{
  "version": 3,
  "sources": ["../../src/web/lib/Project.ts"],
  "sourcesContent": ["import type { AddOnLicenseType, CurrentUser, Project, ProjectBase, Space } from \"@framerjs/app-shared\"\nimport { isPersonalSpace, openNewTab } from \"@framerjs/app-shared\"\nimport { format, parseISO } from \"date-fns\"\n\ntype PrettyProjectUrlParams = Pick<Project, \"id\" | \"title\" | \"accessToken\" | \"canvasFeatures\">\n\nexport function canUserDuplicateProject(user: CurrentUser, project: ProjectBase): boolean {\n\treturn (\n\t\tisPersonalSpace(project.space) ||\n\t\tuser.spaces.some(space => project.space.id === space.id && space.permissions.write)\n\t)\n}\n\nexport function prettyPathSegment({ id, title, accessToken }: Pick<Project, \"id\" | \"title\" | \"accessToken\">): string {\n\tlet segment = (title || \"\").replace(/[^A-Z\\d]+/gi, \"-\").replace(/^-|-$/gu, \"\")\n\n\t// Separate slug and ID with double dash when applicable.\n\tif (segment) {\n\t\tsegment += \"--\"\n\t}\n\tsegment += id\n\n\t// Include access token at the end so people can get access if they copy the link.\n\tif (accessToken) {\n\t\tsegment += `-${accessToken}`\n\t}\n\n\treturn segment\n}\n\n/** Return a URL for the project provided */\nexport function prettyURL(params: PrettyProjectUrlParams): URL {\n\tconst path = \"/projects/\" + prettyPathSegment(params)\n\treturn new URL(path, window.location.origin)\n}\n\nexport const getProjectAnalyticsURL = (project: PrettyProjectUrlParams) => {\n\tconst projectURL = prettyURL(project)\n\tprojectURL.searchParams.set(\"view\", \"analytics:overview\")\n\treturn projectURL\n}\n\nexport const getProjectPlansURL = (project: PrettyProjectUrlParams) => {\n\tconst projectURL = prettyURL(project)\n\tprojectURL.search = \"?view=settings:plans\"\n\treturn projectURL\n}\n\nexport const getProjectAddOnCancellationURL = (projectId: string, addOnLicenseType: AddOnLicenseType) => {\n\tconst projectURL = getProjectPlansURL({ id: projectId, title: null, canvasFeatures: {} })\n\tprojectURL.search += `&add-on-action=cancel&add-on-license-type=${addOnLicenseType}`\n\treturn `${projectURL.pathname}${projectURL.search}`\n}\n\nexport const openProjectPlansPage = (projectId: string) => {\n\tconst projectURL = getProjectPlansURL({ id: projectId, title: null, canvasFeatures: {} })\n\topenNewTab(projectURL.toString())\n}\n\nexport const getProjectDomainsURL = (projectId: string) => {\n\tconst projectURL = prettyURL({ id: projectId, title: \"\", canvasFeatures: {} })\n\tprojectURL.searchParams.set(\"view\", \"settings:domains\")\n\treturn projectURL\n}\n\nconst DEFAULT_FORMAT_STR = \"MMMM do yyyy, h:mm aaaa\"\nexport const formatDate = (date: Date) => format(date, DEFAULT_FORMAT_STR)\n\n/** Return a formatted date string for the project date provided */\nexport const formatFullDate = (date: string) => formatDate(parseISO(date))\n\n/** Return a document title or \u201CUntitled\u201D if it\u2019s empty */\nexport function titleOrUntitled(title: string | null | undefined) {\n\treturn title?.trim() || \"Untitled\"\n}\n\nexport const getProjectVisibleName = (p: ProjectBase) => titleOrUntitled(p.title)\n\nexport const getProjectLastModifiedDate = (p: ProjectBase) => parseISO(p.updatedAt ?? p.createdAt)\n\nexport const getProjectTeamLicenseBySpaces = (project: ProjectBase, spaces: Space[]) => {\n\tconst team = spaces.find(space => space.id === project.space.id)\n\treturn team && team.scope === \"organization\" ? team.license.type : null\n}\n"],
  "mappings": ";;;;;;;;;;AAMO,SAAS,wBAAwB,MAAmB,SAA+B;AACzF,SACC,gBAAgB,QAAQ,KAAK,KAC7B,KAAK,OAAO,KAAK,WAAS,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,YAAY,KAAK;AAEpF;AAEO,SAAS,kBAAkB,EAAE,IAAI,OAAO,YAAY,GAA0D;AACpH,MAAI,WAAW,SAAS,IAAI,QAAQ,eAAe,GAAG,EAAE,QAAQ,WAAW,EAAE;AAG7E,MAAI,SAAS;AACZ,eAAW;AAAA,EACZ;AACA,aAAW;AAGX,MAAI,aAAa;AAChB,eAAW,IAAI,WAAW;AAAA,EAC3B;AAEA,SAAO;AACR;AAGO,SAAS,UAAU,QAAqC;AAC9D,QAAM,OAAO,eAAe,kBAAkB,MAAM;AACpD,SAAO,IAAI,IAAI,MAAM,OAAO,SAAS,MAAM;AAC5C;AAEO,IAAM,yBAAyB,CAAC,YAAoC;AAC1E,QAAM,aAAa,UAAU,OAAO;AACpC,aAAW,aAAa,IAAI,QAAQ,oBAAoB;AACxD,SAAO;AACR;AAEO,IAAM,qBAAqB,CAAC,YAAoC;AACtE,QAAM,aAAa,UAAU,OAAO;AACpC,aAAW,SAAS;AACpB,SAAO;AACR;AAEO,IAAM,iCAAiC,CAAC,WAAmB,qBAAuC;AACxG,QAAM,aAAa,mBAAmB,EAAE,IAAI,WAAW,OAAO,MAAM,gBAAgB,CAAC,EAAE,CAAC;AACxF,aAAW,UAAU,6CAA6C,gBAAgB;AAClF,SAAO,GAAG,WAAW,QAAQ,GAAG,WAAW,MAAM;AAClD;AAEO,IAAM,uBAAuB,CAAC,cAAsB;AAC1D,QAAM,aAAa,mBAAmB,EAAE,IAAI,WAAW,OAAO,MAAM,gBAAgB,CAAC,EAAE,CAAC;AACxF,aAAW,WAAW,SAAS,CAAC;AACjC;AAEO,IAAM,uBAAuB,CAAC,cAAsB;AAC1D,QAAM,aAAa,UAAU,EAAE,IAAI,WAAW,OAAO,IAAI,gBAAgB,CAAC,EAAE,CAAC;AAC7E,aAAW,aAAa,IAAI,QAAQ,kBAAkB;AACtD,SAAO;AACR;AAEA,IAAM,qBAAqB;AACpB,IAAM,aAAa,CAAC,SAAe,OAAO,MAAM,kBAAkB;AAGlE,IAAM,iBAAiB,CAAC,SAAiB,WAAW,SAAS,IAAI,CAAC;AAGlE,SAAS,gBAAgB,OAAkC;AACjE,SAAO,OAAO,KAAK,KAAK;AACzB;AAEO,IAAM,wBAAwB,CAAC,MAAmB,gBAAgB,EAAE,KAAK;AAEzE,IAAM,6BAA6B,CAAC,MAAmB,SAAS,EAAE,aAAa,EAAE,SAAS;AAE1F,IAAM,gCAAgC,CAAC,SAAsB,WAAoB;AACvF,QAAM,OAAO,OAAO,KAAK,WAAS,MAAM,OAAO,QAAQ,MAAM,EAAE;AAC/D,SAAO,QAAQ,KAAK,UAAU,iBAAiB,KAAK,QAAQ,OAAO;AACpE;",
  "names": []
}
