{
  "version": 3,
  "sources": ["../../../../node_modules/@sniptt/guards/lib/guards/primitives.ts", "../../../../node_modules/@sniptt/guards/lib/guards/structural.ts", "../../../../node_modules/@sniptt/guards/lib/guards/convenience.ts", "../../../../node_modules/@sniptt/guards/lib/index.ts", "../../../../src/logic-functions/set-granola-key.function.ts", "twenty-sdk-define-stub:__twenty-sdk-define-stub__", "../../../../src/constants/universal-identifiers.ts", "../../../../src/logic-functions/utils/run-core-graphql.ts", "../../../../src/utils/is-defined.ts", "../../../../src/logic-functions/utils/granola-connection-store.ts", "../../../../src/logic-functions/utils/get-acting-user-id.ts", "../../../../src/logic-functions/utils/resolve-workspace-member.ts", "../../../../src/logic-functions/utils/list-granola-notes.ts", "../../../../src/logic-functions/utils/granola-api-request.ts", "../../../../src/logic-functions/utils/validate-granola-key.ts"],
  "sourcesContent": [null, null, null, null, "import { isNonEmptyString } from '@sniptt/guards';\nimport { CoreApiClient } from 'twenty-client-sdk/core';\nimport { defineLogicFunction } from 'twenty-sdk/define';\n\nimport { GRANOLA_CONNECTION_LOGIC_FUNCTIONS } from 'src/constants/universal-identifiers';\nimport { upsertConnection } from 'src/logic-functions/utils/granola-connection-store';\nimport { resolveWorkspaceMember } from 'src/logic-functions/utils/resolve-workspace-member';\nimport { validateGranolaKey } from 'src/logic-functions/utils/validate-granola-key';\n\ntype SetKeyInput = { body?: { apiKey?: unknown } | null } | undefined;\n\ntype SetKeyResult = { success: boolean; message?: string };\n\nconst handler = async (input: SetKeyInput): Promise<SetKeyResult> => {\n  const rawApiKey = input?.body?.apiKey;\n  const apiKey = typeof rawApiKey === 'string' ? rawApiKey.trim() : '';\n\n  if (!isNonEmptyString(apiKey)) {\n    return { success: false, message: 'Enter your Granola API key.' };\n  }\n\n  const client = new CoreApiClient();\n\n  const member = await resolveWorkspaceMember(client);\n\n  if (!member) {\n    return {\n      success: false,\n      message: 'Could not identify your account. Please sign in and try again.',\n    };\n  }\n\n  const validation = await validateGranolaKey(apiKey);\n\n  if (!validation.valid) {\n    return { success: false, message: validation.message };\n  }\n\n  await upsertConnection({\n    workspaceMemberId: member.workspaceMemberId,\n    displayName: member.displayName,\n    apiKey,\n  });\n\n  return {\n    success: true,\n    message: 'Granola connected. Your meetings will start syncing shortly.',\n  };\n};\n\nexport default defineLogicFunction({\n  universalIdentifier:\n    GRANOLA_CONNECTION_LOGIC_FUNCTIONS.setKey.universalIdentifier,\n  name: 'granola-set-key',\n  description:\n    \"Stores the invoking member's personal Granola API key after validating it against the Granola API.\",\n  timeoutSeconds: 60,\n  handler,\n  httpRouteTriggerSettings: {\n    path: GRANOLA_CONNECTION_LOGIC_FUNCTIONS.setKey.path,\n    httpMethod: 'POST',\n    isAuthRequired: true,\n  },\n});\n", "\n// Auto-generated stub for twenty-sdk/define injected by the SDK CLI build.\n// Real implementations would pull in zod, twenty-shared and ~1MB of code; at\n// runtime only `default.config.handler` is consumed, so tiny no-ops suffice.\nconst __defineFactoryStub = (config) => ({\n  success: true,\n  config,\n  errors: [],\n});\n\nconst __anyHandler = {\n  get(_target, prop) {\n    if (prop === '__esModule') return true;\n    if (prop === Symbol.toPrimitive) return () => '';\n    if (typeof prop === 'symbol') return undefined;\n    return new Proxy(() => undefined, __anyHandler);\n  },\n  apply() {\n    return new Proxy(() => undefined, __anyHandler);\n  },\n};\nconst __anyStub = new Proxy(() => undefined, __anyHandler);\n\nexport const createValidationResult = __defineFactoryStub;\nexport const defineAgent = __defineFactoryStub;\nexport const defineApplication = __defineFactoryStub;\nexport const defineApplicationRole = __defineFactoryStub;\nexport const defineCommandMenuItem = __defineFactoryStub;\nexport const defineConnectionProvider = __defineFactoryStub;\nexport const defineField = __defineFactoryStub;\nexport const defineFrontComponent = __defineFactoryStub;\nexport const defineIndex = __defineFactoryStub;\nexport const defineLogicFunction = __defineFactoryStub;\nexport const defineNavigationMenuItem = __defineFactoryStub;\nexport const defineObject = __defineFactoryStub;\nexport const definePageLayout = __defineFactoryStub;\nexport const definePageLayoutTab = __defineFactoryStub;\nexport const definePermissionFlag = __defineFactoryStub;\nexport const definePostInstallLogicFunction = __defineFactoryStub;\nexport const definePreInstallLogicFunction = __defineFactoryStub;\nexport const defineRole = __defineFactoryStub;\nexport const defineSettingsFrontComponent = __defineFactoryStub;\nexport const defineSkill = __defineFactoryStub;\nexport const defineUninstallLogicFunction = __defineFactoryStub;\nexport const defineView = __defineFactoryStub;\nexport const defineViewField = __defineFactoryStub;\nexport const AggregateOperations = __anyStub;\nexport const DateDisplayFormat = __anyStub;\nexport const FieldMetadataSettingsOnClickAction = __anyStub;\nexport const FieldType = __anyStub;\nexport const HTTPMethod = __anyStub;\nexport const NavigationMenuItemType = __anyStub;\nexport const NumberDataType = __anyStub;\nexport const ObjectRecordGroupByDateGranularity = __anyStub;\nexport const OnDeleteAction = __anyStub;\nexport const PageLayoutTabLayoutMode = __anyStub;\nexport const PageLayoutType = __anyStub;\nexport const RelationType = __anyStub;\nexport const RowLevelPermissionPredicateGroupLogicalOperator = __anyStub;\nexport const RowLevelPermissionPredicateOperand = __anyStub;\nexport const STANDARD_OBJECT = __anyStub;\nexport const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const STANDARD_PAGE_LAYOUT = __anyStub;\nexport const STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const SystemPermissionFlag = __anyStub;\nexport const ViewCalendarLayout = __anyStub;\nexport const ViewFilterGroupLogicalOperator = __anyStub;\nexport const ViewFilterOperand = __anyStub;\nexport const ViewKey = __anyStub;\nexport const ViewOpenRecordIn = __anyStub;\nexport const ViewSortDirection = __anyStub;\nexport const ViewType = __anyStub;\nexport const ViewVisibility = __anyStub;\nexport const canAccessFullAdminPanel = __anyStub;\nexport const canImpersonate = __anyStub;\nexport const every = __anyStub;\nexport const everyDefined = __anyStub;\nexport const everyEquals = __anyStub;\nexport const favoriteRecordIds = __anyStub;\nexport const featureFlags = __anyStub;\nexport const getFieldUniversalIdentifier = __anyStub;\nexport const getSystemRelationFieldUniversalIdentifier = __anyStub;\nexport const getSystemViewFieldUniversalIdentifier = __anyStub;\nexport const getSystemViewUniversalIdentifier = __anyStub;\nexport const hasAnySoftDeleteFilterOnView = __anyStub;\nexport const includes = __anyStub;\nexport const includesEvery = __anyStub;\nexport const isDashboardPageLayoutInEditMode = __anyStub;\nexport const isDefined = __anyStub;\nexport const isInSidePanel = __anyStub;\nexport const isLayoutCustomizationModeEnabled = __anyStub;\nexport const isNonEmptyString = __anyStub;\nexport const isSelectAll = __anyStub;\nexport const none = __anyStub;\nexport const noneDefined = __anyStub;\nexport const noneEquals = __anyStub;\nexport const numberOfSelectedRecords = __anyStub;\nexport const objectMetadataItem = __anyStub;\nexport const objectMetadataLabel = __anyStub;\nexport const objectPermissions = __anyStub;\nexport const pageType = __anyStub;\nexport const selectedRecords = __anyStub;\nexport const some = __anyStub;\nexport const someDefined = __anyStub;\nexport const someEquals = __anyStub;\nexport const someNonEmptyString = __anyStub;\nexport const targetObjectReadPermissions = __anyStub;\nexport const targetObjectWritePermissions = __anyStub;\nexport const validateFields = __anyStub;\n", "export const APPLICATION_UNIVERSAL_IDENTIFIER =\n  '79738d7c-6b48-47fd-949f-de6510e3137d';\n\nexport const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER =\n  '43e9f830-3b8e-4af6-ae29-1520d86f6903';\n\nexport const GRANOLA_SYNC_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  'e3b3aa22-b36a-4c5b-a02e-4d36e43524d4';\n\nexport const GRANOLA_BACKFILL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  'f50358d3-3e94-4933-bbed-f94b05311b7f';\n\n// Per-user Granola API keys. Each workspace member connects their own account;\n// the sync enumerates every connection and pulls that member's meetings.\nexport const GRANOLA_CONNECTION_OBJECT_UNIVERSAL_IDENTIFIER =\n  'fbaf8a1c-c53e-4a86-bfbf-31b773c1a838';\n\nexport const GRANOLA_CONNECTION_FIELD_UNIVERSAL_IDENTIFIERS = {\n  name: '32c08eee-f433-4027-bf7e-f36f2f6b49f6',\n  workspaceMemberId: '6126dadc-9462-4901-b8d0-b9cdf25abd83',\n  apiKey: 'ff502f4b-a889-46fc-8d41-108e78e10827',\n  isActive: '4bbb3104-122c-45d3-a278-d8e72cff031d',\n  lastSyncedAt: '2321678a-f090-4688-bf91-4b57f83a33d8',\n  lastSyncStatus: 'ba88113f-1639-4e8e-af39-da18a695b37f',\n  lastSyncError: '59cea986-0a5b-42e1-ae49-a1a8f8cb982f',\n} as const;\n\nexport const GRANOLA_CONNECTION_LOGIC_FUNCTIONS = {\n  setKey: {\n    universalIdentifier: '04a667fa-07c7-46fa-a589-56f47a9a4131',\n    path: '/granola/connection/set-key',\n  },\n  getConnection: {\n    universalIdentifier: '73535e55-5400-41ce-bd8e-65840e4224ea',\n    path: '/granola/connection/get',\n  },\n  disconnect: {\n    universalIdentifier: '6cc6511f-5b9c-4bd2-b010-75b9ece3d937',\n    path: '/granola/connection/disconnect',\n  },\n} as const;\n\nexport const GRANOLA_CONNECT_COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIER =\n  '0ac3a91c-76a2-45d9-903d-2d6f18c59c1f';\n\nexport const GRANOLA_CONNECT_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER =\n  'cf44e138-08ba-42bf-8144-a130d3f7448d';\n\n// Shared core CalendarEvent record page layout that apps attach tabs to.\nexport const CALENDAR_EVENT_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER =\n  'b9b10e40-9ce2-4704-8ac6-c6e92e2563c1';\n\nexport const CALENDAR_EVENT_SUMMARY_PAGE_LAYOUT_TAB_UNIVERSAL_IDENTIFIER =\n  '73bd93e8-379e-4f04-a7cf-72965f1c1984';\n\nexport const CALENDAR_EVENT_SUMMARY_PAGE_LAYOUT_WIDGET_UNIVERSAL_IDENTIFIER =\n  '04780500-8a23-43de-b8bd-04e0e5f6dac8';\n\nexport const CALENDAR_EVENT_SUMMARY_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER =\n  '0233043a-8284-495c-98cf-9b2380ee063a';\n\nexport const CALENDAR_EVENT_TRANSCRIPT_PAGE_LAYOUT_TAB_UNIVERSAL_IDENTIFIER =\n  '5a57429d-6ade-441d-8c35-512616793a2f';\n\nexport const CALENDAR_EVENT_TRANSCRIPT_PAGE_LAYOUT_WIDGET_UNIVERSAL_IDENTIFIER =\n  '8768103e-b059-44ee-b72e-bc164b954511';\n\nexport const CALENDAR_EVENT_TRANSCRIPT_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER =\n  'bea81361-5df7-4c1f-984d-73274957bd5d';\n", "import { isNonEmptyString } from '@sniptt/guards';\n\n// The generated (Zeus) client is built from the workspace's GraphQL\n// introspection, which does NOT expose this app's own custom object\n// (granolaConnection) \u2014 so client.query({ granolaConnections }) fails client-side\n// with \"type Query does not have a field granolaConnections\". The server DOES\n// have the type, so we talk to it directly with a raw GraphQL request using the\n// application access token the function runs with. Standard objects still use\n// the typed client; only granolaConnection goes through here.\nconst API_URL_ENV = 'TWENTY_API_URL';\nconst TOKEN_ENV_VARS = ['TWENTY_APP_ACCESS_TOKEN', 'TWENTY_API_KEY'] as const;\n\nconst getToken = (): string | undefined => {\n  for (const envVar of TOKEN_ENV_VARS) {\n    const value = process.env[envVar];\n\n    if (isNonEmptyString(value)) {\n      return value;\n    }\n  }\n\n  return undefined;\n};\n\nexport const runCoreGraphql = async <TData>(\n  query: string,\n  variables?: Record<string, unknown>,\n): Promise<TData> => {\n  const apiUrl = process.env[API_URL_ENV]?.replace(/\\/$/, '');\n  const token = getToken();\n\n  if (!isNonEmptyString(apiUrl) || !isNonEmptyString(token)) {\n    throw new Error(\n      'Granola: missing API URL or access token in the function environment.',\n    );\n  }\n\n  const response = await fetch(`${apiUrl}/graphql`, {\n    method: 'POST',\n    headers: {\n      'content-type': 'application/json',\n      authorization: `Bearer ${token}`,\n    },\n    body: JSON.stringify({ query, ...(variables ? { variables } : {}) }),\n  });\n\n  const payload = (await response.json()) as {\n    data?: TData;\n    errors?: unknown;\n  };\n\n  if (payload.errors) {\n    throw new Error(\n      `Granola GraphQL error: ${JSON.stringify(payload.errors).slice(0, 300)}`,\n    );\n  }\n\n  return payload.data as TData;\n};\n", "export const isDefined = <T>(\n  value: T | null | undefined,\n): value is NonNullable<T> => value !== null && value !== undefined;\n", "import { type GranolaSyncStatus } from 'src/constants/granola-connection';\nimport { runCoreGraphql } from 'src/logic-functions/utils/run-core-graphql';\nimport { isDefined } from 'src/utils/is-defined';\n\nexport type GranolaConnectionNode = {\n  id: string;\n  workspaceMemberId: string;\n  apiKey: string;\n  isActive: boolean;\n  lastSyncedAt: string | null;\n  lastSyncStatus: string | null;\n};\n\n// granolaConnection is this app's OWN custom object. The workspace GraphQL\n// introspection the generated client is built from does not expose it, so we\n// query it with raw GraphQL against the server (which does have the type).\nconst CONNECTION_NODE_FRAGMENT = `\n  id\n  workspaceMemberId\n  apiKey\n  isActive\n  lastSyncedAt\n  lastSyncStatus\n`;\n\nconst ACTIVE_CONNECTIONS_PAGE_SIZE = 100;\n\ntype ConnectionEdges = {\n  granolaConnections?: {\n    edges?: { node?: Partial<GranolaConnectionNode> | null }[] | null;\n    pageInfo?: { hasNextPage?: boolean | null; endCursor?: string | null };\n  };\n};\n\nconst toNode = (\n  node: Partial<GranolaConnectionNode> | null | undefined,\n): GranolaConnectionNode | undefined => {\n  if (!isDefined(node) || !isDefined(node.id)) {\n    return undefined;\n  }\n\n  return {\n    id: node.id,\n    workspaceMemberId: node.workspaceMemberId ?? '',\n    apiKey: node.apiKey ?? '',\n    isActive: node.isActive ?? false,\n    lastSyncedAt: node.lastSyncedAt ?? null,\n    lastSyncStatus: node.lastSyncStatus ?? null,\n  };\n};\n\nexport const findConnectionByMemberId = async (\n  workspaceMemberId: string,\n): Promise<GranolaConnectionNode | undefined> => {\n  const result = await runCoreGraphql<ConnectionEdges>(\n    `query FindGranolaConnection($filter: GranolaConnectionFilterInput) {\n      granolaConnections(filter: $filter, first: 1) {\n        edges { node { ${CONNECTION_NODE_FRAGMENT} } }\n      }\n    }`,\n    { filter: { workspaceMemberId: { eq: workspaceMemberId } } },\n  );\n\n  return toNode(result.granolaConnections?.edges?.[0]?.node);\n};\n\n// Lists every active connection, paging through all members so the sync covers\n// the whole workspace.\nexport const listActiveConnections = async (): Promise<\n  GranolaConnectionNode[]\n> => {\n  const connections: GranolaConnectionNode[] = [];\n  let after: string | undefined;\n\n  for (;;) {\n    const result = await runCoreGraphql<ConnectionEdges>(\n      `query ListActiveGranolaConnections($filter: GranolaConnectionFilterInput, $first: Int, $after: String) {\n        granolaConnections(filter: $filter, first: $first, after: $after) {\n          edges { node { ${CONNECTION_NODE_FRAGMENT} } }\n          pageInfo { hasNextPage endCursor }\n        }\n      }`,\n      {\n        filter: { isActive: { eq: true } },\n        first: ACTIVE_CONNECTIONS_PAGE_SIZE,\n        after: after ?? null,\n      },\n    );\n\n    for (const edge of result.granolaConnections?.edges ?? []) {\n      const node = toNode(edge?.node);\n\n      if (isDefined(node)) {\n        connections.push(node);\n      }\n    }\n\n    const pageInfo = result.granolaConnections?.pageInfo;\n\n    if (pageInfo?.hasNextPage !== true || !isDefined(pageInfo.endCursor)) {\n      break;\n    }\n\n    after = pageInfo.endCursor;\n  }\n\n  return connections;\n};\n\nconst updateConnection = async (\n  id: string,\n  data: Record<string, unknown>,\n): Promise<void> => {\n  await runCoreGraphql(\n    `mutation UpdateGranolaConnection($id: UUID!, $data: GranolaConnectionUpdateInput!) {\n      updateGranolaConnection(id: $id, data: $data) { id }\n    }`,\n    { id, data },\n  );\n};\n\nexport const upsertConnection = async ({\n  workspaceMemberId,\n  displayName,\n  apiKey,\n}: {\n  workspaceMemberId: string;\n  displayName: string;\n  apiKey: string;\n}): Promise<void> => {\n  const existing = await findConnectionByMemberId(workspaceMemberId);\n\n  if (isDefined(existing)) {\n    await updateConnection(existing.id, {\n      apiKey,\n      name: displayName,\n      isActive: true,\n    });\n\n    return;\n  }\n\n  await runCoreGraphql(\n    `mutation CreateGranolaConnection($data: GranolaConnectionCreateInput!) {\n      createGranolaConnection(data: $data) { id }\n    }`,\n    { data: { workspaceMemberId, apiKey, name: displayName, isActive: true } },\n  );\n};\n\nexport const deactivateConnection = async (\n  workspaceMemberId: string,\n): Promise<boolean> => {\n  const existing = await findConnectionByMemberId(workspaceMemberId);\n\n  if (!isDefined(existing)) {\n    return false;\n  }\n\n  // Clear the stored key on disconnect so it no longer lives in the workspace,\n  // and flag inactive so the sync skips it.\n  await updateConnection(existing.id, { apiKey: '', isActive: false });\n\n  return true;\n};\n\nexport const stampSyncResult = async (\n  connectionId: string,\n  {\n    syncedAt,\n    status,\n    error,\n  }: { syncedAt: string; status: GranolaSyncStatus; error: string | null },\n): Promise<void> => {\n  await updateConnection(connectionId, {\n    lastSyncedAt: syncedAt,\n    lastSyncStatus: status,\n    lastSyncError: error,\n  });\n};\n", "import { isNonEmptyString } from '@sniptt/guards';\n\n// The function runs with the application access token in its environment (the\n// same token the CoreApiClient authenticates with). For a route-auth'd call the\n// server mints it carrying the invoking user, so its `userId` claim is the\n// verified caller. There is no `currentUser` query on the app-scoped workspace\n// schema, so decoding this claim is how a function learns who invoked it.\nconst APP_TOKEN_ENV_VARS = ['TWENTY_APP_ACCESS_TOKEN', 'TWENTY_API_KEY'] as const;\n\ntype TokenClaims = { userId?: unknown; userWorkspaceId?: unknown };\n\nconst decodeJwtClaims = (token: string): TokenClaims | undefined => {\n  const segments = token.split('.');\n\n  if (segments.length < 2) {\n    return undefined;\n  }\n\n  try {\n    const claims = JSON.parse(\n      Buffer.from(segments[1], 'base64url').toString('utf8'),\n    );\n\n    return typeof claims === 'object' && claims !== null\n      ? (claims as TokenClaims)\n      : undefined;\n  } catch {\n    return undefined;\n  }\n};\n\nexport const getActingUserId = (): string | undefined => {\n  for (const envVar of APP_TOKEN_ENV_VARS) {\n    const token = process.env[envVar];\n\n    if (!isNonEmptyString(token)) {\n      continue;\n    }\n\n    const userId = decodeJwtClaims(token)?.userId;\n\n    if (isNonEmptyString(userId)) {\n      return userId;\n    }\n  }\n\n  return undefined;\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { getActingUserId } from 'src/logic-functions/utils/get-acting-user-id';\nimport { isDefined } from 'src/utils/is-defined';\n\nexport type ResolvedMember = {\n  workspaceMemberId: string;\n  displayName: string;\n};\n\ntype MemberNode = {\n  id?: string | null;\n  name?: { firstName?: string | null; lastName?: string | null } | null;\n  userEmail?: string | null;\n};\n\ntype WorkspaceMembersResult = {\n  workspaceMembers?: { edges?: { node?: MemberNode | null }[] | null };\n};\n\nconst MEMBER_SELECTION = {\n  id: true,\n  name: { firstName: true, lastName: true },\n  userEmail: true,\n} as const;\n\nconst buildDisplayName = (member: MemberNode): string => {\n  const firstName = member.name?.firstName ?? '';\n  const lastName = member.name?.lastName ?? '';\n  const fullName = `${firstName} ${lastName}`.trim();\n\n  if (fullName.length > 0) {\n    return fullName;\n  }\n\n  return member.userEmail ?? 'Granola connection';\n};\n\n// Resolves the INVOKING user for a route-auth'd call. The function's app-scoped\n// client has no `currentUser` query, so we read the verified `userId` from the\n// application access token the server minted for this call, then look up the\n// matching workspaceMember (the app role must be able to read workspaceMember).\n// Deny-by-default: returns undefined when no user/member resolves.\nexport const resolveWorkspaceMember = async (\n  client: CoreApiClient,\n): Promise<ResolvedMember | undefined> => {\n  const userId = getActingUserId();\n\n  if (!isDefined(userId)) {\n    return undefined;\n  }\n\n  try {\n    const result = (await client.query({\n      workspaceMembers: {\n        __args: { filter: { userId: { eq: userId } }, first: 1 },\n        edges: { node: MEMBER_SELECTION },\n      },\n    })) as WorkspaceMembersResult;\n\n    const member = result.workspaceMembers?.edges?.[0]?.node;\n\n    if (!isDefined(member) || !isDefined(member.id)) {\n      return undefined;\n    }\n\n    return {\n      workspaceMemberId: member.id,\n      displayName: buildDisplayName(member),\n    };\n  } catch {\n    return undefined;\n  }\n};\n", "import { isNonEmptyString } from '@sniptt/guards';\nimport { isDefined } from 'src/utils/is-defined';\n\nimport {\n  type GranolaNoteSummary,\n  type GranolaNotesListResponse,\n} from 'src/logic-functions/types/granola-note.type';\nimport {\n  type GranolaApiResult,\n  granolaApiRequest,\n} from 'src/logic-functions/utils/granola-api-request';\n\n// Granola caps page_size at 30.\nconst GRANOLA_MAX_PAGE_SIZE = 30;\n// Safety valve so a pagination bug can never spin forever.\nconst MAX_PAGES = 500;\n\nexport type ListGranolaNotesArgs = {\n  apiKey: string;\n  updatedAfter?: string;\n  createdAfter?: string;\n  folderId?: string;\n  pageSize?: number;\n  // Injectable for tests.\n  sleep?: (milliseconds: number) => Promise<void>;\n};\n\nconst readNotes = (response: GranolaNotesListResponse): GranolaNoteSummary[] =>\n  response.notes ?? [];\n\n// Enumerates every note matching the filters, following the response `cursor`\n// while `hasMore` is set, to exhaustion.\nexport const listGranolaNotes = async ({\n  apiKey,\n  updatedAfter,\n  createdAfter,\n  folderId,\n  pageSize = GRANOLA_MAX_PAGE_SIZE,\n  sleep,\n}: ListGranolaNotesArgs): Promise<GranolaApiResult<GranolaNoteSummary[]>> => {\n  const boundedPageSize = Math.min(\n    Math.max(pageSize, 1),\n    GRANOLA_MAX_PAGE_SIZE,\n  );\n\n  const notes: GranolaNoteSummary[] = [];\n  let cursor: string | undefined;\n  let lastStatus = 200;\n\n  for (let page = 0; page < MAX_PAGES; page += 1) {\n    const result = await granolaApiRequest<GranolaNotesListResponse>({\n      apiKey,\n      path: '/notes',\n      query: {\n        page_size: boundedPageSize,\n        updated_after: updatedAfter,\n        created_after: createdAfter,\n        folder_id: folderId,\n        cursor,\n      },\n      sleep,\n    });\n\n    if (!result.ok) {\n      return result;\n    }\n\n    lastStatus = result.status;\n    notes.push(...readNotes(result.data));\n\n    // Stop when the API signals no further pages.\n    if (result.data.hasMore === false) {\n      break;\n    }\n\n    const nextCursor = result.data.cursor ?? undefined;\n\n    // Guard against a cursor that fails to advance, which would otherwise\n    // spin re-fetching the same page until MAX_PAGES.\n    if (!isNonEmptyString(nextCursor) || nextCursor === cursor) {\n      break;\n    }\n\n    cursor = nextCursor;\n  }\n\n  return { ok: true, status: lastStatus, data: notes };\n};\n\nexport const isListGranolaNotesEmpty = (\n  result: GranolaApiResult<GranolaNoteSummary[]>,\n): boolean => result.ok && (!isDefined(result.data) || result.data.length === 0);\n", "import { isNonEmptyString } from '@sniptt/guards';\nimport { isDefined } from 'src/utils/is-defined';\n\nexport const GRANOLA_API_BASE_URL = 'https://public-api.granola.ai/v1';\n\nconst DEFAULT_MAX_RETRIES = 4;\nconst DEFAULT_BACKOFF_BASE_MS = 500;\n// Upper bound on any single retry sleep, whether derived from a\n// server-supplied Retry-After header or from exponential backoff.\nconst MAX_BACKOFF_MS = 30_000;\n\ntype GranolaApiSuccess<TData> = {\n  ok: true;\n  status: number;\n  data: TData;\n};\n\ntype GranolaApiFailure = {\n  ok: false;\n  status: number;\n  errorMessage: string;\n};\n\nexport type GranolaApiResult<TData> =\n  | GranolaApiSuccess<TData>\n  | GranolaApiFailure;\n\nexport type GranolaApiRequestParams = {\n  apiKey: string;\n  // Path relative to the API base, e.g. '/notes' or `/notes/${id}`.\n  path: string;\n  query?: Record<string, string | number | undefined>;\n  maxRetries?: number;\n  backoffBaseMs?: number;\n  // Injectable for tests; defaults to a real timer-based sleep.\n  sleep?: (milliseconds: number) => Promise<void>;\n};\n\nconst realSleep = (milliseconds: number): Promise<void> =>\n  new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nconst buildUrl = (\n  path: string,\n  query: Record<string, string | number | undefined> | undefined,\n): string => {\n  const url = new URL(`${GRANOLA_API_BASE_URL}${path}`);\n\n  if (isDefined(query)) {\n    for (const [key, value] of Object.entries(query)) {\n      if (isDefined(value)) {\n        url.searchParams.set(key, String(value));\n      }\n    }\n  }\n\n  return url.toString();\n};\n\nconst computeBackoffMs = (\n  response: Response,\n  attempt: number,\n  backoffBaseMs: number,\n): number => {\n  const retryAfterHeader = response.headers.get('retry-after');\n  const retryAfterSeconds =\n    retryAfterHeader !== null ? Number(retryAfterHeader) : NaN;\n\n  if (Number.isFinite(retryAfterSeconds) && retryAfterSeconds >= 0) {\n    return Math.min(retryAfterSeconds * 1000, MAX_BACKOFF_MS);\n  }\n\n  // Exponential backoff: base * 2^attempt.\n  return Math.min(backoffBaseMs * 2 ** attempt, MAX_BACKOFF_MS);\n};\n\n// Granola error responses carry a structured body { code, message, details }.\n// Surface the message when present, else fall back to the HTTP status.\nconst readGranolaErrorMessage = async (response: Response): Promise<string> => {\n  try {\n    const body = (await response.json()) as { message?: unknown };\n\n    if (isNonEmptyString(body.message)) {\n      return `Granola API error (HTTP ${response.status}): ${body.message}`;\n    }\n  } catch {\n    // Non-JSON error body; fall through to the generic message.\n  }\n\n  return `Granola API responded with HTTP ${response.status}`;\n};\n\n// GET against the Granola REST API with Bearer auth, JSON parsing, and HTTP 429\n// retry-with-backoff. Returns a typed ok/err result.\nexport const granolaApiRequest = async <TData = unknown>({\n  apiKey,\n  path,\n  query,\n  maxRetries = DEFAULT_MAX_RETRIES,\n  backoffBaseMs = DEFAULT_BACKOFF_BASE_MS,\n  sleep = realSleep,\n}: GranolaApiRequestParams): Promise<GranolaApiResult<TData>> => {\n  const url = buildUrl(path, query);\n\n  for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n    let response: Response;\n\n    try {\n      response = await fetch(url, {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${apiKey}`,\n          Accept: 'application/json',\n        },\n      });\n    } catch (error) {\n      return {\n        ok: false,\n        status: 0,\n        errorMessage: `Granola API request failed: ${(error as Error).message}`,\n      };\n    }\n\n    if (response.status === 429) {\n      if (attempt < maxRetries) {\n        await sleep(computeBackoffMs(response, attempt, backoffBaseMs));\n        continue;\n      }\n\n      return {\n        ok: false,\n        status: 429,\n        errorMessage: `Granola API rate limit not cleared after ${maxRetries} retries`,\n      };\n    }\n\n    if (!response.ok) {\n      return {\n        ok: false,\n        status: response.status,\n        errorMessage: await readGranolaErrorMessage(response),\n      };\n    }\n\n    try {\n      const data = (await response.json()) as TData;\n\n      return { ok: true, status: response.status, data };\n    } catch (error) {\n      return {\n        ok: false,\n        status: response.status,\n        errorMessage: `Granola API returned a non-JSON response: ${\n          (error as Error).message\n        }`,\n      };\n    }\n  }\n\n  return {\n    ok: false,\n    status: 429,\n    errorMessage: `Granola API rate limit not cleared after ${maxRetries} retries`,\n  };\n};\n", "import { listGranolaNotes } from 'src/logic-functions/utils/list-granola-notes';\n\nconst VALIDATION_WINDOW_MS = 86_400_000;\n\n// Confirms a key works before we store it, by making one cheap list call scoped\n// to the last day. A bad key surfaces as a non-ok list result, which we turn\n// into a clear message for the connect panel.\nexport const validateGranolaKey = async (\n  apiKey: string,\n): Promise<{ valid: true } | { valid: false; message: string }> => {\n  const updatedAfter = new Date(\n    new Date().getTime() - VALIDATION_WINDOW_MS,\n  ).toISOString();\n\n  const result = await listGranolaNotes({ apiKey, updatedAfter });\n\n  if (result.ok) {\n    return { valid: true };\n  }\n\n  return {\n    valid: false,\n    message: `Granola rejected this API key: ${result.errorMessage}`,\n  };\n};\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,QAAM,cAAc,CAAI,SAA0C;AACvE,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,cAAW;AAIjB,QAAM,YAAY,CAAI,SAAsC;AACjE,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,YAAS;AAIf,QAAM,WAAW,CAAI,SAAoC;AAC9D,aAAO,OAAO,SAAS,YAAY,CAAC,OAAO,MAAM,IAAI;IACvD;AAFa,YAAA,WAAQ;AAId,QAAM,WAAW,CAAI,SAAoC;AAC9D,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,WAAQ;AAId,QAAM,WAAW,CAAI,SAAoC;AAC9D,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,WAAQ;AAId,QAAM,WAAW,CAAI,SAAoC;AAC9D,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,WAAQ;;;;;;;;;;ACpBd,QAAM,SAAS,CAAI,SAAgC;AACxD,aAAO,SAAS;IAClB;AAFa,YAAA,SAAM;AAIZ,QAAM,aAAa,CAAwB,SAA0B;AAC1E,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,aAAU;AAIhB,QAAM,WAAW,CACtB,SAC0B;AAC1B,aAAO,CAAC,QAAA,OAAO,IAAI,KAAK,OAAO,SAAS;IAC1C;AAJa,YAAA,WAAQ;AAMd,QAAM,UAAU,CAAO,SAAwC;AACpE,aAAO,MAAM,QAAQ,IAAI;IAC3B;AAFa,YAAA,UAAO;AAIb,QAAM,QAAQ,CAAU,SAA0C;AACvE,aAAO,gBAAgB;IACzB;AAFa,YAAA,QAAK;AAIX,QAAM,QAAQ,CAAO,SAAoC;AAC9D,aAAO,gBAAgB;IACzB;AAFa,YAAA,QAAK;AAIX,QAAM,YAAY,CACvB,SACyB;AACzB,aAAO,gBAAgB;IACzB;AAJa,YAAA,YAAS;AAMf,QAAM,YAAY,CACvB,SACsB;AACtB,aAAO,gBAAgB;IACzB;AAJa,YAAA,YAAS;AAMf,QAAM,SAAS,CAAI,SAAgC;AACxD,aAAO,gBAAgB;IACzB;AAFa,YAAA,SAAM;;;;;;;;;;ACxCnB,QAAA,eAAA;AACA,QAAA,eAAA;AAEO,QAAM,iBAAiB,CAAsB,SAA0B;AAC5E,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,iBAAc;AAIpB,QAAM,kBAAkB,CAAO,SAAwC;AAC5E,aAAO,aAAA,QAAQ,IAAI,KAAK,KAAK,SAAS;IACxC;AAFa,YAAA,kBAAe;AAIrB,QAAMA,oBAAmB,CAAI,SAAoC;AACtE,aAAO,aAAA,SAAS,IAAI,KAAK,KAAK,SAAS;IACzC;AAFa,YAAA,mBAAgBA;AAItB,QAAM,gBAAgB,CAAI,SAAoC;AACnE,aAAO,OAAO,SAAS;IACzB;AAFa,YAAA,gBAAa;AAInB,QAAM,YAAY,CAAI,SAAoC;AAC/D,aAAO,aAAA,SAAS,IAAI,KAAK,OAAO,UAAU,IAAI;IAChD;AAFa,YAAA,YAAS;AAIf,QAAM,oBAAoB,CAAI,SAAoC;AACvE,aAAO,QAAA,UAAU,IAAI,KAAK,OAAO;IACnC;AAFa,YAAA,oBAAiB;AAIvB,QAAM,uBAAuB,CAAI,SAAoC;AAC1E,aAAO,QAAA,UAAU,IAAI,KAAK,QAAQ;IACpC;AAFa,YAAA,uBAAoB;AAI1B,QAAM,oBAAoB,CAAI,SAAoC;AACvE,aAAO,QAAA,UAAU,IAAI,KAAK,OAAO;IACnC;AAFa,YAAA,oBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/B9B,YAAA,cAAA,aAAA,qBAAA;AACA,iBAAA,uBAAA,OAAA;AACA,YAAA,aAAA,aAAA,oBAAA;AACA,iBAAA,sBAAA,OAAA;AACA,YAAA,aAAA,aAAA,oBAAA;AACA,iBAAA,sBAAA,OAAA;;;;;ACLA,IAAAC,iBAAiC;AACjC,SAAS,qBAAqB;;;ACG9B,IAAM,sBAAsB,CAAC,YAAY;AAAA,EACvC,SAAS;AAAA,EACT;AAAA,EACA,QAAQ,CAAC;AACX;AAEA,IAAM,eAAe;AAAA,EACnB,IAAI,SAAS,MAAM;AACjB,QAAI,SAAS,aAAc,QAAO;AAClC,QAAI,SAAS,OAAO,YAAa,QAAO,MAAM;AAC9C,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,WAAO,IAAI,MAAM,MAAM,QAAW,YAAY;AAAA,EAChD;AAAA,EACA,QAAQ;AACN,WAAO,IAAI,MAAM,MAAM,QAAW,YAAY;AAAA,EAChD;AACF;AACA,IAAM,YAAY,IAAI,MAAM,MAAM,QAAW,YAAY;AAWlD,IAAM,sBAAsB;;;ACL5B,IAAM,qCAAqC;AAAA,EAChD,QAAQ;AAAA,IACN,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACb,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AACF;;;ACxCA,oBAAiC;AASjC,IAAM,cAAc;AACpB,IAAM,iBAAiB,CAAC,2BAA2B,gBAAgB;AAEnE,IAAM,WAAW,MAA0B;AACzC,aAAW,UAAU,gBAAgB;AACnC,UAAM,QAAQ,QAAQ,IAAI,MAAM;AAEhC,YAAI,gCAAiB,KAAK,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,OAC5B,OACA,cACmB;AACnB,QAAM,SAAS,QAAQ,IAAI,WAAW,GAAG,QAAQ,OAAO,EAAE;AAC1D,QAAM,QAAQ,SAAS;AAEvB,MAAI,KAAC,gCAAiB,MAAM,KAAK,KAAC,gCAAiB,KAAK,GAAG;AACzD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,YAAY;AAAA,IAChD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,OAAO,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,EACrE,CAAC;AAED,QAAM,UAAW,MAAM,SAAS,KAAK;AAKrC,MAAI,QAAQ,QAAQ;AAClB,UAAM,IAAI;AAAA,MACR,0BAA0B,KAAK,UAAU,QAAQ,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,SAAO,QAAQ;AACjB;;;AC1DO,IAAM,YAAY,CACvB,UAC4B,UAAU,QAAQ,UAAU;;;ACc1D,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBjC,IAAM,SAAS,CACb,SACsC;AACtC,MAAI,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,mBAAmB,KAAK,qBAAqB;AAAA,IAC7C,QAAQ,KAAK,UAAU;AAAA,IACvB,UAAU,KAAK,YAAY;AAAA,IAC3B,cAAc,KAAK,gBAAgB;AAAA,IACnC,gBAAgB,KAAK,kBAAkB;AAAA,EACzC;AACF;AAEO,IAAM,2BAA2B,OACtC,sBAC+C;AAC/C,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA;AAAA,yBAEqB,wBAAwB;AAAA;AAAA;AAAA,IAG7C,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,kBAAkB,EAAE,EAAE;AAAA,EAC7D;AAEA,SAAO,OAAO,OAAO,oBAAoB,QAAQ,CAAC,GAAG,IAAI;AAC3D;AA6CA,IAAM,mBAAmB,OACvB,IACA,SACkB;AAClB,QAAM;AAAA,IACJ;AAAA;AAAA;AAAA,IAGA,EAAE,IAAI,KAAK;AAAA,EACb;AACF;AAEO,IAAM,mBAAmB,OAAO;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,MAIqB;AACnB,QAAM,WAAW,MAAM,yBAAyB,iBAAiB;AAEjE,MAAI,UAAU,QAAQ,GAAG;AACvB,UAAM,iBAAiB,SAAS,IAAI;AAAA,MAClC;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAED;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA;AAAA;AAAA,IAGA,EAAE,MAAM,EAAE,mBAAmB,QAAQ,MAAM,aAAa,UAAU,KAAK,EAAE;AAAA,EAC3E;AACF;;;ACpJA,IAAAC,iBAAiC;AAOjC,IAAM,qBAAqB,CAAC,2BAA2B,gBAAgB;AAIvE,IAAM,kBAAkB,CAAC,UAA2C;AAClE,QAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK;AAAA,MAClB,OAAO,KAAK,SAAS,CAAC,GAAG,WAAW,EAAE,SAAS,MAAM;AAAA,IACvD;AAEA,WAAO,OAAO,WAAW,YAAY,WAAW,OAC3C,SACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kBAAkB,MAA0B;AACvD,aAAW,UAAU,oBAAoB;AACvC,UAAM,QAAQ,QAAQ,IAAI,MAAM;AAEhC,QAAI,KAAC,iCAAiB,KAAK,GAAG;AAC5B;AAAA,IACF;AAEA,UAAM,SAAS,gBAAgB,KAAK,GAAG;AAEvC,YAAI,iCAAiB,MAAM,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC3BA,IAAM,mBAAmB;AAAA,EACvB,IAAI;AAAA,EACJ,MAAM,EAAE,WAAW,MAAM,UAAU,KAAK;AAAA,EACxC,WAAW;AACb;AAEA,IAAM,mBAAmB,CAAC,WAA+B;AACvD,QAAM,YAAY,OAAO,MAAM,aAAa;AAC5C,QAAM,WAAW,OAAO,MAAM,YAAY;AAC1C,QAAM,WAAW,GAAG,SAAS,IAAI,QAAQ,GAAG,KAAK;AAEjD,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,aAAa;AAC7B;AAOO,IAAM,yBAAyB,OACpC,WACwC;AACxC,QAAM,SAAS,gBAAgB;AAE/B,MAAI,CAAC,UAAU,MAAM,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAU,MAAM,OAAO,MAAM;AAAA,MACjC,kBAAkB;AAAA,QAChB,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,OAAO,EAAE,GAAG,OAAO,EAAE;AAAA,QACvD,OAAO,EAAE,MAAM,iBAAiB;AAAA,MAClC;AAAA,IACF,CAAC;AAED,UAAM,SAAS,OAAO,kBAAkB,QAAQ,CAAC,GAAG;AAEpD,QAAI,CAAC,UAAU,MAAM,KAAK,CAAC,UAAU,OAAO,EAAE,GAAG;AAC/C,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,mBAAmB,OAAO;AAAA,MAC1B,aAAa,iBAAiB,MAAM;AAAA,IACtC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACzEA,IAAAC,iBAAiC;;;ACAjC,IAAAC,iBAAiC;AAG1B,IAAM,uBAAuB;AAEpC,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAGhC,IAAM,iBAAiB;AA6BvB,IAAM,YAAY,CAAC,iBACjB,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAE5D,IAAM,WAAW,CACf,MACA,UACW;AACX,QAAM,MAAM,IAAI,IAAI,GAAG,oBAAoB,GAAG,IAAI,EAAE;AAEpD,MAAI,UAAU,KAAK,GAAG;AACpB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,UAAU,KAAK,GAAG;AACpB,YAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,SAAS;AACtB;AAEA,IAAM,mBAAmB,CACvB,UACA,SACA,kBACW;AACX,QAAM,mBAAmB,SAAS,QAAQ,IAAI,aAAa;AAC3D,QAAM,oBACJ,qBAAqB,OAAO,OAAO,gBAAgB,IAAI;AAEzD,MAAI,OAAO,SAAS,iBAAiB,KAAK,qBAAqB,GAAG;AAChE,WAAO,KAAK,IAAI,oBAAoB,KAAM,cAAc;AAAA,EAC1D;AAGA,SAAO,KAAK,IAAI,gBAAgB,KAAK,SAAS,cAAc;AAC9D;AAIA,IAAM,0BAA0B,OAAO,aAAwC;AAC7E,MAAI;AACF,UAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,YAAI,iCAAiB,KAAK,OAAO,GAAG;AAClC,aAAO,2BAA2B,SAAS,MAAM,MAAM,KAAK,OAAO;AAAA,IACrE;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,mCAAmC,SAAS,MAAM;AAC3D;AAIO,IAAM,oBAAoB,OAAwB;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,QAAQ;AACV,MAAiE;AAC/D,QAAM,MAAM,SAAS,MAAM,KAAK;AAEhC,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW,GAAG;AACzD,QAAI;AAEJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK;AAAA,QAC1B,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,MAAM;AAAA,UAC/B,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,cAAc,+BAAgC,MAAgB,OAAO;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,UAAI,UAAU,YAAY;AACxB,cAAM,MAAM,iBAAiB,UAAU,SAAS,aAAa,CAAC;AAC9D;AAAA,MACF;AAEA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,cAAc,4CAA4C,UAAU;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,SAAS;AAAA,QACjB,cAAc,MAAM,wBAAwB,QAAQ;AAAA,MACtD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,aAAO,EAAE,IAAI,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA,IACnD,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,SAAS;AAAA,QACjB,cAAc,6CACX,MAAgB,OACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,cAAc,4CAA4C,UAAU;AAAA,EACtE;AACF;;;ADtJA,IAAM,wBAAwB;AAE9B,IAAM,YAAY;AAYlB,IAAM,YAAY,CAAC,aACjB,SAAS,SAAS,CAAC;AAId,IAAM,mBAAmB,OAAO;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,MAA6E;AAC3E,QAAM,kBAAkB,KAAK;AAAA,IAC3B,KAAK,IAAI,UAAU,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAA8B,CAAC;AACrC,MAAI;AACJ,MAAI,aAAa;AAEjB,WAAS,OAAO,GAAG,OAAO,WAAW,QAAQ,GAAG;AAC9C,UAAM,SAAS,MAAM,kBAA4C;AAAA,MAC/D;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,QACL,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,OAAO,IAAI;AACd,aAAO;AAAA,IACT;AAEA,iBAAa,OAAO;AACpB,UAAM,KAAK,GAAG,UAAU,OAAO,IAAI,CAAC;AAGpC,QAAI,OAAO,KAAK,YAAY,OAAO;AACjC;AAAA,IACF;AAEA,UAAM,aAAa,OAAO,KAAK,UAAU;AAIzC,QAAI,KAAC,iCAAiB,UAAU,KAAK,eAAe,QAAQ;AAC1D;AAAA,IACF;AAEA,aAAS;AAAA,EACX;AAEA,SAAO,EAAE,IAAI,MAAM,QAAQ,YAAY,MAAM,MAAM;AACrD;;;AErFA,IAAM,uBAAuB;AAKtB,IAAM,qBAAqB,OAChC,WACiE;AACjE,QAAM,eAAe,IAAI;AAAA,KACvB,oBAAI,KAAK,GAAE,QAAQ,IAAI;AAAA,EACzB,EAAE,YAAY;AAEd,QAAM,SAAS,MAAM,iBAAiB,EAAE,QAAQ,aAAa,CAAC;AAE9D,MAAI,OAAO,IAAI;AACb,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS,kCAAkC,OAAO,YAAY;AAAA,EAChE;AACF;;;AVXA,IAAM,UAAU,OAAO,UAA8C;AACnE,QAAM,YAAY,OAAO,MAAM;AAC/B,QAAM,SAAS,OAAO,cAAc,WAAW,UAAU,KAAK,IAAI;AAElE,MAAI,KAAC,iCAAiB,MAAM,GAAG;AAC7B,WAAO,EAAE,SAAS,OAAO,SAAS,8BAA8B;AAAA,EAClE;AAEA,QAAM,SAAS,IAAI,cAAc;AAEjC,QAAM,SAAS,MAAM,uBAAuB,MAAM;AAElD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,mBAAmB,MAAM;AAElD,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO,EAAE,SAAS,OAAO,SAAS,WAAW,QAAQ;AAAA,EACvD;AAEA,QAAM,iBAAiB;AAAA,IACrB,mBAAmB,OAAO;AAAA,IAC1B,aAAa,OAAO;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAEA,IAAO,mCAAQ,oBAAoB;AAAA,EACjC,qBACE,mCAAmC,OAAO;AAAA,EAC5C,MAAM;AAAA,EACN,aACE;AAAA,EACF,gBAAgB;AAAA,EAChB;AAAA,EACA,0BAA0B;AAAA,IACxB,MAAM,mCAAmC,OAAO;AAAA,IAChD,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AACF,CAAC;",
  "names": ["isNonEmptyString", "import_guards", "import_guards", "import_guards", "import_guards"]
}
