{
  "version": 3,
  "sources": ["../../src/web/lib/editorLimitReachedError.ts", "../../src/web/lib/grantAccessRequest.ts"],
  "sourcesContent": ["import type { ProjectLicenseType, TeamLicenseType } from \"@framerjs/app-shared\"\nimport { ApiError, HTTP_ERROR_CODES } from \"@framerjs/app-shared\"\n\n/**\n * Happens when an operation cannot proceed because the editor limit is exceeded.\n * It can happen when inviting new users, granting access requests,\n * or updating user permissions.\n *\n * Defined in [FramerProjectsService](https://github.com/framer/FramerProjectsService/blob/3d649b8e9a51a2e7390168d173cd20471a553e32/src/lib/types/errors.ts#L14).\n * and in [FramerTeamsService](https://github.com/framer/FramerTeamsService/blob/dd5e9242cedd7c41c706c6dc2d5829a78743e0ad/services/team_service.go#L1676).\n */\ninterface EditorLimitReachedError extends ApiError {\n\tdata: {\n\t\treason: \"editor_limit_reached\"\n\t\teditorLimit: number\n\t\tlicenseType: TeamLicenseType\n\t\tteamId: string\n\t\tteamName: string\n\t}\n}\n\ninterface ProjectEditorLimitReachedError extends ApiError {\n\tdata: {\n\t\treason: \"project_editor_limit_reached\"\n\t\tprojectId: string\n\t\tlicenseType: ProjectLicenseType\n\t\teditorLimit: number\n\t}\n}\n\nexport function isEditorLimitReachedError(error: unknown): error is EditorLimitReachedError {\n\treturn (\n\t\terror instanceof ApiError &&\n\t\terror.status === HTTP_ERROR_CODES.BadRequest &&\n\t\terror.data.reason === \"editor_limit_reached\"\n\t)\n}\n\nexport function isProjectEditorLimitReachedError(error: unknown): error is ProjectEditorLimitReachedError {\n\treturn (\n\t\terror instanceof ApiError &&\n\t\terror.status === HTTP_ERROR_CODES.BadRequest &&\n\t\terror.data.reason === \"project_editor_limit_reached\"\n\t)\n}\n", "import type { ProjectLicenseType, TeamLicenseType } from \"@framerjs/app-shared\"\nimport { ApiError, HTTP_ERROR_CODES } from \"@framerjs/app-shared\"\nimport { getLogger } from \"@framerjs/shared\"\nimport type { AccessRequest } from \"./RequestEditorAccess.ts\"\nimport { apiFetcher } from \"./apiFetcher.ts\"\nimport { isEditorLimitReachedError, isProjectEditorLimitReachedError } from \"./editorLimitReachedError.ts\"\n\nconst log = getLogger(\"accessRequest\")\n\nexport enum AccessRequestResponseStatus {\n\tSuccess = 0,\n\tEditorLimitReachedError = 1,\n\tRequestAlreadyProcessedError = 2,\n\tUnhandledError = 3,\n\tProjectEditorLimitReachedError = 4,\n}\n\nexport interface RequestingUser {\n\tfullName: string\n\trequestedRole: string\n}\n\nexport interface RequestedResource {\n\tname: string\n}\n\ninterface AccessRequestApiResponse {\n\taccessRequest: AccessRequest\n\trequestingUser: RequestingUser\n\tresource: RequestedResource\n}\n\nexport type GrantAccessRequestResponse =\n\t| {\n\t\t\tstatus: AccessRequestResponseStatus.Success\n\t\t\taccessRequest: AccessRequest\n\t\t\trequestingUser: RequestingUser\n\t\t\tresource: RequestedResource\n\t  }\n\t| {\n\t\t\tstatus: AccessRequestResponseStatus.EditorLimitReachedError\n\t\t\teditorLimit: number\n\t\t\tlicenseType: TeamLicenseType\n\t\t\tteamId: string\n\t\t\tteamName: string\n\t  }\n\t| { status: AccessRequestResponseStatus.RequestAlreadyProcessedError }\n\t| { status: AccessRequestResponseStatus.UnhandledError }\n\t| {\n\t\t\tstatus: AccessRequestResponseStatus.ProjectEditorLimitReachedError\n\t\t\tprojectId: string\n\t\t\tlicenseType: ProjectLicenseType\n\t\t\teditorLimit: number\n\t  }\n\n/** Grants access request */\nexport async function grantAccessRequest(id: string): Promise<GrantAccessRequestResponse> {\n\ttry {\n\t\tconst response: AccessRequestApiResponse = await apiFetcher.post(\"/web/access-requests/grant\", {\n\t\t\trequestId: id,\n\t\t})\n\t\treturn {\n\t\t\tstatus: AccessRequestResponseStatus.Success,\n\t\t\taccessRequest: response.accessRequest,\n\t\t\trequestingUser: response.requestingUser,\n\t\t\tresource: response.resource,\n\t\t}\n\t} catch (error: unknown) {\n\t\tif (isEditorLimitReachedError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: AccessRequestResponseStatus.EditorLimitReachedError,\n\t\t\t\teditorLimit: error.data.editorLimit,\n\t\t\t\tlicenseType: error.data.licenseType,\n\t\t\t\tteamId: error.data.teamId,\n\t\t\t\tteamName: error.data.teamName,\n\t\t\t}\n\t\t}\n\t\tif (isProjectEditorLimitReachedError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: AccessRequestResponseStatus.ProjectEditorLimitReachedError,\n\t\t\t\tprojectId: error.data.projectId,\n\t\t\t\tlicenseType: error.data.licenseType,\n\t\t\t\teditorLimit: error.data.editorLimit,\n\t\t\t}\n\t\t}\n\t\tif (error instanceof ApiError && error.status === HTTP_ERROR_CODES.Conflict) {\n\t\t\treturn { status: AccessRequestResponseStatus.RequestAlreadyProcessedError }\n\t\t}\n\t\tlog.reportError(error)\n\t\treturn { status: AccessRequestResponseStatus.UnhandledError }\n\t}\n}\n\nexport type DenyAccessRequestResponse =\n\t| {\n\t\t\tstatus: AccessRequestResponseStatus.Success\n\t\t\taccessRequest: AccessRequest\n\t\t\trequestingUser: RequestingUser\n\t\t\tresource: RequestedResource\n\t  }\n\t| { status: AccessRequestResponseStatus.RequestAlreadyProcessedError }\n\t| { status: AccessRequestResponseStatus.UnhandledError }\n\n/** Denies access request */\nexport async function denyAccessRequest(id: string): Promise<DenyAccessRequestResponse> {\n\ttry {\n\t\tconst response: AccessRequestApiResponse = await apiFetcher.post(\"/web/access-requests/deny\", {\n\t\t\trequestId: id,\n\t\t})\n\t\treturn {\n\t\t\tstatus: AccessRequestResponseStatus.Success,\n\t\t\taccessRequest: response.accessRequest,\n\t\t\trequestingUser: response.requestingUser,\n\t\t\tresource: response.resource,\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof ApiError && error.status === HTTP_ERROR_CODES.Conflict) {\n\t\t\treturn { status: AccessRequestResponseStatus.RequestAlreadyProcessedError }\n\t\t}\n\t\tlog.reportError(error)\n\t\treturn { status: AccessRequestResponseStatus.UnhandledError }\n\t}\n}\n"],
  "mappings": ";;;;;;;;;;;;AA8BO,SAAS,0BAA0B,OAAkD;AAC3F,SACC,iBAAiB,YACjB,MAAM,WAAW,iBAAiB,cAClC,MAAM,KAAK,WAAW;AAExB;AAEO,SAAS,iCAAiC,OAAyD;AACzG,SACC,iBAAiB,YACjB,MAAM,WAAW,iBAAiB,cAClC,MAAM,KAAK,WAAW;AAExB;;;ACrCA,IAAM,MAAM,UAAU,eAAe;AAiDrC,eAAsB,mBAAmB,IAAiD;AACzF,MAAI;AACH,UAAM,WAAqC,MAAM,WAAW,KAAK,8BAA8B;AAAA,MAC9F,WAAW;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,MACN,QAAQ;AAAA,MACR,eAAe,SAAS;AAAA,MACxB,gBAAgB,SAAS;AAAA,MACzB,UAAU,SAAS;AAAA,IACpB;AAAA,EACD,SAAS,OAAgB;AACxB,QAAI,0BAA0B,KAAK,GAAG;AACrC,aAAO;AAAA,QACN,QAAQ;AAAA,QACR,aAAa,MAAM,KAAK;AAAA,QACxB,aAAa,MAAM,KAAK;AAAA,QACxB,QAAQ,MAAM,KAAK;AAAA,QACnB,UAAU,MAAM,KAAK;AAAA,MACtB;AAAA,IACD;AACA,QAAI,iCAAiC,KAAK,GAAG;AAC5C,aAAO;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,MAAM,KAAK;AAAA,QACtB,aAAa,MAAM,KAAK;AAAA,QACxB,aAAa,MAAM,KAAK;AAAA,MACzB;AAAA,IACD;AACA,QAAI,iBAAiB,YAAY,MAAM,WAAW,iBAAiB,UAAU;AAC5E,aAAO,EAAE,QAAQ,qCAAyD;AAAA,IAC3E;AACA,QAAI,YAAY,KAAK;AACrB,WAAO,EAAE,QAAQ,uBAA2C;AAAA,EAC7D;AACD;AAaA,eAAsB,kBAAkB,IAAgD;AACvF,MAAI;AACH,UAAM,WAAqC,MAAM,WAAW,KAAK,6BAA6B;AAAA,MAC7F,WAAW;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,MACN,QAAQ;AAAA,MACR,eAAe,SAAS;AAAA,MACxB,gBAAgB,SAAS;AAAA,MACzB,UAAU,SAAS;AAAA,IACpB;AAAA,EACD,SAAS,OAAO;AACf,QAAI,iBAAiB,YAAY,MAAM,WAAW,iBAAiB,UAAU;AAC5E,aAAO,EAAE,QAAQ,qCAAyD;AAAA,IAC3E;AACA,QAAI,YAAY,KAAK;AACrB,WAAO,EAAE,QAAQ,uBAA2C;AAAA,EAC7D;AACD;",
  "names": []
}
