@jakubmazanec/carson 0.1.0-6cee770 → 0.1.0-8a0a4d5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,7 +24,7 @@ Usually you also need a package containing Carson templates. Until you
24
24
  npm install @jakubmazanec/carson-templates
25
25
  ```
26
26
 
27
- ⚠️ If you want to create new workspaces, yoy need to install both Carson and your template package
27
+ ⚠️ If you want to create new workspaces, you need to install both Carson and your template package
28
28
  globally:
29
29
 
30
30
  ```sh
@@ -65,7 +65,7 @@ export function CreateWorkspace({ args }) {
65
65
  flexDirection: "column",
66
66
  children: [
67
67
  /*#__PURE__*/ _jsx(Text, {
68
- children: `Creating workspace at ${chalk[colors.highlighted](path)}.`
68
+ children: `Creating workspace at ${chalk[colors.info](workspacePath)}.`
69
69
  }),
70
70
  /*#__PURE__*/ _jsx(CreateWorkspaceInput, {
71
71
  values: createWorkspaceInputResult,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-workspace/CreateWorkspace.tsx"],"sourcesContent":["import {Header, icons, colors, type CommandArguments, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport path from 'node:path';\nimport {useEffect, useState} from 'react';\n\nimport {type createWorkspaceCommand} from './createWorkspaceCommand.js';\nimport {CreateWorkspaceInput, type CreateWorkspaceInputResult} from './CreateWorkspaceInput.js';\nimport {runCreateWorkspace} from './runCreateWorkspace.js';\nimport {type CommandStatus} from '../internals.js';\n\nexport type CreateWorkspaceProps = {\n args: CommandArguments<typeof createWorkspaceCommand>;\n};\n\nexport function CreateWorkspace({args}: CreateWorkspaceProps) {\n let [status, setStatus] = useState<CommandStatus>('not-started');\n let [subscription, setSubscription] = useState<ZenObservable.Subscription | null>(null);\n let [jobs, setJobs] = useState<string[]>([]);\n let [createWorkspaceInputResult, setCreateWorkspaceInputResult] =\n useState<CreateWorkspaceInputResult>(() => ({\n templateId: {value: args.options.template ?? '', isComplete: !!args.options.template},\n }));\n let {exit} = useProgram();\n let workspacePath = path.resolve(process.cwd(), args.options.path ?? '');\n\n useEffect(() => {\n if (Object.entries(createWorkspaceInputResult).every(([, result]) => result.isComplete)) {\n setStatus('in-progress');\n }\n }, [createWorkspaceInputResult]);\n\n useEffect(() => {\n if (status === 'in-progress' && !subscription) {\n let newSubscription = runCreateWorkspace({\n workspacePath,\n templateId: createWorkspaceInputResult.templateId.value,\n args,\n }).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n newSubscription.unsubscribe();\n setStatus('finished');\n },\n });\n\n setSubscription(newSubscription);\n }\n\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [createWorkspaceInputResult, status, subscription, args, exit, workspacePath]);\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`Creating workspace at ${chalk[colors.highlighted](path)}.`}</Text>\n\n <CreateWorkspaceInput\n values={createWorkspaceInputResult}\n marginTop={1}\n onChange={setCreateWorkspaceInputResult}\n onComplete={setCreateWorkspaceInputResult}\n />\n\n {status === 'in-progress' || status === 'finished' ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={status === 'in-progress'} icon={icons.success} marginBottom={1}>\n <Text>Creating workspace...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n ) : null}\n\n {status === 'finished' ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","path","useEffect","useState","CreateWorkspaceInput","runCreateWorkspace","CreateWorkspace","args","status","setStatus","subscription","setSubscription","jobs","setJobs","createWorkspaceInputResult","setCreateWorkspaceInputResult","templateId","value","options","template","isComplete","exit","workspacePath","resolve","process","cwd","Object","entries","every","result","newSubscription","subscribe","next","previousJobs","error","complete","unsubscribe","flexDirection","highlighted","values","marginTop","onChange","onComplete","showSpinner","icon","success","marginBottom","map","job","info"],"mappings":";AAAA,SAAQA,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAyBC,UAAU,QAAO,oBAAoB;AAC3F,OAAOC,WAAW,QAAQ;AAC1B,SAAQC,GAAG,EAAEC,IAAI,QAAO,MAAM;AAC9B,OAAOC,UAAU,YAAY;AAC7B,SAAQC,SAAS,EAAEC,QAAQ,QAAO,QAAQ;AAG1C,SAAQC,oBAAoB,QAAwC,4BAA4B;AAChG,SAAQC,kBAAkB,QAAO,0BAA0B;AAO3D,OAAO,SAASC,gBAAgB,EAACC,IAAI,EAAuB;IAC1D,IAAI,CAACC,QAAQC,UAAU,GAAGN,SAAwB;IAClD,IAAI,CAACO,cAAcC,gBAAgB,GAAGR,SAA4C;IAClF,IAAI,CAACS,MAAMC,QAAQ,GAAGV,SAAmB,EAAE;IAC3C,IAAI,CAACW,4BAA4BC,8BAA8B,GAC7DZ,SAAqC,IAAO,CAAA;YAC1Ca,YAAY;gBAACC,OAAOV,KAAKW,OAAO,CAACC,QAAQ,IAAI;gBAAIC,YAAY,CAAC,CAACb,KAAKW,OAAO,CAACC,QAAQ;YAAA;QACtF,CAAA;IACF,IAAI,EAACE,IAAI,EAAC,GAAGxB;IACb,IAAIyB,gBAAgBrB,KAAKsB,OAAO,CAACC,QAAQC,GAAG,IAAIlB,KAAKW,OAAO,CAACjB,IAAI,IAAI;IAErEC,UAAU;QACR,IAAIwB,OAAOC,OAAO,CAACb,4BAA4Bc,KAAK,CAAC,CAAC,GAAGC,OAAO,GAAKA,OAAOT,UAAU,GAAG;YACvFX,UAAU;QACZ;IACF,GAAG;QAACK;KAA2B;IAE/BZ,UAAU;QACR,IAAIM,WAAW,iBAAiB,CAACE,cAAc;YAC7C,IAAIoB,kBAAkBzB,mBAAmB;gBACvCiB;gBACAN,YAAYF,2BAA2BE,UAAU,CAACC,KAAK;gBACvDV;YACF,GAAGwB,SAAS,CAAC;gBACXC,MAAKf,KAAK;oBACRJ,QAAQ,CAACoB,eAAiB;+BAAIA;4BAAchB;yBAAM;gBACpD;gBACAiB,OAAMA,KAAK;oBACTb,KAAKa;gBACP;gBACAC;oBACEL,gBAAgBM,WAAW;oBAC3B3B,UAAU;gBACZ;YACF;YAEAE,gBAAgBmB;QAClB;QAEA,OAAO;YACL,IAAIpB,cAAc;gBAChBA,aAAa0B,WAAW;YAC1B;QACF;IACF,GAAG;QAACtB;QAA4BN;QAAQE;QAAcH;QAAMc;QAAMC;KAAc;IAEhF,qBACE,MAACvB;QAAIsC,eAAc;;0BACjB,KAACrC;0BAAM,CAAC,sBAAsB,EAAEF,KAAK,CAACF,OAAO0C,WAAW,CAAC,CAACrC,MAAM,CAAC,CAAC;;0BAElE,KAACG;gBACCmC,QAAQzB;gBACR0B,WAAW;gBACXC,UAAU1B;gBACV2B,YAAY3B;;YAGbP,WAAW,iBAAiBA,WAAW,2BACtC,MAACT;gBAAIyC,WAAW;gBAAGH,eAAc;;kCAC/B,KAAC3C;wBAAOiD,aAAanC,WAAW;wBAAeoC,MAAMjD,MAAMkD,OAAO;wBAAEC,cAAc;kCAChF,cAAA,KAAC9C;sCAAK;;;oBAGPY,KAAKmC,GAAG,CAAC,CAACC,oBACT,KAAChD;sCAAgB,CAAC,EAAEL,MAAMsD,IAAI,CAAC,CAAC,EAAED,IAAI,CAAC;2BAA5BA;;iBAGb;YAEHxC,WAAW,2BACV,KAACd;gBAAO8C,WAAW;gBAAGI,MAAMjD,MAAMkD,OAAO;0BACvC,cAAA,KAAC7C;8BAAK;;iBAEN;;;AAGV"}
1
+ {"version":3,"sources":["../../../src/commands/create-workspace/CreateWorkspace.tsx"],"sourcesContent":["import {Header, icons, colors, type CommandArguments, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport path from 'node:path';\nimport {useEffect, useState} from 'react';\n\nimport {type createWorkspaceCommand} from './createWorkspaceCommand.js';\nimport {CreateWorkspaceInput, type CreateWorkspaceInputResult} from './CreateWorkspaceInput.js';\nimport {runCreateWorkspace} from './runCreateWorkspace.js';\nimport {type CommandStatus} from '../internals.js';\n\nexport type CreateWorkspaceProps = {\n args: CommandArguments<typeof createWorkspaceCommand>;\n};\n\nexport function CreateWorkspace({args}: CreateWorkspaceProps) {\n let [status, setStatus] = useState<CommandStatus>('not-started');\n let [subscription, setSubscription] = useState<ZenObservable.Subscription | null>(null);\n let [jobs, setJobs] = useState<string[]>([]);\n let [createWorkspaceInputResult, setCreateWorkspaceInputResult] =\n useState<CreateWorkspaceInputResult>(() => ({\n templateId: {value: args.options.template ?? '', isComplete: !!args.options.template},\n }));\n let {exit} = useProgram();\n let workspacePath = path.resolve(process.cwd(), args.options.path ?? '');\n\n useEffect(() => {\n if (Object.entries(createWorkspaceInputResult).every(([, result]) => result.isComplete)) {\n setStatus('in-progress');\n }\n }, [createWorkspaceInputResult]);\n\n useEffect(() => {\n if (status === 'in-progress' && !subscription) {\n let newSubscription = runCreateWorkspace({\n workspacePath,\n templateId: createWorkspaceInputResult.templateId.value,\n args,\n }).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n newSubscription.unsubscribe();\n setStatus('finished');\n },\n });\n\n setSubscription(newSubscription);\n }\n\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [createWorkspaceInputResult, status, subscription, args, exit, workspacePath]);\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`Creating workspace at ${chalk[colors.info](workspacePath)}.`}</Text>\n\n <CreateWorkspaceInput\n values={createWorkspaceInputResult}\n marginTop={1}\n onChange={setCreateWorkspaceInputResult}\n onComplete={setCreateWorkspaceInputResult}\n />\n\n {status === 'in-progress' || status === 'finished' ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={status === 'in-progress'} icon={icons.success} marginBottom={1}>\n <Text>Creating workspace...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n ) : null}\n\n {status === 'finished' ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","path","useEffect","useState","CreateWorkspaceInput","runCreateWorkspace","CreateWorkspace","args","status","setStatus","subscription","setSubscription","jobs","setJobs","createWorkspaceInputResult","setCreateWorkspaceInputResult","templateId","value","options","template","isComplete","exit","workspacePath","resolve","process","cwd","Object","entries","every","result","newSubscription","subscribe","next","previousJobs","error","complete","unsubscribe","flexDirection","info","values","marginTop","onChange","onComplete","showSpinner","icon","success","marginBottom","map","job"],"mappings":";AAAA,SAAQA,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAyBC,UAAU,QAAO,oBAAoB;AAC3F,OAAOC,WAAW,QAAQ;AAC1B,SAAQC,GAAG,EAAEC,IAAI,QAAO,MAAM;AAC9B,OAAOC,UAAU,YAAY;AAC7B,SAAQC,SAAS,EAAEC,QAAQ,QAAO,QAAQ;AAG1C,SAAQC,oBAAoB,QAAwC,4BAA4B;AAChG,SAAQC,kBAAkB,QAAO,0BAA0B;AAO3D,OAAO,SAASC,gBAAgB,EAACC,IAAI,EAAuB;IAC1D,IAAI,CAACC,QAAQC,UAAU,GAAGN,SAAwB;IAClD,IAAI,CAACO,cAAcC,gBAAgB,GAAGR,SAA4C;IAClF,IAAI,CAACS,MAAMC,QAAQ,GAAGV,SAAmB,EAAE;IAC3C,IAAI,CAACW,4BAA4BC,8BAA8B,GAC7DZ,SAAqC,IAAO,CAAA;YAC1Ca,YAAY;gBAACC,OAAOV,KAAKW,OAAO,CAACC,QAAQ,IAAI;gBAAIC,YAAY,CAAC,CAACb,KAAKW,OAAO,CAACC,QAAQ;YAAA;QACtF,CAAA;IACF,IAAI,EAACE,IAAI,EAAC,GAAGxB;IACb,IAAIyB,gBAAgBrB,KAAKsB,OAAO,CAACC,QAAQC,GAAG,IAAIlB,KAAKW,OAAO,CAACjB,IAAI,IAAI;IAErEC,UAAU;QACR,IAAIwB,OAAOC,OAAO,CAACb,4BAA4Bc,KAAK,CAAC,CAAC,GAAGC,OAAO,GAAKA,OAAOT,UAAU,GAAG;YACvFX,UAAU;QACZ;IACF,GAAG;QAACK;KAA2B;IAE/BZ,UAAU;QACR,IAAIM,WAAW,iBAAiB,CAACE,cAAc;YAC7C,IAAIoB,kBAAkBzB,mBAAmB;gBACvCiB;gBACAN,YAAYF,2BAA2BE,UAAU,CAACC,KAAK;gBACvDV;YACF,GAAGwB,SAAS,CAAC;gBACXC,MAAKf,KAAK;oBACRJ,QAAQ,CAACoB,eAAiB;+BAAIA;4BAAchB;yBAAM;gBACpD;gBACAiB,OAAMA,KAAK;oBACTb,KAAKa;gBACP;gBACAC;oBACEL,gBAAgBM,WAAW;oBAC3B3B,UAAU;gBACZ;YACF;YAEAE,gBAAgBmB;QAClB;QAEA,OAAO;YACL,IAAIpB,cAAc;gBAChBA,aAAa0B,WAAW;YAC1B;QACF;IACF,GAAG;QAACtB;QAA4BN;QAAQE;QAAcH;QAAMc;QAAMC;KAAc;IAEhF,qBACE,MAACvB;QAAIsC,eAAc;;0BACjB,KAACrC;0BAAM,CAAC,sBAAsB,EAAEF,KAAK,CAACF,OAAO0C,IAAI,CAAC,CAAChB,eAAe,CAAC,CAAC;;0BAEpE,KAAClB;gBACCmC,QAAQzB;gBACR0B,WAAW;gBACXC,UAAU1B;gBACV2B,YAAY3B;;YAGbP,WAAW,iBAAiBA,WAAW,2BACtC,MAACT;gBAAIyC,WAAW;gBAAGH,eAAc;;kCAC/B,KAAC3C;wBAAOiD,aAAanC,WAAW;wBAAeoC,MAAMjD,MAAMkD,OAAO;wBAAEC,cAAc;kCAChF,cAAA,KAAC9C;sCAAK;;;oBAGPY,KAAKmC,GAAG,CAAC,CAACC,oBACT,KAAChD;sCAAgB,CAAC,EAAEL,MAAM2C,IAAI,CAAC,CAAC,EAAEU,IAAI,CAAC;2BAA5BA;;iBAGb;YAEHxC,WAAW,2BACV,KAACd;gBAAO8C,WAAW;gBAAGI,MAAMjD,MAAMkD,OAAO;0BACvC,cAAA,KAAC7C;8BAAK;;iBAEN;;;AAGV"}
@@ -317,6 +317,10 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
317
317
  url: repositoryUrl,
318
318
  branches: repositoryBranches ?? []
319
319
  };
320
+ } else if (repositoryBranches) {
321
+ this.repository = {
322
+ branches: repositoryBranches
323
+ };
320
324
  }
321
325
  await this.readProjects();
322
326
  return this;
@@ -329,6 +333,10 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
329
333
  url: repositoryUrl,
330
334
  branches: repositoryBranches ?? []
331
335
  };
336
+ } else if (repositoryBranches) {
337
+ this.repository = {
338
+ branches: repositoryBranches
339
+ };
332
340
  }
333
341
  await this.readProjects();
334
342
  return this;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workspace/Workspace.ts"],"sourcesContent":["import {ensureEmptyDirectory, findExistingDirectory, isRootPath} from '@jakubmazanec/fs-utils';\nimport {readFile, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';\nimport glob from 'fast-glob';\nimport fs from 'fs-extra';\nimport json5 from 'json5';\nimport path from 'node:path';\nimport {z} from 'zod';\n\nimport {\n compareProjectPath,\n getPackageJsonWorkspaces,\n getRepositoryBranches,\n getRepositoryUrl,\n} from './internals.js';\nimport {Project} from './Project.js';\nimport {saveWorkspaceConfig} from './saveWorkspaceConfig.js';\nimport {workspaceConfigSchema} from './WorkspaceConfig.js';\nimport {type WorkspaceConfig} from './WorkspaceConfig.js';\nimport {type WorkspaceCreateOptions} from './WorkspaceCreateOptions.js';\nimport {type WorkspaceCreateProjectOptions} from './WorkspaceCreateProjectOptions.js';\nimport {WorkspaceDependencies} from './WorkspaceDependencies.js';\nimport {WorkspaceError} from './WorkspaceError.js';\nimport {type WorkspaceFindAndReadOptions} from './WorkspaceFindAndReadOptions.js';\nimport type {WorkspaceOptions} from './WorkspaceOptions.js';\nimport {type WorkspacePackageJson} from './WorkspacePackageJson.js';\nimport type {WorkspaceProjectGlobs} from './WorkspaceProjectGlobs.js';\nimport {type WorkspaceProjects} from './WorkspaceProjects.js';\nimport {type WorkspaceRepository} from './WorkspaceRepository.js';\nimport {type WorkspaceUpdateOptions} from './WorkspaceUpdateOptions.js';\nimport {CARSON_CONFIG_DIRECTORY, WORKSPACE_CONFIG_FILENAME} from '../constants.js';\nimport {applyTemplateRenders} from '../template/applyTemplateRenders.js';\nimport {renderCarsonTemplate} from '../template/renderCarsonTemplate.js';\n\n/**\n * Workspace represent a directory, usually a git repository, that contains {@link Project} instances.\n *\n * @typeParam M If true, the workspace is multi-project workspace (so-called \"monorepo\").\n */\nexport class Workspace<M extends boolean = true> {\n /** Workspace path. */\n readonly path: string;\n\n /** Does the workspace contain a multiple projects? */\n readonly isMultiProject: M;\n\n /** Globs used to find projects. */\n projectGlobs: WorkspaceProjectGlobs<M>;\n\n /** Workspace projects. */\n projects: WorkspaceProjects<M>;\n\n /** Workspace configuration; if it's not found, the default is an empty object. */\n config: WorkspaceConfig;\n\n /** Parsed workspace `package.json` file (if the workspace contains multiple projects); if it's not found, the default is an empty object. */\n packageJson: WorkspacePackageJson<M>;\n\n /** Workspace git repository. */\n repository?: WorkspaceRepository;\n\n /** Dependencies of all projects. */\n dependencies: WorkspaceDependencies<M> = [] as unknown as WorkspaceDependencies<M>;\n\n /** Development dependencies of all projects. */\n devDependencies: WorkspaceDependencies<M> = [] as unknown as WorkspaceDependencies<M>;\n\n /** All dependencies of all projects and workspace dependencies. */\n allDependencies: WorkspaceDependencies<M> = [] as unknown as WorkspaceDependencies<M>;\n\n /** Versions of each dependency. */\n dependencyVersions: Record<string, string[]> = {};\n\n /** Errors found during reading from the file system. */\n errors: Array<InstanceType<typeof WorkspaceError>> = [];\n\n constructor(options: WorkspaceOptions<M>) {\n this.path = options.path;\n\n if (typeof options.isMultiProject === 'undefined' || options.isMultiProject) {\n this.isMultiProject = true as M;\n\n let projectGlobOption = (options as WorkspaceOptions<true>).projectGlobs;\n\n if (projectGlobOption) {\n this.projectGlobs = projectGlobOption as WorkspaceProjectGlobs<M>;\n } else {\n this.projectGlobs = [] as string[] as WorkspaceProjectGlobs<M>;\n }\n\n this.projects = [] as Array<Project<M>> as WorkspaceProjects<M>;\n\n let {projects} = options as WorkspaceOptions<true>;\n\n if (projects) {\n this.addProjects(projects.map((project) => new Project({...project, workspace: this})));\n }\n\n let packageJsonOption = (options as WorkspaceOptions<true>).packageJson;\n\n if (packageJsonOption) {\n this.packageJson = packageJsonOption as M extends true ? PackageJson : null;\n } else {\n let emptyPackageJson: PackageJson = {};\n\n this.packageJson = emptyPackageJson as M extends true ? PackageJson : null;\n }\n } else {\n this.isMultiProject = false as M;\n this.projectGlobs = null as M extends true ? string[] : null;\n this.packageJson = null as M extends true ? PackageJson : null;\n this.projects = [] as Array<Project<M>> as WorkspaceProjects<M>;\n\n let {projects} = options as WorkspaceOptions<false>;\n\n if (projects) {\n this.addProjects(projects.map((project) => new Project({...project, workspace: this})));\n }\n }\n\n let configOption = options.config;\n\n if (configOption) {\n this.config = configOption;\n } else {\n let emptyWorkspaceConfig: WorkspaceConfig = {};\n\n this.config = emptyWorkspaceConfig;\n }\n\n if (options.repository) {\n this.repository = options.repository;\n }\n\n if (options.errors) {\n this.errors = options.errors;\n }\n\n // add missing project globs\n if (this.isMultiProject && !(this.projectGlobs as string[]).length) {\n let packageJsonWorkspaces = getPackageJsonWorkspaces(this.packageJson as PackageJson);\n\n if (packageJsonWorkspaces) {\n this.projectGlobs = [...packageJsonWorkspaces] as M extends true ? string[] : null;\n }\n }\n\n this.sortProjects();\n this.updateDependencies();\n }\n\n /**\n * Creates new workspace within the file system.\n *\n * @param options Options.\n * @returns The new workspace.\n */\n static async create({args, path: workspacePath, templateId}: WorkspaceCreateOptions) {\n // TODO: test that workspace returned by this method has the same value of isMultiProject when the same workspace is after its creation re-read with .read()\n let workspace = new this({\n path: workspacePath,\n config: {\n template: templateId,\n },\n });\n\n try {\n await ensureEmptyDirectory(workspace.path);\n } catch {\n throw new WorkspaceError('WORKSPACE_PATH_NOT_EMPTY', {\n messageParameters: [workspace.path],\n data: {\n path: workspace.path,\n },\n });\n }\n\n await saveWorkspaceConfig({\n workspacePath: workspace.path,\n workspaceConfig: {template: templateId},\n });\n\n let templateRenders = await renderCarsonTemplate({\n templateId,\n templateData: {\n workspace,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: workspace.path,\n ignoreStrategies: ['check'],\n });\n\n return Workspace.read(workspace.path);\n }\n\n static async read(workspacePath: string): Promise<Workspace | Workspace<false>> {\n let resolvedWorkspacePath = path.resolve(workspacePath);\n\n if (!(await fs.pathExists(resolvedWorkspacePath))) {\n throw new WorkspaceError('NO_SUCH_WORKSPACE_PATH', {\n messageParameters: [resolvedWorkspacePath],\n data: {\n path: resolvedWorkspacePath,\n },\n });\n }\n\n // load root package.json\n let rootPackageJsonPath = path.join(resolvedWorkspacePath, 'package.json');\n let doesRootPackageJsonExist = await fs.pathExists(rootPackageJsonPath);\n let rootPackageJson: PackageJson | z.ZodError;\n\n if (doesRootPackageJsonExist) {\n rootPackageJson = await readFile(rootPackageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n rootPackageJson = {};\n }\n\n if (rootPackageJson instanceof z.ZodError) {\n rootPackageJson = {};\n }\n\n // add projects\n let projectGlobs = getPackageJsonWorkspaces(rootPackageJson);\n\n // we're dealing with single-project workspace\n if (!projectGlobs) {\n let workspace = new this({\n path: resolvedWorkspacePath,\n isMultiProject: false,\n });\n\n await workspace.read();\n await workspace.readProjects();\n\n return workspace;\n }\n\n // assemble workspace options\n let workspace = new this({\n path: resolvedWorkspacePath,\n isMultiProject: true,\n projectGlobs,\n packageJson: rootPackageJson,\n });\n\n await workspace.read();\n await workspace.readProjects();\n\n return workspace;\n }\n\n /**\n * Traverses file system up from the search path and tries to find a directory that is a root of a workspace.\n */\n static async find(searchPath: string): Promise<string | undefined> {\n let startingPath = await findExistingDirectory(path.resolve(searchPath));\n let currentPath = startingPath;\n let singlePackageWorkspacePath: string | undefined;\n let multiPackageWorkspacePath: string | undefined;\n\n while (\n !(isRootPath(currentPath) || (singlePackageWorkspacePath && multiPackageWorkspacePath))\n ) {\n let packageJsonPath = path.join(currentPath, 'package.json');\n let doesPackageJsonExist = await fs.pathExists(packageJsonPath);\n\n if (doesPackageJsonExist) {\n let packageJson = await readFile(packageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n\n if (!(packageJson instanceof Error)) {\n let projectGlobs = getPackageJsonWorkspaces(packageJson);\n\n if (projectGlobs?.length) {\n multiPackageWorkspacePath ??= currentPath;\n } else {\n singlePackageWorkspacePath ??= currentPath;\n }\n }\n }\n\n currentPath = path.dirname(currentPath);\n }\n\n if (multiPackageWorkspacePath) {\n return multiPackageWorkspacePath;\n } else if (singlePackageWorkspacePath) {\n return singlePackageWorkspacePath;\n }\n\n return undefined;\n }\n\n /**\n * Traverses file system up from the search path and tries to find and read a workspace.\n */\n static async findAndRead<O extends WorkspaceFindAndReadOptions | undefined = undefined>(\n searchPath: string,\n options?: O,\n ): Promise<\n O extends undefined\n ? Workspace | Workspace<false> | undefined\n : NonNullable<O>['throwIfNotFound'] extends true\n ? Workspace | Workspace<false>\n : Workspace | Workspace<false> | undefined\n > {\n let workspacePath = await Workspace.find(searchPath);\n\n if (workspacePath) {\n return Workspace.read(workspacePath) as Promise<\n O extends undefined\n ? Workspace | Workspace<false> | undefined\n : NonNullable<O>['throwIfNotFound'] extends true\n ? Workspace | Workspace<false>\n : Workspace | Workspace<false> | undefined\n >;\n } else if (options?.throwIfNotFound) {\n throw new WorkspaceError('NO_WORKSPACE_FOUND', {\n messageParameters: [searchPath],\n data: {\n path: searchPath,\n },\n });\n }\n\n return undefined as unknown as Promise<\n O extends undefined\n ? Workspace | Workspace<false> | undefined\n : NonNullable<O>['throwIfNotFound'] extends true\n ? Workspace | Workspace<false>\n : Workspace | Workspace<false> | undefined\n >;\n }\n\n async read(): Promise<this> {\n if (!(await fs.pathExists(this.path))) {\n throw new WorkspaceError('NO_SUCH_WORKSPACE_PATH', {\n messageParameters: [this.path],\n data: {\n path: this.path,\n },\n });\n }\n\n let errors: Array<InstanceType<typeof WorkspaceError>> = [];\n let repositoryUrl = await getRepositoryUrl(this.path);\n let repositoryBranches = await getRepositoryBranches(this.path);\n\n // load workspace config\n let workspaceConfigPath = path.join(\n this.path,\n CARSON_CONFIG_DIRECTORY,\n WORKSPACE_CONFIG_FILENAME,\n );\n let doesWorkspaceConfigExist = await fs.pathExists(workspaceConfigPath);\n let workspaceConfig: WorkspaceConfig | z.ZodError;\n\n if (doesWorkspaceConfigExist) {\n workspaceConfig = await readFile(workspaceConfigPath, workspaceConfigSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n workspaceConfig = {};\n }\n\n if (workspaceConfig instanceof z.ZodError) {\n let zodError = workspaceConfig;\n let workspaceError = new WorkspaceError('INVALID_WORKSPACE_CONFIG', {\n messageParameters: [workspaceConfigPath],\n data: {\n path: workspaceConfigPath,\n zodIssues: zodError.issues,\n },\n });\n\n errors.push(workspaceError);\n\n workspaceConfig = {};\n }\n\n if (this.isMultiProject) {\n // load root package.json\n let rootPackageJsonPath = path.join(this.path, 'package.json');\n let doesRootPackageJsonExist = await fs.pathExists(rootPackageJsonPath);\n let rootPackageJson: PackageJson | z.ZodError;\n\n if (doesRootPackageJsonExist) {\n rootPackageJson = await readFile(rootPackageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n rootPackageJson = {};\n }\n\n if (rootPackageJson instanceof z.ZodError) {\n let zodError = rootPackageJson;\n let workspaceError = new WorkspaceError('INVALID_PACKAGE_JSON', {\n messageParameters: [rootPackageJsonPath],\n data: {\n path: rootPackageJsonPath,\n zodIssues: zodError.issues,\n },\n });\n\n errors.push(workspaceError);\n\n rootPackageJson = {};\n }\n\n let projectGlobs = getPackageJsonWorkspaces(rootPackageJson);\n\n this.projectGlobs = (projectGlobs ?? []) as WorkspaceProjectGlobs<M>;\n this.packageJson = rootPackageJson as WorkspacePackageJson<M>;\n this.config = workspaceConfig;\n this.errors = errors;\n\n if (repositoryUrl) {\n this.repository = {\n url: repositoryUrl,\n branches: repositoryBranches ?? [],\n };\n }\n\n await this.readProjects();\n\n return this;\n }\n\n // we're dealing with single-project workspace\n this.config = workspaceConfig;\n this.errors = errors;\n\n if (repositoryUrl) {\n this.repository = {\n url: repositoryUrl,\n branches: repositoryBranches ?? [],\n };\n }\n\n await this.readProjects();\n\n return this;\n }\n\n async update({args}: WorkspaceUpdateOptions): Promise<this> {\n if (!this.config.template) {\n throw new WorkspaceError('MISSING_CARSON_TEMPLATE_ID', {\n messageParameters: [\n path.join(this.path, CARSON_CONFIG_DIRECTORY, WORKSPACE_CONFIG_FILENAME),\n ],\n });\n }\n\n let templateRenders = await renderCarsonTemplate({\n templateId: this.config.template,\n templateData: {\n workspace: this,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: this.path,\n ignoreStrategies: ['create'],\n });\n\n await this.read();\n\n return this;\n }\n\n getProject(projectName: Project<M> | string): Project<M> | undefined {\n for (let project of this.projects) {\n if (project.name === projectName || project === projectName) {\n return project;\n }\n }\n\n return undefined;\n }\n\n async createProject({\n templateId,\n projectPath,\n projectName,\n args,\n }: WorkspaceCreateProjectOptions): Promise<Project<M>> {\n let resolvedProjectPath = path.resolve(projectPath);\n\n if (this.projects.some((project) => resolvedProjectPath === project.path)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_PATH', {\n messageParameters: [resolvedProjectPath],\n });\n }\n\n if (this.projects.some((project) => projectName === project.name)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_NAME', {messageParameters: [projectName]});\n }\n\n if (!this.isMultiProject && this.projects.length >= 1) {\n throw new WorkspaceError('TOO_MANY_PROJECTS');\n }\n\n if (!this.isMultiProject && projectPath !== this.path) {\n throw new WorkspaceError('PATH_MISMATCH');\n }\n\n let newProject = await Project.create({\n templateId,\n projectPath,\n projectName,\n args,\n workspace: this,\n });\n\n this.addProject(newProject);\n\n return newProject;\n }\n\n addProject(newProject: Project<M>): this {\n if (this.projects.some((project) => newProject.path === project.path)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_PATH', {\n messageParameters: [newProject.path],\n });\n }\n\n if (this.projects.some((project) => newProject.name === project.name)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_NAME', {messageParameters: [newProject.name]});\n }\n\n if (!this.isMultiProject && this.projects.length >= 1) {\n throw new WorkspaceError('TOO_MANY_PROJECTS');\n }\n\n if (!this.isMultiProject && newProject.path !== this.path) {\n throw new WorkspaceError('PATH_MISMATCH');\n }\n\n this.projects.push(newProject);\n this.sortProjects();\n this.updateDependencies();\n\n return this;\n }\n\n addProjects(newProjects: Array<Project<M>>): this {\n for (let newProject of newProjects) {\n if (this.projects.some((project) => newProject.path === project.path)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_PATH', {\n messageParameters: [newProject.path],\n });\n }\n\n if (this.projects.some((project) => newProject.name === project.name)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_NAME', {messageParameters: [newProject.name]});\n }\n\n if (!this.isMultiProject && this.projects.length >= 1) {\n throw new WorkspaceError('TOO_MANY_PROJECTS');\n }\n\n if (!this.isMultiProject && newProject.path !== this.path) {\n throw new WorkspaceError('PATH_MISMATCH');\n }\n\n this.projects.push(newProject);\n }\n\n this.sortProjects();\n this.updateDependencies();\n\n return this;\n }\n\n async readProjects(): Promise<Array<Project<M>>> {\n if (this.projectGlobs) {\n let projects: Array<Project<M>> = [];\n let packagePaths = await glob(this.projectGlobs, {\n cwd: this.path,\n onlyDirectories: true,\n });\n\n for (let packagePath of packagePaths) {\n let project = await Project.read(path.join(this.path, packagePath), this);\n\n projects.push(project);\n }\n\n this.projects = projects;\n } else {\n this.projects = [await Project.read(this.path, this)];\n }\n\n this.sortProjects();\n this.updateDependencies();\n\n return this.projects;\n }\n\n protected sortProjects(): void {\n this.projects.sort(compareProjectPath);\n }\n\n protected updateDependencies(): void {\n this.dependencies = WorkspaceDependencies.fromWorkspace(this);\n this.devDependencies = WorkspaceDependencies.fromWorkspace(this, {\n includeOnlyDevDependencies: true,\n });\n this.allDependencies = WorkspaceDependencies.fromWorkspace(this, {\n includeDevDependencies: true,\n includeWorkspaceDependencies: true,\n });\n this.dependencyVersions = this.allDependencies.getVersions({\n useExactVersions: true,\n });\n }\n}\n"],"names":["ensureEmptyDirectory","findExistingDirectory","isRootPath","readFile","packageJsonSchema","glob","fs","json5","path","z","compareProjectPath","getPackageJsonWorkspaces","getRepositoryBranches","getRepositoryUrl","Project","saveWorkspaceConfig","workspaceConfigSchema","WorkspaceDependencies","WorkspaceError","CARSON_CONFIG_DIRECTORY","WORKSPACE_CONFIG_FILENAME","applyTemplateRenders","renderCarsonTemplate","Workspace","isMultiProject","projectGlobs","projects","config","packageJson","repository","dependencies","devDependencies","allDependencies","dependencyVersions","errors","constructor","options","projectGlobOption","addProjects","map","project","workspace","packageJsonOption","emptyPackageJson","configOption","emptyWorkspaceConfig","length","packageJsonWorkspaces","sortProjects","updateDependencies","create","args","workspacePath","templateId","template","messageParameters","data","workspaceConfig","templateRenders","templateData","ignoreStrategies","read","resolvedWorkspacePath","resolve","pathExists","rootPackageJsonPath","join","doesRootPackageJsonExist","rootPackageJson","parser","rawString","parse","ZodError","readProjects","find","searchPath","startingPath","currentPath","singlePackageWorkspacePath","multiPackageWorkspacePath","packageJsonPath","doesPackageJsonExist","Error","dirname","undefined","findAndRead","throwIfNotFound","repositoryUrl","repositoryBranches","workspaceConfigPath","doesWorkspaceConfigExist","zodError","workspaceError","zodIssues","issues","push","url","branches","update","getProject","projectName","name","createProject","projectPath","resolvedProjectPath","some","newProject","addProject","newProjects","packagePaths","cwd","onlyDirectories","packagePath","sort","fromWorkspace","includeOnlyDevDependencies","includeDevDependencies","includeWorkspaceDependencies","getVersions","useExactVersions"],"mappings":"AAAA,SAAQA,oBAAoB,EAAEC,qBAAqB,EAAEC,UAAU,QAAO,yBAAyB;AAC/F,SAAQC,QAAQ,EAAEC,iBAAiB,QAAyB,0BAA0B;AACtF,OAAOC,UAAU,YAAY;AAC7B,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,WAAW,QAAQ;AAC1B,OAAOC,UAAU,YAAY;AAC7B,SAAQC,CAAC,QAAO,MAAM;AAEtB,SACEC,kBAAkB,EAClBC,wBAAwB,EACxBC,qBAAqB,EACrBC,gBAAgB,QACX,iBAAiB;AACxB,SAAQC,OAAO,QAAO,eAAe;AACrC,SAAQC,mBAAmB,QAAO,2BAA2B;AAC7D,SAAQC,qBAAqB,QAAO,uBAAuB;AAI3D,SAAQC,qBAAqB,QAAO,6BAA6B;AACjE,SAAQC,cAAc,QAAO,sBAAsB;AAQnD,SAAQC,uBAAuB,EAAEC,yBAAyB,QAAO,kBAAkB;AACnF,SAAQC,oBAAoB,QAAO,sCAAsC;AACzE,SAAQC,oBAAoB,QAAO,sCAAsC;AAEzE;;;;CAIC,GACD,OAAO,MAAMC;IACX,oBAAoB,GACpB,AAASf,KAAa;IAEtB,oDAAoD,GACpD,AAASgB,eAAkB;IAE3B,iCAAiC,GACjCC,aAAuC;IAEvC,wBAAwB,GACxBC,SAA+B;IAE/B,gFAAgF,GAChFC,OAAwB;IAExB,2IAA2I,GAC3IC,YAAqC;IAErC,8BAA8B,GAC9BC,WAAiC;IAEjC,kCAAkC,GAClCC,eAAyC,EAAE,CAAwC;IAEnF,8CAA8C,GAC9CC,kBAA4C,EAAE,CAAwC;IAEtF,iEAAiE,GACjEC,kBAA4C,EAAE,CAAwC;IAEtF,iCAAiC,GACjCC,qBAA+C,CAAC,EAAE;IAElD,sDAAsD,GACtDC,SAAqD,EAAE,CAAC;IAExDC,YAAYC,OAA4B,CAAE;QACxC,IAAI,CAAC5B,IAAI,GAAG4B,QAAQ5B,IAAI;QAExB,IAAI,OAAO4B,QAAQZ,cAAc,KAAK,eAAeY,QAAQZ,cAAc,EAAE;YAC3E,IAAI,CAACA,cAAc,GAAG;YAEtB,IAAIa,oBAAoB,AAACD,QAAmCX,YAAY;YAExE,IAAIY,mBAAmB;gBACrB,IAAI,CAACZ,YAAY,GAAGY;YACtB,OAAO;gBACL,IAAI,CAACZ,YAAY,GAAG,EAAE;YACxB;YAEA,IAAI,CAACC,QAAQ,GAAG,EAAE;YAElB,IAAI,EAACA,QAAQ,EAAC,GAAGU;YAEjB,IAAIV,UAAU;gBACZ,IAAI,CAACY,WAAW,CAACZ,SAASa,GAAG,CAAC,CAACC,UAAY,IAAI1B,QAAQ;wBAAC,GAAG0B,OAAO;wBAAEC,WAAW,IAAI;oBAAA;YACrF;YAEA,IAAIC,oBAAoB,AAACN,QAAmCR,WAAW;YAEvE,IAAIc,mBAAmB;gBACrB,IAAI,CAACd,WAAW,GAAGc;YACrB,OAAO;gBACL,IAAIC,mBAAgC,CAAC;gBAErC,IAAI,CAACf,WAAW,GAAGe;YACrB;QACF,OAAO;YACL,IAAI,CAACnB,cAAc,GAAG;YACtB,IAAI,CAACC,YAAY,GAAG;YACpB,IAAI,CAACG,WAAW,GAAG;YACnB,IAAI,CAACF,QAAQ,GAAG,EAAE;YAElB,IAAI,EAACA,QAAQ,EAAC,GAAGU;YAEjB,IAAIV,UAAU;gBACZ,IAAI,CAACY,WAAW,CAACZ,SAASa,GAAG,CAAC,CAACC,UAAY,IAAI1B,QAAQ;wBAAC,GAAG0B,OAAO;wBAAEC,WAAW,IAAI;oBAAA;YACrF;QACF;QAEA,IAAIG,eAAeR,QAAQT,MAAM;QAEjC,IAAIiB,cAAc;YAChB,IAAI,CAACjB,MAAM,GAAGiB;QAChB,OAAO;YACL,IAAIC,uBAAwC,CAAC;YAE7C,IAAI,CAAClB,MAAM,GAAGkB;QAChB;QAEA,IAAIT,QAAQP,UAAU,EAAE;YACtB,IAAI,CAACA,UAAU,GAAGO,QAAQP,UAAU;QACtC;QAEA,IAAIO,QAAQF,MAAM,EAAE;YAClB,IAAI,CAACA,MAAM,GAAGE,QAAQF,MAAM;QAC9B;QAEA,4BAA4B;QAC5B,IAAI,IAAI,CAACV,cAAc,IAAI,CAAC,AAAC,IAAI,CAACC,YAAY,CAAcqB,MAAM,EAAE;YAClE,IAAIC,wBAAwBpC,yBAAyB,IAAI,CAACiB,WAAW;YAErE,IAAImB,uBAAuB;gBACzB,IAAI,CAACtB,YAAY,GAAG;uBAAIsB;iBAAsB;YAChD;QACF;QAEA,IAAI,CAACC,YAAY;QACjB,IAAI,CAACC,kBAAkB;IACzB;IAEA;;;;;GAKC,GACD,aAAaC,OAAO,EAACC,IAAI,EAAE3C,MAAM4C,aAAa,EAAEC,UAAU,EAAyB,EAAE;QACnF,4JAA4J;QAC5J,IAAIZ,YAAY,IAAI,IAAI,CAAC;YACvBjC,MAAM4C;YACNzB,QAAQ;gBACN2B,UAAUD;YACZ;QACF;QAEA,IAAI;YACF,MAAMrD,qBAAqByC,UAAUjC,IAAI;QAC3C,EAAE,OAAM;YACN,MAAM,IAAIU,eAAe,4BAA4B;gBACnDqC,mBAAmB;oBAACd,UAAUjC,IAAI;iBAAC;gBACnCgD,MAAM;oBACJhD,MAAMiC,UAAUjC,IAAI;gBACtB;YACF;QACF;QAEA,MAAMO,oBAAoB;YACxBqC,eAAeX,UAAUjC,IAAI;YAC7BiD,iBAAiB;gBAACH,UAAUD;YAAU;QACxC;QAEA,IAAIK,kBAAkB,MAAMpC,qBAAqB;YAC/C+B;YACAM,cAAc;gBACZlB;gBACAU;YACF;QACF;QAEA,MAAM9B,qBAAqB;YACzBqC;YACAlD,MAAMiC,UAAUjC,IAAI;YACpBoD,kBAAkB;gBAAC;aAAQ;QAC7B;QAEA,OAAOrC,UAAUsC,IAAI,CAACpB,UAAUjC,IAAI;IACtC;IAEA,aAAaqD,KAAKT,aAAqB,EAAyC;QAC9E,IAAIU,wBAAwBtD,KAAKuD,OAAO,CAACX;QAEzC,IAAI,CAAE,MAAM9C,GAAG0D,UAAU,CAACF,wBAAyB;YACjD,MAAM,IAAI5C,eAAe,0BAA0B;gBACjDqC,mBAAmB;oBAACO;iBAAsB;gBAC1CN,MAAM;oBACJhD,MAAMsD;gBACR;YACF;QACF;QAEA,yBAAyB;QACzB,IAAIG,sBAAsBzD,KAAK0D,IAAI,CAACJ,uBAAuB;QAC3D,IAAIK,2BAA2B,MAAM7D,GAAG0D,UAAU,CAACC;QACnD,IAAIG;QAEJ,IAAID,0BAA0B;YAC5BC,kBAAkB,MAAMjE,SAAS8D,qBAAqB7D,mBAAmB;gBACvEiE,QAAQ,CAACC,YAAsB/D,MAAMgE,KAAK,CAAUD;YACtD;QACF,OAAO;YACLF,kBAAkB,CAAC;QACrB;QAEA,IAAIA,2BAA2B3D,EAAE+D,QAAQ,EAAE;YACzCJ,kBAAkB,CAAC;QACrB;QAEA,eAAe;QACf,IAAI3C,eAAed,yBAAyByD;QAE5C,8CAA8C;QAC9C,IAAI,CAAC3C,cAAc;YACjB,IAAIgB,YAAY,IAAI,IAAI,CAAC;gBACvBjC,MAAMsD;gBACNtC,gBAAgB;YAClB;YAEA,MAAMiB,UAAUoB,IAAI;YACpB,MAAMpB,UAAUgC,YAAY;YAE5B,OAAOhC;QACT;QAEA,6BAA6B;QAC7B,IAAIA,YAAY,IAAI,IAAI,CAAC;YACvBjC,MAAMsD;YACNtC,gBAAgB;YAChBC;YACAG,aAAawC;QACf;QAEA,MAAM3B,UAAUoB,IAAI;QACpB,MAAMpB,UAAUgC,YAAY;QAE5B,OAAOhC;IACT;IAEA;;GAEC,GACD,aAAaiC,KAAKC,UAAkB,EAA+B;QACjE,IAAIC,eAAe,MAAM3E,sBAAsBO,KAAKuD,OAAO,CAACY;QAC5D,IAAIE,cAAcD;QAClB,IAAIE;QACJ,IAAIC;QAEJ,MACE,CAAE7E,CAAAA,WAAW2E,gBAAiBC,8BAA8BC,yBAAyB,EACrF;YACA,IAAIC,kBAAkBxE,KAAK0D,IAAI,CAACW,aAAa;YAC7C,IAAII,uBAAuB,MAAM3E,GAAG0D,UAAU,CAACgB;YAE/C,IAAIC,sBAAsB;gBACxB,IAAIrD,cAAc,MAAMzB,SAAS6E,iBAAiB5E,mBAAmB;oBACnEiE,QAAQ,CAACC,YAAsB/D,MAAMgE,KAAK,CAAUD;gBACtD;gBAEA,IAAI,CAAE1C,CAAAA,uBAAuBsD,KAAI,GAAI;wBAG/BzD;oBAFJ,IAAIA,eAAed,yBAAyBiB;oBAE5C,KAAIH,gBAAAA,0BAAAA,oCAAAA,cAAcqB,MAAM,EAAE;wBACxBiC,8BAA8BF;oBAChC,OAAO;wBACLC,+BAA+BD;oBACjC;gBACF;YACF;YAEAA,cAAcrE,KAAK2E,OAAO,CAACN;QAC7B;QAEA,IAAIE,2BAA2B;YAC7B,OAAOA;QACT,OAAO,IAAID,4BAA4B;YACrC,OAAOA;QACT;QAEA,OAAOM;IACT;IAEA;;GAEC,GACD,aAAaC,YACXV,UAAkB,EAClBvC,OAAW,EAOX;YAWWA;QAVX,IAAIgB,gBAAgB,MAAM7B,UAAUmD,IAAI,CAACC;QAEzC,IAAIvB,eAAe;YACjB,OAAO7B,UAAUsC,IAAI,CAACT;QAOxB,OAAO,KAAIhB,WAAAA,qBAAAA,+BAAAA,SAASkD,eAAe,EAAE;YACnC,MAAM,IAAIpE,eAAe,sBAAsB;gBAC7CqC,mBAAmB;oBAACoB;iBAAW;gBAC/BnB,MAAM;oBACJhD,MAAMmE;gBACR;YACF;QACF;QAEA,OAAOS;IAOT;IAEA,MAAMvB,OAAsB;QAC1B,IAAI,CAAE,MAAMvD,GAAG0D,UAAU,CAAC,IAAI,CAACxD,IAAI,GAAI;YACrC,MAAM,IAAIU,eAAe,0BAA0B;gBACjDqC,mBAAmB;oBAAC,IAAI,CAAC/C,IAAI;iBAAC;gBAC9BgD,MAAM;oBACJhD,MAAM,IAAI,CAACA,IAAI;gBACjB;YACF;QACF;QAEA,IAAI0B,SAAqD,EAAE;QAC3D,IAAIqD,gBAAgB,MAAM1E,iBAAiB,IAAI,CAACL,IAAI;QACpD,IAAIgF,qBAAqB,MAAM5E,sBAAsB,IAAI,CAACJ,IAAI;QAE9D,wBAAwB;QACxB,IAAIiF,sBAAsBjF,KAAK0D,IAAI,CACjC,IAAI,CAAC1D,IAAI,EACTW,yBACAC;QAEF,IAAIsE,2BAA2B,MAAMpF,GAAG0D,UAAU,CAACyB;QACnD,IAAIhC;QAEJ,IAAIiC,0BAA0B;YAC5BjC,kBAAkB,MAAMtD,SAASsF,qBAAqBzE,uBAAuB;gBAC3EqD,QAAQ,CAACC,YAAsB/D,MAAMgE,KAAK,CAAUD;YACtD;QACF,OAAO;YACLb,kBAAkB,CAAC;QACrB;QAEA,IAAIA,2BAA2BhD,EAAE+D,QAAQ,EAAE;YACzC,IAAImB,WAAWlC;YACf,IAAImC,iBAAiB,IAAI1E,eAAe,4BAA4B;gBAClEqC,mBAAmB;oBAACkC;iBAAoB;gBACxCjC,MAAM;oBACJhD,MAAMiF;oBACNI,WAAWF,SAASG,MAAM;gBAC5B;YACF;YAEA5D,OAAO6D,IAAI,CAACH;YAEZnC,kBAAkB,CAAC;QACrB;QAEA,IAAI,IAAI,CAACjC,cAAc,EAAE;YACvB,yBAAyB;YACzB,IAAIyC,sBAAsBzD,KAAK0D,IAAI,CAAC,IAAI,CAAC1D,IAAI,EAAE;YAC/C,IAAI2D,2BAA2B,MAAM7D,GAAG0D,UAAU,CAACC;YACnD,IAAIG;YAEJ,IAAID,0BAA0B;gBAC5BC,kBAAkB,MAAMjE,SAAS8D,qBAAqB7D,mBAAmB;oBACvEiE,QAAQ,CAACC,YAAsB/D,MAAMgE,KAAK,CAAUD;gBACtD;YACF,OAAO;gBACLF,kBAAkB,CAAC;YACrB;YAEA,IAAIA,2BAA2B3D,EAAE+D,QAAQ,EAAE;gBACzC,IAAImB,WAAWvB;gBACf,IAAIwB,iBAAiB,IAAI1E,eAAe,wBAAwB;oBAC9DqC,mBAAmB;wBAACU;qBAAoB;oBACxCT,MAAM;wBACJhD,MAAMyD;wBACN4B,WAAWF,SAASG,MAAM;oBAC5B;gBACF;gBAEA5D,OAAO6D,IAAI,CAACH;gBAEZxB,kBAAkB,CAAC;YACrB;YAEA,IAAI3C,eAAed,yBAAyByD;YAE5C,IAAI,CAAC3C,YAAY,GAAIA,gBAAgB,EAAE;YACvC,IAAI,CAACG,WAAW,GAAGwC;YACnB,IAAI,CAACzC,MAAM,GAAG8B;YACd,IAAI,CAACvB,MAAM,GAAGA;YAEd,IAAIqD,eAAe;gBACjB,IAAI,CAAC1D,UAAU,GAAG;oBAChBmE,KAAKT;oBACLU,UAAUT,sBAAsB,EAAE;gBACpC;YACF;YAEA,MAAM,IAAI,CAACf,YAAY;YAEvB,OAAO,IAAI;QACb;QAEA,8CAA8C;QAC9C,IAAI,CAAC9C,MAAM,GAAG8B;QACd,IAAI,CAACvB,MAAM,GAAGA;QAEd,IAAIqD,eAAe;YACjB,IAAI,CAAC1D,UAAU,GAAG;gBAChBmE,KAAKT;gBACLU,UAAUT,sBAAsB,EAAE;YACpC;QACF;QAEA,MAAM,IAAI,CAACf,YAAY;QAEvB,OAAO,IAAI;IACb;IAEA,MAAMyB,OAAO,EAAC/C,IAAI,EAAyB,EAAiB;QAC1D,IAAI,CAAC,IAAI,CAACxB,MAAM,CAAC2B,QAAQ,EAAE;YACzB,MAAM,IAAIpC,eAAe,8BAA8B;gBACrDqC,mBAAmB;oBACjB/C,KAAK0D,IAAI,CAAC,IAAI,CAAC1D,IAAI,EAAEW,yBAAyBC;iBAC/C;YACH;QACF;QAEA,IAAIsC,kBAAkB,MAAMpC,qBAAqB;YAC/C+B,YAAY,IAAI,CAAC1B,MAAM,CAAC2B,QAAQ;YAChCK,cAAc;gBACZlB,WAAW,IAAI;gBACfU;YACF;QACF;QAEA,MAAM9B,qBAAqB;YACzBqC;YACAlD,MAAM,IAAI,CAACA,IAAI;YACfoD,kBAAkB;gBAAC;aAAS;QAC9B;QAEA,MAAM,IAAI,CAACC,IAAI;QAEf,OAAO,IAAI;IACb;IAEAsC,WAAWC,WAAgC,EAA0B;QACnE,KAAK,IAAI5D,WAAW,IAAI,CAACd,QAAQ,CAAE;YACjC,IAAIc,QAAQ6D,IAAI,KAAKD,eAAe5D,YAAY4D,aAAa;gBAC3D,OAAO5D;YACT;QACF;QAEA,OAAO4C;IACT;IAEA,MAAMkB,cAAc,EAClBjD,UAAU,EACVkD,WAAW,EACXH,WAAW,EACXjD,IAAI,EAC0B,EAAuB;QACrD,IAAIqD,sBAAsBhG,KAAKuD,OAAO,CAACwC;QAEvC,IAAI,IAAI,CAAC7E,QAAQ,CAAC+E,IAAI,CAAC,CAACjE,UAAYgE,wBAAwBhE,QAAQhC,IAAI,GAAG;YACzE,MAAM,IAAIU,eAAe,0BAA0B;gBACjDqC,mBAAmB;oBAACiD;iBAAoB;YAC1C;QACF;QAEA,IAAI,IAAI,CAAC9E,QAAQ,CAAC+E,IAAI,CAAC,CAACjE,UAAY4D,gBAAgB5D,QAAQ6D,IAAI,GAAG;YACjE,MAAM,IAAInF,eAAe,0BAA0B;gBAACqC,mBAAmB;oBAAC6C;iBAAY;YAAA;QACtF;QAEA,IAAI,CAAC,IAAI,CAAC5E,cAAc,IAAI,IAAI,CAACE,QAAQ,CAACoB,MAAM,IAAI,GAAG;YACrD,MAAM,IAAI5B,eAAe;QAC3B;QAEA,IAAI,CAAC,IAAI,CAACM,cAAc,IAAI+E,gBAAgB,IAAI,CAAC/F,IAAI,EAAE;YACrD,MAAM,IAAIU,eAAe;QAC3B;QAEA,IAAIwF,aAAa,MAAM5F,QAAQoC,MAAM,CAAC;YACpCG;YACAkD;YACAH;YACAjD;YACAV,WAAW,IAAI;QACjB;QAEA,IAAI,CAACkE,UAAU,CAACD;QAEhB,OAAOA;IACT;IAEAC,WAAWD,UAAsB,EAAQ;QACvC,IAAI,IAAI,CAAChF,QAAQ,CAAC+E,IAAI,CAAC,CAACjE,UAAYkE,WAAWlG,IAAI,KAAKgC,QAAQhC,IAAI,GAAG;YACrE,MAAM,IAAIU,eAAe,0BAA0B;gBACjDqC,mBAAmB;oBAACmD,WAAWlG,IAAI;iBAAC;YACtC;QACF;QAEA,IAAI,IAAI,CAACkB,QAAQ,CAAC+E,IAAI,CAAC,CAACjE,UAAYkE,WAAWL,IAAI,KAAK7D,QAAQ6D,IAAI,GAAG;YACrE,MAAM,IAAInF,eAAe,0BAA0B;gBAACqC,mBAAmB;oBAACmD,WAAWL,IAAI;iBAAC;YAAA;QAC1F;QAEA,IAAI,CAAC,IAAI,CAAC7E,cAAc,IAAI,IAAI,CAACE,QAAQ,CAACoB,MAAM,IAAI,GAAG;YACrD,MAAM,IAAI5B,eAAe;QAC3B;QAEA,IAAI,CAAC,IAAI,CAACM,cAAc,IAAIkF,WAAWlG,IAAI,KAAK,IAAI,CAACA,IAAI,EAAE;YACzD,MAAM,IAAIU,eAAe;QAC3B;QAEA,IAAI,CAACQ,QAAQ,CAACqE,IAAI,CAACW;QACnB,IAAI,CAAC1D,YAAY;QACjB,IAAI,CAACC,kBAAkB;QAEvB,OAAO,IAAI;IACb;IAEAX,YAAYsE,WAA8B,EAAQ;QAChD,KAAK,IAAIF,cAAcE,YAAa;YAClC,IAAI,IAAI,CAAClF,QAAQ,CAAC+E,IAAI,CAAC,CAACjE,UAAYkE,WAAWlG,IAAI,KAAKgC,QAAQhC,IAAI,GAAG;gBACrE,MAAM,IAAIU,eAAe,0BAA0B;oBACjDqC,mBAAmB;wBAACmD,WAAWlG,IAAI;qBAAC;gBACtC;YACF;YAEA,IAAI,IAAI,CAACkB,QAAQ,CAAC+E,IAAI,CAAC,CAACjE,UAAYkE,WAAWL,IAAI,KAAK7D,QAAQ6D,IAAI,GAAG;gBACrE,MAAM,IAAInF,eAAe,0BAA0B;oBAACqC,mBAAmB;wBAACmD,WAAWL,IAAI;qBAAC;gBAAA;YAC1F;YAEA,IAAI,CAAC,IAAI,CAAC7E,cAAc,IAAI,IAAI,CAACE,QAAQ,CAACoB,MAAM,IAAI,GAAG;gBACrD,MAAM,IAAI5B,eAAe;YAC3B;YAEA,IAAI,CAAC,IAAI,CAACM,cAAc,IAAIkF,WAAWlG,IAAI,KAAK,IAAI,CAACA,IAAI,EAAE;gBACzD,MAAM,IAAIU,eAAe;YAC3B;YAEA,IAAI,CAACQ,QAAQ,CAACqE,IAAI,CAACW;QACrB;QAEA,IAAI,CAAC1D,YAAY;QACjB,IAAI,CAACC,kBAAkB;QAEvB,OAAO,IAAI;IACb;IAEA,MAAMwB,eAA2C;QAC/C,IAAI,IAAI,CAAChD,YAAY,EAAE;YACrB,IAAIC,WAA8B,EAAE;YACpC,IAAImF,eAAe,MAAMxG,KAAK,IAAI,CAACoB,YAAY,EAAE;gBAC/CqF,KAAK,IAAI,CAACtG,IAAI;gBACduG,iBAAiB;YACnB;YAEA,KAAK,IAAIC,eAAeH,aAAc;gBACpC,IAAIrE,UAAU,MAAM1B,QAAQ+C,IAAI,CAACrD,KAAK0D,IAAI,CAAC,IAAI,CAAC1D,IAAI,EAAEwG,cAAc,IAAI;gBAExEtF,SAASqE,IAAI,CAACvD;YAChB;YAEA,IAAI,CAACd,QAAQ,GAAGA;QAClB,OAAO;YACL,IAAI,CAACA,QAAQ,GAAG;gBAAC,MAAMZ,QAAQ+C,IAAI,CAAC,IAAI,CAACrD,IAAI,EAAE,IAAI;aAAE;QACvD;QAEA,IAAI,CAACwC,YAAY;QACjB,IAAI,CAACC,kBAAkB;QAEvB,OAAO,IAAI,CAACvB,QAAQ;IACtB;IAEUsB,eAAqB;QAC7B,IAAI,CAACtB,QAAQ,CAACuF,IAAI,CAACvG;IACrB;IAEUuC,qBAA2B;QACnC,IAAI,CAACnB,YAAY,GAAGb,sBAAsBiG,aAAa,CAAC,IAAI;QAC5D,IAAI,CAACnF,eAAe,GAAGd,sBAAsBiG,aAAa,CAAC,IAAI,EAAE;YAC/DC,4BAA4B;QAC9B;QACA,IAAI,CAACnF,eAAe,GAAGf,sBAAsBiG,aAAa,CAAC,IAAI,EAAE;YAC/DE,wBAAwB;YACxBC,8BAA8B;QAChC;QACA,IAAI,CAACpF,kBAAkB,GAAG,IAAI,CAACD,eAAe,CAACsF,WAAW,CAAC;YACzDC,kBAAkB;QACpB;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/workspace/Workspace.ts"],"sourcesContent":["import {ensureEmptyDirectory, findExistingDirectory, isRootPath} from '@jakubmazanec/fs-utils';\nimport {readFile, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';\nimport glob from 'fast-glob';\nimport fs from 'fs-extra';\nimport json5 from 'json5';\nimport path from 'node:path';\nimport {z} from 'zod';\n\nimport {\n compareProjectPath,\n getPackageJsonWorkspaces,\n getRepositoryBranches,\n getRepositoryUrl,\n} from './internals.js';\nimport {Project} from './Project.js';\nimport {saveWorkspaceConfig} from './saveWorkspaceConfig.js';\nimport {workspaceConfigSchema} from './WorkspaceConfig.js';\nimport {type WorkspaceConfig} from './WorkspaceConfig.js';\nimport {type WorkspaceCreateOptions} from './WorkspaceCreateOptions.js';\nimport {type WorkspaceCreateProjectOptions} from './WorkspaceCreateProjectOptions.js';\nimport {WorkspaceDependencies} from './WorkspaceDependencies.js';\nimport {WorkspaceError} from './WorkspaceError.js';\nimport {type WorkspaceFindAndReadOptions} from './WorkspaceFindAndReadOptions.js';\nimport type {WorkspaceOptions} from './WorkspaceOptions.js';\nimport {type WorkspacePackageJson} from './WorkspacePackageJson.js';\nimport type {WorkspaceProjectGlobs} from './WorkspaceProjectGlobs.js';\nimport {type WorkspaceProjects} from './WorkspaceProjects.js';\nimport {type WorkspaceRepository} from './WorkspaceRepository.js';\nimport {type WorkspaceUpdateOptions} from './WorkspaceUpdateOptions.js';\nimport {CARSON_CONFIG_DIRECTORY, WORKSPACE_CONFIG_FILENAME} from '../constants.js';\nimport {applyTemplateRenders} from '../template/applyTemplateRenders.js';\nimport {renderCarsonTemplate} from '../template/renderCarsonTemplate.js';\n\n/**\n * Workspace represent a directory, usually a git repository, that contains {@link Project} instances.\n *\n * @typeParam M If true, the workspace is multi-project workspace (so-called \"monorepo\").\n */\nexport class Workspace<M extends boolean = true> {\n /** Workspace path. */\n readonly path: string;\n\n /** Does the workspace contain a multiple projects? */\n readonly isMultiProject: M;\n\n /** Globs used to find projects. */\n projectGlobs: WorkspaceProjectGlobs<M>;\n\n /** Workspace projects. */\n projects: WorkspaceProjects<M>;\n\n /** Workspace configuration; if it's not found, the default is an empty object. */\n config: WorkspaceConfig;\n\n /** Parsed workspace `package.json` file (if the workspace contains multiple projects); if it's not found, the default is an empty object. */\n packageJson: WorkspacePackageJson<M>;\n\n /** Workspace git repository. */\n repository?: WorkspaceRepository;\n\n /** Dependencies of all projects. */\n dependencies: WorkspaceDependencies<M> = [] as unknown as WorkspaceDependencies<M>;\n\n /** Development dependencies of all projects. */\n devDependencies: WorkspaceDependencies<M> = [] as unknown as WorkspaceDependencies<M>;\n\n /** All dependencies of all projects and workspace dependencies. */\n allDependencies: WorkspaceDependencies<M> = [] as unknown as WorkspaceDependencies<M>;\n\n /** Versions of each dependency. */\n dependencyVersions: Record<string, string[]> = {};\n\n /** Errors found during reading from the file system. */\n errors: Array<InstanceType<typeof WorkspaceError>> = [];\n\n constructor(options: WorkspaceOptions<M>) {\n this.path = options.path;\n\n if (typeof options.isMultiProject === 'undefined' || options.isMultiProject) {\n this.isMultiProject = true as M;\n\n let projectGlobOption = (options as WorkspaceOptions<true>).projectGlobs;\n\n if (projectGlobOption) {\n this.projectGlobs = projectGlobOption as WorkspaceProjectGlobs<M>;\n } else {\n this.projectGlobs = [] as string[] as WorkspaceProjectGlobs<M>;\n }\n\n this.projects = [] as Array<Project<M>> as WorkspaceProjects<M>;\n\n let {projects} = options as WorkspaceOptions<true>;\n\n if (projects) {\n this.addProjects(projects.map((project) => new Project({...project, workspace: this})));\n }\n\n let packageJsonOption = (options as WorkspaceOptions<true>).packageJson;\n\n if (packageJsonOption) {\n this.packageJson = packageJsonOption as M extends true ? PackageJson : null;\n } else {\n let emptyPackageJson: PackageJson = {};\n\n this.packageJson = emptyPackageJson as M extends true ? PackageJson : null;\n }\n } else {\n this.isMultiProject = false as M;\n this.projectGlobs = null as M extends true ? string[] : null;\n this.packageJson = null as M extends true ? PackageJson : null;\n this.projects = [] as Array<Project<M>> as WorkspaceProjects<M>;\n\n let {projects} = options as WorkspaceOptions<false>;\n\n if (projects) {\n this.addProjects(projects.map((project) => new Project({...project, workspace: this})));\n }\n }\n\n let configOption = options.config;\n\n if (configOption) {\n this.config = configOption;\n } else {\n let emptyWorkspaceConfig: WorkspaceConfig = {};\n\n this.config = emptyWorkspaceConfig;\n }\n\n if (options.repository) {\n this.repository = options.repository;\n }\n\n if (options.errors) {\n this.errors = options.errors;\n }\n\n // add missing project globs\n if (this.isMultiProject && !(this.projectGlobs as string[]).length) {\n let packageJsonWorkspaces = getPackageJsonWorkspaces(this.packageJson as PackageJson);\n\n if (packageJsonWorkspaces) {\n this.projectGlobs = [...packageJsonWorkspaces] as M extends true ? string[] : null;\n }\n }\n\n this.sortProjects();\n this.updateDependencies();\n }\n\n /**\n * Creates new workspace within the file system.\n *\n * @param options Options.\n * @returns The new workspace.\n */\n static async create({args, path: workspacePath, templateId}: WorkspaceCreateOptions) {\n // TODO: test that workspace returned by this method has the same value of isMultiProject when the same workspace is after its creation re-read with .read()\n let workspace = new this({\n path: workspacePath,\n config: {\n template: templateId,\n },\n });\n\n try {\n await ensureEmptyDirectory(workspace.path);\n } catch {\n throw new WorkspaceError('WORKSPACE_PATH_NOT_EMPTY', {\n messageParameters: [workspace.path],\n data: {\n path: workspace.path,\n },\n });\n }\n\n await saveWorkspaceConfig({\n workspacePath: workspace.path,\n workspaceConfig: {template: templateId},\n });\n\n let templateRenders = await renderCarsonTemplate({\n templateId,\n templateData: {\n workspace,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: workspace.path,\n ignoreStrategies: ['check'],\n });\n\n return Workspace.read(workspace.path);\n }\n\n static async read(workspacePath: string): Promise<Workspace | Workspace<false>> {\n let resolvedWorkspacePath = path.resolve(workspacePath);\n\n if (!(await fs.pathExists(resolvedWorkspacePath))) {\n throw new WorkspaceError('NO_SUCH_WORKSPACE_PATH', {\n messageParameters: [resolvedWorkspacePath],\n data: {\n path: resolvedWorkspacePath,\n },\n });\n }\n\n // load root package.json\n let rootPackageJsonPath = path.join(resolvedWorkspacePath, 'package.json');\n let doesRootPackageJsonExist = await fs.pathExists(rootPackageJsonPath);\n let rootPackageJson: PackageJson | z.ZodError;\n\n if (doesRootPackageJsonExist) {\n rootPackageJson = await readFile(rootPackageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n rootPackageJson = {};\n }\n\n if (rootPackageJson instanceof z.ZodError) {\n rootPackageJson = {};\n }\n\n // add projects\n let projectGlobs = getPackageJsonWorkspaces(rootPackageJson);\n\n // we're dealing with single-project workspace\n if (!projectGlobs) {\n let workspace = new this({\n path: resolvedWorkspacePath,\n isMultiProject: false,\n });\n\n await workspace.read();\n await workspace.readProjects();\n\n return workspace;\n }\n\n // assemble workspace options\n let workspace = new this({\n path: resolvedWorkspacePath,\n isMultiProject: true,\n projectGlobs,\n packageJson: rootPackageJson,\n });\n\n await workspace.read();\n await workspace.readProjects();\n\n return workspace;\n }\n\n /**\n * Traverses file system up from the search path and tries to find a directory that is a root of a workspace.\n */\n static async find(searchPath: string): Promise<string | undefined> {\n let startingPath = await findExistingDirectory(path.resolve(searchPath));\n let currentPath = startingPath;\n let singlePackageWorkspacePath: string | undefined;\n let multiPackageWorkspacePath: string | undefined;\n\n while (\n !(isRootPath(currentPath) || (singlePackageWorkspacePath && multiPackageWorkspacePath))\n ) {\n let packageJsonPath = path.join(currentPath, 'package.json');\n let doesPackageJsonExist = await fs.pathExists(packageJsonPath);\n\n if (doesPackageJsonExist) {\n let packageJson = await readFile(packageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n\n if (!(packageJson instanceof Error)) {\n let projectGlobs = getPackageJsonWorkspaces(packageJson);\n\n if (projectGlobs?.length) {\n multiPackageWorkspacePath ??= currentPath;\n } else {\n singlePackageWorkspacePath ??= currentPath;\n }\n }\n }\n\n currentPath = path.dirname(currentPath);\n }\n\n if (multiPackageWorkspacePath) {\n return multiPackageWorkspacePath;\n } else if (singlePackageWorkspacePath) {\n return singlePackageWorkspacePath;\n }\n\n return undefined;\n }\n\n /**\n * Traverses file system up from the search path and tries to find and read a workspace.\n */\n static async findAndRead<O extends WorkspaceFindAndReadOptions | undefined = undefined>(\n searchPath: string,\n options?: O,\n ): Promise<\n O extends undefined\n ? Workspace | Workspace<false> | undefined\n : NonNullable<O>['throwIfNotFound'] extends true\n ? Workspace | Workspace<false>\n : Workspace | Workspace<false> | undefined\n > {\n let workspacePath = await Workspace.find(searchPath);\n\n if (workspacePath) {\n return Workspace.read(workspacePath) as Promise<\n O extends undefined\n ? Workspace | Workspace<false> | undefined\n : NonNullable<O>['throwIfNotFound'] extends true\n ? Workspace | Workspace<false>\n : Workspace | Workspace<false> | undefined\n >;\n } else if (options?.throwIfNotFound) {\n throw new WorkspaceError('NO_WORKSPACE_FOUND', {\n messageParameters: [searchPath],\n data: {\n path: searchPath,\n },\n });\n }\n\n return undefined as unknown as Promise<\n O extends undefined\n ? Workspace | Workspace<false> | undefined\n : NonNullable<O>['throwIfNotFound'] extends true\n ? Workspace | Workspace<false>\n : Workspace | Workspace<false> | undefined\n >;\n }\n\n async read(): Promise<this> {\n if (!(await fs.pathExists(this.path))) {\n throw new WorkspaceError('NO_SUCH_WORKSPACE_PATH', {\n messageParameters: [this.path],\n data: {\n path: this.path,\n },\n });\n }\n\n let errors: Array<InstanceType<typeof WorkspaceError>> = [];\n let repositoryUrl = await getRepositoryUrl(this.path);\n let repositoryBranches = await getRepositoryBranches(this.path);\n\n // load workspace config\n let workspaceConfigPath = path.join(\n this.path,\n CARSON_CONFIG_DIRECTORY,\n WORKSPACE_CONFIG_FILENAME,\n );\n let doesWorkspaceConfigExist = await fs.pathExists(workspaceConfigPath);\n let workspaceConfig: WorkspaceConfig | z.ZodError;\n\n if (doesWorkspaceConfigExist) {\n workspaceConfig = await readFile(workspaceConfigPath, workspaceConfigSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n workspaceConfig = {};\n }\n\n if (workspaceConfig instanceof z.ZodError) {\n let zodError = workspaceConfig;\n let workspaceError = new WorkspaceError('INVALID_WORKSPACE_CONFIG', {\n messageParameters: [workspaceConfigPath],\n data: {\n path: workspaceConfigPath,\n zodIssues: zodError.issues,\n },\n });\n\n errors.push(workspaceError);\n\n workspaceConfig = {};\n }\n\n if (this.isMultiProject) {\n // load root package.json\n let rootPackageJsonPath = path.join(this.path, 'package.json');\n let doesRootPackageJsonExist = await fs.pathExists(rootPackageJsonPath);\n let rootPackageJson: PackageJson | z.ZodError;\n\n if (doesRootPackageJsonExist) {\n rootPackageJson = await readFile(rootPackageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n rootPackageJson = {};\n }\n\n if (rootPackageJson instanceof z.ZodError) {\n let zodError = rootPackageJson;\n let workspaceError = new WorkspaceError('INVALID_PACKAGE_JSON', {\n messageParameters: [rootPackageJsonPath],\n data: {\n path: rootPackageJsonPath,\n zodIssues: zodError.issues,\n },\n });\n\n errors.push(workspaceError);\n\n rootPackageJson = {};\n }\n\n let projectGlobs = getPackageJsonWorkspaces(rootPackageJson);\n\n this.projectGlobs = (projectGlobs ?? []) as WorkspaceProjectGlobs<M>;\n this.packageJson = rootPackageJson as WorkspacePackageJson<M>;\n this.config = workspaceConfig;\n this.errors = errors;\n\n if (repositoryUrl) {\n this.repository = {\n url: repositoryUrl,\n branches: repositoryBranches ?? [],\n };\n } else if (repositoryBranches) {\n this.repository = {\n branches: repositoryBranches,\n };\n }\n\n await this.readProjects();\n\n return this;\n }\n\n // we're dealing with single-project workspace\n this.config = workspaceConfig;\n this.errors = errors;\n\n if (repositoryUrl) {\n this.repository = {\n url: repositoryUrl,\n branches: repositoryBranches ?? [],\n };\n } else if (repositoryBranches) {\n this.repository = {\n branches: repositoryBranches,\n };\n }\n\n await this.readProjects();\n\n return this;\n }\n\n async update({args}: WorkspaceUpdateOptions): Promise<this> {\n if (!this.config.template) {\n throw new WorkspaceError('MISSING_CARSON_TEMPLATE_ID', {\n messageParameters: [\n path.join(this.path, CARSON_CONFIG_DIRECTORY, WORKSPACE_CONFIG_FILENAME),\n ],\n });\n }\n\n let templateRenders = await renderCarsonTemplate({\n templateId: this.config.template,\n templateData: {\n workspace: this,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: this.path,\n ignoreStrategies: ['create'],\n });\n\n await this.read();\n\n return this;\n }\n\n getProject(projectName: Project<M> | string): Project<M> | undefined {\n for (let project of this.projects) {\n if (project.name === projectName || project === projectName) {\n return project;\n }\n }\n\n return undefined;\n }\n\n async createProject({\n templateId,\n projectPath,\n projectName,\n args,\n }: WorkspaceCreateProjectOptions): Promise<Project<M>> {\n let resolvedProjectPath = path.resolve(projectPath);\n\n if (this.projects.some((project) => resolvedProjectPath === project.path)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_PATH', {\n messageParameters: [resolvedProjectPath],\n });\n }\n\n if (this.projects.some((project) => projectName === project.name)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_NAME', {messageParameters: [projectName]});\n }\n\n if (!this.isMultiProject && this.projects.length >= 1) {\n throw new WorkspaceError('TOO_MANY_PROJECTS');\n }\n\n if (!this.isMultiProject && projectPath !== this.path) {\n throw new WorkspaceError('PATH_MISMATCH');\n }\n\n let newProject = await Project.create({\n templateId,\n projectPath,\n projectName,\n args,\n workspace: this,\n });\n\n this.addProject(newProject);\n\n return newProject;\n }\n\n addProject(newProject: Project<M>): this {\n if (this.projects.some((project) => newProject.path === project.path)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_PATH', {\n messageParameters: [newProject.path],\n });\n }\n\n if (this.projects.some((project) => newProject.name === project.name)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_NAME', {messageParameters: [newProject.name]});\n }\n\n if (!this.isMultiProject && this.projects.length >= 1) {\n throw new WorkspaceError('TOO_MANY_PROJECTS');\n }\n\n if (!this.isMultiProject && newProject.path !== this.path) {\n throw new WorkspaceError('PATH_MISMATCH');\n }\n\n this.projects.push(newProject);\n this.sortProjects();\n this.updateDependencies();\n\n return this;\n }\n\n addProjects(newProjects: Array<Project<M>>): this {\n for (let newProject of newProjects) {\n if (this.projects.some((project) => newProject.path === project.path)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_PATH', {\n messageParameters: [newProject.path],\n });\n }\n\n if (this.projects.some((project) => newProject.name === project.name)) {\n throw new WorkspaceError('DUPLICATE_PROJECT_NAME', {messageParameters: [newProject.name]});\n }\n\n if (!this.isMultiProject && this.projects.length >= 1) {\n throw new WorkspaceError('TOO_MANY_PROJECTS');\n }\n\n if (!this.isMultiProject && newProject.path !== this.path) {\n throw new WorkspaceError('PATH_MISMATCH');\n }\n\n this.projects.push(newProject);\n }\n\n this.sortProjects();\n this.updateDependencies();\n\n return this;\n }\n\n async readProjects(): Promise<Array<Project<M>>> {\n if (this.projectGlobs) {\n let projects: Array<Project<M>> = [];\n let packagePaths = await glob(this.projectGlobs, {\n cwd: this.path,\n onlyDirectories: true,\n });\n\n for (let packagePath of packagePaths) {\n let project = await Project.read(path.join(this.path, packagePath), this);\n\n projects.push(project);\n }\n\n this.projects = projects;\n } else {\n this.projects = [await Project.read(this.path, this)];\n }\n\n this.sortProjects();\n this.updateDependencies();\n\n return this.projects;\n }\n\n protected sortProjects(): void {\n this.projects.sort(compareProjectPath);\n }\n\n protected updateDependencies(): void {\n this.dependencies = WorkspaceDependencies.fromWorkspace(this);\n this.devDependencies = WorkspaceDependencies.fromWorkspace(this, {\n includeOnlyDevDependencies: true,\n });\n this.allDependencies = WorkspaceDependencies.fromWorkspace(this, {\n includeDevDependencies: true,\n includeWorkspaceDependencies: true,\n });\n this.dependencyVersions = this.allDependencies.getVersions({\n useExactVersions: true,\n });\n }\n}\n"],"names":["ensureEmptyDirectory","findExistingDirectory","isRootPath","readFile","packageJsonSchema","glob","fs","json5","path","z","compareProjectPath","getPackageJsonWorkspaces","getRepositoryBranches","getRepositoryUrl","Project","saveWorkspaceConfig","workspaceConfigSchema","WorkspaceDependencies","WorkspaceError","CARSON_CONFIG_DIRECTORY","WORKSPACE_CONFIG_FILENAME","applyTemplateRenders","renderCarsonTemplate","Workspace","isMultiProject","projectGlobs","projects","config","packageJson","repository","dependencies","devDependencies","allDependencies","dependencyVersions","errors","constructor","options","projectGlobOption","addProjects","map","project","workspace","packageJsonOption","emptyPackageJson","configOption","emptyWorkspaceConfig","length","packageJsonWorkspaces","sortProjects","updateDependencies","create","args","workspacePath","templateId","template","messageParameters","data","workspaceConfig","templateRenders","templateData","ignoreStrategies","read","resolvedWorkspacePath","resolve","pathExists","rootPackageJsonPath","join","doesRootPackageJsonExist","rootPackageJson","parser","rawString","parse","ZodError","readProjects","find","searchPath","startingPath","currentPath","singlePackageWorkspacePath","multiPackageWorkspacePath","packageJsonPath","doesPackageJsonExist","Error","dirname","undefined","findAndRead","throwIfNotFound","repositoryUrl","repositoryBranches","workspaceConfigPath","doesWorkspaceConfigExist","zodError","workspaceError","zodIssues","issues","push","url","branches","update","getProject","projectName","name","createProject","projectPath","resolvedProjectPath","some","newProject","addProject","newProjects","packagePaths","cwd","onlyDirectories","packagePath","sort","fromWorkspace","includeOnlyDevDependencies","includeDevDependencies","includeWorkspaceDependencies","getVersions","useExactVersions"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * {@link Workspace.create | Workspace.create} options parameter.
2
+ * {@link Workspace.create} options parameter.
3
3
  */
4
4
  export type WorkspaceCreateOptions = {
5
5
  path: string;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * {@link Workspace.create | Workspace.create} options parameter.
2
+ * {@link Workspace.create} options parameter.
3
3
  */ export { };
4
4
 
5
5
  //# sourceMappingURL=WorkspaceCreateOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workspace/WorkspaceCreateOptions.ts"],"sourcesContent":["/**\n * {@link Workspace.create | Workspace.create} options parameter.\n */\nexport type WorkspaceCreateOptions = {\n path: string;\n templateId: string;\n args: Record<string, unknown>;\n};\n"],"names":[],"mappings":"AAAA;;CAEC,GACD,WAIE"}
1
+ {"version":3,"sources":["../../src/workspace/WorkspaceCreateOptions.ts"],"sourcesContent":["/**\n * {@link Workspace.create} options parameter.\n */\nexport type WorkspaceCreateOptions = {\n path: string;\n templateId: string;\n args: Record<string, unknown>;\n};\n"],"names":[],"mappings":"AAAA;;CAEC,GACD,WAIE"}
@@ -3,5 +3,5 @@
3
3
  */
4
4
  export type WorkspaceRepository = {
5
5
  branches: string[];
6
- url: string;
6
+ url?: string;
7
7
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workspace/WorkspaceRepository.ts"],"sourcesContent":["/**\n * A workspace repository.\n */\nexport type WorkspaceRepository = {\n branches: string[];\n url: string;\n};\n"],"names":[],"mappings":"AAAA;;CAEC,GACD,WAGE"}
1
+ {"version":3,"sources":["../../src/workspace/WorkspaceRepository.ts"],"sourcesContent":["/**\n * A workspace repository.\n */\nexport type WorkspaceRepository = {\n branches: string[];\n url?: string;\n};\n"],"names":[],"mappings":"AAAA;;CAEC,GACD,WAGE"}
@@ -12,6 +12,12 @@ export async function getRepositoryBranches(repositoryPath) {
12
12
  '-r'
13
13
  ]);
14
14
  repositoryBranches = branchSummary.all.map((branch)=>branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''));
15
+ if (!repositoryBranches.length) {
16
+ branchSummary = await git.branch([
17
+ '-a'
18
+ ]);
19
+ repositoryBranches = branchSummary.all.map((branch)=>branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''));
20
+ }
15
21
  } catch (error) {
16
22
  // no-op
17
23
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/workspace/internals/getRepositoryBranches.ts"],"sourcesContent":["import {simpleGit} from 'simple-git';\n\nconst REMOTE_NAME_PREFIX_REGEXP = /^[^/]*\\//iu;\n\nexport async function getRepositoryBranches(repositoryPath: string): Promise<string[] | undefined> {\n let repositoryBranches: string[] | undefined;\n\n try {\n let git = simpleGit({\n baseDir: repositoryPath,\n binary: 'git',\n maxConcurrentProcesses: 1,\n });\n\n let branchSummary = await git.branch(['-r']);\n\n repositoryBranches = branchSummary.all.map((branch) =>\n branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''),\n );\n } catch (error) {\n // no-op\n }\n\n return repositoryBranches;\n}\n"],"names":["simpleGit","REMOTE_NAME_PREFIX_REGEXP","getRepositoryBranches","repositoryPath","repositoryBranches","git","baseDir","binary","maxConcurrentProcesses","branchSummary","branch","all","map","replace","error"],"mappings":"AAAA,SAAQA,SAAS,QAAO,aAAa;AAErC,MAAMC,4BAA4B;AAElC,OAAO,eAAeC,sBAAsBC,cAAsB;IAChE,IAAIC;IAEJ,IAAI;QACF,IAAIC,MAAML,UAAU;YAClBM,SAASH;YACTI,QAAQ;YACRC,wBAAwB;QAC1B;QAEA,IAAIC,gBAAgB,MAAMJ,IAAIK,MAAM,CAAC;YAAC;SAAK;QAE3CN,qBAAqBK,cAAcE,GAAG,CAACC,GAAG,CAAC,CAACF,SAC1CA,OAAOG,OAAO,CAACZ,2BAA2B;IAE9C,EAAE,OAAOa,OAAO;IACd,QAAQ;IACV;IAEA,OAAOV;AACT"}
1
+ {"version":3,"sources":["../../../src/workspace/internals/getRepositoryBranches.ts"],"sourcesContent":["import {simpleGit} from 'simple-git';\n\nconst REMOTE_NAME_PREFIX_REGEXP = /^[^/]*\\//iu;\n\nexport async function getRepositoryBranches(repositoryPath: string): Promise<string[] | undefined> {\n let repositoryBranches: string[] | undefined;\n\n try {\n let git = simpleGit({\n baseDir: repositoryPath,\n binary: 'git',\n maxConcurrentProcesses: 1,\n });\n\n let branchSummary = await git.branch(['-r']);\n\n repositoryBranches = branchSummary.all.map((branch) =>\n branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''),\n );\n\n if (!repositoryBranches.length) {\n branchSummary = await git.branch(['-a']);\n\n repositoryBranches = branchSummary.all.map((branch) =>\n branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''),\n );\n }\n } catch (error) {\n // no-op\n }\n\n return repositoryBranches;\n}\n"],"names":["simpleGit","REMOTE_NAME_PREFIX_REGEXP","getRepositoryBranches","repositoryPath","repositoryBranches","git","baseDir","binary","maxConcurrentProcesses","branchSummary","branch","all","map","replace","length","error"],"mappings":"AAAA,SAAQA,SAAS,QAAO,aAAa;AAErC,MAAMC,4BAA4B;AAElC,OAAO,eAAeC,sBAAsBC,cAAsB;IAChE,IAAIC;IAEJ,IAAI;QACF,IAAIC,MAAML,UAAU;YAClBM,SAASH;YACTI,QAAQ;YACRC,wBAAwB;QAC1B;QAEA,IAAIC,gBAAgB,MAAMJ,IAAIK,MAAM,CAAC;YAAC;SAAK;QAE3CN,qBAAqBK,cAAcE,GAAG,CAACC,GAAG,CAAC,CAACF,SAC1CA,OAAOG,OAAO,CAACZ,2BAA2B;QAG5C,IAAI,CAACG,mBAAmBU,MAAM,EAAE;YAC9BL,gBAAgB,MAAMJ,IAAIK,MAAM,CAAC;gBAAC;aAAK;YAEvCN,qBAAqBK,cAAcE,GAAG,CAACC,GAAG,CAAC,CAACF,SAC1CA,OAAOG,OAAO,CAACZ,2BAA2B;QAE9C;IACF,EAAE,OAAOc,OAAO;IACd,QAAQ;IACV;IAEA,OAAOX;AACT"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson",
3
- "version": "0.1.0-6cee770",
3
+ "version": "0.1.0-8a0a4d5",
4
4
  "description": "Tool for managing workspace and project configuration.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/jakubmazanec/js-tools",
7
+ "url": "git@github.com:jakubmazanec/js-tools.git",
8
8
  "directory": "packages/carson"
9
9
  },
10
10
  "license": "AGPL-3.0-only",
@@ -21,7 +21,7 @@
21
21
  ],
22
22
  "scripts": {
23
23
  "build": "swc src -d dist && tsc",
24
- "clean": "del-cli dist *.tsbuildinfo",
24
+ "clean": "del-cli coverage dist *.tsbuildinfo",
25
25
  "develop": "swc src -d dist --watch",
26
26
  "document": "typedoc --options typedoc.config.cjs",
27
27
  "format": "prettier . --write --ignore-unknown --ignore-path ../../.prettierignore",
@@ -31,13 +31,13 @@
31
31
  "typecheck": "tsc --project tsconfig.typecheck.json"
32
32
  },
33
33
  "dependencies": {
34
- "@jakubmazanec/args": "1.0.1-6cee770",
35
- "@jakubmazanec/cli": "0.1.0-6cee770",
36
- "@jakubmazanec/error": "2.0.1-6cee770",
37
- "@jakubmazanec/fs-utils": "0.1.0-6cee770",
38
- "@jakubmazanec/template": "1.0.1-6cee770",
39
- "@jakubmazanec/ts-utils": "2.1.0-6cee770",
40
- "@jakubmazanec/zod-utils": "1.0.0-6cee770",
34
+ "@jakubmazanec/args": "1.0.1-8a0a4d5",
35
+ "@jakubmazanec/cli": "0.1.0-8a0a4d5",
36
+ "@jakubmazanec/error": "2.0.1-8a0a4d5",
37
+ "@jakubmazanec/fs-utils": "0.1.0-8a0a4d5",
38
+ "@jakubmazanec/template": "1.0.1-8a0a4d5",
39
+ "@jakubmazanec/ts-utils": "2.1.0-8a0a4d5",
40
+ "@jakubmazanec/zod-utils": "1.0.0-8a0a4d5",
41
41
  "chalk": "^5.2.0",
42
42
  "diff": "^5.1.0",
43
43
  "fast-glob": "^3.2.11",
@@ -61,7 +61,7 @@ export function CreateWorkspace({args}: CreateWorkspaceProps) {
61
61
 
62
62
  return (
63
63
  <Box flexDirection="column">
64
- <Text>{`Creating workspace at ${chalk[colors.highlighted](path)}.`}</Text>
64
+ <Text>{`Creating workspace at ${chalk[colors.info](workspacePath)}.`}</Text>
65
65
 
66
66
  <CreateWorkspaceInput
67
67
  values={createWorkspaceInputResult}
@@ -426,6 +426,10 @@ export class Workspace<M extends boolean = true> {
426
426
  url: repositoryUrl,
427
427
  branches: repositoryBranches ?? [],
428
428
  };
429
+ } else if (repositoryBranches) {
430
+ this.repository = {
431
+ branches: repositoryBranches,
432
+ };
429
433
  }
430
434
 
431
435
  await this.readProjects();
@@ -442,6 +446,10 @@ export class Workspace<M extends boolean = true> {
442
446
  url: repositoryUrl,
443
447
  branches: repositoryBranches ?? [],
444
448
  };
449
+ } else if (repositoryBranches) {
450
+ this.repository = {
451
+ branches: repositoryBranches,
452
+ };
445
453
  }
446
454
 
447
455
  await this.readProjects();
@@ -1,5 +1,5 @@
1
1
  /**
2
- * {@link Workspace.create | Workspace.create} options parameter.
2
+ * {@link Workspace.create} options parameter.
3
3
  */
4
4
  export type WorkspaceCreateOptions = {
5
5
  path: string;
@@ -3,5 +3,5 @@
3
3
  */
4
4
  export type WorkspaceRepository = {
5
5
  branches: string[];
6
- url: string;
6
+ url?: string;
7
7
  };
@@ -17,6 +17,14 @@ export async function getRepositoryBranches(repositoryPath: string): Promise<str
17
17
  repositoryBranches = branchSummary.all.map((branch) =>
18
18
  branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''),
19
19
  );
20
+
21
+ if (!repositoryBranches.length) {
22
+ branchSummary = await git.branch(['-a']);
23
+
24
+ repositoryBranches = branchSummary.all.map((branch) =>
25
+ branch.replace(REMOTE_NAME_PREFIX_REGEXP, ''),
26
+ );
27
+ }
20
28
  } catch (error) {
21
29
  // no-op
22
30
  }