@singi-labs/sifa-sdk 0.19.54 → 0.19.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/badge/index.cjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/{network-map-Bj-s4akz.d.cts → network-map-CdYpUy-t.d.cts} +2 -2
- package/dist/{network-map-v_4bPC5p.d.ts → network-map-CiWrQ1fF.d.ts} +2 -2
- package/dist/{org-mUwICoPr.d.cts → org-fmpG85L0.d.cts} +32 -27
- package/dist/{org-DTHVhan9.d.ts → org-hxHnoBfg.d.ts} +32 -27
- package/dist/{profile-summary-D-Z_C6ZC.d.cts → profile-summary-5T1hDw6Q.d.cts} +1 -1
- package/dist/{profile-summary-BXG--PFN.d.ts → profile-summary-Bj7ufSDK.d.ts} +1 -1
- package/dist/query/client.js.map +1 -1
- package/dist/query/fetchers/destructive.js.map +1 -1
- package/dist/query/fetchers/external-accounts.js.map +1 -1
- package/dist/query/fetchers/follow.js.map +1 -1
- package/dist/query/fetchers/index.cjs.map +1 -1
- package/dist/query/fetchers/index.d.cts +5 -5
- package/dist/query/fetchers/index.d.ts +5 -5
- package/dist/query/fetchers/org.js.map +1 -1
- package/dist/query/fetchers/profile-mutations.js.map +1 -1
- package/dist/query/fetchers/publications.js.map +1 -1
- package/dist/query/fetchers/repo-inventory.js.map +1 -1
- package/dist/query/fetchers/skills.js.map +1 -1
- package/dist/query/hooks/index.cjs.map +1 -1
- package/dist/query/hooks/index.d.cts +3 -3
- package/dist/query/hooks/index.d.ts +3 -3
- package/dist/query/hooks/use-org-claim.js.map +1 -1
- package/dist/query/hooks/use-org-domains.js.map +1 -1
- package/dist/query/hooks/use-org-notification-emails.js.map +1 -1
- package/dist/query/hooks/use-org-profile-settings.js.map +1 -1
- package/dist/query/hooks/use-skill-mutations.js.map +1 -1
- package/dist/query/index.cjs.map +1 -1
- package/dist/query/index.d.cts +8 -8
- package/dist/query/index.d.ts +8 -8
- package/dist/{types-BeEuVVBo.d.cts → types-DHT7jcZc.d.cts} +26 -8
- package/dist/{types-Dblq-u-n.d.ts → types-jB67EFpw.d.ts} +26 -8
- package/dist/{use-org-notification-emails-CgEZnFTp.d.ts → use-org-notification-emails-CWLCWkmb.d.ts} +15 -15
- package/dist/{use-org-notification-emails-C8Z0U5rH.d.cts → use-org-notification-emails-Cj8IDI_7.d.cts} +15 -15
- package/package.json +1 -1
package/dist/badge/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/logic/date-lookahead.ts","../../src/logic/primary-position.ts","../../src/logic/profile-summary.ts","../../src/query/client.ts","../../src/query/fetchers/get-profile-view.ts","../../src/query/fetchers/profile-summary.ts","../../src/badge/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * How far ahead a profile date may lie, per kind of date (sifa-workspace#581).\n *\n * A date that records something which already happened (a credential being\n * issued, an award, the end of a finished role) cannot be in the future. Some\n * dates are naturally a little ahead: an accepted job or a forthcoming paper,\n * a booked talk, an expected graduation. A credential's expiry has no cap.\n *\n * One table, so the editors on every client apply the same limits.\n */\nexport const DATE_LOOKAHEAD_MONTHS = {\n credentialIssue: 0,\n award: 0,\n course: 0,\n involvementStart: 0,\n investmentStart: 0,\n /** The end date of any finished (not ongoing) range. */\n completedRangeEnd: 0,\n careerStart: 6,\n projectStart: 6,\n publication: 6,\n talk: 12,\n /** Admitted to a programme that starts next year. */\n educationStart: 12,\n educationEnd: 96,\n} as const;\n\nexport type DateLookaheadKind = keyof typeof DATE_LOOKAHEAD_MONTHS;\n\n/**\n * Is a partial date (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`) more than `months`\n * months after the current month? Compared at year-month resolution. A bare\n * year counts from its first month, so the current year always passes. A\n * malformed or empty value is never \"beyond\" (other validation handles it).\n */\nexport function isBeyondLookahead(value: string, months: number, now: Date = new Date()): boolean {\n const match = /^(\\d{4})(?:-(\\d{2}))?/.exec(value);\n if (!match) return false;\n const index = Number(match[1]) * 12 + (match[2] ? Number(match[2]) : 1);\n const limit = now.getFullYear() * 12 + now.getMonth() + 1 + months;\n return index > limit;\n}\n\n/**\n * Has a start date not arrived yet? A role that starts next month is shown as\n * upcoming, and is not anyone's current role until its start month.\n */\nexport function isUpcomingStart(startedAt: string | undefined, now: Date = new Date()): boolean {\n return !!startedAt && isBeyondLookahead(startedAt, 0, now);\n}\n","/**\n * Canonical rule for picking the \"primary\" position to surface on profile cards,\n * social previews, and structured-data outputs.\n *\n * Without this shared helper, different surfaces (visible hero, OG image,\n * <meta description>, JSON-LD) re-derived \"primary\" inconsistently and diverged\n * for users with multiple concurrent roles.\n *\n * A `hidden` position is one the user chose not to show on their public profile.\n * It is never surfaced as the featured role — hidden wins over `primary`, so a\n * role flagged both hidden and primary is excluded rather than featured.\n *\n * A position whose start month has not arrived yet (an accepted offer) is not\n * active: it is nobody's current role until it starts (sifa-workspace#581).\n *\n * Rules (in order):\n * 1. A position the user explicitly flagged `primary` AND that is still active AND not hidden.\n * 2. Otherwise, the active, non-hidden position with the most recent `startedAt`.\n * 3. Otherwise, undefined (no eligible position).\n */\n\nimport { isUpcomingStart } from './date-lookahead.js';\n\nexport interface PrimaryPositionCandidate {\n startedAt?: string;\n endedAt?: string;\n primary?: boolean;\n hidden?: boolean;\n}\n\nexport function pickPrimaryPosition<T extends PrimaryPositionCandidate>(\n positions: readonly T[] | undefined,\n now: Date = new Date(),\n): T | undefined {\n if (!positions || positions.length === 0) return undefined;\n\n const active = positions.filter(\n (p) => !p.endedAt && !p.hidden && !isUpcomingStart(p.startedAt, now),\n );\n if (active.length === 0) return undefined;\n\n const flagged = active.find((p) => p.primary === true);\n if (flagged) return flagged;\n\n return [...active].sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))[0];\n}\n","/**\n * Compact professional summary derived from a {@link ProfileView}.\n *\n * The full `id.sifa.getProfileView` payload carries every section (all\n * positions, education, skills, publications, talks, and more). Third-party\n * surfaces that only want to show \"who is this, what do they do now\" — a badge,\n * a maintainer card, a byline — need a much smaller shape. This is that shape,\n * derived with the same canonical rules the Sifa web app uses (see\n * {@link pickPrimaryPosition}) so an embedded summary matches the profile page.\n *\n * Pure and I/O-free: pass it a view you already fetched. For the fetch +\n * summarize convenience, use `fetchProfileSummary` from `@singi-labs/sifa-sdk`.\n */\n\nimport type { ProfileView } from '../types/profile-view.js';\nimport { pickPrimaryPosition } from './primary-position.js';\n\nexport interface ProfileSummary {\n did: string;\n handle: string;\n displayName?: string;\n avatar?: string;\n pronouns?: string;\n headline?: string;\n /** Title of the current primary role, if the person has an active position. */\n currentTitle?: string;\n /** Current employer: the resolved entity name when linked, else the free-text company. */\n currentCompany?: string;\n /** Skill names in the order the AppView returns them, capped by `maxSkills`. */\n topSkills: string[];\n /** Whether the profile is claimed by its owner (vs an unclaimed placeholder). */\n claimed: boolean;\n}\n\nexport interface SummarizeProfileViewOptions {\n /** Maximum number of skills to include in `topSkills`. Default 5; negatives clamp to 0. */\n maxSkills?: number;\n}\n\nconst DEFAULT_MAX_SKILLS = 5;\n\nexport function summarizeProfileView(\n view: ProfileView,\n options: SummarizeProfileViewOptions = {},\n): ProfileSummary {\n const limit = Math.max(0, options.maxSkills ?? DEFAULT_MAX_SKILLS);\n const primary = pickPrimaryPosition(view.positions);\n\n return {\n did: view.did,\n handle: view.handle,\n displayName: view.displayName,\n avatar: view.avatar,\n pronouns: view.pronouns,\n headline: view.headline,\n currentTitle: primary?.title,\n currentCompany: primary ? (primary.entityName ?? primary.company) : undefined,\n topSkills: (view.skills ?? []).slice(0, limit).map((s) => s.name),\n claimed: view.claimed ?? false,\n };\n}\n","/**\n * Foundation HTTP client for talking to the Sifa AppView.\n *\n * Stateless. Consumers supply a {@link SifaApiConfig} per call (the React\n * hooks read it from context; non-React consumers pass it explicitly). No\n * singletons, no module-level state.\n */\n\n/** Configuration passed to every fetcher. */\nexport interface SifaApiConfig {\n /** Base URL of the sifa-api AppView, e.g. `https://api.sifa.id`. No trailing slash. */\n baseUrl: string;\n /**\n * Optional fetch implementation. Defaults to {@link globalThis.fetch}.\n * Lets Next.js consumers pass their cache-enhanced fetch; node/Expo\n * consumers can leave this unset.\n */\n fetch?: typeof fetch;\n /**\n * Optional per-request auth-token minter for auth-required reads. The NATIVE\n * app supplies this (it has no sifa-api session cookie): given a method NSID\n * (`lxm`), it mints a short-lived AT Protocol service-auth JWT on the user's\n * PDS (see the SDK's `/atproto` `mintServiceAuthToken`) and returns it; the\n * fetcher attaches it as `Authorization: Bearer`. Web omits this and relies on\n * its session cookie (`credentials: 'include'`). Return `null` to send no\n * token. See `sifa-api` `createIdentityMiddleware`.\n */\n getAuthToken?: (lxm: string) => Promise<string | null>;\n}\n\n/** Options accepted by {@link apiFetch}. */\nexport interface ApiFetchOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n /** Request body. Serialized to JSON automatically. */\n body?: unknown;\n /** AbortSignal. Defaults to `AbortSignal.timeout(timeoutMs)` if `timeoutMs` is set. */\n signal?: AbortSignal;\n /** Per-call timeout in milliseconds. Default: 10_000. Ignored if `signal` is provided. */\n timeoutMs?: number;\n /** Retry on HTTP 429 up to 3 times with the server's `Retry-After` delay (capped at 3s). */\n retryOn429?: boolean;\n /** Additional headers. `Content-Type: application/json` is set automatically when `body` is present. */\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n cache?: RequestCache;\n /**\n * Next.js-specific cache hints. Ignored on non-Next runtimes. Passed\n * through transparently as part of {@link RequestInit}.\n */\n next?: { revalidate?: number | false; tags?: string[] };\n}\n\n/** Error thrown by {@link apiFetch} on non-2xx responses. */\nexport class ApiError extends Error {\n readonly status: number;\n readonly body: unknown;\n /** Seconds until a rate limit resets, read from the headers of a 429. */\n readonly retryAfterSeconds?: number;\n\n constructor(message: string, status: number, body?: unknown, retryAfterSeconds?: number) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n this.body = body;\n if (retryAfterSeconds !== undefined) this.retryAfterSeconds = retryAfterSeconds;\n }\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_RATE_LIMIT_RETRIES = 3;\nconst RATE_LIMIT_RETRY_CAP_SECONDS = 3;\n\n/**\n * Headers sifa-api (`@fastify/rate-limit`) sets on a 429, in preference order.\n * Both carry an integer count of seconds until the limit resets.\n */\nconst RATE_LIMIT_RESET_HEADERS = ['retry-after', 'x-ratelimit-reset'] as const;\n\n/**\n * Seconds to wait before retrying a rate-limited response, or `undefined` when\n * no header carries a positive integer (`Retry-After` may also be an HTTP\n * date, which sifa-api never sends).\n */\nfunction parseRetryAfterSeconds(headers: Headers): number | undefined {\n for (const name of RATE_LIMIT_RESET_HEADERS) {\n const seconds = Number.parseInt(headers.get(name) ?? '', 10);\n if (Number.isFinite(seconds) && seconds > 0) return seconds;\n }\n return undefined;\n}\n\n/**\n * Encode a handle or DID for safe interpolation into a request path,\n * idempotently.\n *\n * Plain {@link encodeURIComponent} double-encodes an already-encoded\n * identifier: Next.js hands route params to RSC pages percent-encoded on a\n * hard navigation (`did%3Aplc%3A...`) but decoded on client-side navigation\n * (`did:plc:...`). Encoding the former again turns `%` into `%25`, so the\n * AppView reads `did%3A...` as a literal handle, finds no match, and 404s —\n * which is why DID profile links broke on direct visits but worked when\n * clicked within the app.\n *\n * AT identifiers (handles are domain names, DIDs are `did:method:...`) never\n * contain a literal `%`, so decoding a decoded value is a no-op. A malformed\n * percent sequence (lone `%`) makes {@link decodeURIComponent} throw; in that\n * case we keep the original value so behaviour matches the prior bare\n * `encodeURIComponent`.\n */\nexport function encodeIdentifier(value: string): string {\n let decoded = value;\n try {\n decoded = decodeURIComponent(value);\n } catch {\n // Malformed percent-encoding — fall back to the raw value.\n }\n return encodeURIComponent(decoded);\n}\n\n/**\n * Generic fetcher used by all SDK query and mutation functions.\n *\n * Returns parsed JSON typed as `T`. Throws {@link ApiError} on non-2xx\n * responses. Use {@link apiFetchOrNull} when 404 should resolve to `null`\n * instead.\n */\nexport async function apiFetch<T = unknown>(\n config: SifaApiConfig,\n path: string,\n options: ApiFetchOptions = {},\n): Promise<T> {\n const fetchFn = config.fetch ?? globalThis.fetch;\n const url = `${config.baseUrl}${path}`;\n const maxRetries = options.retryOn429 ? MAX_RATE_LIMIT_RETRIES : 0;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const signal = options.signal ?? AbortSignal.timeout(options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n\n const headers: Record<string, string> = { ...(options.headers ?? {}) };\n let body: BodyInit | undefined;\n if (options.body !== undefined) {\n headers['Content-Type'] ??= 'application/json';\n body = JSON.stringify(options.body);\n }\n\n // `next` is a Next.js extension to RequestInit; cast through.\n const init = {\n method: options.method ?? 'GET',\n headers,\n body,\n signal,\n credentials: options.credentials,\n cache: options.cache,\n ...(options.next ? { next: options.next } : {}),\n } as RequestInit;\n\n const res = await fetchFn(url, init);\n\n if (res.status === 429 && attempt < maxRetries) {\n const retryAfterRaw = res.headers.get('retry-after');\n const retryAfter = retryAfterRaw ? Number.parseInt(retryAfterRaw, 10) : 2;\n const waitSeconds = Math.min(\n Number.isFinite(retryAfter) ? retryAfter : 2,\n RATE_LIMIT_RETRY_CAP_SECONDS,\n );\n await new Promise((r) => setTimeout(r, waitSeconds * 1000));\n continue;\n }\n\n if (!res.ok) {\n let errBody: unknown;\n try {\n errBody = (await res.json()) as unknown;\n } catch {\n try {\n errBody = await res.text();\n } catch {\n errBody = undefined;\n }\n }\n throw new ApiError(\n `Sifa API ${res.status} on ${path}`,\n res.status,\n errBody,\n res.status === 429 ? parseRetryAfterSeconds(res.headers) : undefined,\n );\n }\n\n // 204 and 205 are defined to carry no body, so res.json() throws on them.\n // apiWrite treats that throw as a failed write, which turned every\n // successful no-content response (roadmap unvote, remove reaction,\n // dismiss endorsement) into a reported error.\n if (res.status === 204 || res.status === 205) {\n return undefined as T;\n }\n\n return (await res.json()) as T;\n }\n\n throw new ApiError(`Sifa API exhausted retries on ${path}`, 429);\n}\n\n/**\n * Variant of {@link apiFetch} that resolves to `null` on HTTP 404 instead\n * of throwing. Useful for \"fetch by handle\" reads where missing is\n * expected (e.g. unknown profile).\n */\nexport async function apiFetchOrNull<T>(\n config: SifaApiConfig,\n path: string,\n options: ApiFetchOptions = {},\n): Promise<T | null> {\n try {\n return await apiFetch<T>(config, path, options);\n } catch (e) {\n if (e instanceof ApiError && e.status === 404) return null;\n throw e;\n }\n}\n\n/**\n * Result returned by record-write mutations (create / update / delete).\n *\n * Never throws -- writes against the user's PDS can fail in many ways\n * (network, PDS unreachable, rate limit) and the UI needs structured\n * results to render appropriate messages.\n */\nexport interface WriteResult {\n success: boolean;\n error?: string;\n /**\n * PDS hostname returned by sifa-api when a write failed at the user's\n * Personal Data Server (issue #167). Lets the UI render\n * \"Your data server (eurosky.social) isn't responding\" instead of a\n * generic \"Request failed (500)\".\n */\n pdsHost?: string;\n /** HTTP status of a failed write. Absent on success and on network errors. */\n status?: number;\n /**\n * Seconds until the rate limit resets, when a write was rejected with 429\n * and the server said how long to wait (sifa-workspace#533). Lets the UI say\n * \"try again in N seconds\" instead of a generic failure.\n */\n retryAfterSeconds?: number;\n}\n\n/** Result returned by create mutations. Includes the newly created `rkey`. */\nexport interface CreateResult extends WriteResult {\n rkey?: string;\n}\n\ninterface ApiErrorBody {\n message?: string;\n error?: string;\n pdsHost?: string;\n}\n\nfunction extractWriteError(\n e: ApiError,\n): Pick<WriteResult, 'error' | 'pdsHost' | 'status' | 'retryAfterSeconds'> {\n const body = (e.body && typeof e.body === 'object' ? e.body : {}) as ApiErrorBody;\n return {\n // Fastify puts the detail in `message` and the status phrase in `error`;\n // sifa-api's own handlers (and the rate limiter) only set `error`.\n error: body.message ?? body.error ?? `Request failed (${e.status})`,\n status: e.status,\n ...(e.retryAfterSeconds !== undefined ? { retryAfterSeconds: e.retryAfterSeconds } : {}),\n ...(body.pdsHost ? { pdsHost: body.pdsHost } : {}),\n };\n}\n\n/**\n * Write mutation against the Sifa AppView. Wraps {@link apiFetch} with the\n * never-throws contract used by all sifa-web mutations: returns a\n * structured {@link WriteResult} on both success and failure, and\n * preserves the `pdsHost` field when the AppView reports a PDS-side\n * failure (issue #167).\n *\n * On success: returns `{ success: true, ...payload }` where `payload` is\n * whatever the server returned in JSON (or `{}` for 204).\n *\n * On failure: returns `{ success: false, error, pdsHost? }`. Never throws.\n *\n * Use {@link apiWriteCreate} when you specifically need the `rkey` from a\n * create response folded into the result shape.\n */\nexport async function apiWrite<TExtra extends object = Record<never, never>>(\n config: SifaApiConfig,\n path: string,\n method: 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n options: Omit<ApiFetchOptions, 'method'> = {},\n): Promise<WriteResult & TExtra> {\n try {\n const data = await apiFetch<TExtra>(config, path, {\n method,\n credentials: 'include',\n ...options,\n });\n return { success: true, ...(data ?? ({} as TExtra)) };\n } catch (e) {\n if (e instanceof ApiError) {\n return { success: false, ...extractWriteError(e) } as WriteResult & TExtra;\n }\n return { success: false, error: 'Network error' } as WriteResult & TExtra;\n }\n}\n\n/**\n * Write mutation that expects the server to return a record key (`rkey`)\n * in its response body. Wraps {@link apiWrite} and folds the `rkey` into\n * the result shape so consumers get `{ success, rkey?, error?, pdsHost? }`.\n *\n * If the server returns additional fields (e.g. `feedUrl` from external\n * account creation), pass them via the `TExtra` generic to keep them\n * typed.\n */\nexport function apiWriteCreate<TExtra extends object = Record<never, never>>(\n config: SifaApiConfig,\n path: string,\n body: unknown,\n options: Omit<ApiFetchOptions, 'method' | 'body'> = {},\n): Promise<CreateResult & TExtra> {\n return apiWrite<{ rkey?: string } & TExtra>(config, path, 'POST', {\n body,\n ...options,\n });\n}\n","import type { ProfileView } from '../../types/profile-view.js';\nimport {\n ApiError,\n apiFetch,\n encodeIdentifier,\n type ApiFetchOptions,\n type SifaApiConfig,\n} from '../client.js';\n\n/**\n * Read the aggregated public profile view via the `id.sifa.getProfileView`\n * XRPC query. This is the AppView-only join (positions, education, skills,\n * endorsements, and more) exposed as a standard lexicon method, distinct from\n * the internal `/api/profile/*` REST surface.\n *\n * Returns `null` when the AppView has no profile for the actor\n * (`ProfileNotFound`). Throws {@link ApiError} on other non-2xx responses.\n *\n * Server-callable (Next.js RSC) and client-callable (Expo, browser).\n */\nexport async function fetchGetProfileView(\n config: SifaApiConfig,\n actor: string,\n options: ApiFetchOptions = {},\n): Promise<ProfileView | null> {\n const path = `/xrpc/id.sifa.getProfileView?actor=${encodeIdentifier(actor)}`;\n try {\n return await apiFetch<ProfileView>(config, path, { retryOn429: true, ...options });\n } catch (e) {\n if (\n e instanceof ApiError &&\n e.status === 400 &&\n typeof e.body === 'object' &&\n e.body !== null &&\n (e.body as { error?: unknown }).error === 'ProfileNotFound'\n ) {\n return null;\n }\n throw e;\n }\n}\n","import {\n summarizeProfileView,\n type ProfileSummary,\n type SummarizeProfileViewOptions,\n} from '../../logic/profile-summary.js';\nimport { fetchGetProfileView } from './get-profile-view.js';\nimport type { ApiFetchOptions, SifaApiConfig } from '../client.js';\n\n/**\n * Fetch the aggregated public profile via `id.sifa.getProfileView` and reduce it\n * to a compact {@link ProfileSummary} (identity, headline, current role/employer,\n * top skills). Convenience over `fetchGetProfileView` + `summarizeProfileView`,\n * for third-party surfaces that only want the headline facts.\n *\n * Returns `null` when the AppView has no profile for the actor. Server-callable\n * (Next.js RSC) and client-callable (Expo, browser).\n */\nexport async function fetchProfileSummary(\n config: SifaApiConfig,\n actor: string,\n options: SummarizeProfileViewOptions & ApiFetchOptions = {},\n): Promise<ProfileSummary | null> {\n const { maxSkills, ...fetchOptions } = options;\n const view = await fetchGetProfileView(config, actor, fetchOptions);\n return view ? summarizeProfileView(view, { maxSkills }) : null;\n}\n","/**\n * `<sifa-badge>` — a framework-free custom element that renders a person's\n * professional headline (name, current role and employer, top skills) from\n * their Sifa profile. Drop it into any page:\n *\n * ```html\n * <script type=\"module\" src=\"https://esm.sh/@singi-labs/sifa-sdk/badge\"></script>\n * <sifa-badge handle=\"gui.do\"></sifa-badge>\n * ```\n *\n * Or, in a bundler: `import '@singi-labs/sifa-sdk/badge'` (importing registers\n * the element). Attributes: `handle` or `did` (required), `api` (AppView base,\n * default `https://api.sifa.id`), `max-skills` (default 5).\n *\n * Reads the public `id.sifa.getProfileView` query, so it needs no auth or key.\n * Cross-origin browser use depends on that endpoint's open CORS.\n */\n\nimport type { ProfileSummary } from '../logic/profile-summary.js';\nimport { fetchProfileSummary } from '../query/fetchers/profile-summary.js';\n\nconst TAG = 'sifa-badge';\nconst DEFAULT_API_BASE = 'https://api.sifa.id';\nconst PROFILE_BASE = 'https://sifa.id/p/';\n\n// Reference HTMLElement through a guarded base so importing this module never\n// throws in a non-DOM (SSR / Node) context. The real element is only ever\n// registered and instantiated in a browser, where defineSifaBadge runs.\nconst BaseElement: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\nconst STYLES = `\n :host { display: inline-block; max-width: 22rem; }\n a.card {\n display: flex; gap: 0.75rem; align-items: center;\n padding: 0.75rem 0.9rem; text-decoration: none; color: inherit;\n border: 1px solid rgba(0,0,0,0.12); border-radius: 0.75rem;\n background: canvas; font: 400 0.9rem/1.4 system-ui, sans-serif;\n }\n a.card:hover { border-color: rgba(0,0,0,0.28); }\n a.card:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }\n .avatar { width: 2.75rem; height: 2.75rem; border-radius: 50%; object-fit: cover; flex: none; }\n .body { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }\n .name { font-weight: 600; }\n .role { color: color-mix(in srgb, canvastext 65%, canvas); }\n .skills { display: flex; flex-wrap: wrap; gap: 0.3rem; margin-top: 0.25rem; }\n .chip {\n font-size: 0.72rem; padding: 0.1rem 0.45rem; border-radius: 999px;\n background: color-mix(in srgb, canvastext 8%, canvas);\n }\n .msg { margin: 0; padding: 0.5rem 0.6rem; color: color-mix(in srgb, canvastext 60%, canvas);\n font: 400 0.85rem/1.4 system-ui, sans-serif; }\n`;\n\nexport class SifaBadgeElement extends BaseElement {\n static readonly observedAttributes = ['handle', 'did', 'api', 'max-skills'];\n\n private readonly shadow: ShadowRoot;\n private renderToken = 0;\n private scheduled = false;\n\n constructor() {\n super();\n this.shadow = this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n this.schedule();\n }\n\n attributeChangedCallback(): void {\n this.schedule();\n }\n\n /** Coalesce a burst of synchronous attribute writes (and the initial connect) into one load. */\n private schedule(): void {\n if (this.scheduled) return;\n this.scheduled = true;\n queueMicrotask(() => {\n this.scheduled = false;\n if (this.isConnected) void this.load();\n });\n }\n\n private async load(): Promise<void> {\n const token = ++this.renderToken;\n const actor = this.getAttribute('did') || this.getAttribute('handle');\n if (!actor) {\n this.paint(this.message('Set a handle or did attribute on <sifa-badge>.'));\n return;\n }\n\n const baseUrl = this.getAttribute('api') || DEFAULT_API_BASE;\n const rawMax = this.getAttribute('max-skills');\n const maxSkills = rawMax != null ? Number(rawMax) : undefined;\n const options = maxSkills != null && Number.isFinite(maxSkills) ? { maxSkills } : {};\n\n this.paint(this.message('Loading…'));\n\n let summary: ProfileSummary | null;\n try {\n summary = await fetchProfileSummary({ baseUrl }, actor, options);\n } catch {\n if (token === this.renderToken) this.paint(this.message('Could not load this profile.'));\n return;\n }\n\n if (token !== this.renderToken) return; // a newer load superseded this one\n this.paint(summary ? this.card(summary) : this.message(`No Sifa profile for ${actor}.`));\n }\n\n private paint(body: Node): void {\n const style = document.createElement('style');\n style.textContent = STYLES;\n this.shadow.replaceChildren(style, body);\n }\n\n private message(text: string): HTMLElement {\n const p = document.createElement('p');\n p.className = 'msg';\n p.textContent = text;\n return p;\n }\n\n private card(summary: ProfileSummary): HTMLElement {\n const name = summary.displayName || summary.handle;\n const link = document.createElement('a');\n link.className = 'card';\n link.href = PROFILE_BASE + encodeURIComponent(summary.handle);\n link.target = '_blank';\n link.rel = 'noopener';\n link.setAttribute('aria-label', `${name} on Sifa`);\n\n if (summary.avatar) {\n const img = document.createElement('img');\n img.className = 'avatar';\n img.src = summary.avatar;\n img.alt = '';\n img.loading = 'lazy';\n link.append(img);\n }\n\n const body = document.createElement('span');\n body.className = 'body';\n\n const nameEl = document.createElement('span');\n nameEl.className = 'name';\n nameEl.textContent = name;\n body.append(nameEl);\n\n const role =\n [summary.currentTitle, summary.currentCompany].filter(Boolean).join(' · ') ||\n summary.headline;\n if (role) {\n const roleEl = document.createElement('span');\n roleEl.className = 'role';\n roleEl.textContent = role;\n body.append(roleEl);\n }\n\n if (summary.topSkills.length > 0) {\n const skills = document.createElement('span');\n skills.className = 'skills';\n for (const skill of summary.topSkills) {\n const chip = document.createElement('span');\n chip.className = 'chip';\n chip.textContent = skill;\n skills.append(chip);\n }\n body.append(skills);\n }\n\n link.append(body);\n return link;\n }\n}\n\n/** Register the element (idempotent). Called automatically when this module is imported. */\nexport function defineSifaBadge(tag: string = TAG): void {\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n customElements.define(tag, SifaBadgeElement);\n }\n}\n\ndefineSifaBadge();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/logic/date-lookahead.ts","../../src/logic/primary-position.ts","../../src/logic/profile-summary.ts","../../src/query/client.ts","../../src/query/fetchers/get-profile-view.ts","../../src/query/fetchers/profile-summary.ts","../../src/badge/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * How far ahead a profile date may lie, per kind of date (sifa-workspace#581).\n *\n * A date that records something which already happened (a credential being\n * issued, an award, the end of a finished role) cannot be in the future. Some\n * dates are naturally a little ahead: an accepted job or a forthcoming paper,\n * a booked talk, an expected graduation. A credential's expiry has no cap.\n *\n * One table, so the editors on every client apply the same limits.\n */\nexport const DATE_LOOKAHEAD_MONTHS = {\n credentialIssue: 0,\n award: 0,\n course: 0,\n involvementStart: 0,\n investmentStart: 0,\n /** The end date of any finished (not ongoing) range. */\n completedRangeEnd: 0,\n careerStart: 6,\n projectStart: 6,\n publication: 6,\n talk: 12,\n /** Admitted to a programme that starts next year. */\n educationStart: 12,\n educationEnd: 96,\n} as const;\n\nexport type DateLookaheadKind = keyof typeof DATE_LOOKAHEAD_MONTHS;\n\n/**\n * Is a partial date (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`) more than `months`\n * months after the current month? Compared at year-month resolution. A bare\n * year counts from its first month, so the current year always passes. A\n * malformed or empty value is never \"beyond\" (other validation handles it).\n */\nexport function isBeyondLookahead(value: string, months: number, now: Date = new Date()): boolean {\n const match = /^(\\d{4})(?:-(\\d{2}))?/.exec(value);\n if (!match) return false;\n const index = Number(match[1]) * 12 + (match[2] ? Number(match[2]) : 1);\n const limit = now.getFullYear() * 12 + now.getMonth() + 1 + months;\n return index > limit;\n}\n\n/**\n * Has a start date not arrived yet? A role that starts next month is shown as\n * upcoming, and is not anyone's current role until its start month.\n */\nexport function isUpcomingStart(startedAt: string | undefined, now: Date = new Date()): boolean {\n return !!startedAt && isBeyondLookahead(startedAt, 0, now);\n}\n","/**\n * Canonical rule for picking the \"primary\" position to surface on profile cards,\n * social previews, and structured-data outputs.\n *\n * Without this shared helper, different surfaces (visible hero, OG image,\n * <meta description>, JSON-LD) re-derived \"primary\" inconsistently and diverged\n * for users with multiple concurrent roles.\n *\n * A `hidden` position is one the user chose not to show on their public profile.\n * It is never surfaced as the featured role — hidden wins over `primary`, so a\n * role flagged both hidden and primary is excluded rather than featured.\n *\n * A position whose start month has not arrived yet (an accepted offer) is not\n * active: it is nobody's current role until it starts (sifa-workspace#581).\n *\n * Rules (in order):\n * 1. A position the user explicitly flagged `primary` AND that is still active AND not hidden.\n * 2. Otherwise, the active, non-hidden position with the most recent `startedAt`.\n * 3. Otherwise, undefined (no eligible position).\n */\n\nimport { isUpcomingStart } from './date-lookahead.js';\n\nexport interface PrimaryPositionCandidate {\n startedAt?: string;\n endedAt?: string;\n primary?: boolean;\n hidden?: boolean;\n}\n\nexport function pickPrimaryPosition<T extends PrimaryPositionCandidate>(\n positions: readonly T[] | undefined,\n now: Date = new Date(),\n): T | undefined {\n if (!positions || positions.length === 0) return undefined;\n\n const active = positions.filter(\n (p) => !p.endedAt && !p.hidden && !isUpcomingStart(p.startedAt, now),\n );\n if (active.length === 0) return undefined;\n\n const flagged = active.find((p) => p.primary === true);\n if (flagged) return flagged;\n\n return [...active].sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))[0];\n}\n","/**\n * Compact professional summary derived from a {@link ProfileView}.\n *\n * The full `id.sifa.getProfileView` payload carries every section (all\n * positions, education, skills, publications, talks, and more). Third-party\n * surfaces that only want to show \"who is this, what do they do now\" — a badge,\n * a maintainer card, a byline — need a much smaller shape. This is that shape,\n * derived with the same canonical rules the Sifa web app uses (see\n * {@link pickPrimaryPosition}) so an embedded summary matches the profile page.\n *\n * Pure and I/O-free: pass it a view you already fetched. For the fetch +\n * summarize convenience, use `fetchProfileSummary` from `@singi-labs/sifa-sdk`.\n */\n\nimport type { ProfileView } from '../types/profile-view.js';\nimport { pickPrimaryPosition } from './primary-position.js';\n\nexport interface ProfileSummary {\n did: string;\n handle: string;\n displayName?: string;\n avatar?: string;\n pronouns?: string;\n headline?: string;\n /** Title of the current primary role, if the person has an active position. */\n currentTitle?: string;\n /** Current employer: the resolved entity name when linked, else the free-text company. */\n currentCompany?: string;\n /** Skill names in the order the AppView returns them, capped by `maxSkills`. */\n topSkills: string[];\n /** Whether the profile is claimed by its owner (vs an unclaimed placeholder). */\n claimed: boolean;\n}\n\nexport interface SummarizeProfileViewOptions {\n /** Maximum number of skills to include in `topSkills`. Default 5; negatives clamp to 0. */\n maxSkills?: number;\n}\n\nconst DEFAULT_MAX_SKILLS = 5;\n\nexport function summarizeProfileView(\n view: ProfileView,\n options: SummarizeProfileViewOptions = {},\n): ProfileSummary {\n const limit = Math.max(0, options.maxSkills ?? DEFAULT_MAX_SKILLS);\n const primary = pickPrimaryPosition(view.positions);\n\n return {\n did: view.did,\n handle: view.handle,\n displayName: view.displayName,\n avatar: view.avatar,\n pronouns: view.pronouns,\n headline: view.headline,\n currentTitle: primary?.title,\n currentCompany: primary ? (primary.entityName ?? primary.company) : undefined,\n topSkills: (view.skills ?? []).slice(0, limit).map((s) => s.name),\n claimed: view.claimed ?? false,\n };\n}\n","/**\n * Foundation HTTP client for talking to the Sifa AppView.\n *\n * Stateless. Consumers supply a {@link SifaApiConfig} per call (the React\n * hooks read it from context; non-React consumers pass it explicitly). No\n * singletons, no module-level state.\n */\n\n/** Configuration passed to every fetcher. */\nexport interface SifaApiConfig {\n /** Base URL of the sifa-api AppView, e.g. `https://api.sifa.id`. No trailing slash. */\n baseUrl: string;\n /**\n * Optional fetch implementation. Defaults to {@link globalThis.fetch}.\n * Lets Next.js consumers pass their cache-enhanced fetch; node/Expo\n * consumers can leave this unset.\n */\n fetch?: typeof fetch;\n /**\n * Optional per-request auth-token minter for auth-required reads. The NATIVE\n * app supplies this (it has no sifa-api session cookie): given a method NSID\n * (`lxm`), it mints a short-lived AT Protocol service-auth JWT on the user's\n * PDS (see the SDK's `/atproto` `mintServiceAuthToken`) and returns it; the\n * fetcher attaches it as `Authorization: Bearer`. Web omits this and relies on\n * its session cookie (`credentials: 'include'`). Return `null` to send no\n * token. See `sifa-api` `createIdentityMiddleware`.\n */\n getAuthToken?: (lxm: string) => Promise<string | null>;\n}\n\n/** Options accepted by {@link apiFetch}. */\nexport interface ApiFetchOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n /** Request body. Serialized to JSON automatically. */\n body?: unknown;\n /** AbortSignal. Defaults to `AbortSignal.timeout(timeoutMs)` if `timeoutMs` is set. */\n signal?: AbortSignal;\n /** Per-call timeout in milliseconds. Default: 10_000. Ignored if `signal` is provided. */\n timeoutMs?: number;\n /** Retry on HTTP 429 up to 3 times with the server's `Retry-After` delay (capped at 3s). */\n retryOn429?: boolean;\n /** Additional headers. `Content-Type: application/json` is set automatically when `body` is present. */\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n cache?: RequestCache;\n /**\n * Next.js-specific cache hints. Ignored on non-Next runtimes. Passed\n * through transparently as part of {@link RequestInit}.\n */\n next?: { revalidate?: number | false; tags?: string[] };\n}\n\n/** Error thrown by {@link apiFetch} on non-2xx responses. */\nexport class ApiError extends Error {\n readonly status: number;\n readonly body: unknown;\n /** Seconds until a rate limit resets, read from the headers of a 429. */\n readonly retryAfterSeconds?: number;\n\n constructor(message: string, status: number, body?: unknown, retryAfterSeconds?: number) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n this.body = body;\n if (retryAfterSeconds !== undefined) this.retryAfterSeconds = retryAfterSeconds;\n }\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_RATE_LIMIT_RETRIES = 3;\nconst RATE_LIMIT_RETRY_CAP_SECONDS = 3;\n\n/**\n * Headers sifa-api (`@fastify/rate-limit`) sets on a 429, in preference order.\n * Both carry an integer count of seconds until the limit resets.\n */\nconst RATE_LIMIT_RESET_HEADERS = ['retry-after', 'x-ratelimit-reset'] as const;\n\n/**\n * Seconds to wait before retrying a rate-limited response, or `undefined` when\n * no header carries a positive integer (`Retry-After` may also be an HTTP\n * date, which sifa-api never sends).\n */\nfunction parseRetryAfterSeconds(headers: Headers): number | undefined {\n for (const name of RATE_LIMIT_RESET_HEADERS) {\n const seconds = Number.parseInt(headers.get(name) ?? '', 10);\n if (Number.isFinite(seconds) && seconds > 0) return seconds;\n }\n return undefined;\n}\n\n/**\n * Encode a handle or DID for safe interpolation into a request path,\n * idempotently.\n *\n * Plain {@link encodeURIComponent} double-encodes an already-encoded\n * identifier: Next.js hands route params to RSC pages percent-encoded on a\n * hard navigation (`did%3Aplc%3A...`) but decoded on client-side navigation\n * (`did:plc:...`). Encoding the former again turns `%` into `%25`, so the\n * AppView reads `did%3A...` as a literal handle, finds no match, and 404s —\n * which is why DID profile links broke on direct visits but worked when\n * clicked within the app.\n *\n * AT identifiers (handles are domain names, DIDs are `did:method:...`) never\n * contain a literal `%`, so decoding a decoded value is a no-op. A malformed\n * percent sequence (lone `%`) makes {@link decodeURIComponent} throw; in that\n * case we keep the original value so behaviour matches the prior bare\n * `encodeURIComponent`.\n */\nexport function encodeIdentifier(value: string): string {\n let decoded = value;\n try {\n decoded = decodeURIComponent(value);\n } catch {\n // Malformed percent-encoding — fall back to the raw value.\n }\n return encodeURIComponent(decoded);\n}\n\n/**\n * Generic fetcher used by all SDK query and mutation functions.\n *\n * Returns parsed JSON typed as `T`. Throws {@link ApiError} on non-2xx\n * responses. Use {@link apiFetchOrNull} when 404 should resolve to `null`\n * instead.\n */\nexport async function apiFetch<T = unknown>(\n config: SifaApiConfig,\n path: string,\n options: ApiFetchOptions = {},\n): Promise<T> {\n const fetchFn = config.fetch ?? globalThis.fetch;\n const url = `${config.baseUrl}${path}`;\n const maxRetries = options.retryOn429 ? MAX_RATE_LIMIT_RETRIES : 0;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const signal = options.signal ?? AbortSignal.timeout(options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n\n const headers: Record<string, string> = { ...(options.headers ?? {}) };\n let body: BodyInit | undefined;\n if (options.body !== undefined) {\n headers['Content-Type'] ??= 'application/json';\n body = JSON.stringify(options.body);\n }\n\n // `next` is a Next.js extension to RequestInit; cast through.\n const init = {\n method: options.method ?? 'GET',\n headers,\n body,\n signal,\n credentials: options.credentials,\n cache: options.cache,\n ...(options.next ? { next: options.next } : {}),\n } as RequestInit;\n\n const res = await fetchFn(url, init);\n\n if (res.status === 429 && attempt < maxRetries) {\n const retryAfterRaw = res.headers.get('retry-after');\n const retryAfter = retryAfterRaw ? Number.parseInt(retryAfterRaw, 10) : 2;\n const waitSeconds = Math.min(\n Number.isFinite(retryAfter) ? retryAfter : 2,\n RATE_LIMIT_RETRY_CAP_SECONDS,\n );\n await new Promise((r) => setTimeout(r, waitSeconds * 1000));\n continue;\n }\n\n if (!res.ok) {\n let errBody: unknown;\n try {\n errBody = (await res.json()) as unknown;\n } catch {\n try {\n errBody = await res.text();\n } catch {\n errBody = undefined;\n }\n }\n throw new ApiError(\n `Sifa API ${res.status} on ${path}`,\n res.status,\n errBody,\n res.status === 429 ? parseRetryAfterSeconds(res.headers) : undefined,\n );\n }\n\n // 204 and 205 are defined to carry no body, so res.json() throws on them.\n // apiWrite treats that throw as a failed write, which turned every\n // successful no-content response (roadmap unvote, remove reaction,\n // dismiss endorsement) into a reported error.\n if (res.status === 204 || res.status === 205) {\n return undefined as T;\n }\n\n return (await res.json()) as T;\n }\n\n throw new ApiError(`Sifa API exhausted retries on ${path}`, 429);\n}\n\n/**\n * Variant of {@link apiFetch} that resolves to `null` on HTTP 404 instead\n * of throwing. Useful for \"fetch by handle\" reads where missing is\n * expected (e.g. unknown profile).\n */\nexport async function apiFetchOrNull<T>(\n config: SifaApiConfig,\n path: string,\n options: ApiFetchOptions = {},\n): Promise<T | null> {\n try {\n return await apiFetch<T>(config, path, options);\n } catch (e) {\n if (e instanceof ApiError && e.status === 404) return null;\n throw e;\n }\n}\n\n/**\n * Failed branch of a {@link WriteResult}.\n *\n * Never throws -- writes against the user's PDS can fail in many ways\n * (network, PDS unreachable, rate limit) and the UI needs structured\n * results to render appropriate messages.\n */\nexport interface WriteFailure {\n success: false;\n error?: string;\n /**\n * PDS hostname returned by sifa-api when a write failed at the user's\n * Personal Data Server (issue #167). Lets the UI render\n * \"Your data server (eurosky.social) isn't responding\" instead of a\n * generic \"Request failed (500)\".\n */\n pdsHost?: string;\n /** HTTP status of a failed write. Absent on network errors. */\n status?: number;\n /**\n * Seconds until the rate limit resets, when a write was rejected with 429\n * and the server said how long to wait (sifa-workspace#533). Lets the UI say\n * \"try again in N seconds\" instead of a generic failure.\n */\n retryAfterSeconds?: number;\n}\n\n/**\n * Successful branch of a {@link WriteResult}: the response body fields\n * (`TExtra`) plus the optional failure fields. A body field that shares a name\n * with a failure field (e.g. a body `status`) keeps its body type here, so it\n * never collides with the HTTP status on the failure branch.\n */\nexport type WriteSuccess<TExtra extends object = Record<never, never>> = { success: true } & Omit<\n WriteFailure,\n 'success' | keyof TExtra\n> &\n TExtra;\n\n/**\n * Result returned by record-write mutations (create / update / delete),\n * discriminated on `success`. Narrow on `success` to read a body `status`\n * (success) or the HTTP `status` (failure). Other fields stay readable without\n * narrowing.\n */\nexport type WriteResult<TExtra extends object = Record<never, never>> =\n WriteSuccess<TExtra> | (WriteFailure & Partial<Omit<TExtra, keyof WriteFailure>>);\n\n/** Result returned by create mutations. Includes the newly created `rkey`. */\nexport type CreateResult = WriteResult<{ rkey?: string }>;\n\ninterface ApiErrorBody {\n message?: string;\n error?: string;\n pdsHost?: string;\n}\n\nfunction extractWriteError(e: ApiError): Omit<WriteFailure, 'success'> {\n const body = (e.body && typeof e.body === 'object' ? e.body : {}) as ApiErrorBody;\n return {\n // Fastify puts the detail in `message` and the status phrase in `error`;\n // sifa-api's own handlers (and the rate limiter) only set `error`.\n error: body.message ?? body.error ?? `Request failed (${e.status})`,\n status: e.status,\n ...(e.retryAfterSeconds !== undefined ? { retryAfterSeconds: e.retryAfterSeconds } : {}),\n ...(body.pdsHost ? { pdsHost: body.pdsHost } : {}),\n };\n}\n\n/**\n * Write mutation against the Sifa AppView. Wraps {@link apiFetch} with the\n * never-throws contract used by all sifa-web mutations: returns a\n * structured {@link WriteResult} on both success and failure, and\n * preserves the `pdsHost` field when the AppView reports a PDS-side\n * failure (issue #167).\n *\n * On success: returns `{ success: true, ...payload }` where `payload` is\n * whatever the server returned in JSON (or `{}` for 204).\n *\n * On failure: returns `{ success: false, error, pdsHost? }`. Never throws.\n *\n * Use {@link apiWriteCreate} when you specifically need the `rkey` from a\n * create response folded into the result shape.\n */\nexport async function apiWrite<TExtra extends object = Record<never, never>>(\n config: SifaApiConfig,\n path: string,\n method: 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n options: Omit<ApiFetchOptions, 'method'> = {},\n): Promise<WriteResult<TExtra>> {\n try {\n const data = await apiFetch<TExtra>(config, path, {\n method,\n credentials: 'include',\n ...options,\n });\n return { success: true, ...(data ?? ({} as TExtra)) };\n } catch (e) {\n if (e instanceof ApiError) {\n return { success: false, ...extractWriteError(e) };\n }\n return { success: false, error: 'Network error' };\n }\n}\n\n/**\n * Write mutation that expects the server to return a record key (`rkey`)\n * in its response body. Wraps {@link apiWrite} and folds the `rkey` into\n * the result shape so consumers get `{ success, rkey?, error?, pdsHost? }`.\n *\n * If the server returns additional fields (e.g. `feedUrl` from external\n * account creation), pass them via the `TExtra` generic to keep them\n * typed.\n */\nexport function apiWriteCreate<TExtra extends object = Record<never, never>>(\n config: SifaApiConfig,\n path: string,\n body: unknown,\n options: Omit<ApiFetchOptions, 'method' | 'body'> = {},\n): Promise<WriteResult<{ rkey?: string } & TExtra>> {\n return apiWrite<{ rkey?: string } & TExtra>(config, path, 'POST', {\n body,\n ...options,\n });\n}\n","import type { ProfileView } from '../../types/profile-view.js';\nimport {\n ApiError,\n apiFetch,\n encodeIdentifier,\n type ApiFetchOptions,\n type SifaApiConfig,\n} from '../client.js';\n\n/**\n * Read the aggregated public profile view via the `id.sifa.getProfileView`\n * XRPC query. This is the AppView-only join (positions, education, skills,\n * endorsements, and more) exposed as a standard lexicon method, distinct from\n * the internal `/api/profile/*` REST surface.\n *\n * Returns `null` when the AppView has no profile for the actor\n * (`ProfileNotFound`). Throws {@link ApiError} on other non-2xx responses.\n *\n * Server-callable (Next.js RSC) and client-callable (Expo, browser).\n */\nexport async function fetchGetProfileView(\n config: SifaApiConfig,\n actor: string,\n options: ApiFetchOptions = {},\n): Promise<ProfileView | null> {\n const path = `/xrpc/id.sifa.getProfileView?actor=${encodeIdentifier(actor)}`;\n try {\n return await apiFetch<ProfileView>(config, path, { retryOn429: true, ...options });\n } catch (e) {\n if (\n e instanceof ApiError &&\n e.status === 400 &&\n typeof e.body === 'object' &&\n e.body !== null &&\n (e.body as { error?: unknown }).error === 'ProfileNotFound'\n ) {\n return null;\n }\n throw e;\n }\n}\n","import {\n summarizeProfileView,\n type ProfileSummary,\n type SummarizeProfileViewOptions,\n} from '../../logic/profile-summary.js';\nimport { fetchGetProfileView } from './get-profile-view.js';\nimport type { ApiFetchOptions, SifaApiConfig } from '../client.js';\n\n/**\n * Fetch the aggregated public profile via `id.sifa.getProfileView` and reduce it\n * to a compact {@link ProfileSummary} (identity, headline, current role/employer,\n * top skills). Convenience over `fetchGetProfileView` + `summarizeProfileView`,\n * for third-party surfaces that only want the headline facts.\n *\n * Returns `null` when the AppView has no profile for the actor. Server-callable\n * (Next.js RSC) and client-callable (Expo, browser).\n */\nexport async function fetchProfileSummary(\n config: SifaApiConfig,\n actor: string,\n options: SummarizeProfileViewOptions & ApiFetchOptions = {},\n): Promise<ProfileSummary | null> {\n const { maxSkills, ...fetchOptions } = options;\n const view = await fetchGetProfileView(config, actor, fetchOptions);\n return view ? summarizeProfileView(view, { maxSkills }) : null;\n}\n","/**\n * `<sifa-badge>` — a framework-free custom element that renders a person's\n * professional headline (name, current role and employer, top skills) from\n * their Sifa profile. Drop it into any page:\n *\n * ```html\n * <script type=\"module\" src=\"https://esm.sh/@singi-labs/sifa-sdk/badge\"></script>\n * <sifa-badge handle=\"gui.do\"></sifa-badge>\n * ```\n *\n * Or, in a bundler: `import '@singi-labs/sifa-sdk/badge'` (importing registers\n * the element). Attributes: `handle` or `did` (required), `api` (AppView base,\n * default `https://api.sifa.id`), `max-skills` (default 5).\n *\n * Reads the public `id.sifa.getProfileView` query, so it needs no auth or key.\n * Cross-origin browser use depends on that endpoint's open CORS.\n */\n\nimport type { ProfileSummary } from '../logic/profile-summary.js';\nimport { fetchProfileSummary } from '../query/fetchers/profile-summary.js';\n\nconst TAG = 'sifa-badge';\nconst DEFAULT_API_BASE = 'https://api.sifa.id';\nconst PROFILE_BASE = 'https://sifa.id/p/';\n\n// Reference HTMLElement through a guarded base so importing this module never\n// throws in a non-DOM (SSR / Node) context. The real element is only ever\n// registered and instantiated in a browser, where defineSifaBadge runs.\nconst BaseElement: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\nconst STYLES = `\n :host { display: inline-block; max-width: 22rem; }\n a.card {\n display: flex; gap: 0.75rem; align-items: center;\n padding: 0.75rem 0.9rem; text-decoration: none; color: inherit;\n border: 1px solid rgba(0,0,0,0.12); border-radius: 0.75rem;\n background: canvas; font: 400 0.9rem/1.4 system-ui, sans-serif;\n }\n a.card:hover { border-color: rgba(0,0,0,0.28); }\n a.card:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }\n .avatar { width: 2.75rem; height: 2.75rem; border-radius: 50%; object-fit: cover; flex: none; }\n .body { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }\n .name { font-weight: 600; }\n .role { color: color-mix(in srgb, canvastext 65%, canvas); }\n .skills { display: flex; flex-wrap: wrap; gap: 0.3rem; margin-top: 0.25rem; }\n .chip {\n font-size: 0.72rem; padding: 0.1rem 0.45rem; border-radius: 999px;\n background: color-mix(in srgb, canvastext 8%, canvas);\n }\n .msg { margin: 0; padding: 0.5rem 0.6rem; color: color-mix(in srgb, canvastext 60%, canvas);\n font: 400 0.85rem/1.4 system-ui, sans-serif; }\n`;\n\nexport class SifaBadgeElement extends BaseElement {\n static readonly observedAttributes = ['handle', 'did', 'api', 'max-skills'];\n\n private readonly shadow: ShadowRoot;\n private renderToken = 0;\n private scheduled = false;\n\n constructor() {\n super();\n this.shadow = this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n this.schedule();\n }\n\n attributeChangedCallback(): void {\n this.schedule();\n }\n\n /** Coalesce a burst of synchronous attribute writes (and the initial connect) into one load. */\n private schedule(): void {\n if (this.scheduled) return;\n this.scheduled = true;\n queueMicrotask(() => {\n this.scheduled = false;\n if (this.isConnected) void this.load();\n });\n }\n\n private async load(): Promise<void> {\n const token = ++this.renderToken;\n const actor = this.getAttribute('did') || this.getAttribute('handle');\n if (!actor) {\n this.paint(this.message('Set a handle or did attribute on <sifa-badge>.'));\n return;\n }\n\n const baseUrl = this.getAttribute('api') || DEFAULT_API_BASE;\n const rawMax = this.getAttribute('max-skills');\n const maxSkills = rawMax != null ? Number(rawMax) : undefined;\n const options = maxSkills != null && Number.isFinite(maxSkills) ? { maxSkills } : {};\n\n this.paint(this.message('Loading…'));\n\n let summary: ProfileSummary | null;\n try {\n summary = await fetchProfileSummary({ baseUrl }, actor, options);\n } catch {\n if (token === this.renderToken) this.paint(this.message('Could not load this profile.'));\n return;\n }\n\n if (token !== this.renderToken) return; // a newer load superseded this one\n this.paint(summary ? this.card(summary) : this.message(`No Sifa profile for ${actor}.`));\n }\n\n private paint(body: Node): void {\n const style = document.createElement('style');\n style.textContent = STYLES;\n this.shadow.replaceChildren(style, body);\n }\n\n private message(text: string): HTMLElement {\n const p = document.createElement('p');\n p.className = 'msg';\n p.textContent = text;\n return p;\n }\n\n private card(summary: ProfileSummary): HTMLElement {\n const name = summary.displayName || summary.handle;\n const link = document.createElement('a');\n link.className = 'card';\n link.href = PROFILE_BASE + encodeURIComponent(summary.handle);\n link.target = '_blank';\n link.rel = 'noopener';\n link.setAttribute('aria-label', `${name} on Sifa`);\n\n if (summary.avatar) {\n const img = document.createElement('img');\n img.className = 'avatar';\n img.src = summary.avatar;\n img.alt = '';\n img.loading = 'lazy';\n link.append(img);\n }\n\n const body = document.createElement('span');\n body.className = 'body';\n\n const nameEl = document.createElement('span');\n nameEl.className = 'name';\n nameEl.textContent = name;\n body.append(nameEl);\n\n const role =\n [summary.currentTitle, summary.currentCompany].filter(Boolean).join(' · ') ||\n summary.headline;\n if (role) {\n const roleEl = document.createElement('span');\n roleEl.className = 'role';\n roleEl.textContent = role;\n body.append(roleEl);\n }\n\n if (summary.topSkills.length > 0) {\n const skills = document.createElement('span');\n skills.className = 'skills';\n for (const skill of summary.topSkills) {\n const chip = document.createElement('span');\n chip.className = 'chip';\n chip.textContent = skill;\n skills.append(chip);\n }\n body.append(skills);\n }\n\n link.append(body);\n return link;\n }\n}\n\n/** Register the element (idempotent). Called automatically when this module is imported. */\nexport function defineSifaBadge(tag: string = TAG): void {\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n customElements.define(tag, SifaBadgeElement);\n }\n}\n\ndefineSifaBadge();\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -7157,7 +7157,7 @@ function describeSifaRecord(collection, value) {
|
|
|
7157
7157
|
}
|
|
7158
7158
|
|
|
7159
7159
|
// src/index.ts
|
|
7160
|
-
var SIFA_SDK_VERSION = "0.19.
|
|
7160
|
+
var SIFA_SDK_VERSION = "0.19.55";
|
|
7161
7161
|
|
|
7162
7162
|
exports.ACTIVITY_TIERS = ACTIVITY_TIERS;
|
|
7163
7163
|
exports.ACTIVITY_VERBS = ACTIVITY_VERBS;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { P as ProfileSkill, a as ProfilePresentationDelivery, L as LocationValue, b as PdsProviderInfo, c as Profile, A as AccountFacetMode, d as ProfilePosition, e as ProfileCertification, f as ProfileEducation, g as ProfileHonor, h as ProfileLanguage, i as ProfileProject, j as ProfilePublication, k as ProfileInvolvement, R as RelatedIdentifier } from './index-DmlIG8sJ.cjs';
|
|
2
2
|
export { l as ActiveApp, m as ActorCard, n as AuthorSuggestion, C as CoSpeaker, E as Endorsement, o as EndorsementData, p as ExternalAccount, q as ExternalAccountKeytraceClaim, F as FeedItem, r as LanguageProficiency, O as OrgAddressView, s as OrgFloorVerdict, t as OrgLinkView, u as OrgProfileView, v as PROJECT_ROLES, w as PresentationLinkView, x as ProfileCourse, y as ProfileIndustry, z as ProfileInvestment, B as ProfileInvestmentLink, D as ProfileInvolvementLink, G as ProfileLocation, H as ProfileOverrideSource, I as ProfilePresentation, J as ProfileVolunteering, K as ProjectMemberCard, M as ProjectRole, N as PublicationContributor, Q as RecognizedEntity, S as SkillRef, T as SkillSuggestion, U as TrustStat, V as VerifiedAccount } from './index-DmlIG8sJ.cjs';
|
|
3
|
-
import { S as SearchFilters } from './types-
|
|
4
|
-
export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-
|
|
3
|
+
import { S as SearchFilters } from './types-DHT7jcZc.cjs';
|
|
4
|
+
export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-DHT7jcZc.cjs';
|
|
5
5
|
import { P as PresentationDuration, a as ProfilePresentationDeliveryRecord, b as ProfilePresentationRecord, O as OrgProfileRecord } from './profile-investment-BiHM7C5q.cjs';
|
|
6
6
|
export { A as ArtifactLink, c as ArtifactLinkSchema, d as AtmosphereFeedItem, e as AtmosphereFeedItemSchema, B as BlobRef, f as BlobRefSchema, E as EndorsementConfirmationRecord, g as EndorsementConfirmationRecordSchema, h as EndorsementRecord, i as EndorsementRecordSchema, F as FeedActor, j as FeedActorSchema, k as FeedCursor, l as FollowFeedItem, m as FollowFeedItemSchema, n as FollowFeedPage, o as FollowFeedPageSchema, G as GraphFollowRecord, p as GraphFollowRecordSchema, I as InvestmentAmountSchema, q as OrgEmploymentAttestationRecord, r as OrgEmploymentAttestationRecordSchema, s as OrgProfileRecordSchema, t as PROFILE_INVESTMENT_NSID, u as PROFILE_INVOLVEMENT_NSID, v as PresentationDurationSchema, w as PresentationLink, x as PresentationLinkSchema, y as ProfileCertificationRecord, z as ProfileCertificationRecordSchema, C as ProfileCourseRecord, D as ProfileCourseRecordSchema, H as ProfileEducationRecord, J as ProfileEducationRecordSchema, K as ProfileExternalAccountRecord, L as ProfileExternalAccountRecordSchema, M as ProfileHonorRecord, N as ProfileHonorRecordSchema, Q as ProfileInvestmentRecordSchema, R as ProfileInvolvementRecord, S as ProfileInvolvementRecordSchema, T as ProfileLanguageRecord, U as ProfileLanguageRecordSchema, V as ProfilePositionRecord, W as ProfilePositionRecordSchema, X as ProfilePresentationDeliveryRecordSchema, Y as ProfilePresentationRecordSchema, Z as ProfileProjectRecord, _ as ProfileProjectRecordSchema, $ as ProfilePublicationRecord, a0 as ProfilePublicationRecordSchema, a1 as ProfileSelfRecord, a2 as ProfileSelfRecordSchema, a3 as ProfileSkillRecord, a4 as ProfileSkillRecordSchema, a5 as ProfileVolunteeringRecord, a6 as ProfileVolunteeringRecordSchema, a7 as PublicationAuthor, a8 as PublicationAuthorSchema, a9 as RelatedIdentifierSchema, aa as SifaFeedItem, ab as SifaFeedItemSchema, ac as decodeFeedCursor, ad as encodeFeedCursor, ae as makeGraphFollowRecordSchema } from './profile-investment-BiHM7C5q.cjs';
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
-
export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-
|
|
8
|
+
export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-5T1hDw6Q.cjs';
|
|
9
9
|
import { E as EntitySearchResult } from './follow-profile-D1l6pulB.cjs';
|
|
10
10
|
export { a as EntityImportSearchResponse, b as EntityImportSearchResponseSchema, c as EntityMintDomainResponse, d as EntityMintDomainResponseSchema, e as EntityResolveDomainRequest, f as EntityResolveDomainRequestSchema, g as EntityResolveDomainResponse, h as EntityResolveDomainResponseSchema, i as EntitySearchResponse, j as EntitySearchResponseSchema, k as EntitySearchResultSchema, l as EntitySelectRequest, m as EntitySelectRequestSchema, n as EntitySelectResponse, o as EntitySelectResponseSchema, F as FEATURE_FLAGS, p as FeatureAllowlistEntry, q as FeatureAllowlistEntrySchema, r as FeatureFlag, s as FollowProfileItem, t as FollowProfilePage, u as FollowProfilePageSchema, v as FollowProfileSchema } from './follow-profile-D1l6pulB.cjs';
|
|
11
11
|
import { A as AgentRef } from './shared-v0vl5hov.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { P as ProfileSkill, a as ProfilePresentationDelivery, L as LocationValue, b as PdsProviderInfo, c as Profile, A as AccountFacetMode, d as ProfilePosition, e as ProfileCertification, f as ProfileEducation, g as ProfileHonor, h as ProfileLanguage, i as ProfileProject, j as ProfilePublication, k as ProfileInvolvement, R as RelatedIdentifier } from './index-D9GC0u__.js';
|
|
2
2
|
export { l as ActiveApp, m as ActorCard, n as AuthorSuggestion, C as CoSpeaker, E as Endorsement, o as EndorsementData, p as ExternalAccount, q as ExternalAccountKeytraceClaim, F as FeedItem, r as LanguageProficiency, O as OrgAddressView, s as OrgFloorVerdict, t as OrgLinkView, u as OrgProfileView, v as PROJECT_ROLES, w as PresentationLinkView, x as ProfileCourse, y as ProfileIndustry, z as ProfileInvestment, B as ProfileInvestmentLink, D as ProfileInvolvementLink, G as ProfileLocation, H as ProfileOverrideSource, I as ProfilePresentation, J as ProfileVolunteering, K as ProjectMemberCard, M as ProjectRole, N as PublicationContributor, Q as RecognizedEntity, S as SkillRef, T as SkillSuggestion, U as TrustStat, V as VerifiedAccount } from './index-D9GC0u__.js';
|
|
3
|
-
import { S as SearchFilters } from './types-
|
|
4
|
-
export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-
|
|
3
|
+
import { S as SearchFilters } from './types-jB67EFpw.js';
|
|
4
|
+
export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-jB67EFpw.js';
|
|
5
5
|
import { P as PresentationDuration, a as ProfilePresentationDeliveryRecord, b as ProfilePresentationRecord, O as OrgProfileRecord } from './profile-investment-BiHM7C5q.js';
|
|
6
6
|
export { A as ArtifactLink, c as ArtifactLinkSchema, d as AtmosphereFeedItem, e as AtmosphereFeedItemSchema, B as BlobRef, f as BlobRefSchema, E as EndorsementConfirmationRecord, g as EndorsementConfirmationRecordSchema, h as EndorsementRecord, i as EndorsementRecordSchema, F as FeedActor, j as FeedActorSchema, k as FeedCursor, l as FollowFeedItem, m as FollowFeedItemSchema, n as FollowFeedPage, o as FollowFeedPageSchema, G as GraphFollowRecord, p as GraphFollowRecordSchema, I as InvestmentAmountSchema, q as OrgEmploymentAttestationRecord, r as OrgEmploymentAttestationRecordSchema, s as OrgProfileRecordSchema, t as PROFILE_INVESTMENT_NSID, u as PROFILE_INVOLVEMENT_NSID, v as PresentationDurationSchema, w as PresentationLink, x as PresentationLinkSchema, y as ProfileCertificationRecord, z as ProfileCertificationRecordSchema, C as ProfileCourseRecord, D as ProfileCourseRecordSchema, H as ProfileEducationRecord, J as ProfileEducationRecordSchema, K as ProfileExternalAccountRecord, L as ProfileExternalAccountRecordSchema, M as ProfileHonorRecord, N as ProfileHonorRecordSchema, Q as ProfileInvestmentRecordSchema, R as ProfileInvolvementRecord, S as ProfileInvolvementRecordSchema, T as ProfileLanguageRecord, U as ProfileLanguageRecordSchema, V as ProfilePositionRecord, W as ProfilePositionRecordSchema, X as ProfilePresentationDeliveryRecordSchema, Y as ProfilePresentationRecordSchema, Z as ProfileProjectRecord, _ as ProfileProjectRecordSchema, $ as ProfilePublicationRecord, a0 as ProfilePublicationRecordSchema, a1 as ProfileSelfRecord, a2 as ProfileSelfRecordSchema, a3 as ProfileSkillRecord, a4 as ProfileSkillRecordSchema, a5 as ProfileVolunteeringRecord, a6 as ProfileVolunteeringRecordSchema, a7 as PublicationAuthor, a8 as PublicationAuthorSchema, a9 as RelatedIdentifierSchema, aa as SifaFeedItem, ab as SifaFeedItemSchema, ac as decodeFeedCursor, ad as encodeFeedCursor, ae as makeGraphFollowRecordSchema } from './profile-investment-BiHM7C5q.js';
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
-
export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-
|
|
8
|
+
export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-Bj7ufSDK.js';
|
|
9
9
|
import { E as EntitySearchResult } from './follow-profile-D1l6pulB.js';
|
|
10
10
|
export { a as EntityImportSearchResponse, b as EntityImportSearchResponseSchema, c as EntityMintDomainResponse, d as EntityMintDomainResponseSchema, e as EntityResolveDomainRequest, f as EntityResolveDomainRequestSchema, g as EntityResolveDomainResponse, h as EntityResolveDomainResponseSchema, i as EntitySearchResponse, j as EntitySearchResponseSchema, k as EntitySearchResultSchema, l as EntitySelectRequest, m as EntitySelectRequestSchema, n as EntitySelectResponse, o as EntitySelectResponseSchema, F as FEATURE_FLAGS, p as FeatureAllowlistEntry, q as FeatureAllowlistEntrySchema, r as FeatureFlag, s as FollowProfileItem, t as FollowProfilePage, u as FollowProfilePageSchema, v as FollowProfileSchema } from './follow-profile-D1l6pulB.js';
|
|
11
11
|
import { A as AgentRef } from './shared-v0vl5hov.js';
|
package/dist/index.js
CHANGED
|
@@ -350,7 +350,7 @@ import {
|
|
|
350
350
|
roadmapIssueUrl
|
|
351
351
|
} from "./roadmap/index.js";
|
|
352
352
|
import { SIFA_REPO_GROUPS, describeSifaRecord, repoGroupForCollection } from "./repo/index.js";
|
|
353
|
-
var SIFA_SDK_VERSION = "0.19.
|
|
353
|
+
var SIFA_SDK_VERSION = "0.19.55";
|
|
354
354
|
export {
|
|
355
355
|
ACTIVITY_TIERS,
|
|
356
356
|
ACTIVITY_VERBS,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as Profile, d as ProfilePosition, S as SkillRef, w as PresentationLinkView } from './index-DmlIG8sJ.cjs';
|
|
2
|
-
import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-
|
|
3
|
-
import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-
|
|
2
|
+
import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-DHT7jcZc.cjs';
|
|
3
|
+
import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-5T1hDw6Q.cjs';
|
|
4
4
|
import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, l as EntitySelectRequest, n as EntitySelectResponse } from './follow-profile-D1l6pulB.cjs';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as Profile, d as ProfilePosition, S as SkillRef, w as PresentationLinkView } from './index-D9GC0u__.js';
|
|
2
|
-
import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-
|
|
3
|
-
import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-
|
|
2
|
+
import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-jB67EFpw.js';
|
|
3
|
+
import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-Bj7ufSDK.js';
|
|
4
4
|
import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, l as EntitySelectRequest, n as EntitySelectResponse } from './follow-profile-D1l6pulB.js';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as WriteResult, K as SifaApiConfig, M as ApiFetchOptions, N as CreateResult, b as ActivityLabel, t as RepoDeleteResult, w as RepoInventory } from './types-
|
|
1
|
+
import { W as WriteResult, K as SifaApiConfig, M as ApiFetchOptions, N as CreateResult, b as ActivityLabel, t as RepoDeleteResult, w as RepoInventory } from './types-DHT7jcZc.cjs';
|
|
2
2
|
import { p as ExternalAccount } from './index-DmlIG8sJ.cjs';
|
|
3
3
|
import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-D1l6pulB.cjs';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -56,10 +56,10 @@ interface UpdateProfileOverrideInput {
|
|
|
56
56
|
*/
|
|
57
57
|
declare function updateProfileOverride(config: SifaApiConfig, data: UpdateProfileOverrideInput, options?: ApiFetchOptions): Promise<WriteResult>;
|
|
58
58
|
/** Extended result for {@link refreshPds}. */
|
|
59
|
-
|
|
59
|
+
type RefreshPdsResult = WriteResult<{
|
|
60
60
|
displayName?: string | null;
|
|
61
61
|
avatar?: string | null;
|
|
62
|
-
}
|
|
62
|
+
}>;
|
|
63
63
|
/**
|
|
64
64
|
* Re-pull the authenticated user's `app.bsky.actor.profile` from their
|
|
65
65
|
* PDS. Returns the freshly resolved `displayName` and `avatar` on
|
|
@@ -67,10 +67,10 @@ interface RefreshPdsResult extends WriteResult {
|
|
|
67
67
|
*/
|
|
68
68
|
declare function refreshPds(config: SifaApiConfig, options?: ApiFetchOptions): Promise<RefreshPdsResult>;
|
|
69
69
|
/** Extended result for {@link uploadAvatar}. */
|
|
70
|
-
|
|
70
|
+
type UploadAvatarResult = WriteResult<{
|
|
71
71
|
/** Publicly accessible URL of the newly uploaded avatar. */
|
|
72
72
|
url?: string;
|
|
73
|
-
}
|
|
73
|
+
}>;
|
|
74
74
|
/**
|
|
75
75
|
* Upload a new avatar via `multipart/form-data`. Pass either a `File`
|
|
76
76
|
* (browser) or any `Blob` (Expo, node). The SDK leaves `Content-Type`
|
|
@@ -82,10 +82,10 @@ declare function uploadAvatar(config: SifaApiConfig, file: Blob, options?: ApiFe
|
|
|
82
82
|
/** Delete the authenticated user's avatar override (revert to PDS avatar). */
|
|
83
83
|
declare function deleteAvatarOverride(config: SifaApiConfig, options?: ApiFetchOptions): Promise<WriteResult>;
|
|
84
84
|
/** Extended result for {@link uploadNamePronunciationAudio}. */
|
|
85
|
-
|
|
85
|
+
type UploadPronunciationAudioResult = WriteResult<{
|
|
86
86
|
/** Publicly accessible URL of the newly uploaded audio clip. */
|
|
87
87
|
url?: string;
|
|
88
|
-
}
|
|
88
|
+
}>;
|
|
89
89
|
/**
|
|
90
90
|
* Upload a name-pronunciation audio clip via `multipart/form-data`. Pass a
|
|
91
91
|
* `File` (browser) or any `Blob` (Expo, node). The SDK leaves `Content-Type`
|
|
@@ -137,7 +137,7 @@ interface SubCategoryBulkResult {
|
|
|
137
137
|
* per-IP rate limit on any sizeable profile (#324). An empty `subCategory`
|
|
138
138
|
* clears the field.
|
|
139
139
|
*/
|
|
140
|
-
declare function updateSkillSubCategories(config: SifaApiConfig, rkeys: string[], subCategory: string, options?: ApiFetchOptions): Promise<WriteResult
|
|
140
|
+
declare function updateSkillSubCategories(config: SifaApiConfig, rkeys: string[], subCategory: string, options?: ApiFetchOptions): Promise<WriteResult<SubCategoryBulkResult>>;
|
|
141
141
|
/** Delete a skill record by `rkey`. */
|
|
142
142
|
declare function deleteSkill(config: SifaApiConfig, rkey: string, options?: ApiFetchOptions): Promise<WriteResult>;
|
|
143
143
|
|
|
@@ -182,15 +182,15 @@ interface ExternalAccountInput {
|
|
|
182
182
|
feedUrl?: string;
|
|
183
183
|
}
|
|
184
184
|
/** Extended create result for {@link createExternalAccount}. */
|
|
185
|
-
|
|
185
|
+
type CreateExternalAccountResult = WriteResult<{
|
|
186
186
|
rkey?: string;
|
|
187
187
|
feedUrl?: string | null;
|
|
188
|
-
}
|
|
188
|
+
}>;
|
|
189
189
|
/** Extended write result for {@link verifyExternalAccount}. */
|
|
190
|
-
|
|
190
|
+
type VerifyExternalAccountResult = WriteResult<{
|
|
191
191
|
verified?: boolean;
|
|
192
192
|
verifiedVia?: string;
|
|
193
|
-
}
|
|
193
|
+
}>;
|
|
194
194
|
/** List external accounts attached to a profile. Returns `[]` on error. */
|
|
195
195
|
declare function fetchExternalAccounts(config: SifaApiConfig, handleOrDid: string, options?: ApiFetchOptions): Promise<ExternalAccount[]>;
|
|
196
196
|
/**
|
|
@@ -516,10 +516,10 @@ interface FetchProfileCompletenessOptions extends ApiFetchOptions {
|
|
|
516
516
|
declare function fetchProfileCompleteness(config: SifaApiConfig, options?: FetchProfileCompletenessOptions): Promise<ProfileCompleteness>;
|
|
517
517
|
|
|
518
518
|
/** Extended result for {@link refreshOrcidPublications}. */
|
|
519
|
-
|
|
519
|
+
type RefreshOrcidPublicationsResult = WriteResult<{
|
|
520
520
|
added?: number;
|
|
521
521
|
removed?: number;
|
|
522
|
-
}
|
|
522
|
+
}>;
|
|
523
523
|
/**
|
|
524
524
|
* Hide an ORCID-imported publication from the user's profile. The
|
|
525
525
|
* `putCode` is the ORCID-side identifier; the underlying record stays
|
|
@@ -1001,11 +1001,11 @@ declare function fetchFollowing(config: SifaApiConfig, opts?: {
|
|
|
1001
1001
|
* handle surface as `success: false` with the server-provided message;
|
|
1002
1002
|
* dup-follow is idempotent (sifa-api E7) and resolves as `success: true`.
|
|
1003
1003
|
*/
|
|
1004
|
-
|
|
1004
|
+
type FollowUserResult = WriteResult<{
|
|
1005
1005
|
rkey?: string;
|
|
1006
1006
|
/** DID of the followed subject (server-resolved from the handle). */
|
|
1007
1007
|
subjectDid?: string;
|
|
1008
|
-
}
|
|
1008
|
+
}>;
|
|
1009
1009
|
/**
|
|
1010
1010
|
* Create an `id.sifa.graph.follow` record on the caller's PDS via the
|
|
1011
1011
|
* AppView. Idempotent on duplicate (server catches the unique-violation
|
|
@@ -1442,17 +1442,17 @@ interface WipePreview {
|
|
|
1442
1442
|
*/
|
|
1443
1443
|
declare function fetchWipePreview(config: SifaApiConfig, options?: ApiFetchOptions): Promise<WipePreview>;
|
|
1444
1444
|
/** Extended write result for {@link resetProfile}. */
|
|
1445
|
-
|
|
1445
|
+
type ResetProfileResult = WriteResult<{
|
|
1446
1446
|
/** Present when `deletePdsData: true`. See {@link PdsWipeOutcome}. */
|
|
1447
1447
|
pds?: PdsWipeOutcome;
|
|
1448
|
-
}
|
|
1448
|
+
}>;
|
|
1449
1449
|
/** Extended write result for {@link deleteAccount}. */
|
|
1450
|
-
|
|
1450
|
+
type DeleteAccountResult = WriteResult<{
|
|
1451
1451
|
/** The deleted handle, returned by the server for confirmation UIs. */
|
|
1452
1452
|
handle?: string;
|
|
1453
1453
|
/** Present when `deletePdsData: true`. See {@link PdsWipeOutcome}. */
|
|
1454
1454
|
pds?: PdsWipeOutcome;
|
|
1455
|
-
}
|
|
1455
|
+
}>;
|
|
1456
1456
|
/**
|
|
1457
1457
|
* Reset the authenticated user's Sifa profile.
|
|
1458
1458
|
*
|
|
@@ -1698,7 +1698,12 @@ interface OrgDomainVerifyResult {
|
|
|
1698
1698
|
/** Response body of `POST /api/org/notification-emails`. */
|
|
1699
1699
|
interface OrgNotificationEmailAddResult {
|
|
1700
1700
|
ok: boolean;
|
|
1701
|
-
|
|
1701
|
+
/**
|
|
1702
|
+
* Outcome of the verification email: `verification_sent` (accepted by the
|
|
1703
|
+
* mail provider), `sends_paused` (sending is off, nothing went out) or
|
|
1704
|
+
* `send_failed` (rejected or unreachable).
|
|
1705
|
+
*/
|
|
1706
|
+
status: 'verification_sent' | 'sends_paused' | 'send_failed';
|
|
1702
1707
|
}
|
|
1703
1708
|
/** Response body of `DELETE /api/org/notification-emails`. */
|
|
1704
1709
|
interface OrgNotificationEmailRemoveResult {
|
|
@@ -1711,35 +1716,35 @@ interface OrgNotificationEmailRemoveResult {
|
|
|
1711
1716
|
* structured {@link OrgClaimResult} folded into a {@link WriteResult} on success,
|
|
1712
1717
|
* or `{ success: false, error, pdsHost? }` on failure.
|
|
1713
1718
|
*/
|
|
1714
|
-
declare function submitOrgClaim(config: SifaApiConfig, body: OrgClaimRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult
|
|
1719
|
+
declare function submitOrgClaim(config: SifaApiConfig, body: OrgClaimRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgClaimResult>>>;
|
|
1715
1720
|
/**
|
|
1716
1721
|
* Edit the org record (`PUT /api/org/profile`). Fresh-from-body server-side PUT
|
|
1717
1722
|
* (a cleared optional field is dropped, no spread-merge). Never throws.
|
|
1718
1723
|
*/
|
|
1719
|
-
declare function updateOrgProfile(config: SifaApiConfig, body: OrgProfileUpdateRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult
|
|
1724
|
+
declare function updateOrgProfile(config: SifaApiConfig, body: OrgProfileUpdateRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgProfileUpdateResult>>>;
|
|
1720
1725
|
/**
|
|
1721
1726
|
* Issue a one-time DNS TXT domain challenge (`POST /api/org/domains/challenge`).
|
|
1722
1727
|
* Returns the TXT record name + value the org must publish. Never throws.
|
|
1723
1728
|
*/
|
|
1724
|
-
declare function requestOrgDomainChallenge(config: SifaApiConfig, body: OrgDomainChallengeRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult
|
|
1729
|
+
declare function requestOrgDomainChallenge(config: SifaApiConfig, body: OrgDomainChallengeRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgDomainChallengeResult>>>;
|
|
1725
1730
|
/**
|
|
1726
1731
|
* Verify a DNS TXT domain challenge (`POST /api/org/domains/verify`). On success
|
|
1727
1732
|
* `status` is `verified` or `pending`. Expired / confusable / not-found map to
|
|
1728
1733
|
* non-2xx server responses and surface as `{ success: false, error }`. Never
|
|
1729
1734
|
* throws.
|
|
1730
1735
|
*/
|
|
1731
|
-
declare function verifyOrgDomain(config: SifaApiConfig, body: OrgDomainVerifyRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult
|
|
1736
|
+
declare function verifyOrgDomain(config: SifaApiConfig, body: OrgDomainVerifyRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgDomainVerifyResult>>>;
|
|
1732
1737
|
/**
|
|
1733
1738
|
* Add an org notification email (`POST /api/org/notification-emails`). The
|
|
1734
1739
|
* address must use a domain the org controls (checked server-side). An
|
|
1735
1740
|
* individual verification email is enqueued through the (dormant) sending
|
|
1736
1741
|
* pipeline. Never throws.
|
|
1737
1742
|
*/
|
|
1738
|
-
declare function addOrgNotificationEmail(config: SifaApiConfig, body: OrgNotificationEmailRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult
|
|
1743
|
+
declare function addOrgNotificationEmail(config: SifaApiConfig, body: OrgNotificationEmailRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgNotificationEmailAddResult>>>;
|
|
1739
1744
|
/**
|
|
1740
1745
|
* Remove an org notification email (`DELETE /api/org/notification-emails`).
|
|
1741
1746
|
* Never throws.
|
|
1742
1747
|
*/
|
|
1743
|
-
declare function removeOrgNotificationEmail(config: SifaApiConfig, body: OrgNotificationEmailRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult
|
|
1748
|
+
declare function removeOrgNotificationEmail(config: SifaApiConfig, body: OrgNotificationEmailRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgNotificationEmailRemoveResult>>>;
|
|
1744
1749
|
|
|
1745
1750
|
export { type HeatmapDay as $, type AccountCheckResult as A, type BulkHideProfileItemInput as B, type ConfirmEndorsementInput as C, type DeleteAccountResult as D, type EndorsementInput as E, type FeatureAllowlistResponse as F, type FetchInboxCountsOptions as G, type FetchMyGithubPullRequestsOptions as H, type FetchMyRoadmapVotesOptions as I, type FetchProfileCompletenessOptions as J, type FetchReactionStatusOptions as K, type FetchSuggestionsOptions as L, type FetchUnlinkedPositionsOptions as M, type FollowListPage as N, type FollowProfile as O, type FollowProfilePageResponse as P, type FollowUserResult as Q, type FollowingFeedApp as R, type FollowingFeedEmptyReason as S, type FollowingFeedResponse as T, type FollowingFeedVersion as U, type FollowingResponse as V, type GetAdminReviewQueuesOptions as W, type GithubPullRequest as X, type GivenConfirmation as Y, HIDDEN_ITEM_SOURCES as Z, HIDDEN_ITEM_TYPES as _, type ConfirmEndorsementResult as a, bulkHideProfileItems as a$, type HeatmapResponse as a0, type HiddenActivityItem as a1, type HiddenApp as a2, type HiddenItemSource as a3, type HiddenItemType as a4, type HideActivityItemInput as a5, type HideProfileItemInput as a6, type InboxCounts as a7, type ListFeatureAllowlistOptions as a8, type MyGithubPullRequestsResponse as a9, type ReactionStatus as aA, type RefreshOrcidPublicationsResult as aB, type RefreshPdsResult as aC, type RepoDeleteInput as aD, type ResetProfileResult as aE, type ResolveQuotedPostsOptions as aF, type RoadmapVoteError as aG, type RoadmapVoteResult as aH, type RoadmapVoter as aI, type RoadmapVotesResponse as aJ, type SifaQueryKey as aK, type SimilarProfile as aL, type StatsResponse as aM, type SubCategoryBulkResult as aN, type SuggestionProfile as aO, type SuggestionsResponse as aP, type UnhideActivityItemInput as aQ, type UnlinkedPosition as aR, type UnlinkedPositionsResult as aS, type UpdateProfileOverrideInput as aT, type UpdateProfileSelfInput as aU, type UploadAvatarResult as aV, type UploadPronunciationAudioResult as aW, type VerifyExternalAccountResult as aX, type WipePreview as aY, addFeatureAllowlist as aZ, addOrgNotificationEmail as a_, type OrgClaimBinding as aa, type OrgClaimResult as ab, type OrgDomainChallengeResult as ac, type OrgDomainVerifyResult as ad, type OrgNotificationEmailAddResult as ae, type OrgNotificationEmailRemoveResult as af, type OrgProfileEcho as ag, type OrgProfileUpdateResult as ah, PROFILE_COMPLETENESS_SIGNALS as ai, type PdsWipeOutcome as aj, type PendingConfirmation as ak, type PendingConfirmationsPage as al, type PrimarySection as am, type ProfileCompleteness as an, type ProfileCompletenessSignal as ao, type ProfileIndustryInput as ap, type ProfileLocationAddress as aq, type ProfileLocationInput as ar, type ProfileSelfLocation as as, QUOTED_POSTS_BATCH_MAX as at, type QuotedPostAuthor as au, type QuotedPostImage as av, type QuotedPostResult as aw, type QuotedPostView as ax, type ReactionError as ay, type ReactionResult as az, type AccountSummary as b, refreshPds as b$, bulkHideStandardPublications as b0, bulkUnhideProfileItems as b1, bulkUnhideStandardPublications as b2, castRoadmapVote as b3, checkAppAccount as b4, confirmEndorsement as b5, createConfirmation as b6, createEndorsement as b7, createExternalAccount as b8, createProfileLocation as b9, fetchMyGithubPullRequests as bA, fetchMyRoadmapVotes as bB, fetchPendingConfirmations as bC, fetchProfileCompleteness as bD, fetchReactionStatus as bE, fetchRepoInventory as bF, fetchRoadmapVotes as bG, fetchSimilarProfiles as bH, fetchStats as bI, fetchSuggestionCount as bJ, fetchSuggestions as bK, fetchUnlinkedPositions as bL, fetchWipePreview as bM, followUser as bN, getAdminReviewQueues as bO, getBlueskySuggestions as bP, getFollowers as bQ, getFollowing as bR, getMutuals as bS, hideActivityItem as bT, hideOrcidPublication as bU, hideProfileItem as bV, hideSifaPublication as bW, hideStandardPublication as bX, isNewerFollowingFeed as bY, listFeatureAllowlist as bZ, refreshOrcidPublications as b_, createReaction as ba, createSkill as bb, deleteAccount as bc, deleteAvatarOverride as bd, deleteExternalAccount as be, deleteNamePronunciationAudio as bf, deleteProfileLocation as bg, deleteReaction as bh, deleteRepoRecords as bi, deleteSkill as bj, dismissConfirmation as bk, dismissUnlinkedPosition as bl, fetchAccounts as bm, fetchActivityFeed as bn, fetchActivityTeaser as bo, fetchAppsRegistry as bp, fetchExternalAccounts as bq, fetchFeaturedProfile as br, fetchFollowing as bs, fetchFollowingFeed as bt, fetchFollowingFeedVersion as bu, fetchGivenConfirmations as bv, fetchHeatmapData as bw, fetchHiddenActivityItems as bx, fetchHiddenApps as by, fetchInboxCounts as bz, type ActivityFeedResponse as c, removeFeatureAllowlist as c0, removeOrgNotificationEmail as c1, repoExportUrl as c2, requestOrgDomainChallenge as c3, resetProfile as c4, resolveQuotedPosts as c5, retractRoadmapVote as c6, revokeConfirmation as c7, setExternalAccountPrimary as c8, setSectionPrimary as c9, submitOrgClaim as ca, switchAccount as cb, unfollowUser as cc, unhideActivityItem as cd, unhideOrcidPublication as ce, unhideProfileItem as cf, unhideSifaPublication as cg, unhideStandardPublication as ch, unsetExternalAccountPrimary as ci, unsetSectionPrimary as cj, updateExternalAccount as ck, updateOrgProfile as cl, updateProfileLocation as cm, updateProfileOverride as cn, updateProfileSelf as co, updateSkill as cp, updateSkillSubCategories as cq, uploadAvatar as cr, uploadNamePronunciationAudio as cs, verifyExternalAccount as ct, verifyOrgDomain as cu, type ActivityItem as d, type ActivityItemLinkHealth as e, type ActivityTeaserResponse as f, type AdminReviewQueues as g, type AppRegistryEntry as h, type CastRoadmapVoteResult as i, type CheckAppAccountOptions as j, type ConfirmationInput as k, type ConfirmationSubjectInput as l, type CreateExternalAccountResult as m, type DismissUnlinkedPositionInput as n, type ExternalAccountInput as o, type FeaturedProfile as p, type FetchAccountsOptions as q, type FetchActivityFeedOptions as r, sifaQueryKeys as s, type FetchActivityTeaserOptions as t, type FetchConfirmationsOptions as u, type FetchFollowListOptions as v, type FetchFollowProfilePageOptions as w, type FetchFollowingFeedOptions as x, type FetchHiddenActivityItemsOptions as y, type FetchHiddenAppsOptions as z };
|