{"version":3,"sources":["utils/workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,OAAO,EACL,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,gBAAgB,EAC5D,MAAM,eAAe,CAAC;AAUvB,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,KAAK,EAAE,MAAM,GACZ,qBAAqB,CAUvB;AAED,wBAAsB,aAAa,CACjC,IAAI,GAAE,IAAI,CAAC,WAAgB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CAYvB;AAED,eAAO,MAAM,iBAAiB,6DAIyB,CAAC;AAExD,eAAO,MAAM,mBAAmB,0DAGwB,CAAC;AAEzD,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,IAAI,CAAC,WAAgB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CAcvB;AAED,wBAAsB,iCAAiC,CACrD,IAAI,GAAE,IAAI,CAAC,WAAgB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAsB3B","file":"workspaces.d.ts","sourcesContent":["import * as bolt from 'bolt';\nimport Project from 'bolt/dist/modern/Project';\nimport { toSpawnOpts, toFilterOpts } from 'bolt/dist/modern/utils/options';\nimport path from 'path';\nimport pLocate from 'p-locate';\nimport os from 'os';\n\nimport {\n  IWorkspace, IFlags, IWorkspacesRunOptions, IWorkspaceChange,\n} from '../interfaces';\nimport {\n  getChangedFilesSinceRef,\n  getTags,\n  isRefInHistory,\n} from './git';\n\n\nconst isWin = (os.platform() === 'win32');\n\nexport function toWorkspacesRunOptions(\n  args: bolt.IArgs,\n  flags: IFlags,\n): IWorkspacesRunOptions {\n  const [script, ...scriptArgs] = args;\n  const flagArgs = flags['--'] || [];\n\n  return {\n    script,\n    scriptArgs: [...scriptArgs, ...flagArgs],\n    spawnOpts: toSpawnOpts(flags),\n    filterOpts: toFilterOpts(flags),\n  };\n}\n\nexport async function getWorkspaces(\n  opts: bolt.IFilterOpts = {},\n): Promise<IWorkspace[]> {\n  const project = await Project.init(process.cwd());\n  const packages = await project.getPackages();\n\n  const filtered = project.filterPackages(packages, {\n    only: opts.only,\n    ignore: opts.ignore,\n    onlyFs: opts.onlyFs,\n    ignoreFs: opts.ignoreFs,\n  });\n\n  return filtered;\n}\n\nexport const fileNameToPackage = (\n  fileName: string,\n  allPackages: IWorkspace[],\n): IWorkspace => allPackages\n  .find(pkg => fileName.startsWith(pkg.dir + path.sep));\n\nexport const fileExistsInPackage = (\n  fileName: string,\n  allPackages: IWorkspace[],\n): boolean => !!fileNameToPackage(fileName, allPackages);\n\nexport async function getWorkspacesChangedSinceRef(\n  ref: string,\n  opts: bolt.IFilterOpts = {},\n): Promise<IWorkspace[]> {\n  const changedFiles = await getChangedFilesSinceRef(ref, true);\n  const allPackages = await getWorkspaces(opts);\n\n  return (\n    changedFiles\n      // ignore deleted files\n      .filter(fileName => fileExistsInPackage(fileName, allPackages))\n      .map(fileName => fileNameToPackage(fileName, allPackages))\n      // filter, so that we have only unique packages\n      .filter((pkg, idx, packages) => packages.indexOf(pkg) === idx)\n  );\n\n  // return changedWorkspaces;\n}\n\nexport async function getChangesFromLastTagByWorkspaces(\n  opts: bolt.IFilterOpts = {},\n): Promise<IWorkspaceChange> {\n  const tags = await getTags({ isRevert: true });\n  const tag = await pLocate(tags, async (t: string): Promise<boolean> => {\n    const result = await isRefInHistory(t);\n    return result;\n  }, { preserveOrder: true });\n  const changedFiles = await getChangedFilesSinceRef(tag, true);\n  const allPackages = await getWorkspaces(opts);\n  const result = {};\n\n  allPackages.forEach((workspace: IWorkspace): void => {\n    const changes = changedFiles.filter(\n      (changeFilePath: string): boolean => changeFilePath.includes(workspace.dir),\n    );\n\n    result[workspace.dir] = changes.map((change: string): string => {\n      const parts = change.split(isWin ? '\\\\' : '/');\n      return parts[parts.length - 1];\n    });\n  });\n\n  return result;\n}\n"]}