{"version":3,"file":"components/Opener/code.mjs","sources":["../../../src/components/Opener/code.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Typography } from 'antd';\nimport path from 'path';\nimport { VSCode, openVSCode } from './ide';\nimport { getShortPath } from 'src/utils';\n\ninterface CodeOpenerProps {\n  windowId?: number;\n  /**\n   * @example /foo/src/pages/home/index.ts + 100 modules\n   * @example /foo/src/pages/b/index.ts\n   */\n  url: string;\n  /**\n   * @example 1:0-10\n   * @example 1:1\n   */\n  loc?: string;\n  cwd: string;\n  label?: string;\n  disabled?: boolean;\n  code?: boolean;\n}\n\nfunction parseUrl(url: string) {\n  const strs = url.split(' ');\n  let res = '';\n  if (strs.length === 1) {\n    [res] = strs;\n  } else {\n    [res] = strs.filter((e) => path.isAbsolute(e) || e.startsWith('./'));\n  }\n\n  return res || url;\n}\n\nfunction parseLoc(loc?: string) {\n  if (!loc) return { line: 1, column: 1 };\n\n  const [line, col = ''] = loc.split(':');\n  const [start = 1, end] = col.split('-');\n\n  return {\n    line,\n    columnStart: start,\n    columnEnd: end || start,\n  };\n}\n\nconst defaultWindowId = +Date.now().toString().slice(-4) + 1000;\n\nexport const CodeOpener = ({\n  cwd,\n  url,\n  loc,\n  windowId = defaultWindowId,\n  label,\n  disabled,\n  code = false,\n}: PropsWithChildren<CodeOpenerProps>): React.JSX.Element | null => {\n  const file = path.resolve(cwd, parseUrl(url));\n\n  const { line, columnStart } = parseLoc(loc);\n\n  return (\n    <span style={{ wordBreak: 'break-all' }}>\n      <Typography.Text\n        copyable={{\n          text: file,\n        }}\n      >\n        <Typography.Text\n          code={code}\n          onClick={() => {\n            if (disabled) return;\n            openVSCode({ file, line, column: columnStart, windowId });\n          }}\n          style={{ cursor: disabled ? 'revert' : 'pointer' }}\n        >\n          {label || getShortPath(url)}\n          {loc ? `:${loc}` : ''}\n        </Typography.Text>\n      </Typography.Text>\n      {process.env.NODE_ENV === 'development' ? (\n        <VSCode\n          file={file}\n          line={line}\n          column={columnStart}\n          windowId={windowId}\n          style={{ marginLeft: 3 }}\n        />\n      ) : (\n        <div style={{ display: 'inline-block' }} />\n      )}\n      {/* TODO implement open cloud ide or codebase by git url + branch + relative filepath in production */}\n    </span>\n  );\n};\n"],"names":["parseUrl","url","strs","res","e","path","parseLoc","loc","line","col","start","end","defaultWindowId","Date","CodeOpener","cwd","windowId","label","disabled","code","file","columnStart","Typography","openVSCode","getShortPath","process","VSCode"],"mappings":";;;;;AAwBA,SAASA,SAASC,GAAW;IAC3B,MAAMC,OAAOD,IAAI,KAAK,CAAC;IACvB,IAAIE,MAAM;IACV,IAAID,AAAgB,MAAhBA,KAAK,MAAM,EACb,CAACC,IAAI,GAAGD;SAER,CAACC,IAAI,GAAGD,KAAK,MAAM,CAAC,CAACE,IAAMC,KAAK,UAAU,CAACD,MAAMA,EAAE,UAAU,CAAC;IAGhE,OAAOD,OAAOF;AAChB;AAEA,SAASK,SAASC,GAAY;IAC5B,IAAI,CAACA,KAAK,OAAO;QAAE,MAAM;QAAG,QAAQ;IAAE;IAEtC,MAAM,CAACC,MAAMC,MAAM,EAAE,CAAC,GAAGF,IAAI,KAAK,CAAC;IACnC,MAAM,CAACG,QAAQ,CAAC,EAAEC,IAAI,GAAGF,IAAI,KAAK,CAAC;IAEnC,OAAO;QACLD;QACA,aAAaE;QACb,WAAWC,OAAOD;IACpB;AACF;AAEA,MAAME,kBAAkB,CAACC,KAAK,GAAG,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM;AAEpD,MAAMC,aAAa,CAAC,EACzBC,GAAG,EACHd,GAAG,EACHM,GAAG,EACHS,WAAWJ,eAAe,EAC1BK,KAAK,EACLC,QAAQ,EACRC,OAAO,KAAK,EACuB;IACnC,MAAMC,OAAOf,KAAK,OAAO,CAACU,KAAKf,SAASC;IAExC,MAAM,EAAEO,IAAI,EAAEa,WAAW,EAAE,GAAGf,SAASC;IAEvC,OAAO,WAAP,GACE,KAAC;QAAK,OAAO;YAAE,WAAW;QAAY;;0BACpC,IAACe,WAAW,IAAI;gBACd,UAAU;oBACR,MAAMF;gBACR;0BAEA,mBAACE,WAAW,IAAI;oBACd,MAAMH;oBACN,SAAS;wBACP,IAAID,UAAU;wBACdK,WAAW;4BAAEH;4BAAMZ;4BAAM,QAAQa;4BAAaL;wBAAS;oBACzD;oBACA,OAAO;wBAAE,QAAQE,WAAW,WAAW;oBAAU;;wBAEhDD,SAASO,aAAavB;wBACtBM,MAAM,CAAC,CAAC,EAAEA,KAAK,GAAG;;;;YAGG,kBAAzBkB,QAAQ,GAAG,CAAC,QAAQ,GAAqB,WAAhB,GACxB,IAACC,QAAMA;gBACL,MAAMN;gBACN,MAAMZ;gBACN,QAAQa;gBACR,UAAUL;gBACV,OAAO;oBAAE,YAAY;gBAAE;+BAGzB,IAAC;gBAAI,OAAO;oBAAE,SAAS;gBAAe;;;;AAK9C"}