@jakubmazanec/carson 0.1.1-next.121ef1e → 0.1.2-20482c1

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.
@@ -8,6 +8,14 @@ export const updateWorkspaceCommand = new Command('update workspace', async (arg
8
8
  let workspace = await Workspace.findAndRead(resolvedPath, {
9
9
  throwIfNotFound: true
10
10
  });
11
+ if (workspace.errors[0]) {
12
+ throw workspace.errors[0];
13
+ }
14
+ for (let project of workspace.projects){
15
+ if (project.errors[0]) {
16
+ throw project.errors[0];
17
+ }
18
+ }
11
19
  await program.renderElement(/*#__PURE__*/ _jsx(UpdateWorkspace, {
12
20
  workspace: workspace,
13
21
  args: args
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/update-workspace/updateWorkspaceCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport path from 'node:path';\n\nimport {UpdateWorkspace} from './UpdateWorkspace.js';\nimport {Workspace} from '../../workspace.js';\n\nexport const updateWorkspaceCommand = new Command(\n 'update workspace',\n async (args, program) => {\n let resolvedPath = path.resolve(process.cwd(), args.options.path ?? '');\n let workspace = await Workspace.findAndRead(resolvedPath, {throwIfNotFound: true});\n\n await program.renderElement(<UpdateWorkspace workspace={workspace} args={args} />);\n },\n {\n description: 'Updates files in a workspace.',\n options: {\n path: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","path","UpdateWorkspace","Workspace","updateWorkspaceCommand","args","program","resolvedPath","resolve","process","cwd","options","workspace","findAndRead","throwIfNotFound","renderElement","description","type"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,OAAOC,UAAU,YAAY;AAE7B,SAAQC,eAAe,QAAO,uBAAuB;AACrD,SAAQC,SAAS,QAAO,qBAAqB;AAE7C,OAAO,MAAMC,yBAAyB,IAAIJ,QACxC,oBACA,OAAOK,MAAMC;IACX,IAAIC,eAAeN,KAAKO,OAAO,CAACC,QAAQC,GAAG,IAAIL,KAAKM,OAAO,CAACV,IAAI,IAAI;IACpE,IAAIW,YAAY,MAAMT,UAAUU,WAAW,CAACN,cAAc;QAACO,iBAAiB;IAAI;IAEhF,MAAMR,QAAQS,aAAa,eAAC,KAACb;QAAgBU,WAAWA;QAAWP,MAAMA;;AAC3E,GACA;IACEW,aAAa;IACbL,SAAS;QACPV,MAAM;YACJgB,MAAM;QACR;IACF;AACF,GACA"}
1
+ {"version":3,"sources":["../../../src/commands/update-workspace/updateWorkspaceCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport path from 'node:path';\n\nimport {UpdateWorkspace} from './UpdateWorkspace.js';\nimport {Workspace} from '../../workspace.js';\n\nexport const updateWorkspaceCommand = new Command(\n 'update workspace',\n async (args, program) => {\n let resolvedPath = path.resolve(process.cwd(), args.options.path ?? '');\n let workspace = await Workspace.findAndRead(resolvedPath, {throwIfNotFound: true});\n\n if (workspace.errors[0]) {\n throw workspace.errors[0];\n }\n\n for (let project of workspace.projects) {\n if (project.errors[0]) {\n throw project.errors[0];\n }\n }\n\n await program.renderElement(<UpdateWorkspace workspace={workspace} args={args} />);\n },\n {\n description: 'Updates files in a workspace.',\n options: {\n path: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","path","UpdateWorkspace","Workspace","updateWorkspaceCommand","args","program","resolvedPath","resolve","process","cwd","options","workspace","findAndRead","throwIfNotFound","errors","project","projects","renderElement","description","type"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,OAAOC,UAAU,YAAY;AAE7B,SAAQC,eAAe,QAAO,uBAAuB;AACrD,SAAQC,SAAS,QAAO,qBAAqB;AAE7C,OAAO,MAAMC,yBAAyB,IAAIJ,QACxC,oBACA,OAAOK,MAAMC;IACX,IAAIC,eAAeN,KAAKO,OAAO,CAACC,QAAQC,GAAG,IAAIL,KAAKM,OAAO,CAACV,IAAI,IAAI;IACpE,IAAIW,YAAY,MAAMT,UAAUU,WAAW,CAACN,cAAc;QAACO,iBAAiB;IAAI;IAEhF,IAAIF,UAAUG,MAAM,CAAC,EAAE,EAAE;QACvB,MAAMH,UAAUG,MAAM,CAAC,EAAE;IAC3B;IAEA,KAAK,IAAIC,WAAWJ,UAAUK,QAAQ,CAAE;QACtC,IAAID,QAAQD,MAAM,CAAC,EAAE,EAAE;YACrB,MAAMC,QAAQD,MAAM,CAAC,EAAE;QACzB;IACF;IAEA,MAAMT,QAAQY,aAAa,eAAC,KAAChB;QAAgBU,WAAWA;QAAWP,MAAMA;;AAC3E,GACA;IACEc,aAAa;IACbR,SAAS;QACPV,MAAM;YACJmB,MAAM;QACR;IACF;AACF,GACA"}
@@ -1,5 +1,5 @@
1
1
  import { ensureEmptyDirectory, findExistingDirectory, isRootPath } from '@jakubmazanec/fs-utils';
2
- import { readFile, packageJsonSchema } from '@jakubmazanec/zod-utils';
2
+ import { readFile, jsonSchema, packageJsonSchema } from '@jakubmazanec/zod-utils';
3
3
  import glob from 'fast-glob';
4
4
  import fs from 'fs-extra';
5
5
  import json5 from 'json5';
@@ -166,6 +166,20 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
166
166
  }
167
167
  if (rootPackageJson instanceof z.ZodError) {
168
168
  rootPackageJson = {};
169
+ // even if the package.json file has errors, maybe there's still a correct workspace field
170
+ try {
171
+ let rootJson = await readFile(rootPackageJsonPath, jsonSchema, {
172
+ parser: (rawString)=>json5.parse(rawString),
173
+ throwOnZodError: true
174
+ });
175
+ let projectGlobs = getPackageJsonWorkspaces(rootJson);
176
+ // add back to the empty package.json object
177
+ if (projectGlobs) {
178
+ rootPackageJson.workspaces = projectGlobs;
179
+ }
180
+ } catch {
181
+ // no-op
182
+ }
169
183
  }
170
184
  // add projects
171
185
  let projectGlobs = getPackageJsonWorkspaces(rootPackageJson);
@@ -201,7 +215,7 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
201
215
  let packageJsonPath = path.join(currentPath, 'package.json');
202
216
  let doesPackageJsonExist = await fs.pathExists(packageJsonPath);
203
217
  if (doesPackageJsonExist) {
204
- let packageJson = await readFile(packageJsonPath, packageJsonSchema, {
218
+ let packageJson = await readFile(packageJsonPath, jsonSchema, {
205
219
  parser: (rawString)=>json5.parse(rawString)
206
220
  });
207
221
  if (!(packageJson instanceof Error)) {
@@ -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 containsProject,\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 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 await saveWorkspaceConfig({\n workspacePath: workspace.path,\n workspaceConfig: {template: templateId},\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 projectPath = path.join(this.path, packagePath);\n\n if (await containsProject(projectPath)) {\n let project = await Project.read(projectPath, this);\n\n projects.push(project);\n }\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","containsProject","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","templateRenders","templateData","ignoreStrategies","workspaceConfig","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
+ {"version":3,"sources":["../../src/workspace/Workspace.ts"],"sourcesContent":["import {ensureEmptyDirectory, findExistingDirectory, isRootPath} from '@jakubmazanec/fs-utils';\nimport {readFile, jsonSchema, 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 containsProject,\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 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 await saveWorkspaceConfig({\n workspacePath: workspace.path,\n workspaceConfig: {template: templateId},\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 // even if the package.json file has errors, maybe there's still a correct workspace field\n try {\n let rootJson = await readFile(rootPackageJsonPath, jsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n throwOnZodError: true,\n });\n let projectGlobs = getPackageJsonWorkspaces(rootJson);\n\n // add back to the empty package.json object\n if (projectGlobs) {\n rootPackageJson.workspaces = projectGlobs;\n }\n } catch {\n // no-op\n }\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, jsonSchema, {\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 projectPath = path.join(this.path, packagePath);\n\n if (await containsProject(projectPath)) {\n let project = await Project.read(projectPath, this);\n\n projects.push(project);\n }\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","jsonSchema","packageJsonSchema","glob","fs","json5","path","z","compareProjectPath","containsProject","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","templateRenders","templateData","ignoreStrategies","workspaceConfig","read","resolvedWorkspacePath","resolve","pathExists","rootPackageJsonPath","join","doesRootPackageJsonExist","rootPackageJson","parser","rawString","parse","ZodError","rootJson","throwOnZodError","workspaces","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,2 +1,2 @@
1
- import type { PackageJson } from '@jakubmazanec/zod-utils';
2
- export declare function getPackageJsonWorkspaces(packageJson: PackageJson): string[] | undefined;
1
+ import { type Json, type PackageJson } from '@jakubmazanec/zod-utils';
2
+ export declare function getPackageJsonWorkspaces(packageJson: Json | PackageJson): string[] | undefined;
@@ -1,8 +1,29 @@
1
+ import { isPackageJson } from '@jakubmazanec/zod-utils';
2
+ function isStringList(value) {
3
+ if (Array.isArray(value) && value.some((item)=>typeof item === 'string')) {
4
+ return true;
5
+ }
6
+ return false;
7
+ }
8
+ function isNonPrimitive(value) {
9
+ if (typeof value === 'object' && value !== null) {
10
+ return true;
11
+ }
12
+ return false;
13
+ }
1
14
  export function getPackageJsonWorkspaces(packageJson) {
2
- if (Array.isArray(packageJson.workspaces)) {
3
- return packageJson.workspaces;
4
- } else if (packageJson.workspaces?.packages) {
5
- return packageJson.workspaces.packages;
15
+ if (isPackageJson(packageJson)) {
16
+ if (Array.isArray(packageJson.workspaces)) {
17
+ return packageJson.workspaces;
18
+ } else if (packageJson.workspaces?.packages) {
19
+ return packageJson.workspaces.packages;
20
+ }
21
+ } else if (isNonPrimitive(packageJson) && !Array.isArray(packageJson)) {
22
+ if (isStringList(packageJson.workspaces)) {
23
+ return packageJson.workspaces;
24
+ } else if (isNonPrimitive(packageJson.workspaces) && !Array.isArray(packageJson.workspaces) && isStringList(packageJson.workspaces.packages)) {
25
+ return packageJson.workspaces.packages;
26
+ }
6
27
  }
7
28
  return undefined;
8
29
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/workspace/internals/getPackageJsonWorkspaces.ts"],"sourcesContent":["import type {PackageJson} from '@jakubmazanec/zod-utils';\n\nexport function getPackageJsonWorkspaces(packageJson: PackageJson) {\n if (Array.isArray(packageJson.workspaces)) {\n return packageJson.workspaces;\n } else if (packageJson.workspaces?.packages) {\n return packageJson.workspaces.packages;\n }\n\n return undefined;\n}\n"],"names":["getPackageJsonWorkspaces","packageJson","Array","isArray","workspaces","packages","undefined"],"mappings":"AAEA,OAAO,SAASA,yBAAyBC,WAAwB;IAC/D,IAAIC,MAAMC,OAAO,CAACF,YAAYG,UAAU,GAAG;QACzC,OAAOH,YAAYG,UAAU;IAC/B,OAAO,IAAIH,YAAYG,UAAU,EAAEC,UAAU;QAC3C,OAAOJ,YAAYG,UAAU,CAACC,QAAQ;IACxC;IAEA,OAAOC;AACT"}
1
+ {"version":3,"sources":["../../../src/workspace/internals/getPackageJsonWorkspaces.ts"],"sourcesContent":["import {type Json, type PackageJson, isPackageJson} from '@jakubmazanec/zod-utils';\n\nfunction isStringList(value: unknown): value is string[] {\n if (Array.isArray(value) && value.some((item) => typeof item === 'string')) {\n return true;\n }\n\n return false;\n}\n\nfunction isNonPrimitive(value: unknown): value is object {\n if (typeof value === 'object' && value !== null) {\n return true;\n }\n\n return false;\n}\n\nexport function getPackageJsonWorkspaces(packageJson: Json | PackageJson): string[] | undefined {\n if (isPackageJson(packageJson)) {\n if (Array.isArray(packageJson.workspaces)) {\n return packageJson.workspaces;\n } else if (packageJson.workspaces?.packages) {\n return packageJson.workspaces.packages;\n }\n } else if (isNonPrimitive(packageJson) && !Array.isArray(packageJson)) {\n if (isStringList(packageJson.workspaces)) {\n return packageJson.workspaces;\n } else if (\n isNonPrimitive(packageJson.workspaces) &&\n !Array.isArray(packageJson.workspaces) &&\n isStringList(packageJson.workspaces.packages)\n ) {\n return packageJson.workspaces.packages;\n }\n }\n\n return undefined;\n}\n"],"names":["isPackageJson","isStringList","value","Array","isArray","some","item","isNonPrimitive","getPackageJsonWorkspaces","packageJson","workspaces","packages","undefined"],"mappings":"AAAA,SAAqCA,aAAa,QAAO,0BAA0B;AAEnF,SAASC,aAAaC,KAAc;IAClC,IAAIC,MAAMC,OAAO,CAACF,UAAUA,MAAMG,IAAI,CAAC,CAACC,OAAS,OAAOA,SAAS,WAAW;QAC1E,OAAO;IACT;IAEA,OAAO;AACT;AAEA,SAASC,eAAeL,KAAc;IACpC,IAAI,OAAOA,UAAU,YAAYA,UAAU,MAAM;QAC/C,OAAO;IACT;IAEA,OAAO;AACT;AAEA,OAAO,SAASM,yBAAyBC,WAA+B;IACtE,IAAIT,cAAcS,cAAc;QAC9B,IAAIN,MAAMC,OAAO,CAACK,YAAYC,UAAU,GAAG;YACzC,OAAOD,YAAYC,UAAU;QAC/B,OAAO,IAAID,YAAYC,UAAU,EAAEC,UAAU;YAC3C,OAAOF,YAAYC,UAAU,CAACC,QAAQ;QACxC;IACF,OAAO,IAAIJ,eAAeE,gBAAgB,CAACN,MAAMC,OAAO,CAACK,cAAc;QACrE,IAAIR,aAAaQ,YAAYC,UAAU,GAAG;YACxC,OAAOD,YAAYC,UAAU;QAC/B,OAAO,IACLH,eAAeE,YAAYC,UAAU,KACrC,CAACP,MAAMC,OAAO,CAACK,YAAYC,UAAU,KACrCT,aAAaQ,YAAYC,UAAU,CAACC,QAAQ,GAC5C;YACA,OAAOF,YAAYC,UAAU,CAACC,QAAQ;QACxC;IACF;IAEA,OAAOC;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson",
3
- "version": "0.1.1-next.121ef1e",
3
+ "version": "0.1.2-20482c1",
4
4
  "description": "Tool for managing workspace and project configuration.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,13 +31,13 @@
31
31
  "typecheck": "tsc --project tsconfig.typecheck.json"
32
32
  },
33
33
  "dependencies": {
34
- "@jakubmazanec/args": "1.0.2-next.121ef1e",
35
- "@jakubmazanec/cli": "0.1.2-next.121ef1e",
36
- "@jakubmazanec/error": "2.0.3-next.121ef1e",
37
- "@jakubmazanec/fs-utils": "0.1.2-next.121ef1e",
38
- "@jakubmazanec/template": "1.0.3-next.121ef1e",
39
- "@jakubmazanec/ts-utils": "2.1.2-next.121ef1e",
40
- "@jakubmazanec/zod-utils": "1.0.2-next.121ef1e",
34
+ "@jakubmazanec/args": "^1.0.0",
35
+ "@jakubmazanec/cli": "0.1.3-20482c1",
36
+ "@jakubmazanec/error": "^2.0.0",
37
+ "@jakubmazanec/fs-utils": "^0.1.0",
38
+ "@jakubmazanec/template": "^1.0.0",
39
+ "@jakubmazanec/ts-utils": "^2.1.0",
40
+ "@jakubmazanec/zod-utils": "^1.0.0",
41
41
  "chalk": "^5.2.0",
42
42
  "diff": "^5.1.0",
43
43
  "fast-glob": "^3.2.11",
@@ -10,6 +10,16 @@ export const updateWorkspaceCommand = new Command(
10
10
  let resolvedPath = path.resolve(process.cwd(), args.options.path ?? '');
11
11
  let workspace = await Workspace.findAndRead(resolvedPath, {throwIfNotFound: true});
12
12
 
13
+ if (workspace.errors[0]) {
14
+ throw workspace.errors[0];
15
+ }
16
+
17
+ for (let project of workspace.projects) {
18
+ if (project.errors[0]) {
19
+ throw project.errors[0];
20
+ }
21
+ }
22
+
13
23
  await program.renderElement(<UpdateWorkspace workspace={workspace} args={args} />);
14
24
  },
15
25
  {
@@ -1,5 +1,5 @@
1
1
  import {ensureEmptyDirectory, findExistingDirectory, isRootPath} from '@jakubmazanec/fs-utils';
2
- import {readFile, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';
2
+ import {readFile, jsonSchema, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';
3
3
  import glob from 'fast-glob';
4
4
  import fs from 'fs-extra';
5
5
  import json5 from 'json5';
@@ -224,6 +224,22 @@ export class Workspace<M extends boolean = true> {
224
224
 
225
225
  if (rootPackageJson instanceof z.ZodError) {
226
226
  rootPackageJson = {};
227
+
228
+ // even if the package.json file has errors, maybe there's still a correct workspace field
229
+ try {
230
+ let rootJson = await readFile(rootPackageJsonPath, jsonSchema, {
231
+ parser: (rawString: string) => json5.parse<unknown>(rawString),
232
+ throwOnZodError: true,
233
+ });
234
+ let projectGlobs = getPackageJsonWorkspaces(rootJson);
235
+
236
+ // add back to the empty package.json object
237
+ if (projectGlobs) {
238
+ rootPackageJson.workspaces = projectGlobs;
239
+ }
240
+ } catch {
241
+ // no-op
242
+ }
227
243
  }
228
244
 
229
245
  // add projects
@@ -272,7 +288,7 @@ export class Workspace<M extends boolean = true> {
272
288
  let doesPackageJsonExist = await fs.pathExists(packageJsonPath);
273
289
 
274
290
  if (doesPackageJsonExist) {
275
- let packageJson = await readFile(packageJsonPath, packageJsonSchema, {
291
+ let packageJson = await readFile(packageJsonPath, jsonSchema, {
276
292
  parser: (rawString: string) => json5.parse<unknown>(rawString),
277
293
  });
278
294
 
@@ -1,10 +1,38 @@
1
- import type {PackageJson} from '@jakubmazanec/zod-utils';
1
+ import {type Json, type PackageJson, isPackageJson} from '@jakubmazanec/zod-utils';
2
2
 
3
- export function getPackageJsonWorkspaces(packageJson: PackageJson) {
4
- if (Array.isArray(packageJson.workspaces)) {
5
- return packageJson.workspaces;
6
- } else if (packageJson.workspaces?.packages) {
7
- return packageJson.workspaces.packages;
3
+ function isStringList(value: unknown): value is string[] {
4
+ if (Array.isArray(value) && value.some((item) => typeof item === 'string')) {
5
+ return true;
6
+ }
7
+
8
+ return false;
9
+ }
10
+
11
+ function isNonPrimitive(value: unknown): value is object {
12
+ if (typeof value === 'object' && value !== null) {
13
+ return true;
14
+ }
15
+
16
+ return false;
17
+ }
18
+
19
+ export function getPackageJsonWorkspaces(packageJson: Json | PackageJson): string[] | undefined {
20
+ if (isPackageJson(packageJson)) {
21
+ if (Array.isArray(packageJson.workspaces)) {
22
+ return packageJson.workspaces;
23
+ } else if (packageJson.workspaces?.packages) {
24
+ return packageJson.workspaces.packages;
25
+ }
26
+ } else if (isNonPrimitive(packageJson) && !Array.isArray(packageJson)) {
27
+ if (isStringList(packageJson.workspaces)) {
28
+ return packageJson.workspaces;
29
+ } else if (
30
+ isNonPrimitive(packageJson.workspaces) &&
31
+ !Array.isArray(packageJson.workspaces) &&
32
+ isStringList(packageJson.workspaces.packages)
33
+ ) {
34
+ return packageJson.workspaces.packages;
35
+ }
8
36
  }
9
37
 
10
38
  return undefined;