@jakubmazanec/carson 0.1.0 → 0.1.1-2487994

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.
Files changed (33) hide show
  1. package/dist/constants.d.ts +1 -0
  2. package/dist/constants.js +1 -0
  3. package/dist/constants.js.map +1 -1
  4. package/dist/template/applyTemplateRenders.js +1 -1
  5. package/dist/template/applyTemplateRenders.js.map +1 -1
  6. package/dist/template/internals/deleteUsingTemplateRender.js +1 -2
  7. package/dist/template/internals/deleteUsingTemplateRender.js.map +1 -1
  8. package/dist/template/internals/prettify.js +1 -1
  9. package/dist/template/internals/prettify.js.map +1 -1
  10. package/dist/workspace/Project.js +8 -10
  11. package/dist/workspace/Project.js.map +1 -1
  12. package/dist/workspace/Workspace.js +14 -13
  13. package/dist/workspace/Workspace.js.map +1 -1
  14. package/dist/workspace/WorkspaceDependencies.js +9 -16
  15. package/dist/workspace/WorkspaceDependencies.js.map +1 -1
  16. package/dist/workspace/internals/compareSemver.js +2 -3
  17. package/dist/workspace/internals/compareSemver.js.map +1 -1
  18. package/dist/workspace/internals/containsProject.d.ts +1 -0
  19. package/dist/workspace/internals/containsProject.js +14 -0
  20. package/dist/workspace/internals/containsProject.js.map +1 -0
  21. package/dist/workspace/internals/getPackageJsonWorkspaces.js +1 -2
  22. package/dist/workspace/internals/getPackageJsonWorkspaces.js.map +1 -1
  23. package/dist/workspace/internals.d.ts +1 -0
  24. package/dist/workspace/internals.js +1 -0
  25. package/dist/workspace/internals.js.map +1 -1
  26. package/package.json +9 -9
  27. package/src/constants.ts +1 -0
  28. package/src/template/applyTemplateRenders.ts +1 -1
  29. package/src/template/internals/prettify.ts +1 -1
  30. package/src/workspace/Project.ts +2 -2
  31. package/src/workspace/Workspace.ts +12 -7
  32. package/src/workspace/internals/containsProject.ts +16 -0
  33. package/src/workspace/internals.ts +1 -0
@@ -5,3 +5,4 @@ export declare const WORKSPACE_CONFIG_FILENAME = "workspace.json";
5
5
  export declare const SNAPSHOTS_FILENAME = ".snapshots";
6
6
  export declare const TEMPLATES_PATH = "templates";
7
7
  export declare const TEMPLATE_CONFIG_FILENAME = "config.json";
8
+ export declare const PACKAGE_JSON_FILENAME = "package.json";
package/dist/constants.js CHANGED
@@ -8,5 +8,6 @@ export const WORKSPACE_CONFIG_FILENAME = 'workspace.json';
8
8
  export const SNAPSHOTS_FILENAME = '.snapshots';
9
9
  export const TEMPLATES_PATH = 'templates';
10
10
  export const TEMPLATE_CONFIG_FILENAME = 'config.json';
11
+ export const PACKAGE_JSON_FILENAME = 'package.json';
11
12
 
12
13
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import path from 'node:path';\nimport url from 'node:url';\n\nlet directory = path.dirname(url.fileURLToPath(import.meta.url));\n\nexport const PACKAGE_PATH = path.resolve(directory, '..');\n\nexport const CARSON_CONFIG_DIRECTORY = '.carson';\nexport const PROJECT_CONFIG_FILENAME = 'project.json';\nexport const WORKSPACE_CONFIG_FILENAME = 'workspace.json';\nexport const SNAPSHOTS_FILENAME = '.snapshots';\nexport const TEMPLATES_PATH = 'templates';\nexport const TEMPLATE_CONFIG_FILENAME = 'config.json';\n"],"names":["path","url","directory","dirname","fileURLToPath","PACKAGE_PATH","resolve","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","WORKSPACE_CONFIG_FILENAME","SNAPSHOTS_FILENAME","TEMPLATES_PATH","TEMPLATE_CONFIG_FILENAME"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAC7B,OAAOC,SAAS,WAAW;AAE3B,IAAIC,YAAYF,KAAKG,OAAO,CAACF,IAAIG,aAAa,CAAC,YAAYH,GAAG;AAE9D,OAAO,MAAMI,eAAeL,KAAKM,OAAO,CAACJ,WAAW,MAAM;AAE1D,OAAO,MAAMK,0BAA0B,UAAU;AACjD,OAAO,MAAMC,0BAA0B,eAAe;AACtD,OAAO,MAAMC,4BAA4B,iBAAiB;AAC1D,OAAO,MAAMC,qBAAqB,aAAa;AAC/C,OAAO,MAAMC,iBAAiB,YAAY;AAC1C,OAAO,MAAMC,2BAA2B,cAAc"}
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import path from 'node:path';\nimport url from 'node:url';\n\nlet directory = path.dirname(url.fileURLToPath(import.meta.url));\n\nexport const PACKAGE_PATH = path.resolve(directory, '..');\n\nexport const CARSON_CONFIG_DIRECTORY = '.carson';\nexport const PROJECT_CONFIG_FILENAME = 'project.json';\nexport const WORKSPACE_CONFIG_FILENAME = 'workspace.json';\nexport const SNAPSHOTS_FILENAME = '.snapshots';\nexport const TEMPLATES_PATH = 'templates';\nexport const TEMPLATE_CONFIG_FILENAME = 'config.json';\nexport const PACKAGE_JSON_FILENAME = 'package.json';\n"],"names":["path","url","directory","dirname","fileURLToPath","PACKAGE_PATH","resolve","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","WORKSPACE_CONFIG_FILENAME","SNAPSHOTS_FILENAME","TEMPLATES_PATH","TEMPLATE_CONFIG_FILENAME","PACKAGE_JSON_FILENAME"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAC7B,OAAOC,SAAS,WAAW;AAE3B,IAAIC,YAAYF,KAAKG,OAAO,CAACF,IAAIG,aAAa,CAAC,YAAYH,GAAG;AAE9D,OAAO,MAAMI,eAAeL,KAAKM,OAAO,CAACJ,WAAW,MAAM;AAE1D,OAAO,MAAMK,0BAA0B,UAAU;AACjD,OAAO,MAAMC,0BAA0B,eAAe;AACtD,OAAO,MAAMC,4BAA4B,iBAAiB;AAC1D,OAAO,MAAMC,qBAAqB,aAAa;AAC/C,OAAO,MAAMC,iBAAiB,YAAY;AAC1C,OAAO,MAAMC,2BAA2B,cAAc;AACtD,OAAO,MAAMC,wBAAwB,eAAe"}
@@ -9,7 +9,7 @@ import { CARSON_CONFIG_DIRECTORY, SNAPSHOTS_FILENAME } from '../constants.js';
9
9
  * Applies rendered Carson template to a specified path, i.e. creates and updates files based on the result of rendering each Carson template file.
10
10
  */ export async function applyTemplateRenders({ templateRenders, path: targetPath, ignoreStrategies }) {
11
11
  // we need to clear Prettier cache, because we are changing file system
12
- prettier.clearConfigCache();
12
+ await prettier.clearConfigCache();
13
13
  // first, we read the existing snapshots and use them to undo previous changes
14
14
  let templateRenderSnapshotsPath = path.join(targetPath, CARSON_CONFIG_DIRECTORY, SNAPSHOTS_FILENAME);
15
15
  if (await fs.pathExists(templateRenderSnapshotsPath)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/template/applyTemplateRenders.ts"],"sourcesContent":["// TODO: can this be fixed?\n/* eslint-disable complexity -- TODO */\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport prettier from 'prettier';\n\nimport {CarsonTemplateError} from './CarsonTemplateError.js';\nimport {\n createUsingTemplateRender,\n deleteUsingTemplateRender,\n insertUsingTemplateRender,\n loadTemplateRenderSnapshots,\n mergeUsingTemplateRender,\n overwriteUsingTemplateRender,\n saveTemplateRenderSnapshots,\n uninsertUsingTemplateRender,\n unmergeUsingTemplateRender,\n} from './internals.js';\nimport {type TemplateRenders} from './TemplateRenders.js';\nimport {CARSON_CONFIG_DIRECTORY, SNAPSHOTS_FILENAME} from '../constants.js';\n\nexport type ApplyTemplateRendersOptions = {\n templateRenders: TemplateRenders;\n path: string;\n ignoreStrategies: string[];\n};\n\n/**\n * Applies rendered Carson template to a specified path, i.e. creates and updates files based on the result of rendering each Carson template file.\n */\nexport async function applyTemplateRenders({\n templateRenders,\n path: targetPath,\n ignoreStrategies,\n}: ApplyTemplateRendersOptions) {\n // we need to clear Prettier cache, because we are changing file system\n prettier.clearConfigCache();\n\n // first, we read the existing snapshots and use them to undo previous changes\n let templateRenderSnapshotsPath = path.join(\n targetPath,\n CARSON_CONFIG_DIRECTORY,\n SNAPSHOTS_FILENAME,\n );\n\n if (await fs.pathExists(templateRenderSnapshotsPath)) {\n let templateRenderSnapshots = await loadTemplateRenderSnapshots(templateRenderSnapshotsPath);\n\n for (let templateRenderSnapshot of templateRenderSnapshots) {\n let strategy =\n typeof templateRenderSnapshot.attributes.strategy === 'string'\n ? templateRenderSnapshot.attributes.strategy\n : templateRenderSnapshot.attributes.strategy[0];\n\n if (ignoreStrategies.includes(strategy)) {\n continue;\n }\n\n if (templateRenderSnapshot.attributes.strategy === 'ensure') {\n await deleteUsingTemplateRender(templateRenderSnapshot, targetPath, {\n onlyDeleteWhenContentsMatch: true,\n });\n }\n\n if (templateRenderSnapshot.attributes.strategy === 'overwrite') {\n await deleteUsingTemplateRender(templateRenderSnapshot, targetPath);\n }\n\n if (templateRenderSnapshot.attributes.strategy === 'merge') {\n await unmergeUsingTemplateRender(templateRenderSnapshot, targetPath);\n }\n\n if (templateRenderSnapshot.attributes.strategy[0] === 'insert') {\n await uninsertUsingTemplateRender(templateRenderSnapshot, targetPath);\n }\n }\n }\n\n // second, we apply strategies that create files\n for (let templateRender of templateRenders) {\n let strategy =\n typeof templateRender.attributes.strategy === 'string'\n ? templateRender.attributes.strategy\n : templateRender.attributes.strategy[0];\n\n if (ignoreStrategies.includes(strategy)) {\n continue;\n }\n\n if (templateRender.attributes.strategy === 'create') {\n await createUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy === 'ensure') {\n let to = path.join(targetPath, templateRender.attributes.to);\n let doesToExist = await fs.pathExists(to);\n\n if (!doesToExist) {\n await createUsingTemplateRender(templateRender, targetPath);\n }\n }\n }\n\n // third, we apply strategies that change files\n for (let templateRender of templateRenders) {\n let strategy =\n typeof templateRender.attributes.strategy === 'string'\n ? templateRender.attributes.strategy\n : templateRender.attributes.strategy[0];\n\n if (ignoreStrategies.includes(strategy)) {\n continue;\n }\n\n if (templateRender.attributes.strategy === 'overwrite') {\n await overwriteUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy === 'merge') {\n await mergeUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy[0] === 'insert') {\n await insertUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy === 'check') {\n let to = path.join(targetPath, templateRender.attributes.to);\n let doesToExist = await fs.pathExists(to);\n\n if (!doesToExist) {\n throw new CarsonTemplateError('STRATEGY_MISSING_FILE', {\n messageParameters: [templateRender.attributes.strategy, templateRender.template.path, to],\n data: {\n path: to,\n },\n });\n }\n }\n }\n\n await saveTemplateRenderSnapshots(templateRenders, templateRenderSnapshotsPath);\n}\n"],"names":["fs","path","prettier","CarsonTemplateError","createUsingTemplateRender","deleteUsingTemplateRender","insertUsingTemplateRender","loadTemplateRenderSnapshots","mergeUsingTemplateRender","overwriteUsingTemplateRender","saveTemplateRenderSnapshots","uninsertUsingTemplateRender","unmergeUsingTemplateRender","CARSON_CONFIG_DIRECTORY","SNAPSHOTS_FILENAME","applyTemplateRenders","templateRenders","targetPath","ignoreStrategies","clearConfigCache","templateRenderSnapshotsPath","join","pathExists","templateRenderSnapshots","templateRenderSnapshot","strategy","attributes","includes","onlyDeleteWhenContentsMatch","templateRender","to","doesToExist","messageParameters","template","data"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/template/applyTemplateRenders.ts"],"sourcesContent":["// TODO: can this be fixed?\n/* eslint-disable complexity -- TODO */\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport prettier from 'prettier';\n\nimport {CarsonTemplateError} from './CarsonTemplateError.js';\nimport {\n createUsingTemplateRender,\n deleteUsingTemplateRender,\n insertUsingTemplateRender,\n loadTemplateRenderSnapshots,\n mergeUsingTemplateRender,\n overwriteUsingTemplateRender,\n saveTemplateRenderSnapshots,\n uninsertUsingTemplateRender,\n unmergeUsingTemplateRender,\n} from './internals.js';\nimport {type TemplateRenders} from './TemplateRenders.js';\nimport {CARSON_CONFIG_DIRECTORY, SNAPSHOTS_FILENAME} from '../constants.js';\n\nexport type ApplyTemplateRendersOptions = {\n templateRenders: TemplateRenders;\n path: string;\n ignoreStrategies: string[];\n};\n\n/**\n * Applies rendered Carson template to a specified path, i.e. creates and updates files based on the result of rendering each Carson template file.\n */\nexport async function applyTemplateRenders({\n templateRenders,\n path: targetPath,\n ignoreStrategies,\n}: ApplyTemplateRendersOptions) {\n // we need to clear Prettier cache, because we are changing file system\n await prettier.clearConfigCache();\n\n // first, we read the existing snapshots and use them to undo previous changes\n let templateRenderSnapshotsPath = path.join(\n targetPath,\n CARSON_CONFIG_DIRECTORY,\n SNAPSHOTS_FILENAME,\n );\n\n if (await fs.pathExists(templateRenderSnapshotsPath)) {\n let templateRenderSnapshots = await loadTemplateRenderSnapshots(templateRenderSnapshotsPath);\n\n for (let templateRenderSnapshot of templateRenderSnapshots) {\n let strategy =\n typeof templateRenderSnapshot.attributes.strategy === 'string'\n ? templateRenderSnapshot.attributes.strategy\n : templateRenderSnapshot.attributes.strategy[0];\n\n if (ignoreStrategies.includes(strategy)) {\n continue;\n }\n\n if (templateRenderSnapshot.attributes.strategy === 'ensure') {\n await deleteUsingTemplateRender(templateRenderSnapshot, targetPath, {\n onlyDeleteWhenContentsMatch: true,\n });\n }\n\n if (templateRenderSnapshot.attributes.strategy === 'overwrite') {\n await deleteUsingTemplateRender(templateRenderSnapshot, targetPath);\n }\n\n if (templateRenderSnapshot.attributes.strategy === 'merge') {\n await unmergeUsingTemplateRender(templateRenderSnapshot, targetPath);\n }\n\n if (templateRenderSnapshot.attributes.strategy[0] === 'insert') {\n await uninsertUsingTemplateRender(templateRenderSnapshot, targetPath);\n }\n }\n }\n\n // second, we apply strategies that create files\n for (let templateRender of templateRenders) {\n let strategy =\n typeof templateRender.attributes.strategy === 'string'\n ? templateRender.attributes.strategy\n : templateRender.attributes.strategy[0];\n\n if (ignoreStrategies.includes(strategy)) {\n continue;\n }\n\n if (templateRender.attributes.strategy === 'create') {\n await createUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy === 'ensure') {\n let to = path.join(targetPath, templateRender.attributes.to);\n let doesToExist = await fs.pathExists(to);\n\n if (!doesToExist) {\n await createUsingTemplateRender(templateRender, targetPath);\n }\n }\n }\n\n // third, we apply strategies that change files\n for (let templateRender of templateRenders) {\n let strategy =\n typeof templateRender.attributes.strategy === 'string'\n ? templateRender.attributes.strategy\n : templateRender.attributes.strategy[0];\n\n if (ignoreStrategies.includes(strategy)) {\n continue;\n }\n\n if (templateRender.attributes.strategy === 'overwrite') {\n await overwriteUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy === 'merge') {\n await mergeUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy[0] === 'insert') {\n await insertUsingTemplateRender(templateRender, targetPath);\n }\n\n if (templateRender.attributes.strategy === 'check') {\n let to = path.join(targetPath, templateRender.attributes.to);\n let doesToExist = await fs.pathExists(to);\n\n if (!doesToExist) {\n throw new CarsonTemplateError('STRATEGY_MISSING_FILE', {\n messageParameters: [templateRender.attributes.strategy, templateRender.template.path, to],\n data: {\n path: to,\n },\n });\n }\n }\n }\n\n await saveTemplateRenderSnapshots(templateRenders, templateRenderSnapshotsPath);\n}\n"],"names":["fs","path","prettier","CarsonTemplateError","createUsingTemplateRender","deleteUsingTemplateRender","insertUsingTemplateRender","loadTemplateRenderSnapshots","mergeUsingTemplateRender","overwriteUsingTemplateRender","saveTemplateRenderSnapshots","uninsertUsingTemplateRender","unmergeUsingTemplateRender","CARSON_CONFIG_DIRECTORY","SNAPSHOTS_FILENAME","applyTemplateRenders","templateRenders","targetPath","ignoreStrategies","clearConfigCache","templateRenderSnapshotsPath","join","pathExists","templateRenderSnapshots","templateRenderSnapshot","strategy","attributes","includes","onlyDeleteWhenContentsMatch","templateRender","to","doesToExist","messageParameters","template","data"],"mappings":"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"}
@@ -2,12 +2,11 @@ import fs from 'fs-extra';
2
2
  import path from 'node:path';
3
3
  import { prettify } from './prettify.js';
4
4
  export async function deleteUsingTemplateRender(templateRender, basePath, options) {
5
- var _options;
6
5
  let to = path.join(basePath, templateRender.attributes.to);
7
6
  if (!await fs.pathExists(to)) {
8
7
  return;
9
8
  }
10
- if ((_options = options) === null || _options === void 0 ? void 0 : _options.onlyDeleteWhenContentsMatch) {
9
+ if (options?.onlyDeleteWhenContentsMatch) {
11
10
  let existingContent = await fs.readFile(to, {
12
11
  encoding: 'utf8'
13
12
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/template/internals/deleteUsingTemplateRender.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {prettify} from './prettify.js';\nimport {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';\nimport {type TemplateRender} from '../TemplateRender.js';\n\nexport type DeleteUsingTemplateRenderOptions = {\n onlyDeleteWhenContentsMatch?: boolean;\n};\n\nexport async function deleteUsingTemplateRender(\n templateRender: TemplateRender | TemplateRenderSnapshot,\n basePath: string,\n options?: DeleteUsingTemplateRenderOptions,\n) {\n let to = path.join(basePath, templateRender.attributes.to);\n\n if (!(await fs.pathExists(to))) {\n return;\n }\n\n if (options?.onlyDeleteWhenContentsMatch) {\n let existingContent = await fs.readFile(to, {encoding: 'utf8'});\n let newContent = await prettify(templateRender.content, to);\n\n if (existingContent.trim() === newContent.trim()) {\n await fs.rm(to);\n }\n\n return;\n }\n\n await fs.rm(to);\n}\n"],"names":["fs","path","prettify","deleteUsingTemplateRender","templateRender","basePath","options","to","join","attributes","pathExists","onlyDeleteWhenContentsMatch","existingContent","readFile","encoding","newContent","content","trim","rm"],"mappings":"AAAA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,SAAQC,QAAQ,QAAO,gBAAgB;AAQvC,OAAO,eAAeC,0BACpBC,cAAuD,EACvDC,QAAgB,EAChBC,OAA0C;QAQtCA;IANJ,IAAIC,KAAKN,KAAKO,IAAI,CAACH,UAAUD,eAAeK,UAAU,CAACF,EAAE;IAEzD,IAAI,CAAE,MAAMP,GAAGU,UAAU,CAACH,KAAM;QAC9B;IACF;IAEA,KAAID,WAAAA,qBAAAA,+BAAAA,SAASK,2BAA2B,EAAE;QACxC,IAAIC,kBAAkB,MAAMZ,GAAGa,QAAQ,CAACN,IAAI;YAACO,UAAU;QAAM;QAC7D,IAAIC,aAAa,MAAMb,SAASE,eAAeY,OAAO,EAAET;QAExD,IAAIK,gBAAgBK,IAAI,OAAOF,WAAWE,IAAI,IAAI;YAChD,MAAMjB,GAAGkB,EAAE,CAACX;QACd;QAEA;IACF;IAEA,MAAMP,GAAGkB,EAAE,CAACX;AACd"}
1
+ {"version":3,"sources":["../../../src/template/internals/deleteUsingTemplateRender.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {prettify} from './prettify.js';\nimport {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';\nimport {type TemplateRender} from '../TemplateRender.js';\n\nexport type DeleteUsingTemplateRenderOptions = {\n onlyDeleteWhenContentsMatch?: boolean;\n};\n\nexport async function deleteUsingTemplateRender(\n templateRender: TemplateRender | TemplateRenderSnapshot,\n basePath: string,\n options?: DeleteUsingTemplateRenderOptions,\n) {\n let to = path.join(basePath, templateRender.attributes.to);\n\n if (!(await fs.pathExists(to))) {\n return;\n }\n\n if (options?.onlyDeleteWhenContentsMatch) {\n let existingContent = await fs.readFile(to, {encoding: 'utf8'});\n let newContent = await prettify(templateRender.content, to);\n\n if (existingContent.trim() === newContent.trim()) {\n await fs.rm(to);\n }\n\n return;\n }\n\n await fs.rm(to);\n}\n"],"names":["fs","path","prettify","deleteUsingTemplateRender","templateRender","basePath","options","to","join","attributes","pathExists","onlyDeleteWhenContentsMatch","existingContent","readFile","encoding","newContent","content","trim","rm"],"mappings":"AAAA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,SAAQC,QAAQ,QAAO,gBAAgB;AAQvC,OAAO,eAAeC,0BACpBC,cAAuD,EACvDC,QAAgB,EAChBC,OAA0C;IAE1C,IAAIC,KAAKN,KAAKO,IAAI,CAACH,UAAUD,eAAeK,UAAU,CAACF,EAAE;IAEzD,IAAI,CAAE,MAAMP,GAAGU,UAAU,CAACH,KAAM;QAC9B;IACF;IAEA,IAAID,SAASK,6BAA6B;QACxC,IAAIC,kBAAkB,MAAMZ,GAAGa,QAAQ,CAACN,IAAI;YAACO,UAAU;QAAM;QAC7D,IAAIC,aAAa,MAAMb,SAASE,eAAeY,OAAO,EAAET;QAExD,IAAIK,gBAAgBK,IAAI,OAAOF,WAAWE,IAAI,IAAI;YAChD,MAAMjB,GAAGkB,EAAE,CAACX;QACd;QAEA;IACF;IAEA,MAAMP,GAAGkB,EAAE,CAACX;AACd"}
@@ -7,7 +7,7 @@ export async function prettify(content, targetPath) {
7
7
  let prettierOptions = await prettier.resolveConfig(targetPath, {
8
8
  editorconfig: true
9
9
  });
10
- prettifiedContent = prettier.format(content, {
10
+ prettifiedContent = await prettier.format(content, {
11
11
  ...prettierOptions,
12
12
  filepath: targetPath,
13
13
  plugins: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/template/internals/prettify.ts"],"sourcesContent":["import prettier from 'prettier';\nimport packageJsonPrettierPlugin from 'prettier-plugin-packagejson';\n\nconst NO_INFERRED_PARSER = /parser.*inferred/i;\n\nexport async function prettify(content: string, targetPath: string) {\n let prettifiedContent = content;\n\n try {\n let prettierOptions = await prettier.resolveConfig(targetPath, {editorconfig: true});\n\n prettifiedContent = prettier.format(content, {\n ...prettierOptions,\n filepath: targetPath,\n plugins: [packageJsonPrettierPlugin],\n });\n } catch (error: unknown) {\n if (!NO_INFERRED_PARSER.test((error as Error).message)) {\n throw error;\n }\n }\n\n return prettifiedContent;\n}\n"],"names":["prettier","packageJsonPrettierPlugin","NO_INFERRED_PARSER","prettify","content","targetPath","prettifiedContent","prettierOptions","resolveConfig","editorconfig","format","filepath","plugins","error","test","message"],"mappings":"AAAA,OAAOA,cAAc,WAAW;AAChC,OAAOC,+BAA+B,8BAA8B;AAEpE,MAAMC,qBAAqB;AAE3B,OAAO,eAAeC,SAASC,OAAe,EAAEC,UAAkB;IAChE,IAAIC,oBAAoBF;IAExB,IAAI;QACF,IAAIG,kBAAkB,MAAMP,SAASQ,aAAa,CAACH,YAAY;YAACI,cAAc;QAAI;QAElFH,oBAAoBN,SAASU,MAAM,CAACN,SAAS;YAC3C,GAAGG,eAAe;YAClBI,UAAUN;YACVO,SAAS;gBAACX;aAA0B;QACtC;IACF,EAAE,OAAOY,OAAgB;QACvB,IAAI,CAACX,mBAAmBY,IAAI,CAAC,AAACD,MAAgBE,OAAO,GAAG;YACtD,MAAMF;QACR;IACF;IAEA,OAAOP;AACT"}
1
+ {"version":3,"sources":["../../../src/template/internals/prettify.ts"],"sourcesContent":["import prettier from 'prettier';\nimport packageJsonPrettierPlugin from 'prettier-plugin-packagejson';\n\nconst NO_INFERRED_PARSER = /parser.*inferred/i;\n\nexport async function prettify(content: string, targetPath: string) {\n let prettifiedContent = content;\n\n try {\n let prettierOptions = await prettier.resolveConfig(targetPath, {editorconfig: true});\n\n prettifiedContent = await prettier.format(content, {\n ...prettierOptions,\n filepath: targetPath,\n plugins: [packageJsonPrettierPlugin],\n });\n } catch (error: unknown) {\n if (!NO_INFERRED_PARSER.test((error as Error).message)) {\n throw error;\n }\n }\n\n return prettifiedContent;\n}\n"],"names":["prettier","packageJsonPrettierPlugin","NO_INFERRED_PARSER","prettify","content","targetPath","prettifiedContent","prettierOptions","resolveConfig","editorconfig","format","filepath","plugins","error","test","message"],"mappings":"AAAA,OAAOA,cAAc,WAAW;AAChC,OAAOC,+BAA+B,8BAA8B;AAEpE,MAAMC,qBAAqB;AAE3B,OAAO,eAAeC,SAASC,OAAe,EAAEC,UAAkB;IAChE,IAAIC,oBAAoBF;IAExB,IAAI;QACF,IAAIG,kBAAkB,MAAMP,SAASQ,aAAa,CAACH,YAAY;YAACI,cAAc;QAAI;QAElFH,oBAAoB,MAAMN,SAASU,MAAM,CAACN,SAAS;YACjD,GAAGG,eAAe;YAClBI,UAAUN;YACVO,SAAS;gBAACX;aAA0B;QACtC;IACF,EAAE,OAAOY,OAAgB;QACvB,IAAI,CAACX,mBAAmBY,IAAI,CAAC,AAACD,MAAgBE,OAAO,GAAG;YACtD,MAAMF;QACR;IACF;IAEA,OAAOP;AACT"}
@@ -23,7 +23,6 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
23
23
  /** Parent {@link Workspace} instance. */ workspace;
24
24
  /** Errors found during reading from the file system. */ errors = [];
25
25
  constructor({ path: projectPath, name, config, packageJson, workspace, errors }){
26
- var _this_packageJson_name;
27
26
  // TODO: check that this path and workspace path are correct, i.e. project path must always be inside of workspace path
28
27
  this.path = projectPath;
29
28
  if (name) {
@@ -43,7 +42,7 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
43
42
  if (errors) {
44
43
  this.errors = errors;
45
44
  }
46
- if ((_this_packageJson_name = this.packageJson.name) === null || _this_packageJson_name === void 0 ? void 0 : _this_packageJson_name.length) {
45
+ if (this.packageJson.name?.length) {
47
46
  this.name = this.packageJson.name;
48
47
  }
49
48
  this.relativePath = pathToPosixPath(path.relative(this.workspace.path, this.path));
@@ -69,12 +68,6 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
69
68
  }
70
69
  });
71
70
  }
72
- await saveProjectConfig({
73
- projectPath: project.path,
74
- projectConfig: {
75
- template: templateId
76
- }
77
- });
78
71
  let templateRenders = await renderCarsonTemplate({
79
72
  templateId,
80
73
  templateData: {
@@ -90,6 +83,12 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
90
83
  'check'
91
84
  ]
92
85
  });
86
+ await saveProjectConfig({
87
+ projectPath: project.path,
88
+ projectConfig: {
89
+ template: templateId
90
+ }
91
+ });
93
92
  await project.read();
94
93
  return project;
95
94
  }
@@ -102,7 +101,6 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
102
101
  return project;
103
102
  }
104
103
  async read() {
105
- var _packageJson_name;
106
104
  if (!await fs.pathExists(this.path)) {
107
105
  throw new ProjectError('NO_SUCH_PROJECT_PATH', {
108
106
  messageParameters: [
@@ -162,7 +160,7 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
162
160
  }));
163
161
  packageJson = {};
164
162
  }
165
- if ((_packageJson_name = packageJson.name) === null || _packageJson_name === void 0 ? void 0 : _packageJson_name.length) {
163
+ if (packageJson.name?.length) {
166
164
  this.name = packageJson.name;
167
165
  }
168
166
  this.config = projectConfig;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workspace/Project.ts"],"sourcesContent":["import {ensureEmptyDirectory, pathToPosixPath} from '@jakubmazanec/fs-utils';\nimport {readFile, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';\nimport fs from 'fs-extra';\nimport json5 from 'json5';\nimport path from 'node:path';\nimport {z} from 'zod';\n\nimport {type ProjectConfig, projectConfigSchema} from './ProjectConfig.js';\nimport {type ProjectCreateOptions} from './ProjectCreateOptions.js';\nimport {ProjectError} from './ProjectError.js';\nimport {type ProjectOptions} from './ProjectOptions.js';\nimport {type ProjectUpdateOptions} from './ProjectUpdateOptions.js';\nimport {saveProjectConfig} from './saveProjectConfig.js';\nimport {type Workspace} from './Workspace.js';\nimport {CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME} from '../constants.js';\nimport {applyTemplateRenders} from '../template/applyTemplateRenders.js';\nimport {renderCarsonTemplate} from '../template/renderCarsonTemplate.js';\n\n/**\n * Project represent a self-contained piece of software (e.g. a package, or an app) that is part of a {@link Workspace}. Currently only Node.js projects are supported.\n *\n * @typeParam M If true, the project belongs to a multi-project workspace.\n */\nexport class Project<M extends boolean = true> {\n /** Project name. */\n name?: string;\n\n /** Project path. */\n path: string;\n\n /** Project path relative to workspace path. */\n relativePath: string;\n\n /** Project configuration; if it's not found, the default is an empty object. */\n config: ProjectConfig;\n\n /** Parsed project `package.json` file; if it's not found, the default is an empty object. */\n packageJson: PackageJson;\n\n /** Parent {@link Workspace} instance. */\n workspace: Workspace<M>;\n\n /** Errors found during reading from the file system. */\n errors: Array<InstanceType<typeof ProjectError>> = [];\n\n constructor({\n path: projectPath,\n name,\n config,\n packageJson,\n workspace,\n errors,\n }: ProjectOptions<M>) {\n // TODO: check that this path and workspace path are correct, i.e. project path must always be inside of workspace path\n this.path = projectPath;\n\n if (name) {\n this.name = name;\n }\n\n if (config) {\n this.config = config;\n } else {\n this.config = {};\n }\n\n if (packageJson) {\n this.packageJson = packageJson;\n } else {\n this.packageJson = {};\n }\n\n this.workspace = workspace;\n\n if (errors) {\n this.errors = errors;\n }\n\n if (this.packageJson.name?.length) {\n this.name = this.packageJson.name;\n }\n\n this.relativePath = pathToPosixPath(path.relative(this.workspace.path, this.path));\n }\n\n static async create<M extends boolean>({\n templateId,\n workspace,\n projectPath,\n projectName,\n args,\n }: ProjectCreateOptions<M>): Promise<Project<M>> {\n let project = new this({\n path: projectPath,\n name: projectName,\n config: {\n template: templateId,\n },\n workspace,\n });\n\n try {\n await ensureEmptyDirectory(project.path);\n } catch {\n throw new ProjectError('PROJECT_PATH_NOT_EMPTY', {\n messageParameters: [project.path],\n data: {\n path: project.path,\n },\n });\n }\n\n await saveProjectConfig({projectPath: project.path, projectConfig: {template: templateId}});\n\n let templateRenders = await renderCarsonTemplate({\n templateId,\n templateData: {\n workspace,\n project,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: project.path,\n ignoreStrategies: ['check'],\n });\n\n await project.read();\n\n return project;\n }\n\n static async read<M extends boolean>(\n projectPath: string,\n workspace: Workspace<M>,\n ): Promise<Project<M>> {\n let project = new this({\n path: projectPath,\n workspace,\n });\n\n await project.read();\n\n return project;\n }\n\n async read() {\n if (!(await fs.pathExists(this.path))) {\n throw new ProjectError('NO_SUCH_PROJECT_PATH', {\n messageParameters: [this.path],\n data: {\n path: this.path,\n },\n });\n }\n\n let errors: Array<InstanceType<typeof ProjectError>> = [];\n\n // load project config\n let projectConfigPath = path.join(this.path, CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME);\n let doesProjectConfigExist = await fs.pathExists(projectConfigPath);\n let projectConfig: ProjectConfig | z.ZodError;\n\n if (doesProjectConfigExist) {\n projectConfig = await readFile(projectConfigPath, projectConfigSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n projectConfig = {};\n }\n\n if (projectConfig instanceof z.ZodError) {\n let zodError = projectConfig;\n\n errors.push(\n new ProjectError('INVALID_PROJECT_CONFIG', {\n messageParameters: [projectConfigPath],\n data: {\n path: projectConfigPath,\n zodIssues: zodError.issues,\n },\n }),\n );\n\n projectConfig = {};\n }\n\n // load package.json\n let packageJsonPath = path.join(this.path, 'package.json');\n let doesPackageJsonExist = await fs.pathExists(packageJsonPath);\n let packageJson: PackageJson | z.ZodError;\n\n if (doesPackageJsonExist) {\n packageJson = await readFile(packageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n packageJson = {};\n }\n\n if (packageJson instanceof z.ZodError) {\n let zodError = packageJson;\n\n errors.push(\n new ProjectError('INVALID_PACKAGE_JSON', {\n messageParameters: [packageJsonPath],\n data: {\n path: packageJsonPath,\n zodIssues: zodError.issues,\n },\n }),\n );\n\n packageJson = {};\n }\n\n if (packageJson.name?.length) {\n this.name = packageJson.name;\n }\n\n this.config = projectConfig;\n this.packageJson = packageJson;\n this.errors = errors;\n\n return this;\n }\n\n async update({args}: ProjectUpdateOptions): Promise<this> {\n if (!this.config.template) {\n throw new ProjectError('MISSING_CARSON_TEMPLATE_ID', {\n messageParameters: [path.join(this.path, CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME)],\n });\n }\n\n let templateRenders = await renderCarsonTemplate({\n templateId: this.config.template,\n templateData: {\n workspace: this.workspace,\n project: 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"],"names":["ensureEmptyDirectory","pathToPosixPath","readFile","packageJsonSchema","fs","json5","path","z","projectConfigSchema","ProjectError","saveProjectConfig","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","applyTemplateRenders","renderCarsonTemplate","Project","name","relativePath","config","packageJson","workspace","errors","constructor","projectPath","length","relative","create","templateId","projectName","args","project","template","messageParameters","data","projectConfig","templateRenders","templateData","ignoreStrategies","read","pathExists","projectConfigPath","join","doesProjectConfigExist","parser","rawString","parse","ZodError","zodError","push","zodIssues","issues","packageJsonPath","doesPackageJsonExist","update"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/workspace/Project.ts"],"sourcesContent":["import {ensureEmptyDirectory, pathToPosixPath} from '@jakubmazanec/fs-utils';\nimport {readFile, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';\nimport fs from 'fs-extra';\nimport json5 from 'json5';\nimport path from 'node:path';\nimport {z} from 'zod';\n\nimport {type ProjectConfig, projectConfigSchema} from './ProjectConfig.js';\nimport {type ProjectCreateOptions} from './ProjectCreateOptions.js';\nimport {ProjectError} from './ProjectError.js';\nimport {type ProjectOptions} from './ProjectOptions.js';\nimport {type ProjectUpdateOptions} from './ProjectUpdateOptions.js';\nimport {saveProjectConfig} from './saveProjectConfig.js';\nimport {type Workspace} from './Workspace.js';\nimport {CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME} from '../constants.js';\nimport {applyTemplateRenders} from '../template/applyTemplateRenders.js';\nimport {renderCarsonTemplate} from '../template/renderCarsonTemplate.js';\n\n/**\n * Project represent a self-contained piece of software (e.g. a package, or an app) that is part of a {@link Workspace}. Currently only Node.js projects are supported.\n *\n * @typeParam M If true, the project belongs to a multi-project workspace.\n */\nexport class Project<M extends boolean = true> {\n /** Project name. */\n name?: string;\n\n /** Project path. */\n path: string;\n\n /** Project path relative to workspace path. */\n relativePath: string;\n\n /** Project configuration; if it's not found, the default is an empty object. */\n config: ProjectConfig;\n\n /** Parsed project `package.json` file; if it's not found, the default is an empty object. */\n packageJson: PackageJson;\n\n /** Parent {@link Workspace} instance. */\n workspace: Workspace<M>;\n\n /** Errors found during reading from the file system. */\n errors: Array<InstanceType<typeof ProjectError>> = [];\n\n constructor({\n path: projectPath,\n name,\n config,\n packageJson,\n workspace,\n errors,\n }: ProjectOptions<M>) {\n // TODO: check that this path and workspace path are correct, i.e. project path must always be inside of workspace path\n this.path = projectPath;\n\n if (name) {\n this.name = name;\n }\n\n if (config) {\n this.config = config;\n } else {\n this.config = {};\n }\n\n if (packageJson) {\n this.packageJson = packageJson;\n } else {\n this.packageJson = {};\n }\n\n this.workspace = workspace;\n\n if (errors) {\n this.errors = errors;\n }\n\n if (this.packageJson.name?.length) {\n this.name = this.packageJson.name;\n }\n\n this.relativePath = pathToPosixPath(path.relative(this.workspace.path, this.path));\n }\n\n static async create<M extends boolean>({\n templateId,\n workspace,\n projectPath,\n projectName,\n args,\n }: ProjectCreateOptions<M>): Promise<Project<M>> {\n let project = new this({\n path: projectPath,\n name: projectName,\n config: {\n template: templateId,\n },\n workspace,\n });\n\n try {\n await ensureEmptyDirectory(project.path);\n } catch {\n throw new ProjectError('PROJECT_PATH_NOT_EMPTY', {\n messageParameters: [project.path],\n data: {\n path: project.path,\n },\n });\n }\n\n let templateRenders = await renderCarsonTemplate({\n templateId,\n templateData: {\n workspace,\n project,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: project.path,\n ignoreStrategies: ['check'],\n });\n\n await saveProjectConfig({projectPath: project.path, projectConfig: {template: templateId}});\n\n await project.read();\n\n return project;\n }\n\n static async read<M extends boolean>(\n projectPath: string,\n workspace: Workspace<M>,\n ): Promise<Project<M>> {\n let project = new this({\n path: projectPath,\n workspace,\n });\n\n await project.read();\n\n return project;\n }\n\n async read() {\n if (!(await fs.pathExists(this.path))) {\n throw new ProjectError('NO_SUCH_PROJECT_PATH', {\n messageParameters: [this.path],\n data: {\n path: this.path,\n },\n });\n }\n\n let errors: Array<InstanceType<typeof ProjectError>> = [];\n\n // load project config\n let projectConfigPath = path.join(this.path, CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME);\n let doesProjectConfigExist = await fs.pathExists(projectConfigPath);\n let projectConfig: ProjectConfig | z.ZodError;\n\n if (doesProjectConfigExist) {\n projectConfig = await readFile(projectConfigPath, projectConfigSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n projectConfig = {};\n }\n\n if (projectConfig instanceof z.ZodError) {\n let zodError = projectConfig;\n\n errors.push(\n new ProjectError('INVALID_PROJECT_CONFIG', {\n messageParameters: [projectConfigPath],\n data: {\n path: projectConfigPath,\n zodIssues: zodError.issues,\n },\n }),\n );\n\n projectConfig = {};\n }\n\n // load package.json\n let packageJsonPath = path.join(this.path, 'package.json');\n let doesPackageJsonExist = await fs.pathExists(packageJsonPath);\n let packageJson: PackageJson | z.ZodError;\n\n if (doesPackageJsonExist) {\n packageJson = await readFile(packageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n packageJson = {};\n }\n\n if (packageJson instanceof z.ZodError) {\n let zodError = packageJson;\n\n errors.push(\n new ProjectError('INVALID_PACKAGE_JSON', {\n messageParameters: [packageJsonPath],\n data: {\n path: packageJsonPath,\n zodIssues: zodError.issues,\n },\n }),\n );\n\n packageJson = {};\n }\n\n if (packageJson.name?.length) {\n this.name = packageJson.name;\n }\n\n this.config = projectConfig;\n this.packageJson = packageJson;\n this.errors = errors;\n\n return this;\n }\n\n async update({args}: ProjectUpdateOptions): Promise<this> {\n if (!this.config.template) {\n throw new ProjectError('MISSING_CARSON_TEMPLATE_ID', {\n messageParameters: [path.join(this.path, CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME)],\n });\n }\n\n let templateRenders = await renderCarsonTemplate({\n templateId: this.config.template,\n templateData: {\n workspace: this.workspace,\n project: 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"],"names":["ensureEmptyDirectory","pathToPosixPath","readFile","packageJsonSchema","fs","json5","path","z","projectConfigSchema","ProjectError","saveProjectConfig","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","applyTemplateRenders","renderCarsonTemplate","Project","name","relativePath","config","packageJson","workspace","errors","constructor","projectPath","length","relative","create","templateId","projectName","args","project","template","messageParameters","data","templateRenders","templateData","ignoreStrategies","projectConfig","read","pathExists","projectConfigPath","join","doesProjectConfigExist","parser","rawString","parse","ZodError","zodError","push","zodIssues","issues","packageJsonPath","doesPackageJsonExist","update"],"mappings":"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"}
@@ -5,7 +5,7 @@ import fs from 'fs-extra';
5
5
  import json5 from 'json5';
6
6
  import path from 'node:path';
7
7
  import { z } from 'zod';
8
- import { compareProjectPath, getPackageJsonWorkspaces, getRepositoryBranches, getRepositoryUrl } from './internals.js';
8
+ import { compareProjectPath, containsProject, getPackageJsonWorkspaces, getRepositoryBranches, getRepositoryUrl } from './internals.js';
9
9
  import { Project } from './Project.js';
10
10
  import { saveWorkspaceConfig } from './saveWorkspaceConfig.js';
11
11
  import { workspaceConfigSchema } from './WorkspaceConfig.js';
@@ -119,12 +119,6 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
119
119
  }
120
120
  });
121
121
  }
122
- await saveWorkspaceConfig({
123
- workspacePath: workspace.path,
124
- workspaceConfig: {
125
- template: templateId
126
- }
127
- });
128
122
  let templateRenders = await renderCarsonTemplate({
129
123
  templateId,
130
124
  templateData: {
@@ -139,6 +133,12 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
139
133
  'check'
140
134
  ]
141
135
  });
136
+ await saveWorkspaceConfig({
137
+ workspacePath: workspace.path,
138
+ workspaceConfig: {
139
+ template: templateId
140
+ }
141
+ });
142
142
  return Workspace.read(workspace.path);
143
143
  }
144
144
  static async read(workspacePath) {
@@ -205,9 +205,8 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
205
205
  parser: (rawString)=>json5.parse(rawString)
206
206
  });
207
207
  if (!(packageJson instanceof Error)) {
208
- var _projectGlobs;
209
208
  let projectGlobs = getPackageJsonWorkspaces(packageJson);
210
- if ((_projectGlobs = projectGlobs) === null || _projectGlobs === void 0 ? void 0 : _projectGlobs.length) {
209
+ if (projectGlobs?.length) {
211
210
  multiPackageWorkspacePath ??= currentPath;
212
211
  } else {
213
212
  singlePackageWorkspacePath ??= currentPath;
@@ -226,11 +225,10 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
226
225
  /**
227
226
  * Traverses file system up from the search path and tries to find and read a workspace.
228
227
  */ static async findAndRead(searchPath, options) {
229
- var _options;
230
228
  let workspacePath = await Workspace.find(searchPath);
231
229
  if (workspacePath) {
232
230
  return Workspace.read(workspacePath);
233
- } else if ((_options = options) === null || _options === void 0 ? void 0 : _options.throwIfNotFound) {
231
+ } else if (options?.throwIfNotFound) {
234
232
  throw new WorkspaceError('NO_WORKSPACE_FOUND', {
235
233
  messageParameters: [
236
234
  searchPath
@@ -468,8 +466,11 @@ import { renderCarsonTemplate } from '../template/renderCarsonTemplate.js';
468
466
  onlyDirectories: true
469
467
  });
470
468
  for (let packagePath of packagePaths){
471
- let project = await Project.read(path.join(this.path, packagePath), this);
472
- projects.push(project);
469
+ let projectPath = path.join(this.path, packagePath);
470
+ if (await containsProject(projectPath)) {
471
+ let project = await Project.read(projectPath, this);
472
+ projects.push(project);
473
+ }
473
474
  }
474
475
  this.projects = projects;
475
476
  } else {
@@ -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 } 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
+ {"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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"}
@@ -49,16 +49,13 @@ import { compareSemver, compareWorkspaceDependencyProjectName } from './internal
49
49
  * @param options Options.
50
50
  * @returns The new {@link WorkspaceDependencies} instance.
51
51
  */ static fromWorkspace(workspace, options) {
52
- var _options;
53
52
  let workspaceDependencies = [];
54
- if ((_options = options) === null || _options === void 0 ? void 0 : _options.includeWorkspaceDependencies) {
55
- var _workspace_packageJson, _workspace_packageJson1;
53
+ if (options?.includeWorkspaceDependencies) {
56
54
  for (let [dependencyName, dependencyVersion] of Object.entries({
57
- ...(_workspace_packageJson = workspace.packageJson) === null || _workspace_packageJson === void 0 ? void 0 : _workspace_packageJson.dependencies,
58
- ...(_workspace_packageJson1 = workspace.packageJson) === null || _workspace_packageJson1 === void 0 ? void 0 : _workspace_packageJson1.devDependencies
55
+ ...workspace.packageJson?.dependencies,
56
+ ...workspace.packageJson?.devDependencies
59
57
  })){
60
- var _semver_minVersion, _semver_coerce;
61
- let exactDependencyVersion = semver.validRange(dependencyVersion) ? ((_semver_minVersion = semver.minVersion(dependencyVersion)) === null || _semver_minVersion === void 0 ? void 0 : _semver_minVersion.format()) ?? ((_semver_coerce = semver.coerce(dependencyVersion)) === null || _semver_coerce === void 0 ? void 0 : _semver_coerce.format()) ?? dependencyVersion.trim() : dependencyVersion.trim();
58
+ let exactDependencyVersion = semver.validRange(dependencyVersion) ? semver.minVersion(dependencyVersion)?.format() ?? semver.coerce(dependencyVersion)?.format() ?? dependencyVersion.trim() : dependencyVersion.trim();
62
59
  let workspaceDependency = {
63
60
  name: dependencyName,
64
61
  versions: [
@@ -73,11 +70,9 @@ import { compareSemver, compareWorkspaceDependencyProjectName } from './internal
73
70
  }
74
71
  }
75
72
  for (let project of workspace.projects){
76
- var _options1, _options2, _options3;
77
- if (!((_options1 = options) === null || _options1 === void 0 ? void 0 : _options1.includeOnlyDevDependencies)) {
73
+ if (!options?.includeOnlyDevDependencies) {
78
74
  for (let [dependencyName, dependencyVersion] of Object.entries(project.packageJson.dependencies ?? {})){
79
- var _semver_minVersion1, _semver_coerce1;
80
- let exactDependencyVersion = semver.validRange(dependencyVersion) ? ((_semver_minVersion1 = semver.minVersion(dependencyVersion)) === null || _semver_minVersion1 === void 0 ? void 0 : _semver_minVersion1.format()) ?? ((_semver_coerce1 = semver.coerce(dependencyVersion)) === null || _semver_coerce1 === void 0 ? void 0 : _semver_coerce1.format()) ?? dependencyVersion.trim() : dependencyVersion.trim();
75
+ let exactDependencyVersion = semver.validRange(dependencyVersion) ? semver.minVersion(dependencyVersion)?.format() ?? semver.coerce(dependencyVersion)?.format() ?? dependencyVersion.trim() : dependencyVersion.trim();
81
76
  let workspaceDependency = {
82
77
  name: dependencyName,
83
78
  versions: [
@@ -100,10 +95,9 @@ import { compareSemver, compareWorkspaceDependencyProjectName } from './internal
100
95
  workspaceDependencies.push(workspaceDependency);
101
96
  }
102
97
  }
103
- if (((_options2 = options) === null || _options2 === void 0 ? void 0 : _options2.includeDevDependencies) || ((_options3 = options) === null || _options3 === void 0 ? void 0 : _options3.includeOnlyDevDependencies)) {
98
+ if (options?.includeDevDependencies || options?.includeOnlyDevDependencies) {
104
99
  for (let [dependencyName, dependencyVersion] of Object.entries(project.packageJson.devDependencies ?? {})){
105
- var _semver_minVersion2, _semver_coerce2;
106
- let exactDependencyVersion = semver.validRange(dependencyVersion) ? ((_semver_minVersion2 = semver.minVersion(dependencyVersion)) === null || _semver_minVersion2 === void 0 ? void 0 : _semver_minVersion2.format()) ?? ((_semver_coerce2 = semver.coerce(dependencyVersion)) === null || _semver_coerce2 === void 0 ? void 0 : _semver_coerce2.format()) ?? dependencyVersion.trim() : dependencyVersion.trim();
100
+ let exactDependencyVersion = semver.validRange(dependencyVersion) ? semver.minVersion(dependencyVersion)?.format() ?? semver.coerce(dependencyVersion)?.format() ?? dependencyVersion.trim() : dependencyVersion.trim();
107
101
  let workspaceDependency = {
108
102
  name: dependencyName,
109
103
  versions: [
@@ -137,8 +131,7 @@ import { compareSemver, compareWorkspaceDependencyProjectName } from './internal
137
131
  */ getVersions(options) {
138
132
  let versions = {};
139
133
  for (let dependency of this){
140
- var _options;
141
- versions[dependency.name] = ((_options = options) === null || _options === void 0 ? void 0 : _options.useExactVersions) ? dependency.exactVersions : dependency.versions;
134
+ versions[dependency.name] = options?.useExactVersions ? dependency.exactVersions : dependency.versions;
142
135
  }
143
136
  return versions;
144
137
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workspace/WorkspaceDependencies.ts"],"sourcesContent":["// TODO: try to fix\n/* eslint-disable complexity -- TODO */\nimport _ from 'lodash';\nimport semver from 'semver';\n\nimport {compareSemver, compareWorkspaceDependencyProjectName} from './internals.js';\nimport {type Workspace} from './Workspace.js';\nimport {type WorkspaceDependenciesFromWorkspaceOptions} from './WorkspaceDependenciesFromWorkspaceOptions.js';\nimport {type WorkspaceDependenciesGetVersionsOptions} from './WorkspaceDependenciesGetVersionsOptions.js';\nimport {type WorkspaceDependency} from './WorkspaceDependency.js';\n\n/**\n * A collection of {@link WorkspaceDependency | workspace dependencies} that are installed in {@link Workspace | a workspace}.\n */\nexport class WorkspaceDependencies<M extends boolean = true> extends Array<WorkspaceDependency> {\n /** The workspace the dependencies are installed in. */\n workspace: Workspace<M>;\n\n constructor(...args: [...WorkspaceDependency[], Workspace<M>]) {\n super();\n\n if (args.length === 1) {\n [this.workspace] = args as [Workspace<M>];\n } else {\n let values = args.slice(0, -1) as WorkspaceDependency[];\n let workspace = args.at(-1) as Workspace<M>;\n\n this.push(...values);\n\n this.workspace = workspace;\n }\n }\n\n /**\n * Adds one or more new dependencies.\n *\n * @param newWorkspaceDependencies The dependencies to add.\n * @returns The new length of the collection.\n */\n override push(...newWorkspaceDependencies: WorkspaceDependency[]): number {\n for (let newWorkspaceDependency of newWorkspaceDependencies) {\n let doesExist = false;\n\n for (let workspaceDependency of this) {\n if (workspaceDependency.name === newWorkspaceDependency.name) {\n doesExist = true;\n\n workspaceDependency.versions = _.union(\n workspaceDependency.versions,\n newWorkspaceDependency.versions,\n );\n workspaceDependency.exactVersions = _.union(\n workspaceDependency.exactVersions,\n newWorkspaceDependency.exactVersions,\n );\n workspaceDependency.projects = _.unionWith(\n workspaceDependency.projects,\n newWorkspaceDependency.projects,\n (a, b) => a.name === b.name,\n );\n\n workspaceDependency.versions.sort(compareSemver);\n workspaceDependency.exactVersions.sort(compareSemver);\n workspaceDependency.projects.sort(compareWorkspaceDependencyProjectName);\n }\n }\n\n if (!doesExist) {\n super.push(newWorkspaceDependency);\n }\n }\n\n return this.length;\n }\n\n /**\n * Creates new {@link WorkspaceDependencies} instance from a {@link Workspace} instance and its dependencies.\n *\n * @param workspace The workspace from which the dependnecies are taken.\n * @param options Options.\n * @returns The new {@link WorkspaceDependencies} instance.\n */\n static fromWorkspace<M extends boolean = true>(\n workspace: Workspace<M>,\n options?: WorkspaceDependenciesFromWorkspaceOptions,\n ) {\n let workspaceDependencies: WorkspaceDependency[] = [];\n\n if (options?.includeWorkspaceDependencies) {\n for (let [dependencyName, dependencyVersion] of Object.entries({\n ...workspace.packageJson?.dependencies,\n ...workspace.packageJson?.devDependencies,\n })) {\n let exactDependencyVersion = semver.validRange(dependencyVersion)\n ? semver.minVersion(dependencyVersion)?.format() ??\n semver.coerce(dependencyVersion)?.format() ??\n dependencyVersion.trim()\n : dependencyVersion.trim();\n\n let workspaceDependency: WorkspaceDependency = {\n name: dependencyName,\n versions: [dependencyVersion],\n exactVersions: [exactDependencyVersion],\n projects: [],\n };\n\n workspaceDependencies.push(workspaceDependency);\n }\n }\n\n for (let project of workspace.projects) {\n if (!options?.includeOnlyDevDependencies) {\n for (let [dependencyName, dependencyVersion] of Object.entries(\n project.packageJson.dependencies ?? {},\n )) {\n let exactDependencyVersion = semver.validRange(dependencyVersion)\n ? semver.minVersion(dependencyVersion)?.format() ??\n semver.coerce(dependencyVersion)?.format() ??\n dependencyVersion.trim()\n : dependencyVersion.trim();\n\n let workspaceDependency: WorkspaceDependency = {\n name: dependencyName,\n versions: [dependencyVersion],\n exactVersions: [exactDependencyVersion],\n projects: [],\n };\n\n if (project.name) {\n workspaceDependency.projects = [\n {\n name: project.name,\n version: dependencyVersion,\n exactVersion: exactDependencyVersion,\n },\n ];\n }\n\n workspaceDependencies.push(workspaceDependency);\n }\n }\n\n if (options?.includeDevDependencies || options?.includeOnlyDevDependencies) {\n for (let [dependencyName, dependencyVersion] of Object.entries(\n project.packageJson.devDependencies ?? {},\n )) {\n let exactDependencyVersion = semver.validRange(dependencyVersion)\n ? semver.minVersion(dependencyVersion)?.format() ??\n semver.coerce(dependencyVersion)?.format() ??\n dependencyVersion.trim()\n : dependencyVersion.trim();\n\n let workspaceDependency: WorkspaceDependency = {\n name: dependencyName,\n versions: [dependencyVersion],\n exactVersions: [exactDependencyVersion],\n projects: [],\n };\n\n if (project.name) {\n workspaceDependency.projects = [\n {\n name: project.name,\n version: dependencyVersion,\n exactVersion: exactDependencyVersion,\n },\n ];\n }\n\n workspaceDependencies.push(workspaceDependency);\n }\n }\n }\n\n return new this(...workspaceDependencies, workspace);\n }\n\n /**\n * Creates map of all dependnecies and their installed version.\n *\n * @param options Options.\n * @returns Object whose keys are dependency names and values are sorted versions.\n */\n getVersions(options?: WorkspaceDependenciesGetVersionsOptions) {\n let versions: Record<string, string[]> = {};\n\n for (let dependency of this) {\n versions[dependency.name] = options?.useExactVersions\n ? dependency.exactVersions\n : dependency.versions;\n }\n\n return versions;\n }\n}\n"],"names":["_","semver","compareSemver","compareWorkspaceDependencyProjectName","WorkspaceDependencies","Array","workspace","constructor","args","length","values","slice","at","push","newWorkspaceDependencies","newWorkspaceDependency","doesExist","workspaceDependency","name","versions","union","exactVersions","projects","unionWith","a","b","sort","fromWorkspace","options","workspaceDependencies","includeWorkspaceDependencies","dependencyName","dependencyVersion","Object","entries","packageJson","dependencies","devDependencies","exactDependencyVersion","validRange","minVersion","format","coerce","trim","project","includeOnlyDevDependencies","version","exactVersion","includeDevDependencies","getVersions","dependency","useExactVersions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/workspace/WorkspaceDependencies.ts"],"sourcesContent":["// TODO: try to fix\n/* eslint-disable complexity -- TODO */\nimport _ from 'lodash';\nimport semver from 'semver';\n\nimport {compareSemver, compareWorkspaceDependencyProjectName} from './internals.js';\nimport {type Workspace} from './Workspace.js';\nimport {type WorkspaceDependenciesFromWorkspaceOptions} from './WorkspaceDependenciesFromWorkspaceOptions.js';\nimport {type WorkspaceDependenciesGetVersionsOptions} from './WorkspaceDependenciesGetVersionsOptions.js';\nimport {type WorkspaceDependency} from './WorkspaceDependency.js';\n\n/**\n * A collection of {@link WorkspaceDependency | workspace dependencies} that are installed in {@link Workspace | a workspace}.\n */\nexport class WorkspaceDependencies<M extends boolean = true> extends Array<WorkspaceDependency> {\n /** The workspace the dependencies are installed in. */\n workspace: Workspace<M>;\n\n constructor(...args: [...WorkspaceDependency[], Workspace<M>]) {\n super();\n\n if (args.length === 1) {\n [this.workspace] = args as [Workspace<M>];\n } else {\n let values = args.slice(0, -1) as WorkspaceDependency[];\n let workspace = args.at(-1) as Workspace<M>;\n\n this.push(...values);\n\n this.workspace = workspace;\n }\n }\n\n /**\n * Adds one or more new dependencies.\n *\n * @param newWorkspaceDependencies The dependencies to add.\n * @returns The new length of the collection.\n */\n override push(...newWorkspaceDependencies: WorkspaceDependency[]): number {\n for (let newWorkspaceDependency of newWorkspaceDependencies) {\n let doesExist = false;\n\n for (let workspaceDependency of this) {\n if (workspaceDependency.name === newWorkspaceDependency.name) {\n doesExist = true;\n\n workspaceDependency.versions = _.union(\n workspaceDependency.versions,\n newWorkspaceDependency.versions,\n );\n workspaceDependency.exactVersions = _.union(\n workspaceDependency.exactVersions,\n newWorkspaceDependency.exactVersions,\n );\n workspaceDependency.projects = _.unionWith(\n workspaceDependency.projects,\n newWorkspaceDependency.projects,\n (a, b) => a.name === b.name,\n );\n\n workspaceDependency.versions.sort(compareSemver);\n workspaceDependency.exactVersions.sort(compareSemver);\n workspaceDependency.projects.sort(compareWorkspaceDependencyProjectName);\n }\n }\n\n if (!doesExist) {\n super.push(newWorkspaceDependency);\n }\n }\n\n return this.length;\n }\n\n /**\n * Creates new {@link WorkspaceDependencies} instance from a {@link Workspace} instance and its dependencies.\n *\n * @param workspace The workspace from which the dependnecies are taken.\n * @param options Options.\n * @returns The new {@link WorkspaceDependencies} instance.\n */\n static fromWorkspace<M extends boolean = true>(\n workspace: Workspace<M>,\n options?: WorkspaceDependenciesFromWorkspaceOptions,\n ) {\n let workspaceDependencies: WorkspaceDependency[] = [];\n\n if (options?.includeWorkspaceDependencies) {\n for (let [dependencyName, dependencyVersion] of Object.entries({\n ...workspace.packageJson?.dependencies,\n ...workspace.packageJson?.devDependencies,\n })) {\n let exactDependencyVersion = semver.validRange(dependencyVersion)\n ? semver.minVersion(dependencyVersion)?.format() ??\n semver.coerce(dependencyVersion)?.format() ??\n dependencyVersion.trim()\n : dependencyVersion.trim();\n\n let workspaceDependency: WorkspaceDependency = {\n name: dependencyName,\n versions: [dependencyVersion],\n exactVersions: [exactDependencyVersion],\n projects: [],\n };\n\n workspaceDependencies.push(workspaceDependency);\n }\n }\n\n for (let project of workspace.projects) {\n if (!options?.includeOnlyDevDependencies) {\n for (let [dependencyName, dependencyVersion] of Object.entries(\n project.packageJson.dependencies ?? {},\n )) {\n let exactDependencyVersion = semver.validRange(dependencyVersion)\n ? semver.minVersion(dependencyVersion)?.format() ??\n semver.coerce(dependencyVersion)?.format() ??\n dependencyVersion.trim()\n : dependencyVersion.trim();\n\n let workspaceDependency: WorkspaceDependency = {\n name: dependencyName,\n versions: [dependencyVersion],\n exactVersions: [exactDependencyVersion],\n projects: [],\n };\n\n if (project.name) {\n workspaceDependency.projects = [\n {\n name: project.name,\n version: dependencyVersion,\n exactVersion: exactDependencyVersion,\n },\n ];\n }\n\n workspaceDependencies.push(workspaceDependency);\n }\n }\n\n if (options?.includeDevDependencies || options?.includeOnlyDevDependencies) {\n for (let [dependencyName, dependencyVersion] of Object.entries(\n project.packageJson.devDependencies ?? {},\n )) {\n let exactDependencyVersion = semver.validRange(dependencyVersion)\n ? semver.minVersion(dependencyVersion)?.format() ??\n semver.coerce(dependencyVersion)?.format() ??\n dependencyVersion.trim()\n : dependencyVersion.trim();\n\n let workspaceDependency: WorkspaceDependency = {\n name: dependencyName,\n versions: [dependencyVersion],\n exactVersions: [exactDependencyVersion],\n projects: [],\n };\n\n if (project.name) {\n workspaceDependency.projects = [\n {\n name: project.name,\n version: dependencyVersion,\n exactVersion: exactDependencyVersion,\n },\n ];\n }\n\n workspaceDependencies.push(workspaceDependency);\n }\n }\n }\n\n return new this(...workspaceDependencies, workspace);\n }\n\n /**\n * Creates map of all dependnecies and their installed version.\n *\n * @param options Options.\n * @returns Object whose keys are dependency names and values are sorted versions.\n */\n getVersions(options?: WorkspaceDependenciesGetVersionsOptions) {\n let versions: Record<string, string[]> = {};\n\n for (let dependency of this) {\n versions[dependency.name] = options?.useExactVersions\n ? dependency.exactVersions\n : dependency.versions;\n }\n\n return versions;\n }\n}\n"],"names":["_","semver","compareSemver","compareWorkspaceDependencyProjectName","WorkspaceDependencies","Array","workspace","constructor","args","length","values","slice","at","push","newWorkspaceDependencies","newWorkspaceDependency","doesExist","workspaceDependency","name","versions","union","exactVersions","projects","unionWith","a","b","sort","fromWorkspace","options","workspaceDependencies","includeWorkspaceDependencies","dependencyName","dependencyVersion","Object","entries","packageJson","dependencies","devDependencies","exactDependencyVersion","validRange","minVersion","format","coerce","trim","project","includeOnlyDevDependencies","version","exactVersion","includeDevDependencies","getVersions","dependency","useExactVersions"],"mappings":"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"}
@@ -6,9 +6,8 @@ import semver from 'semver';
6
6
  * @param b The second SemvEr string.
7
7
  * @returns Number whose positivity indicates the relative order of the two elements.
8
8
  */ export function compareSemver(a, b) {
9
- var _semver_minVersion, _semver_coerce, _semver_minVersion1, _semver_coerce1;
10
- let firstSemver = semver.validRange(a) ? ((_semver_minVersion = semver.minVersion(a)) === null || _semver_minVersion === void 0 ? void 0 : _semver_minVersion.format()) ?? ((_semver_coerce = semver.coerce(a)) === null || _semver_coerce === void 0 ? void 0 : _semver_coerce.format()) ?? '0.0.0' : '0.0.0';
11
- let secondSemver = semver.validRange(b) ? ((_semver_minVersion1 = semver.minVersion(b)) === null || _semver_minVersion1 === void 0 ? void 0 : _semver_minVersion1.format()) ?? ((_semver_coerce1 = semver.coerce(b)) === null || _semver_coerce1 === void 0 ? void 0 : _semver_coerce1.format()) ?? '0.0.0' : '0.0.0';
9
+ let firstSemver = semver.validRange(a) ? semver.minVersion(a)?.format() ?? semver.coerce(a)?.format() ?? '0.0.0' : '0.0.0';
10
+ let secondSemver = semver.validRange(b) ? semver.minVersion(b)?.format() ?? semver.coerce(b)?.format() ?? '0.0.0' : '0.0.0';
12
11
  let comparison = semver.compare(firstSemver, secondSemver);
13
12
  if (comparison === 0 && (a !== firstSemver || b !== secondSemver)) {
14
13
  if (a !== firstSemver && b !== secondSemver) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/workspace/internals/compareSemver.ts"],"sourcesContent":["import semver from 'semver';\n\n/**\n * Defines sort order between two SemVer strings.\n *\n * @param a The first SemVer string.\n * @param b The second SemvEr string.\n * @returns Number whose positivity indicates the relative order of the two elements.\n */\nexport function compareSemver(a: string, b: string) {\n let firstSemver = semver.validRange(a)\n ? semver.minVersion(a)?.format() ?? semver.coerce(a)?.format() ?? '0.0.0'\n : '0.0.0';\n let secondSemver = semver.validRange(b)\n ? semver.minVersion(b)?.format() ?? semver.coerce(b)?.format() ?? '0.0.0'\n : '0.0.0';\n\n let comparison = semver.compare(firstSemver, secondSemver);\n\n if (comparison === 0 && (a !== firstSemver || b !== secondSemver)) {\n if (a !== firstSemver && b !== secondSemver) {\n return b.localeCompare(a);\n }\n\n if (a !== firstSemver) {\n return 1;\n }\n\n if (b !== secondSemver) {\n return -1;\n }\n }\n\n return comparison;\n}\n"],"names":["semver","compareSemver","a","b","firstSemver","validRange","minVersion","format","coerce","secondSemver","comparison","compare","localeCompare"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAE5B;;;;;;CAMC,GACD,OAAO,SAASC,cAAcC,CAAS,EAAEC,CAAS;QAE5CH,oBAAkCA,gBAGlCA,qBAAkCA;IAJtC,IAAII,cAAcJ,OAAOK,UAAU,CAACH,KAChCF,EAAAA,qBAAAA,OAAOM,UAAU,CAACJ,gBAAlBF,yCAAAA,mBAAsBO,MAAM,SAAMP,iBAAAA,OAAOQ,MAAM,CAACN,gBAAdF,qCAAAA,eAAkBO,MAAM,OAAM,UAChE;IACJ,IAAIE,eAAeT,OAAOK,UAAU,CAACF,KACjCH,EAAAA,sBAAAA,OAAOM,UAAU,CAACH,gBAAlBH,0CAAAA,oBAAsBO,MAAM,SAAMP,kBAAAA,OAAOQ,MAAM,CAACL,gBAAdH,sCAAAA,gBAAkBO,MAAM,OAAM,UAChE;IAEJ,IAAIG,aAAaV,OAAOW,OAAO,CAACP,aAAaK;IAE7C,IAAIC,eAAe,KAAMR,CAAAA,MAAME,eAAeD,MAAMM,YAAW,GAAI;QACjE,IAAIP,MAAME,eAAeD,MAAMM,cAAc;YAC3C,OAAON,EAAES,aAAa,CAACV;QACzB;QAEA,IAAIA,MAAME,aAAa;YACrB,OAAO;QACT;QAEA,IAAID,MAAMM,cAAc;YACtB,OAAO,CAAC;QACV;IACF;IAEA,OAAOC;AACT"}
1
+ {"version":3,"sources":["../../../src/workspace/internals/compareSemver.ts"],"sourcesContent":["import semver from 'semver';\n\n/**\n * Defines sort order between two SemVer strings.\n *\n * @param a The first SemVer string.\n * @param b The second SemvEr string.\n * @returns Number whose positivity indicates the relative order of the two elements.\n */\nexport function compareSemver(a: string, b: string) {\n let firstSemver = semver.validRange(a)\n ? semver.minVersion(a)?.format() ?? semver.coerce(a)?.format() ?? '0.0.0'\n : '0.0.0';\n let secondSemver = semver.validRange(b)\n ? semver.minVersion(b)?.format() ?? semver.coerce(b)?.format() ?? '0.0.0'\n : '0.0.0';\n\n let comparison = semver.compare(firstSemver, secondSemver);\n\n if (comparison === 0 && (a !== firstSemver || b !== secondSemver)) {\n if (a !== firstSemver && b !== secondSemver) {\n return b.localeCompare(a);\n }\n\n if (a !== firstSemver) {\n return 1;\n }\n\n if (b !== secondSemver) {\n return -1;\n }\n }\n\n return comparison;\n}\n"],"names":["semver","compareSemver","a","b","firstSemver","validRange","minVersion","format","coerce","secondSemver","comparison","compare","localeCompare"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAE5B;;;;;;CAMC,GACD,OAAO,SAASC,cAAcC,CAAS,EAAEC,CAAS;IAChD,IAAIC,cAAcJ,OAAOK,UAAU,CAACH,KAChCF,OAAOM,UAAU,CAACJ,IAAIK,YAAYP,OAAOQ,MAAM,CAACN,IAAIK,YAAY,UAChE;IACJ,IAAIE,eAAeT,OAAOK,UAAU,CAACF,KACjCH,OAAOM,UAAU,CAACH,IAAII,YAAYP,OAAOQ,MAAM,CAACL,IAAII,YAAY,UAChE;IAEJ,IAAIG,aAAaV,OAAOW,OAAO,CAACP,aAAaK;IAE7C,IAAIC,eAAe,KAAMR,CAAAA,MAAME,eAAeD,MAAMM,YAAW,GAAI;QACjE,IAAIP,MAAME,eAAeD,MAAMM,cAAc;YAC3C,OAAON,EAAES,aAAa,CAACV;QACzB;QAEA,IAAIA,MAAME,aAAa;YACrB,OAAO;QACT;QAEA,IAAID,MAAMM,cAAc;YACtB,OAAO,CAAC;QACV;IACF;IAEA,OAAOC;AACT"}
@@ -0,0 +1 @@
1
+ export declare function containsProject(directoryPath: string): Promise<boolean>;
@@ -0,0 +1,14 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import { CARSON_CONFIG_DIRECTORY, PACKAGE_JSON_FILENAME } from '../../constants.js';
4
+ export async function containsProject(directoryPath) {
5
+ if (await fs.pathExists(path.join(directoryPath, PACKAGE_JSON_FILENAME))) {
6
+ return true;
7
+ }
8
+ if (await fs.pathExists(path.join(directoryPath, CARSON_CONFIG_DIRECTORY))) {
9
+ return true;
10
+ }
11
+ return false;
12
+ }
13
+
14
+ //# sourceMappingURL=containsProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/workspace/internals/containsProject.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {CARSON_CONFIG_DIRECTORY, PACKAGE_JSON_FILENAME} from '../../constants.js';\n\nexport async function containsProject(directoryPath: string): Promise<boolean> {\n if (await fs.pathExists(path.join(directoryPath, PACKAGE_JSON_FILENAME))) {\n return true;\n }\n\n if (await fs.pathExists(path.join(directoryPath, CARSON_CONFIG_DIRECTORY))) {\n return true;\n }\n\n return false;\n}\n"],"names":["fs","path","CARSON_CONFIG_DIRECTORY","PACKAGE_JSON_FILENAME","containsProject","directoryPath","pathExists","join"],"mappings":"AAAA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,SAAQC,uBAAuB,EAAEC,qBAAqB,QAAO,qBAAqB;AAElF,OAAO,eAAeC,gBAAgBC,aAAqB;IACzD,IAAI,MAAML,GAAGM,UAAU,CAACL,KAAKM,IAAI,CAACF,eAAeF,yBAAyB;QACxE,OAAO;IACT;IAEA,IAAI,MAAMH,GAAGM,UAAU,CAACL,KAAKM,IAAI,CAACF,eAAeH,2BAA2B;QAC1E,OAAO;IACT;IAEA,OAAO;AACT"}
@@ -1,8 +1,7 @@
1
1
  export function getPackageJsonWorkspaces(packageJson) {
2
- var _packageJson_workspaces;
3
2
  if (Array.isArray(packageJson.workspaces)) {
4
3
  return packageJson.workspaces;
5
- } else if ((_packageJson_workspaces = packageJson.workspaces) === null || _packageJson_workspaces === void 0 ? void 0 : _packageJson_workspaces.packages) {
4
+ } else if (packageJson.workspaces?.packages) {
6
5
  return packageJson.workspaces.packages;
7
6
  }
8
7
  return undefined;
@@ -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;QAGpDA;IAFX,IAAIC,MAAMC,OAAO,CAACF,YAAYG,UAAU,GAAG;QACzC,OAAOH,YAAYG,UAAU;IAC/B,OAAO,KAAIH,0BAAAA,YAAYG,UAAU,cAAtBH,8CAAAA,wBAAwBI,QAAQ,EAAE;QAC3C,OAAOJ,YAAYG,UAAU,CAACC,QAAQ;IACxC;IAEA,OAAOC;AACT"}
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,6 +1,7 @@
1
1
  export * from './internals/compareProjectPath.js';
2
2
  export * from './internals/compareSemver.js';
3
3
  export * from './internals/compareWorkspaceDependencyProjectName.js';
4
+ export * from './internals/containsProject.js';
4
5
  export * from './internals/getPackageJsonWorkspaces.js';
5
6
  export * from './internals/getRepositoryBranches.js';
6
7
  export * from './internals/getRepositoryUrl.js';
@@ -1,6 +1,7 @@
1
1
  export * from './internals/compareProjectPath.js';
2
2
  export * from './internals/compareSemver.js';
3
3
  export * from './internals/compareWorkspaceDependencyProjectName.js';
4
+ export * from './internals/containsProject.js';
4
5
  export * from './internals/getPackageJsonWorkspaces.js';
5
6
  export * from './internals/getRepositoryBranches.js';
6
7
  export * from './internals/getRepositoryUrl.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workspace/internals.ts"],"sourcesContent":["export * from './internals/compareProjectPath.js';\nexport * from './internals/compareSemver.js';\nexport * from './internals/compareWorkspaceDependencyProjectName.js';\nexport * from './internals/getPackageJsonWorkspaces.js';\nexport * from './internals/getRepositoryBranches.js';\nexport * from './internals/getRepositoryUrl.js';\n"],"names":[],"mappings":"AAAA,cAAc,oCAAoC;AAClD,cAAc,+BAA+B;AAC7C,cAAc,uDAAuD;AACrE,cAAc,0CAA0C;AACxD,cAAc,uCAAuC;AACrD,cAAc,kCAAkC"}
1
+ {"version":3,"sources":["../../src/workspace/internals.ts"],"sourcesContent":["export * from './internals/compareProjectPath.js';\nexport * from './internals/compareSemver.js';\nexport * from './internals/compareWorkspaceDependencyProjectName.js';\nexport * from './internals/containsProject.js';\nexport * from './internals/getPackageJsonWorkspaces.js';\nexport * from './internals/getRepositoryBranches.js';\nexport * from './internals/getRepositoryUrl.js';\n"],"names":[],"mappings":"AAAA,cAAc,oCAAoC;AAClD,cAAc,+BAA+B;AAC7C,cAAc,uDAAuD;AACrE,cAAc,iCAAiC;AAC/C,cAAc,0CAA0C;AACxD,cAAc,uCAAuC;AACrD,cAAc,kCAAkC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson",
3
- "version": "0.1.0",
3
+ "version": "0.1.1-2487994",
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.0",
35
- "@jakubmazanec/cli": "^0.1.0",
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",
34
+ "@jakubmazanec/args": "1.0.2-2487994",
35
+ "@jakubmazanec/cli": "0.1.2-2487994",
36
+ "@jakubmazanec/error": "2.0.3-2487994",
37
+ "@jakubmazanec/fs-utils": "0.1.2-2487994",
38
+ "@jakubmazanec/template": "1.0.3-2487994",
39
+ "@jakubmazanec/ts-utils": "2.1.2-2487994",
40
+ "@jakubmazanec/zod-utils": "1.0.2-2487994",
41
41
  "chalk": "^5.2.0",
42
42
  "diff": "^5.1.0",
43
43
  "fast-glob": "^3.2.11",
@@ -46,7 +46,7 @@
46
46
  "json5": "^2.2.1",
47
47
  "lodash": "^4.17.21",
48
48
  "micromatch": "^4.0.5",
49
- "prettier": "^2.8.5",
49
+ "prettier": "^3.0.0",
50
50
  "prettier-plugin-packagejson": "^2.4.3",
51
51
  "semver": "^7.3.6",
52
52
  "simple-git": "^3.15.1",
package/src/constants.ts CHANGED
@@ -11,3 +11,4 @@ export const WORKSPACE_CONFIG_FILENAME = 'workspace.json';
11
11
  export const SNAPSHOTS_FILENAME = '.snapshots';
12
12
  export const TEMPLATES_PATH = 'templates';
13
13
  export const TEMPLATE_CONFIG_FILENAME = 'config.json';
14
+ export const PACKAGE_JSON_FILENAME = 'package.json';
@@ -34,7 +34,7 @@ export async function applyTemplateRenders({
34
34
  ignoreStrategies,
35
35
  }: ApplyTemplateRendersOptions) {
36
36
  // we need to clear Prettier cache, because we are changing file system
37
- prettier.clearConfigCache();
37
+ await prettier.clearConfigCache();
38
38
 
39
39
  // first, we read the existing snapshots and use them to undo previous changes
40
40
  let templateRenderSnapshotsPath = path.join(
@@ -9,7 +9,7 @@ export async function prettify(content: string, targetPath: string) {
9
9
  try {
10
10
  let prettierOptions = await prettier.resolveConfig(targetPath, {editorconfig: true});
11
11
 
12
- prettifiedContent = prettier.format(content, {
12
+ prettifiedContent = await prettier.format(content, {
13
13
  ...prettierOptions,
14
14
  filepath: targetPath,
15
15
  plugins: [packageJsonPrettierPlugin],
@@ -110,8 +110,6 @@ export class Project<M extends boolean = true> {
110
110
  });
111
111
  }
112
112
 
113
- await saveProjectConfig({projectPath: project.path, projectConfig: {template: templateId}});
114
-
115
113
  let templateRenders = await renderCarsonTemplate({
116
114
  templateId,
117
115
  templateData: {
@@ -127,6 +125,8 @@ export class Project<M extends boolean = true> {
127
125
  ignoreStrategies: ['check'],
128
126
  });
129
127
 
128
+ await saveProjectConfig({projectPath: project.path, projectConfig: {template: templateId}});
129
+
130
130
  await project.read();
131
131
 
132
132
  return project;
@@ -8,6 +8,7 @@ import {z} from 'zod';
8
8
 
9
9
  import {
10
10
  compareProjectPath,
11
+ containsProject,
11
12
  getPackageJsonWorkspaces,
12
13
  getRepositoryBranches,
13
14
  getRepositoryUrl,
@@ -174,11 +175,6 @@ export class Workspace<M extends boolean = true> {
174
175
  });
175
176
  }
176
177
 
177
- await saveWorkspaceConfig({
178
- workspacePath: workspace.path,
179
- workspaceConfig: {template: templateId},
180
- });
181
-
182
178
  let templateRenders = await renderCarsonTemplate({
183
179
  templateId,
184
180
  templateData: {
@@ -193,6 +189,11 @@ export class Workspace<M extends boolean = true> {
193
189
  ignoreStrategies: ['check'],
194
190
  });
195
191
 
192
+ await saveWorkspaceConfig({
193
+ workspacePath: workspace.path,
194
+ workspaceConfig: {template: templateId},
195
+ });
196
+
196
197
  return Workspace.read(workspace.path);
197
198
  }
198
199
 
@@ -598,9 +599,13 @@ export class Workspace<M extends boolean = true> {
598
599
  });
599
600
 
600
601
  for (let packagePath of packagePaths) {
601
- let project = await Project.read(path.join(this.path, packagePath), this);
602
+ let projectPath = path.join(this.path, packagePath);
603
+
604
+ if (await containsProject(projectPath)) {
605
+ let project = await Project.read(projectPath, this);
602
606
 
603
- projects.push(project);
607
+ projects.push(project);
608
+ }
604
609
  }
605
610
 
606
611
  this.projects = projects;
@@ -0,0 +1,16 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+
4
+ import {CARSON_CONFIG_DIRECTORY, PACKAGE_JSON_FILENAME} from '../../constants.js';
5
+
6
+ export async function containsProject(directoryPath: string): Promise<boolean> {
7
+ if (await fs.pathExists(path.join(directoryPath, PACKAGE_JSON_FILENAME))) {
8
+ return true;
9
+ }
10
+
11
+ if (await fs.pathExists(path.join(directoryPath, CARSON_CONFIG_DIRECTORY))) {
12
+ return true;
13
+ }
14
+
15
+ return false;
16
+ }
@@ -1,6 +1,7 @@
1
1
  export * from './internals/compareProjectPath.js';
2
2
  export * from './internals/compareSemver.js';
3
3
  export * from './internals/compareWorkspaceDependencyProjectName.js';
4
+ export * from './internals/containsProject.js';
4
5
  export * from './internals/getPackageJsonWorkspaces.js';
5
6
  export * from './internals/getRepositoryBranches.js';
6
7
  export * from './internals/getRepositoryUrl.js';