@singi-labs/sifa-sdk 0.19.44 → 0.19.46
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/atproto/index.js +9 -3
- package/dist/atproto/index.js.map +1 -1
- package/dist/badge/index.cjs.map +1 -1
- package/dist/badge/index.js +5 -141
- package/dist/badge/index.js.map +1 -1
- package/dist/cards/adult-content.js +14 -0
- package/dist/cards/adult-content.js.map +1 -0
- package/dist/cards/app-url-patterns.js +369 -0
- package/dist/cards/app-url-patterns.js.map +1 -0
- package/dist/cards/index.js +24 -0
- package/dist/cards/index.js.map +1 -0
- package/dist/cards/resolve-card-url.js +198 -0
- package/dist/cards/resolve-card-url.js.map +1 -0
- package/dist/cards/visibility.js +45 -0
- package/dist/cards/visibility.js.map +1 -0
- package/dist/flags/index.js +4 -3
- package/dist/flags/index.js.map +1 -1
- package/dist/format/collapse-contributors.js +19 -0
- package/dist/format/collapse-contributors.js.map +1 -0
- package/dist/format/company-name.js +61 -0
- package/dist/format/company-name.js.map +1 -0
- package/dist/format/compare-text.js +9 -0
- package/dist/format/compare-text.js.map +1 -0
- package/dist/format/doi.js +8 -0
- package/dist/format/doi.js.map +1 -0
- package/dist/format/embed.js +131 -0
- package/dist/format/embed.js.map +1 -0
- package/dist/format/endorsement-context.js +35 -0
- package/dist/format/endorsement-context.js.map +1 -0
- package/dist/format/format-display-url.js +42 -0
- package/dist/format/format-display-url.js.map +1 -0
- package/dist/format/format-duration.js +13 -0
- package/dist/format/format-duration.js.map +1 -0
- package/dist/format/format-time.js +30 -0
- package/dist/format/format-time.js.map +1 -0
- package/dist/format/handle-utils.js +19 -0
- package/dist/format/handle-utils.js.map +1 -0
- package/dist/format/index.js +106 -0
- package/dist/format/index.js.map +1 -0
- package/dist/format/location-segments.js +29 -0
- package/dist/format/location-segments.js.map +1 -0
- package/dist/format/location-utils.js +42 -0
- package/dist/format/location-utils.js.map +1 -0
- package/dist/format/meta-description.js +35 -0
- package/dist/format/meta-description.js.map +1 -0
- package/dist/format/normalize-company-key.js +12 -0
- package/dist/format/normalize-company-key.js.map +1 -0
- package/dist/format/normalize-legal-form.js +71 -0
- package/dist/format/normalize-legal-form.js.map +1 -0
- package/dist/format/pds-utils.js +73 -0
- package/dist/format/pds-utils.js.map +1 -0
- package/dist/format/sort-by-date.js +39 -0
- package/dist/format/sort-by-date.js.map +1 -0
- package/dist/format/summarize-deliveries.js +37 -0
- package/dist/format/summarize-deliveries.js.map +1 -0
- package/dist/format/talk-slug.js +21 -0
- package/dist/format/talk-slug.js.map +1 -0
- package/dist/format/text-sanitize.js +29 -0
- package/dist/format/text-sanitize.js.map +1 -0
- package/dist/format/text-truncate.js +14 -0
- package/dist/format/text-truncate.js.map +1 -0
- package/dist/format/time-utils.js +19 -0
- package/dist/format/time-utils.js.map +1 -0
- package/dist/format/timeline.js +33 -0
- package/dist/format/timeline.js.map +1 -0
- package/dist/format/wcag-contrast.js +34 -0
- package/dist/format/wcag-contrast.js.map +1 -0
- package/dist/import/index.js +22 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/presentation-csv.js +116 -0
- package/dist/import/presentation-csv.js.map +1 -0
- package/dist/index.cjs +7 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +677 -7086
- package/dist/index.js.map +1 -1
- package/dist/jev/index.js +18 -5
- package/dist/jev/index.js.map +1 -1
- package/dist/jsonld/index.cjs.map +1 -1
- package/dist/jsonld/index.js +30 -987
- package/dist/jsonld/index.js.map +1 -1
- package/dist/jsonld/profile.js +222 -0
- package/dist/jsonld/profile.js.map +1 -0
- package/dist/jsonld/terms.js +496 -0
- package/dist/jsonld/terms.js.map +1 -0
- package/dist/jsonld/url.js +17 -0
- package/dist/jsonld/url.js.map +1 -0
- package/dist/jsonld/works-graph.js +41 -0
- package/dist/jsonld/works-graph.js.map +1 -0
- package/dist/jsonld/works.js +178 -0
- package/dist/jsonld/works.js.map +1 -0
- package/dist/logic/actor-identity.js +8 -0
- package/dist/logic/actor-identity.js.map +1 -0
- package/dist/logic/agent-ref.js +24 -0
- package/dist/logic/agent-ref.js.map +1 -0
- package/dist/logic/company-page-indexable.js +23 -0
- package/dist/logic/company-page-indexable.js.map +1 -0
- package/dist/logic/date-lookahead.js +33 -0
- package/dist/logic/date-lookahead.js.map +1 -0
- package/dist/logic/domain-detect.js +43 -0
- package/dist/logic/domain-detect.js.map +1 -0
- package/dist/logic/entity-disambiguation.js +24 -0
- package/dist/logic/entity-disambiguation.js.map +1 -0
- package/dist/logic/entity-ref-anchor.js +33 -0
- package/dist/logic/entity-ref-anchor.js.map +1 -0
- package/dist/logic/index.js +91 -0
- package/dist/logic/index.js.map +1 -0
- package/dist/logic/org-floor.js +66 -0
- package/dist/logic/org-floor.js.map +1 -0
- package/dist/logic/primary-item.js +9 -0
- package/dist/logic/primary-item.js.map +1 -0
- package/dist/logic/primary-position.js +16 -0
- package/dist/logic/primary-position.js.map +1 -0
- package/dist/logic/profile-completeness.js +21 -0
- package/dist/logic/profile-completeness.js.map +1 -0
- package/dist/logic/profile-dimensions.js +50 -0
- package/dist/logic/profile-dimensions.js.map +1 -0
- package/dist/logic/profile-summary.js +23 -0
- package/dist/logic/profile-summary.js.map +1 -0
- package/dist/logic/pseudo-employer.js +34 -0
- package/dist/logic/pseudo-employer.js.map +1 -0
- package/dist/logic/recent-activity.js +10 -0
- package/dist/logic/recent-activity.js.map +1 -0
- package/dist/logic/self-app.js +10 -0
- package/dist/logic/self-app.js.map +1 -0
- package/dist/{org-BCrvebcf.d.ts → org-CxTEjjrm.d.ts} +1 -1
- package/dist/{org-settings-C73Sin5E.d.ts → org-settings-BShvhyFp.d.ts} +1 -1
- package/dist/profile/headline-role-dedupe.js +12 -0
- package/dist/profile/headline-role-dedupe.js.map +1 -0
- package/dist/profile/highlights.js +200 -0
- package/dist/profile/highlights.js.map +1 -0
- package/dist/profile/index.js +66 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/involvement-grouping.js +31 -0
- package/dist/profile/involvement-grouping.js.map +1 -0
- package/dist/profile/language-sort.js +24 -0
- package/dist/profile/language-sort.js.map +1 -0
- package/dist/profile/publication-versions.js +98 -0
- package/dist/profile/publication-versions.js.map +1 -0
- package/dist/profile/range-sort.js +14 -0
- package/dist/profile/range-sort.js.map +1 -0
- package/dist/profile/section-model.js +122 -0
- package/dist/profile/section-model.js.map +1 -0
- package/dist/profile/section-sorts.js +33 -0
- package/dist/profile/section-sorts.js.map +1 -0
- package/dist/publishers/index.js +16 -0
- package/dist/publishers/index.js.map +1 -0
- package/dist/publishers/registry.js +87 -0
- package/dist/publishers/registry.js.map +1 -0
- package/dist/publishing/index.js +46 -184
- package/dist/publishing/index.js.map +1 -1
- package/dist/publishing/linkblog.js +42 -0
- package/dist/publishing/linkblog.js.map +1 -0
- package/dist/publishing/registry.js +32 -0
- package/dist/publishing/registry.js.map +1 -0
- package/dist/publishing/schemas.js +74 -0
- package/dist/publishing/schemas.js.map +1 -0
- package/dist/publishing/types.js +32 -0
- package/dist/publishing/types.js.map +1 -0
- package/dist/query/client.js +119 -0
- package/dist/query/client.js.map +1 -0
- package/dist/query/config.js +23 -0
- package/dist/query/config.js.map +1 -0
- package/dist/query/fetchers/accounts.js +29 -0
- package/dist/query/fetchers/accounts.js.map +1 -0
- package/dist/query/fetchers/activity-items-hide.js +31 -0
- package/dist/query/fetchers/activity-items-hide.js.map +1 -0
- package/dist/query/fetchers/activity.js +61 -0
- package/dist/query/fetchers/activity.js.map +1 -0
- package/dist/query/fetchers/actor.js +30 -0
- package/dist/query/fetchers/actor.js.map +1 -0
- package/dist/query/fetchers/admin-feature-allowlists.js +41 -0
- package/dist/query/fetchers/admin-feature-allowlists.js.map +1 -0
- package/dist/query/fetchers/admin-review-queues.js +30 -0
- package/dist/query/fetchers/admin-review-queues.js.map +1 -0
- package/dist/query/fetchers/apps.js +31 -0
- package/dist/query/fetchers/apps.js.map +1 -0
- package/dist/query/fetchers/bsky-preferences.js +55 -0
- package/dist/query/fetchers/bsky-preferences.js.map +1 -0
- package/dist/query/fetchers/confirmations.js +55 -0
- package/dist/query/fetchers/confirmations.js.map +1 -0
- package/dist/query/fetchers/destructive.js +34 -0
- package/dist/query/fetchers/destructive.js.map +1 -0
- package/dist/query/fetchers/discovery.js +67 -0
- package/dist/query/fetchers/discovery.js.map +1 -0
- package/dist/query/fetchers/education.js +23 -0
- package/dist/query/fetchers/education.js.map +1 -0
- package/dist/query/fetchers/endorsement-inbox.js +36 -0
- package/dist/query/fetchers/endorsement-inbox.js.map +1 -0
- package/dist/query/fetchers/endorsement.js +23 -0
- package/dist/query/fetchers/endorsement.js.map +1 -0
- package/dist/query/fetchers/endorsements.js +20 -0
- package/dist/query/fetchers/endorsements.js.map +1 -0
- package/dist/query/fetchers/entities.js +65 -0
- package/dist/query/fetchers/entities.js.map +1 -0
- package/dist/query/fetchers/external-accounts.js +74 -0
- package/dist/query/fetchers/external-accounts.js.map +1 -0
- package/dist/query/fetchers/follow-extras.js +38 -0
- package/dist/query/fetchers/follow-extras.js.map +1 -0
- package/dist/query/fetchers/follow.js +105 -0
- package/dist/query/fetchers/follow.js.map +1 -0
- package/dist/query/fetchers/get-profile-view.js +21 -0
- package/dist/query/fetchers/get-profile-view.js.map +1 -0
- package/dist/query/fetchers/github-prs.js +45 -0
- package/dist/query/fetchers/github-prs.js.map +1 -0
- package/dist/query/fetchers/inbox.js +29 -0
- package/dist/query/fetchers/inbox.js.map +1 -0
- package/dist/query/fetchers/index.cjs.map +1 -1
- package/dist/query/fetchers/index.d.ts +2 -2
- package/dist/query/fetchers/index.js +360 -2045
- package/dist/query/fetchers/index.js.map +1 -1
- package/dist/query/fetchers/investments.js +18 -0
- package/dist/query/fetchers/investments.js.map +1 -0
- package/dist/query/fetchers/keytrace-claims.js +23 -0
- package/dist/query/fetchers/keytrace-claims.js.map +1 -0
- package/dist/query/fetchers/marque-domains.js +23 -0
- package/dist/query/fetchers/marque-domains.js.map +1 -0
- package/dist/query/fetchers/network-map.js +36 -0
- package/dist/query/fetchers/network-map.js.map +1 -0
- package/dist/query/fetchers/org.js +48 -0
- package/dist/query/fetchers/org.js.map +1 -0
- package/dist/query/fetchers/positions.js +77 -0
- package/dist/query/fetchers/positions.js.map +1 -0
- package/dist/query/fetchers/profile-completeness.js +45 -0
- package/dist/query/fetchers/profile-completeness.js.map +1 -0
- package/dist/query/fetchers/profile-items-hide.js +36 -0
- package/dist/query/fetchers/profile-items-hide.js.map +1 -0
- package/dist/query/fetchers/profile-locations.js +23 -0
- package/dist/query/fetchers/profile-locations.js.map +1 -0
- package/dist/query/fetchers/profile-mutations.js +82 -0
- package/dist/query/fetchers/profile-mutations.js.map +1 -0
- package/dist/query/fetchers/profile-summary.js +14 -0
- package/dist/query/fetchers/profile-summary.js.map +1 -0
- package/dist/query/fetchers/profile.js +31 -0
- package/dist/query/fetchers/profile.js.map +1 -0
- package/dist/query/fetchers/publications.js +66 -0
- package/dist/query/fetchers/publications.js.map +1 -0
- package/dist/query/fetchers/quoted-posts.js +40 -0
- package/dist/query/fetchers/quoted-posts.js.map +1 -0
- package/dist/query/fetchers/reactions.js +85 -0
- package/dist/query/fetchers/reactions.js.map +1 -0
- package/dist/query/fetchers/received-endorsements.js +20 -0
- package/dist/query/fetchers/received-endorsements.js.map +1 -0
- package/dist/query/fetchers/reciprocity.js +23 -0
- package/dist/query/fetchers/reciprocity.js.map +1 -0
- package/dist/query/fetchers/records.js +27 -0
- package/dist/query/fetchers/records.js.map +1 -0
- package/dist/query/fetchers/repo-inventory.js +23 -0
- package/dist/query/fetchers/repo-inventory.js.map +1 -0
- package/dist/query/fetchers/roadmap.js +73 -0
- package/dist/query/fetchers/roadmap.js.map +1 -0
- package/dist/query/fetchers/rpg.js +36 -0
- package/dist/query/fetchers/rpg.js.map +1 -0
- package/dist/query/fetchers/search.js +78 -0
- package/dist/query/fetchers/search.js.map +1 -0
- package/dist/query/fetchers/section-primary.js +23 -0
- package/dist/query/fetchers/section-primary.js.map +1 -0
- package/dist/query/fetchers/skills.js +30 -0
- package/dist/query/fetchers/skills.js.map +1 -0
- package/dist/query/fetchers/speakers.js +42 -0
- package/dist/query/fetchers/speakers.js.map +1 -0
- package/dist/query/fetchers/stats.js +16 -0
- package/dist/query/fetchers/stats.js.map +1 -0
- package/dist/query/fetchers/stream.js +30 -0
- package/dist/query/fetchers/stream.js.map +1 -0
- package/dist/query/fetchers/unlinked-positions.js +30 -0
- package/dist/query/fetchers/unlinked-positions.js.map +1 -0
- package/dist/query/hooks/index.d.ts +3 -3
- package/dist/query/hooks/index.js +283 -3555
- package/dist/query/hooks/index.js.map +1 -1
- package/dist/query/hooks/use-accounts.js +19 -0
- package/dist/query/hooks/use-accounts.js.map +1 -0
- package/dist/query/hooks/use-activity-items-hide.js +52 -0
- package/dist/query/hooks/use-activity-items-hide.js.map +1 -0
- package/dist/query/hooks/use-activity.js +44 -0
- package/dist/query/hooks/use-activity.js.map +1 -0
- package/dist/query/hooks/use-admin-review-queues.js +21 -0
- package/dist/query/hooks/use-admin-review-queues.js.map +1 -0
- package/dist/query/hooks/use-apps.js +31 -0
- package/dist/query/hooks/use-apps.js.map +1 -0
- package/dist/query/hooks/use-bsky-content-prefs.js +45 -0
- package/dist/query/hooks/use-bsky-content-prefs.js.map +1 -0
- package/dist/query/hooks/use-confirmations.js +121 -0
- package/dist/query/hooks/use-confirmations.js.map +1 -0
- package/dist/query/hooks/use-create-position.js +28 -0
- package/dist/query/hooks/use-create-position.js.map +1 -0
- package/dist/query/hooks/use-destructive.js +63 -0
- package/dist/query/hooks/use-destructive.js.map +1 -0
- package/dist/query/hooks/use-discovery.js +53 -0
- package/dist/query/hooks/use-discovery.js.map +1 -0
- package/dist/query/hooks/use-education-mutations.js +67 -0
- package/dist/query/hooks/use-education-mutations.js.map +1 -0
- package/dist/query/hooks/use-endorsement-inbox.js +80 -0
- package/dist/query/hooks/use-endorsement-inbox.js.map +1 -0
- package/dist/query/hooks/use-endorsement-mutations.js +33 -0
- package/dist/query/hooks/use-endorsement-mutations.js.map +1 -0
- package/dist/query/hooks/use-endorsement.js +20 -0
- package/dist/query/hooks/use-endorsement.js.map +1 -0
- package/dist/query/hooks/use-entity-search.js +73 -0
- package/dist/query/hooks/use-entity-search.js.map +1 -0
- package/dist/query/hooks/use-external-accounts.js +143 -0
- package/dist/query/hooks/use-external-accounts.js.map +1 -0
- package/dist/query/hooks/use-feature-allowlist.js +104 -0
- package/dist/query/hooks/use-feature-allowlist.js.map +1 -0
- package/dist/query/hooks/use-follow-extras.js +38 -0
- package/dist/query/hooks/use-follow-extras.js.map +1 -0
- package/dist/query/hooks/use-follow.js +113 -0
- package/dist/query/hooks/use-follow.js.map +1 -0
- package/dist/query/hooks/use-get-profile-view.js +20 -0
- package/dist/query/hooks/use-get-profile-view.js.map +1 -0
- package/dist/query/hooks/use-github-prs.js +21 -0
- package/dist/query/hooks/use-github-prs.js.map +1 -0
- package/dist/query/hooks/use-inbox.js +19 -0
- package/dist/query/hooks/use-inbox.js.map +1 -0
- package/dist/query/hooks/use-investment-mutations.js +65 -0
- package/dist/query/hooks/use-investment-mutations.js.map +1 -0
- package/dist/query/hooks/use-keytrace-claims.js +50 -0
- package/dist/query/hooks/use-keytrace-claims.js.map +1 -0
- package/dist/query/hooks/use-location-mutations.js +71 -0
- package/dist/query/hooks/use-location-mutations.js.map +1 -0
- package/dist/query/hooks/use-marque-domains.js +50 -0
- package/dist/query/hooks/use-marque-domains.js.map +1 -0
- package/dist/query/hooks/use-org-claim.js +29 -0
- package/dist/query/hooks/use-org-claim.js.map +1 -0
- package/dist/query/hooks/use-org-domains.js +28 -0
- package/dist/query/hooks/use-org-domains.js.map +1 -0
- package/dist/query/hooks/use-org-notification-emails.js +28 -0
- package/dist/query/hooks/use-org-notification-emails.js.map +1 -0
- package/dist/query/hooks/use-org-profile-settings.js +29 -0
- package/dist/query/hooks/use-org-profile-settings.js.map +1 -0
- package/dist/query/hooks/use-org-profile.js +21 -0
- package/dist/query/hooks/use-org-profile.js.map +1 -0
- package/dist/query/hooks/use-position-mutations.js +128 -0
- package/dist/query/hooks/use-position-mutations.js.map +1 -0
- package/dist/query/hooks/use-profile-completeness.js +21 -0
- package/dist/query/hooks/use-profile-completeness.js.map +1 -0
- package/dist/query/hooks/use-profile-items-hide.js +53 -0
- package/dist/query/hooks/use-profile-items-hide.js.map +1 -0
- package/dist/query/hooks/use-profile-mutations.js +143 -0
- package/dist/query/hooks/use-profile-mutations.js.map +1 -0
- package/dist/query/hooks/use-profile.js +30 -0
- package/dist/query/hooks/use-profile.js.map +1 -0
- package/dist/query/hooks/use-publication-mutations.js +90 -0
- package/dist/query/hooks/use-publication-mutations.js.map +1 -0
- package/dist/query/hooks/use-reaction-mutations.js +48 -0
- package/dist/query/hooks/use-reaction-mutations.js.map +1 -0
- package/dist/query/hooks/use-reactions.js +32 -0
- package/dist/query/hooks/use-reactions.js.map +1 -0
- package/dist/query/hooks/use-received-endorsements.js +23 -0
- package/dist/query/hooks/use-received-endorsements.js.map +1 -0
- package/dist/query/hooks/use-reciprocity.js +19 -0
- package/dist/query/hooks/use-reciprocity.js.map +1 -0
- package/dist/query/hooks/use-record-mutations.js +67 -0
- package/dist/query/hooks/use-record-mutations.js.map +1 -0
- package/dist/query/hooks/use-repo-inventory.js +43 -0
- package/dist/query/hooks/use-repo-inventory.js.map +1 -0
- package/dist/query/hooks/use-roadmap-mutations.js +51 -0
- package/dist/query/hooks/use-roadmap-mutations.js.map +1 -0
- package/dist/query/hooks/use-roadmap.js +31 -0
- package/dist/query/hooks/use-roadmap.js.map +1 -0
- package/dist/query/hooks/use-search.js +63 -0
- package/dist/query/hooks/use-search.js.map +1 -0
- package/dist/query/hooks/use-section-primary-mutations.js +53 -0
- package/dist/query/hooks/use-section-primary-mutations.js.map +1 -0
- package/dist/query/hooks/use-skill-mutations.js +91 -0
- package/dist/query/hooks/use-skill-mutations.js.map +1 -0
- package/dist/query/hooks/use-stats.js +19 -0
- package/dist/query/hooks/use-stats.js.map +1 -0
- package/dist/query/hooks/use-stream.js +20 -0
- package/dist/query/hooks/use-stream.js.map +1 -0
- package/dist/query/hooks/use-unlinked-positions.js +45 -0
- package/dist/query/hooks/use-unlinked-positions.js.map +1 -0
- package/dist/query/index.cjs.map +1 -1
- package/dist/query/index.d.ts +4 -4
- package/dist/query/index.js +685 -3744
- package/dist/query/index.js.map +1 -1
- package/dist/query/keys.js +138 -0
- package/dist/query/keys.js.map +1 -0
- package/dist/repo/groups.js +81 -0
- package/dist/repo/groups.js.map +1 -0
- package/dist/repo/index.js +9 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/labels.js +121 -0
- package/dist/repo/labels.js.map +1 -0
- package/dist/repo/types.js +1 -0
- package/dist/repo/types.js.map +1 -0
- package/dist/resume/index.js +5 -179
- package/dist/resume/index.js.map +1 -1
- package/dist/resume/json-resume.js +153 -0
- package/dist/resume/json-resume.js.map +1 -0
- package/dist/roadmap/index.js +101 -0
- package/dist/roadmap/index.js.map +1 -0
- package/dist/rpg/catalog.js +101 -0
- package/dist/rpg/catalog.js.map +1 -0
- package/dist/rpg/index.js +13 -116
- package/dist/rpg/index.js.map +1 -1
- package/dist/rpg/unlocks.js +21 -0
- package/dist/rpg/unlocks.js.map +1 -0
- package/dist/schemas/blob-ref.js +12 -0
- package/dist/schemas/blob-ref.js.map +1 -0
- package/dist/schemas/confirmation.js +23 -0
- package/dist/schemas/confirmation.js.map +1 -0
- package/dist/schemas/endorsement-confirmation.js +18 -0
- package/dist/schemas/endorsement-confirmation.js.map +1 -0
- package/dist/schemas/endorsement.js +19 -0
- package/dist/schemas/endorsement.js.map +1 -0
- package/dist/schemas/entity.js +74 -0
- package/dist/schemas/entity.js.map +1 -0
- package/dist/schemas/feed.js +73 -0
- package/dist/schemas/feed.js.map +1 -0
- package/dist/schemas/follow-profile.js +32 -0
- package/dist/schemas/follow-profile.js.map +1 -0
- package/dist/schemas/graph-follow.js +19 -0
- package/dist/schemas/graph-follow.js.map +1 -0
- package/dist/schemas/index.js +164 -629
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/org-employment-attestation.js +28 -0
- package/dist/schemas/org-employment-attestation.js.map +1 -0
- package/dist/schemas/org-profile.js +64 -0
- package/dist/schemas/org-profile.js.map +1 -0
- package/dist/schemas/profile-certification.js +28 -0
- package/dist/schemas/profile-certification.js.map +1 -0
- package/dist/schemas/profile-course.js +32 -0
- package/dist/schemas/profile-course.js.map +1 -0
- package/dist/schemas/profile-education.js +33 -0
- package/dist/schemas/profile-education.js.map +1 -0
- package/dist/schemas/profile-external-account.js +15 -0
- package/dist/schemas/profile-external-account.js.map +1 -0
- package/dist/schemas/profile-honor.js +18 -0
- package/dist/schemas/profile-honor.js.map +1 -0
- package/dist/schemas/profile-investment.js +48 -0
- package/dist/schemas/profile-investment.js.map +1 -0
- package/dist/schemas/profile-involvement.js +47 -0
- package/dist/schemas/profile-involvement.js.map +1 -0
- package/dist/schemas/profile-language.js +12 -0
- package/dist/schemas/profile-language.js.map +1 -0
- package/dist/schemas/profile-position.js +42 -0
- package/dist/schemas/profile-position.js.map +1 -0
- package/dist/schemas/profile-presentation-delivery.js +38 -0
- package/dist/schemas/profile-presentation-delivery.js.map +1 -0
- package/dist/schemas/profile-presentation.js +36 -0
- package/dist/schemas/profile-presentation.js.map +1 -0
- package/dist/schemas/profile-project.js +48 -0
- package/dist/schemas/profile-project.js.map +1 -0
- package/dist/schemas/profile-publication.js +30 -0
- package/dist/schemas/profile-publication.js.map +1 -0
- package/dist/schemas/profile-self.js +22 -0
- package/dist/schemas/profile-self.js.map +1 -0
- package/dist/schemas/profile-skill.js +13 -0
- package/dist/schemas/profile-skill.js.map +1 -0
- package/dist/schemas/profile-volunteering.js +20 -0
- package/dist/schemas/profile-volunteering.js.map +1 -0
- package/dist/schemas/shared.js +56 -0
- package/dist/schemas/shared.js.map +1 -0
- package/dist/schemas/write/certification.js +16 -0
- package/dist/schemas/write/certification.js.map +1 -0
- package/dist/schemas/write/course.js +36 -0
- package/dist/schemas/write/course.js.map +1 -0
- package/dist/schemas/write/education.js +18 -0
- package/dist/schemas/write/education.js.map +1 -0
- package/dist/schemas/write/external-account.js +13 -0
- package/dist/schemas/write/external-account.js.map +1 -0
- package/dist/schemas/write/honor.js +14 -0
- package/dist/schemas/write/honor.js.map +1 -0
- package/dist/schemas/write/index.d.ts +1 -1
- package/dist/schemas/write/index.js +89 -593
- package/dist/schemas/write/index.js.map +1 -1
- package/dist/schemas/write/investment.js +32 -0
- package/dist/schemas/write/investment.js.map +1 -0
- package/dist/schemas/write/involvement.js +34 -0
- package/dist/schemas/write/involvement.js.map +1 -0
- package/dist/schemas/write/language.js +10 -0
- package/dist/schemas/write/language.js.map +1 -0
- package/dist/schemas/write/org-claim.js +56 -0
- package/dist/schemas/write/org-claim.js.map +1 -0
- package/dist/schemas/write/org-employment-attestation.js +19 -0
- package/dist/schemas/write/org-employment-attestation.js.map +1 -0
- package/dist/schemas/write/org-profile.js +54 -0
- package/dist/schemas/write/org-profile.js.map +1 -0
- package/dist/schemas/write/org-settings.js +81 -0
- package/dist/schemas/write/org-settings.js.map +1 -0
- package/dist/schemas/write/position.js +24 -0
- package/dist/schemas/write/position.js.map +1 -0
- package/dist/schemas/write/presentation-delivery.js +34 -0
- package/dist/schemas/write/presentation-delivery.js.map +1 -0
- package/dist/schemas/write/presentation.js +23 -0
- package/dist/schemas/write/presentation.js.map +1 -0
- package/dist/schemas/write/profile-location.js +21 -0
- package/dist/schemas/write/profile-location.js.map +1 -0
- package/dist/schemas/write/profile-self.js +27 -0
- package/dist/schemas/write/profile-self.js.map +1 -0
- package/dist/schemas/write/project.js +27 -0
- package/dist/schemas/write/project.js.map +1 -0
- package/dist/schemas/write/publication.js +41 -0
- package/dist/schemas/write/publication.js.map +1 -0
- package/dist/schemas/write/shared.js +96 -0
- package/dist/schemas/write/shared.js.map +1 -0
- package/dist/schemas/write/skill.js +18 -0
- package/dist/schemas/write/skill.js.map +1 -0
- package/dist/schemas/write/volunteering.js +16 -0
- package/dist/schemas/write/volunteering.js.map +1 -0
- package/dist/stream/activity-item.js +1 -0
- package/dist/stream/activity-item.js.map +1 -0
- package/dist/stream/index.js +49 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/stream-card-vm-schema.js +265 -0
- package/dist/stream/stream-card-vm-schema.js.map +1 -0
- package/dist/stream/stream-card-vm.js +1 -0
- package/dist/stream/stream-card-vm.js.map +1 -0
- package/dist/stream/to-stream-card-vm.js +793 -0
- package/dist/stream/to-stream-card-vm.js.map +1 -0
- package/dist/stream/two-tier.js +30 -0
- package/dist/stream/two-tier.js.map +1 -0
- package/dist/stream/verbs.js +120 -0
- package/dist/stream/verbs.js.map +1 -0
- package/dist/taxonomy/activity-tiers.js +956 -0
- package/dist/taxonomy/activity-tiers.js.map +1 -0
- package/dist/taxonomy/app-categories.js +42 -0
- package/dist/taxonomy/app-categories.js.map +1 -0
- package/dist/taxonomy/app-category-map.js +166 -0
- package/dist/taxonomy/app-category-map.js.map +1 -0
- package/dist/taxonomy/artifact-link-kind.js +29 -0
- package/dist/taxonomy/artifact-link-kind.js.map +1 -0
- package/dist/taxonomy/calendar-event.js +28 -0
- package/dist/taxonomy/calendar-event.js.map +1 -0
- package/dist/taxonomy/continents.js +215 -0
- package/dist/taxonomy/continents.js.map +1 -0
- package/dist/taxonomy/countries.js +203 -0
- package/dist/taxonomy/countries.js.map +1 -0
- package/dist/taxonomy/course-role.js +37 -0
- package/dist/taxonomy/course-role.js.map +1 -0
- package/dist/taxonomy/employment-type.js +82 -0
- package/dist/taxonomy/employment-type.js.map +1 -0
- package/dist/taxonomy/eqf-level.js +59 -0
- package/dist/taxonomy/eqf-level.js.map +1 -0
- package/dist/taxonomy/index.js +263 -0
- package/dist/taxonomy/index.js.map +1 -0
- package/dist/taxonomy/industry-taxonomy.js +281 -0
- package/dist/taxonomy/industry-taxonomy.js.map +1 -0
- package/dist/taxonomy/investment.js +54 -0
- package/dist/taxonomy/investment.js.map +1 -0
- package/dist/taxonomy/involvement-kind.js +30 -0
- package/dist/taxonomy/involvement-kind.js.map +1 -0
- package/dist/taxonomy/open-to.js +128 -0
- package/dist/taxonomy/open-to.js.map +1 -0
- package/dist/taxonomy/platforms.js +56 -0
- package/dist/taxonomy/platforms.js.map +1 -0
- package/dist/taxonomy/presentation-link-type.js +22 -0
- package/dist/taxonomy/presentation-link-type.js.map +1 -0
- package/dist/taxonomy/presentation-role.js +21 -0
- package/dist/taxonomy/presentation-role.js.map +1 -0
- package/dist/taxonomy/publication-type.js +54 -0
- package/dist/taxonomy/publication-type.js.map +1 -0
- package/dist/taxonomy/relational.js +25 -0
- package/dist/taxonomy/relational.js.map +1 -0
- package/dist/taxonomy/search-filter-defs.js +66 -0
- package/dist/taxonomy/search-filter-defs.js.map +1 -0
- package/dist/taxonomy/skill-categories.js +28 -0
- package/dist/taxonomy/skill-categories.js.map +1 -0
- package/dist/taxonomy/skill-display-groups.js +12 -0
- package/dist/taxonomy/skill-display-groups.js.map +1 -0
- package/dist/taxonomy/skill-grouping.js +90 -0
- package/dist/taxonomy/skill-grouping.js.map +1 -0
- package/dist/taxonomy/verification-providers.js +69 -0
- package/dist/taxonomy/verification-providers.js.map +1 -0
- package/dist/taxonomy/workplace-type.js +38 -0
- package/dist/taxonomy/workplace-type.js.map +1 -0
- package/dist/tokens/colors.js +11 -0
- package/dist/tokens/colors.js.map +1 -0
- package/dist/tokens/icons.js +15 -0
- package/dist/tokens/icons.js.map +1 -0
- package/dist/tokens/index.js +10 -39
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/typography.js +23 -0
- package/dist/tokens/typography.js.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/profile-view.js +1 -0
- package/dist/types/profile-view.js.map +1 -0
- package/dist/{use-org-notification-emails-0hjt-dEw.d.ts → use-org-notification-emails-CWWi1D8t.d.ts} +2 -2
- package/package.json +4 -3
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// src/query/fetchers/discovery.ts
|
|
2
|
+
import { encodeIdentifier, apiFetch } from "../client.js";
|
|
3
|
+
async function fetchSimilarProfiles(config, did, opts = {}) {
|
|
4
|
+
const limit = opts.limit ?? 5;
|
|
5
|
+
const path = `/api/discover/similar/${encodeIdentifier(did)}?limit=${limit}`;
|
|
6
|
+
try {
|
|
7
|
+
const data = await apiFetch(config, path, {
|
|
8
|
+
next: { revalidate: 300 },
|
|
9
|
+
timeoutMs: 5e3,
|
|
10
|
+
...opts
|
|
11
|
+
});
|
|
12
|
+
return data.profiles ?? [];
|
|
13
|
+
} catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function fetchSuggestions(config, opts = {}) {
|
|
18
|
+
const params = new URLSearchParams();
|
|
19
|
+
if (opts.source) params.set("source", opts.source);
|
|
20
|
+
if (opts.includeDismissed) params.set("include_dismissed", "true");
|
|
21
|
+
if (opts.cursor) params.set("cursor", opts.cursor);
|
|
22
|
+
if (opts.limit) params.set("limit", String(opts.limit));
|
|
23
|
+
const qs = params.toString();
|
|
24
|
+
const headers = { ...opts.headers ?? {} };
|
|
25
|
+
if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
|
|
26
|
+
try {
|
|
27
|
+
return await apiFetch(config, `/api/suggestions${qs ? `?${qs}` : ""}`, {
|
|
28
|
+
credentials: "include",
|
|
29
|
+
cache: "no-store",
|
|
30
|
+
timeoutMs: 8e3,
|
|
31
|
+
...opts,
|
|
32
|
+
headers
|
|
33
|
+
});
|
|
34
|
+
} catch {
|
|
35
|
+
return { onSifa: [], notOnSifa: [] };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function fetchSuggestionCount(config, since, options = {}) {
|
|
39
|
+
const params = since ? `?since=${encodeURIComponent(since)}` : "";
|
|
40
|
+
try {
|
|
41
|
+
const data = await apiFetch(config, `/api/suggestions/count${params}`, {
|
|
42
|
+
credentials: "include",
|
|
43
|
+
cache: "no-store",
|
|
44
|
+
...options
|
|
45
|
+
});
|
|
46
|
+
return data.count ?? 0;
|
|
47
|
+
} catch {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function fetchFeaturedProfile(config, options = {}) {
|
|
52
|
+
try {
|
|
53
|
+
return await apiFetch(config, "/api/featured-profile", {
|
|
54
|
+
next: { revalidate: 900 },
|
|
55
|
+
...options
|
|
56
|
+
});
|
|
57
|
+
} catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
fetchFeaturedProfile,
|
|
63
|
+
fetchSimilarProfiles,
|
|
64
|
+
fetchSuggestionCount,
|
|
65
|
+
fetchSuggestions
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/discovery.ts"],"sourcesContent":["import { encodeIdentifier, apiFetch, type ApiFetchOptions, type SifaApiConfig } from '../client.js';\n\n/** Lightweight profile representation used by discovery endpoints. */\nexport interface SimilarProfile {\n did: string;\n handle: string;\n displayName?: string | null;\n avatar?: string | null;\n headline?: string | null;\n currentRole?: string | null;\n currentCompany?: string | null;\n industry?: string | null;\n domain?: string | null;\n}\n\nexport interface SuggestionProfile {\n did: string;\n handle: string;\n displayName?: string;\n headline?: string;\n avatarUrl?: string;\n source: string;\n dismissed: boolean;\n blueskyVerified?: boolean;\n}\n\nexport interface SuggestionsResponse {\n onSifa: SuggestionProfile[];\n notOnSifa: SuggestionProfile[];\n cursor?: string;\n}\n\nexport interface FeaturedProfile {\n did: string;\n handle: string;\n displayName?: string;\n avatar?: string;\n pronouns?: string;\n headline?: string;\n about?: string;\n currentRole?: string;\n currentCompany?: string;\n locationCountry?: string;\n locationRegion?: string;\n /** Legacy alias for `locationLocality`; emitted by sifa-api during the additive response window. */\n locationCity?: string;\n /** community.lexicon.location.address field name -- prefer over `locationCity`. */\n locationLocality?: string;\n countryCode?: string;\n location?: string;\n website?: string;\n openTo?: string[];\n preferredWorkplace?: string[];\n availableFromUtc?: number;\n availableToUtc?: number;\n followersCount?: number;\n atprotoFollowersCount?: number;\n pdsProvider?: { name: string; host: string } | null;\n claimed: boolean;\n featuredDate: string;\n}\n\n/** Profiles similar to the given DID (matchmaking). Returns `[]` on error. */\nexport async function fetchSimilarProfiles(\n config: SifaApiConfig,\n did: string,\n opts: { limit?: number } & ApiFetchOptions = {},\n): Promise<SimilarProfile[]> {\n const limit = opts.limit ?? 5;\n const path = `/api/discover/similar/${encodeIdentifier(did)}?limit=${limit}`;\n try {\n const data = await apiFetch<{ profiles?: SimilarProfile[] }>(config, path, {\n next: { revalidate: 300 },\n timeoutMs: 5000,\n ...opts,\n });\n return data.profiles ?? [];\n } catch {\n return [];\n }\n}\n\nexport interface FetchSuggestionsOptions extends ApiFetchOptions {\n source?: string;\n includeDismissed?: boolean;\n cursor?: string;\n limit?: number;\n /**\n * Pass the caller's `Cookie` header on Next.js RSC server-side calls.\n * `credentials: 'include'` does NOT propagate browser cookies in RSC,\n * so authenticated server fetches must forward the header explicitly.\n */\n cookieHeader?: string;\n}\n\n/** Discovery suggestions feed. Resolves to empty arrays on error. */\nexport async function fetchSuggestions(\n config: SifaApiConfig,\n opts: FetchSuggestionsOptions = {},\n): Promise<SuggestionsResponse> {\n const params = new URLSearchParams();\n if (opts.source) params.set('source', opts.source);\n if (opts.includeDismissed) params.set('include_dismissed', 'true');\n if (opts.cursor) params.set('cursor', opts.cursor);\n if (opts.limit) params.set('limit', String(opts.limit));\n\n const qs = params.toString();\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n if (opts.cookieHeader) headers.cookie = opts.cookieHeader;\n\n try {\n return await apiFetch<SuggestionsResponse>(config, `/api/suggestions${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n cache: 'no-store',\n timeoutMs: 8000,\n ...opts,\n headers,\n });\n } catch {\n return { onSifa: [], notOnSifa: [] };\n }\n}\n\n/** Count of pending suggestions since an optional timestamp. */\nexport async function fetchSuggestionCount(\n config: SifaApiConfig,\n since?: string,\n options: ApiFetchOptions = {},\n): Promise<number> {\n const params = since ? `?since=${encodeURIComponent(since)}` : '';\n try {\n const data = await apiFetch<{ count?: number }>(config, `/api/suggestions/count${params}`, {\n credentials: 'include',\n cache: 'no-store',\n ...options,\n });\n return data.count ?? 0;\n } catch {\n return 0;\n }\n}\n\n/** Featured profile (rotated by sifa-api). Returns `null` when none. */\nexport async function fetchFeaturedProfile(\n config: SifaApiConfig,\n options: ApiFetchOptions = {},\n): Promise<FeaturedProfile | null> {\n try {\n return await apiFetch<FeaturedProfile>(config, '/api/featured-profile', {\n next: { revalidate: 900 },\n ...options,\n });\n } catch {\n return null;\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAkB,gBAA0D;AA+DrF,eAAsB,qBACpB,QACA,KACA,OAA6C,CAAC,GACnB;AAC3B,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,OAAO,yBAAyB,iBAAiB,GAAG,CAAC,UAAU,KAAK;AAC1E,MAAI;AACF,UAAM,OAAO,MAAM,SAA0C,QAAQ,MAAM;AAAA,MACzE,MAAM,EAAE,YAAY,IAAI;AAAA,MACxB,WAAW;AAAA,MACX,GAAG;AAAA,IACL,CAAC;AACD,WAAO,KAAK,YAAY,CAAC;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAgBA,eAAsB,iBACpB,QACA,OAAgC,CAAC,GACH;AAC9B,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,MAAI,KAAK,iBAAkB,QAAO,IAAI,qBAAqB,MAAM;AACjE,MAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,MAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AAEtD,QAAM,KAAK,OAAO,SAAS;AAC3B,QAAM,UAAkC,EAAE,GAAI,KAAK,WAAW,CAAC,EAAG;AAClE,MAAI,KAAK,aAAc,SAAQ,SAAS,KAAK;AAE7C,MAAI;AACF,WAAO,MAAM,SAA8B,QAAQ,mBAAmB,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI;AAAA,MAC1F,aAAa;AAAA,MACb,OAAO;AAAA,MACP,WAAW;AAAA,MACX,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC,EAAE;AAAA,EACrC;AACF;AAGA,eAAsB,qBACpB,QACA,OACA,UAA2B,CAAC,GACX;AACjB,QAAM,SAAS,QAAQ,UAAU,mBAAmB,KAAK,CAAC,KAAK;AAC/D,MAAI;AACF,UAAM,OAAO,MAAM,SAA6B,QAAQ,yBAAyB,MAAM,IAAI;AAAA,MACzF,aAAa;AAAA,MACb,OAAO;AAAA,MACP,GAAG;AAAA,IACL,CAAC;AACD,WAAO,KAAK,SAAS;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,qBACpB,QACA,UAA2B,CAAC,GACK;AACjC,MAAI;AACF,WAAO,MAAM,SAA0B,QAAQ,yBAAyB;AAAA,MACtE,MAAM,EAAE,YAAY,IAAI;AAAA,MACxB,GAAG;AAAA,IACL,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/query/fetchers/education.ts
|
|
2
|
+
import {
|
|
3
|
+
apiWrite,
|
|
4
|
+
apiWriteCreate
|
|
5
|
+
} from "../client.js";
|
|
6
|
+
function createEducation(config, data, options = {}) {
|
|
7
|
+
return apiWriteCreate(config, "/api/profile/education", data, options);
|
|
8
|
+
}
|
|
9
|
+
function updateEducation(config, rkey, data, options = {}) {
|
|
10
|
+
return apiWrite(config, `/api/profile/education/${encodeURIComponent(rkey)}`, "PUT", {
|
|
11
|
+
body: data,
|
|
12
|
+
...options
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function deleteEducation(config, rkey, options = {}) {
|
|
16
|
+
return apiWrite(config, `/api/profile/education/${encodeURIComponent(rkey)}`, "DELETE", options);
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
createEducation,
|
|
20
|
+
deleteEducation,
|
|
21
|
+
updateEducation
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=education.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/education.ts"],"sourcesContent":["import {\n apiWrite,\n apiWriteCreate,\n type ApiFetchOptions,\n type CreateResult,\n type SifaApiConfig,\n type WriteResult,\n} from '../client.js';\n\n/**\n * Create a new `id.sifa.profile.education` record on the authenticated\n * user's PDS.\n */\nexport function createEducation(\n config: SifaApiConfig,\n data: Record<string, unknown>,\n options: ApiFetchOptions = {},\n): Promise<CreateResult> {\n return apiWriteCreate(config, '/api/profile/education', data, options);\n}\n\n/** Update an existing education record by `rkey`. */\nexport function updateEducation(\n config: SifaApiConfig,\n rkey: string,\n data: Record<string, unknown>,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(config, `/api/profile/education/${encodeURIComponent(rkey)}`, 'PUT', {\n body: data,\n ...options,\n });\n}\n\n/** Delete an education record by `rkey`. */\nexport function deleteEducation(\n config: SifaApiConfig,\n rkey: string,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(config, `/api/profile/education/${encodeURIComponent(rkey)}`, 'DELETE', options);\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AAMA,SAAS,gBACd,QACA,MACA,UAA2B,CAAC,GACL;AACvB,SAAO,eAAe,QAAQ,0BAA0B,MAAM,OAAO;AACvE;AAGO,SAAS,gBACd,QACA,MACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO,SAAS,QAAQ,0BAA0B,mBAAmB,IAAI,CAAC,IAAI,OAAO;AAAA,IACnF,MAAM;AAAA,IACN,GAAG;AAAA,EACL,CAAC;AACH;AAGO,SAAS,gBACd,QACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO,SAAS,QAAQ,0BAA0B,mBAAmB,IAAI,CAAC,IAAI,UAAU,OAAO;AACjG;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/query/fetchers/endorsement-inbox.ts
|
|
2
|
+
import {
|
|
3
|
+
apiFetch,
|
|
4
|
+
apiWrite
|
|
5
|
+
} from "../client.js";
|
|
6
|
+
var PENDING_ENDORSEMENTS_LXM = "id.sifa.endorsement.getPending";
|
|
7
|
+
async function fetchPendingEndorsements(config, options = {}) {
|
|
8
|
+
const { cookieHeader, ...rest } = options;
|
|
9
|
+
const headers = { ...rest.headers ?? {} };
|
|
10
|
+
if (cookieHeader) headers.cookie = cookieHeader;
|
|
11
|
+
if (config.getAuthToken) {
|
|
12
|
+
const token = await config.getAuthToken(PENDING_ENDORSEMENTS_LXM);
|
|
13
|
+
if (token) headers.Authorization = `Bearer ${token}`;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const data = await apiFetch(config, "/api/endorsements/pending", {
|
|
17
|
+
cache: "no-store",
|
|
18
|
+
credentials: "include",
|
|
19
|
+
timeoutMs: 5e3,
|
|
20
|
+
...rest,
|
|
21
|
+
headers
|
|
22
|
+
});
|
|
23
|
+
return { endorsements: data?.endorsements ?? [], cursor: data?.cursor };
|
|
24
|
+
} catch {
|
|
25
|
+
return { endorsements: [] };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function dismissEndorsement(config, data, options = {}) {
|
|
29
|
+
return apiWrite(config, "/api/endorsement/dismiss", "POST", { body: data, ...options });
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
PENDING_ENDORSEMENTS_LXM,
|
|
33
|
+
dismissEndorsement,
|
|
34
|
+
fetchPendingEndorsements
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=endorsement-inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/endorsement-inbox.ts"],"sourcesContent":["import {\n apiFetch,\n apiWrite,\n type ApiFetchOptions,\n type SifaApiConfig,\n type WriteResult,\n} from '../client.js';\n\n/** A received endorsement the subject has neither confirmed nor dismissed. */\nexport interface PendingEndorsement {\n endorserDid: string;\n /**\n * Endorser's handle, when the AppView has resolved one. Absent when the\n * endorser has no Sifa profile yet -- an endorsement can come from any AT\n * Protocol app -- so the UI needs a fallback for having no name to show.\n */\n endorserHandle?: string;\n /** Endorser's display name (Sifa override wins), for naming them without a handle. */\n endorserDisplayName?: string;\n /** Endorser's avatar URL (Sifa override wins). */\n endorserAvatar?: string;\n rkey: string;\n /**\n * AT-URI of the endorsement record. The confirm mutation needs a strongRef,\n * so the AppView hands this back rather than making callers rebuild it.\n */\n uri: string;\n /**\n * CID of the endorsement record, when the AppView has it. Often absent:\n * an endorsement written by another AT Protocol app can be indexed without\n * its CID ever reaching us. Pass it through to confirm when present; the\n * AppView resolves it from the endorser's PDS when it is not.\n */\n cid?: string;\n /** Absent when this endorsement proposes a skill the subject does not have. */\n skillUri?: string;\n skillCid?: string;\n /**\n * True when accepting this will add `skillName` to the profile as well as\n * publishing the endorsement. The UI must say so: it is a bigger action than\n * confirming an endorsement of a skill already listed.\n */\n proposesNewSkill?: boolean;\n skillName: string;\n comment?: string;\n createdAt: string;\n}\n\nexport interface PendingEndorsementsPage {\n endorsements: PendingEndorsement[];\n cursor?: string;\n}\n\n/** Body accepted by {@link dismissEndorsement}. */\nexport interface DismissEndorsementInput {\n endorserDid: string;\n rkey: string;\n}\n\n/** The method binding for the pending-inbox service-auth token; MUST match the\n * sifa-api endpoint's `lxm`. */\nexport const PENDING_ENDORSEMENTS_LXM = 'id.sifa.endorsement.getPending';\n\n/** Options for {@link fetchPendingEndorsements}, adding RSC cookie forwarding. */\nexport interface FetchPendingEndorsementsOptions extends ApiFetchOptions {\n /**\n * Pass the caller's `Cookie` header on Next.js RSC server-side calls.\n * `credentials: 'include'` does NOT propagate browser cookies in RSC,\n * so authenticated server fetches must forward the header explicitly.\n */\n cookieHeader?: string;\n}\n\n/**\n * Endorsements awaiting the signed-in user's decision. Requires credentials --\n * the AppView reads the subject DID from the caller's identity, not from a\n * parameter, so there is no way to read someone else's inbox.\n *\n * Auth is identity-only server-side, so the NATIVE app supplies\n * `config.getAuthToken` to mint a service-auth Bearer, while WEB relies on its\n * session cookie (`credentials: 'include'`).\n *\n * Returns an empty page on failure so a broken inbox degrades to \"nothing\n * pending\" rather than breaking the surface hosting it.\n */\nexport async function fetchPendingEndorsements(\n config: SifaApiConfig,\n options: FetchPendingEndorsementsOptions = {},\n): Promise<PendingEndorsementsPage> {\n const { cookieHeader, ...rest } = options;\n const headers: Record<string, string> = { ...(rest.headers ?? {}) };\n if (cookieHeader) headers.cookie = cookieHeader;\n if (config.getAuthToken) {\n const token = await config.getAuthToken(PENDING_ENDORSEMENTS_LXM);\n if (token) headers.Authorization = `Bearer ${token}`;\n }\n try {\n const data = await apiFetch<PendingEndorsementsPage>(config, '/api/endorsements/pending', {\n cache: 'no-store',\n credentials: 'include',\n timeoutMs: 5000,\n ...rest,\n headers,\n });\n return { endorsements: data?.endorsements ?? [], cursor: data?.cursor };\n } catch {\n return { endorsements: [] };\n }\n}\n\n/**\n * Take a received endorsement out of the inbox.\n *\n * This writes nothing to any PDS. An endorsement only displays once the subject\n * has confirmed it, so declining is already the default state -- the dismissal\n * is a local flag that stops it reappearing, not a published rejection.\n */\nexport function dismissEndorsement(\n config: SifaApiConfig,\n data: DismissEndorsementInput,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(config, '/api/endorsement/dismiss', 'POST', { body: data, ...options });\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAuDA,IAAM,2BAA2B;AAwBxC,eAAsB,yBACpB,QACA,UAA2C,CAAC,GACV;AAClC,QAAM,EAAE,cAAc,GAAG,KAAK,IAAI;AAClC,QAAM,UAAkC,EAAE,GAAI,KAAK,WAAW,CAAC,EAAG;AAClE,MAAI,aAAc,SAAQ,SAAS;AACnC,MAAI,OAAO,cAAc;AACvB,UAAM,QAAQ,MAAM,OAAO,aAAa,wBAAwB;AAChE,QAAI,MAAO,SAAQ,gBAAgB,UAAU,KAAK;AAAA,EACpD;AACA,MAAI;AACF,UAAM,OAAO,MAAM,SAAkC,QAAQ,6BAA6B;AAAA,MACxF,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,WAAO,EAAE,cAAc,MAAM,gBAAgB,CAAC,GAAG,QAAQ,MAAM,OAAO;AAAA,EACxE,QAAQ;AACN,WAAO,EAAE,cAAc,CAAC,EAAE;AAAA,EAC5B;AACF;AASO,SAAS,mBACd,QACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO,SAAS,QAAQ,4BAA4B,QAAQ,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC;AACxF;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/query/fetchers/endorsement.ts
|
|
2
|
+
import { encodeIdentifier, apiFetch } from "../client.js";
|
|
3
|
+
async function fetchEndorsementCount(config, did, options = {}) {
|
|
4
|
+
const path = `/api/endorsement/${encodeIdentifier(did)}`;
|
|
5
|
+
try {
|
|
6
|
+
const data = await apiFetch(config, path, {
|
|
7
|
+
cache: "no-store",
|
|
8
|
+
timeoutMs: 5e3,
|
|
9
|
+
...options
|
|
10
|
+
});
|
|
11
|
+
if (typeof data !== "object" || data === null || !("endorsements" in data)) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
const endorsements = data.endorsements;
|
|
15
|
+
return Array.isArray(endorsements) ? endorsements.length : 0;
|
|
16
|
+
} catch {
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
fetchEndorsementCount
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=endorsement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/endorsement.ts"],"sourcesContent":["import { encodeIdentifier, apiFetch, type ApiFetchOptions, type SifaApiConfig } from '../client.js';\n\n/**\n * Counts confirmed endorsements received by a DID. The backend's\n * `GET /api/endorsement/:did` already returns only confirmed endorsements\n * (via inner join with `endorsementConfirmations`), so this helper just\n * returns the array length. Failures return 0 so callers can route safely.\n *\n * Public endpoint -- no credentials needed.\n */\nexport async function fetchEndorsementCount(\n config: SifaApiConfig,\n did: string,\n options: ApiFetchOptions = {},\n): Promise<number> {\n const path = `/api/endorsement/${encodeIdentifier(did)}`;\n try {\n const data = await apiFetch<unknown>(config, path, {\n cache: 'no-store',\n timeoutMs: 5000,\n ...options,\n });\n if (typeof data !== 'object' || data === null || !('endorsements' in data)) {\n return 0;\n }\n const endorsements = data.endorsements;\n return Array.isArray(endorsements) ? endorsements.length : 0;\n } catch {\n return 0;\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAkB,gBAA0D;AAUrF,eAAsB,sBACpB,QACA,KACA,UAA2B,CAAC,GACX;AACjB,QAAM,OAAO,oBAAoB,iBAAiB,GAAG,CAAC;AACtD,MAAI;AACF,UAAM,OAAO,MAAM,SAAkB,QAAQ,MAAM;AAAA,MACjD,OAAO;AAAA,MACP,WAAW;AAAA,MACX,GAAG;AAAA,IACL,CAAC;AACD,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,EAAE,kBAAkB,OAAO;AAC1E,aAAO;AAAA,IACT;AACA,UAAM,eAAe,KAAK;AAC1B,WAAO,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// src/query/fetchers/endorsements.ts
|
|
2
|
+
import {
|
|
3
|
+
apiWriteCreate
|
|
4
|
+
} from "../client.js";
|
|
5
|
+
function createEndorsement(config, data, options = {}) {
|
|
6
|
+
return apiWriteCreate(config, "/api/endorsement", data, options);
|
|
7
|
+
}
|
|
8
|
+
function confirmEndorsement(config, data, options = {}) {
|
|
9
|
+
return apiWriteCreate(
|
|
10
|
+
config,
|
|
11
|
+
"/api/endorsement/confirm",
|
|
12
|
+
data,
|
|
13
|
+
options
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
confirmEndorsement,
|
|
18
|
+
createEndorsement
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=endorsements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/endorsements.ts"],"sourcesContent":["import {\n apiWriteCreate,\n type ApiFetchOptions,\n type CreateResult,\n type SifaApiConfig,\n} from '../client.js';\n\n/** Body accepted by {@link createEndorsement}. */\nexport interface EndorsementInput {\n /** DID of the person being endorsed. */\n subjectDid: string;\n /**\n * AT-URI of the subject's `id.sifa.profile.skill` record. Omit to propose a\n * skill they have not listed; `skillName` then names what is proposed, and\n * the record is created when they accept.\n */\n skillUri?: string;\n /**\n * CID of that skill record, pinning the endorsement to the version endorsed.\n * Optional: the AppView resolves it when omitted, which is the common case\n * since only the firehose carries a CID. Never substitute another record's.\n */\n skillCid?: string;\n /**\n * Snapshot of the skill's name at endorsement time. Acts as the validity\n * anchor: if the subject later renames the skill, the mismatch is detectable.\n */\n skillName: string;\n comment?: string;\n}\n\n/** Body accepted by {@link confirmEndorsement}. */\nexport interface ConfirmEndorsementResult {\n /** Skill the endorsement resolved to, created if it was a proposal. */\n skillUri?: string;\n /** True when accepting added a new skill to the profile. */\n skillCreated?: boolean;\n}\n\nexport interface ConfirmEndorsementInput {\n endorsementUri: string;\n /**\n * Optional. When omitted the AppView resolves the CID itself, reading the\n * record from the endorser's PDS if it has none stored. Callers working from\n * the pending inbox should pass `cid` through when it is there and leave it\n * out when it is not, rather than substituting another record's CID.\n */\n endorsementCid?: string;\n}\n\n/**\n * Create an endorsement of another user's skill. The endorsed user\n * must confirm before the endorsement appears on their profile (the\n * endorsement record is on the endorser's PDS; a separate confirmation\n * record on the endorsed user's PDS gates display).\n */\nexport function createEndorsement(\n config: SifaApiConfig,\n data: EndorsementInput,\n options: ApiFetchOptions = {},\n): Promise<CreateResult> {\n return apiWriteCreate(config, '/api/endorsement', data, options);\n}\n\n/**\n * Confirm a received endorsement, writing a confirmation record to the\n * signed-in user's PDS. This is what makes the endorsement public: until the\n * confirmation exists, the endorsement is indexed but displays nowhere.\n */\nexport function confirmEndorsement(\n config: SifaApiConfig,\n data: ConfirmEndorsementInput,\n options: ApiFetchOptions = {},\n): Promise<CreateResult & ConfirmEndorsementResult> {\n return apiWriteCreate<ConfirmEndorsementResult>(\n config,\n '/api/endorsement/confirm',\n data,\n options,\n );\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAIK;AAmDA,SAAS,kBACd,QACA,MACA,UAA2B,CAAC,GACL;AACvB,SAAO,eAAe,QAAQ,oBAAoB,MAAM,OAAO;AACjE;AAOO,SAAS,mBACd,QACA,MACA,UAA2B,CAAC,GACsB;AAClD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// src/query/fetchers/entities.ts
|
|
2
|
+
import { apiFetch } from "../client.js";
|
|
3
|
+
import {
|
|
4
|
+
EntitySearchResponseSchema,
|
|
5
|
+
EntitySelectResponseSchema,
|
|
6
|
+
EntityImportSearchResponseSchema,
|
|
7
|
+
EntityResolveDomainResponseSchema,
|
|
8
|
+
EntityMintDomainResponseSchema
|
|
9
|
+
} from "../../schemas/entity.js";
|
|
10
|
+
var EMPTY_SEARCH = { results: [], hasMore: false };
|
|
11
|
+
async function fetchEntitySearch(config, query, limit, options = {}) {
|
|
12
|
+
if (!query.trim()) return EMPTY_SEARCH;
|
|
13
|
+
const params = new URLSearchParams({ q: query });
|
|
14
|
+
if (limit !== void 0) params.set("limit", String(limit));
|
|
15
|
+
const data = await apiFetch(config, `/api/entities/search?${params.toString()}`, {
|
|
16
|
+
cache: "no-store",
|
|
17
|
+
...options
|
|
18
|
+
});
|
|
19
|
+
return EntitySearchResponseSchema.parse(data);
|
|
20
|
+
}
|
|
21
|
+
async function selectEntity(config, body, options = {}) {
|
|
22
|
+
const data = await apiFetch(config, "/api/entities/select", {
|
|
23
|
+
method: "POST",
|
|
24
|
+
body,
|
|
25
|
+
credentials: "include",
|
|
26
|
+
...options
|
|
27
|
+
});
|
|
28
|
+
return EntitySelectResponseSchema.parse(data);
|
|
29
|
+
}
|
|
30
|
+
async function importSearchEntities(config, query, options = {}) {
|
|
31
|
+
if (!query.trim()) return [];
|
|
32
|
+
const data = await apiFetch(config, "/api/entities/import-search", {
|
|
33
|
+
method: "POST",
|
|
34
|
+
body: { q: query },
|
|
35
|
+
credentials: "include",
|
|
36
|
+
...options
|
|
37
|
+
});
|
|
38
|
+
return EntityImportSearchResponseSchema.parse(data).results;
|
|
39
|
+
}
|
|
40
|
+
async function resolveEntityDomain(config, domain, options = {}) {
|
|
41
|
+
const data = await apiFetch(config, "/api/entities/resolve-domain", {
|
|
42
|
+
method: "POST",
|
|
43
|
+
body: { domain },
|
|
44
|
+
credentials: "include",
|
|
45
|
+
...options
|
|
46
|
+
});
|
|
47
|
+
return EntityResolveDomainResponseSchema.parse(data);
|
|
48
|
+
}
|
|
49
|
+
async function mintEntityDomain(config, domain, options = {}) {
|
|
50
|
+
const data = await apiFetch(config, "/api/entities/mint-domain", {
|
|
51
|
+
method: "POST",
|
|
52
|
+
body: { domain },
|
|
53
|
+
credentials: "include",
|
|
54
|
+
...options
|
|
55
|
+
});
|
|
56
|
+
return EntityMintDomainResponseSchema.parse(data);
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
fetchEntitySearch,
|
|
60
|
+
importSearchEntities,
|
|
61
|
+
mintEntityDomain,
|
|
62
|
+
resolveEntityDomain,
|
|
63
|
+
selectEntity
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/entities.ts"],"sourcesContent":["import { apiFetch, type ApiFetchOptions, type SifaApiConfig } from '../client.js';\nimport {\n EntitySearchResponseSchema,\n EntitySelectResponseSchema,\n EntityImportSearchResponseSchema,\n EntityResolveDomainResponseSchema,\n EntityMintDomainResponseSchema,\n type EntitySearchResponse,\n type EntitySearchResult,\n type EntitySelectRequest,\n type EntitySelectResponse,\n type EntityResolveDomainResponse,\n type EntityMintDomainResponse,\n} from '../../schemas/entity.js';\n\nconst EMPTY_SEARCH: EntitySearchResponse = { results: [], hasMore: false };\n\n/**\n * Organization typeahead. Returns curated entities first, then the PDL crawl,\n * deduped by domain. Empty input returns an empty result without a network call.\n */\nexport async function fetchEntitySearch(\n config: SifaApiConfig,\n query: string,\n limit?: number,\n options: ApiFetchOptions = {},\n): Promise<EntitySearchResponse> {\n if (!query.trim()) return EMPTY_SEARCH;\n const params = new URLSearchParams({ q: query });\n if (limit !== undefined) params.set('limit', String(limit));\n const data = await apiFetch<unknown>(config, `/api/entities/search?${params.toString()}`, {\n cache: 'no-store',\n ...options,\n });\n return EntitySearchResponseSchema.parse(data);\n}\n\n/**\n * Record a selection: promote a PDL row into a canonical entity (dedupe by\n * domain) or bump an existing entity's usage counter. Returns the entity plus\n * its portable `entityRef` (null for PDL-only entities). Requires a session.\n */\nexport async function selectEntity(\n config: SifaApiConfig,\n body: EntitySelectRequest,\n options: ApiFetchOptions = {},\n): Promise<EntitySelectResponse> {\n const data = await apiFetch<unknown>(config, '/api/entities/select', {\n method: 'POST',\n body,\n credentials: 'include',\n ...options,\n });\n return EntitySelectResponseSchema.parse(data);\n}\n\n/**\n * Grow-on-demand: when the local typeahead misses, resolve the query live via\n * Wikidata, import the org-class matches, and return them. Requires a session.\n * Empty input returns an empty array without a network call.\n */\nexport async function importSearchEntities(\n config: SifaApiConfig,\n query: string,\n options: ApiFetchOptions = {},\n): Promise<EntitySearchResult[]> {\n if (!query.trim()) return [];\n const data = await apiFetch<unknown>(config, '/api/entities/import-search', {\n method: 'POST',\n body: { q: query },\n credentials: 'include',\n ...options,\n });\n return EntityImportSearchResponseSchema.parse(data).results;\n}\n\n/**\n * Grow-on-demand by domain, Branch 1: when a domain-shaped typeahead query\n * misses locally, resolve any notable company whose official website is that\n * domain (Wikidata reverse P856), importing the matches. Read-only w.r.t.\n * minting. `canMint` tells the caller whether to offer the user-initiated\n * \"Add <domain>\" affordance. Requires a session.\n */\nexport async function resolveEntityDomain(\n config: SifaApiConfig,\n domain: string,\n options: ApiFetchOptions = {},\n): Promise<EntityResolveDomainResponse> {\n const data = await apiFetch<unknown>(config, '/api/entities/resolve-domain', {\n method: 'POST',\n body: { domain },\n credentials: 'include',\n ...options,\n });\n return EntityResolveDomainResponseSchema.parse(data);\n}\n\n/**\n * Grow-on-demand by domain, Branch 2 (user-initiated): mint a crawled-tier\n * entity from the domain's own homepage (or resolve it to a notable company if\n * one exists). Throws on a non-2xx response (domain not mintable, or the site\n * yielded nothing usable). Requires a session.\n */\nexport async function mintEntityDomain(\n config: SifaApiConfig,\n domain: string,\n options: ApiFetchOptions = {},\n): Promise<EntityMintDomainResponse> {\n const data = await apiFetch<unknown>(config, '/api/entities/mint-domain', {\n method: 'POST',\n body: { domain },\n credentials: 'include',\n ...options,\n });\n return EntityMintDomainResponseSchema.parse(data);\n}\n"],"mappings":";AAAA,SAAS,gBAA0D;AACnE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AAEP,IAAM,eAAqC,EAAE,SAAS,CAAC,GAAG,SAAS,MAAM;AAMzE,eAAsB,kBACpB,QACA,OACA,OACA,UAA2B,CAAC,GACG;AAC/B,MAAI,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1B,QAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,MAAM,CAAC;AAC/C,MAAI,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,CAAC;AAC1D,QAAM,OAAO,MAAM,SAAkB,QAAQ,wBAAwB,OAAO,SAAS,CAAC,IAAI;AAAA,IACxF,OAAO;AAAA,IACP,GAAG;AAAA,EACL,CAAC;AACD,SAAO,2BAA2B,MAAM,IAAI;AAC9C;AAOA,eAAsB,aACpB,QACA,MACA,UAA2B,CAAC,GACG;AAC/B,QAAM,OAAO,MAAM,SAAkB,QAAQ,wBAAwB;AAAA,IACnE,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,IACb,GAAG;AAAA,EACL,CAAC;AACD,SAAO,2BAA2B,MAAM,IAAI;AAC9C;AAOA,eAAsB,qBACpB,QACA,OACA,UAA2B,CAAC,GACG;AAC/B,MAAI,CAAC,MAAM,KAAK,EAAG,QAAO,CAAC;AAC3B,QAAM,OAAO,MAAM,SAAkB,QAAQ,+BAA+B;AAAA,IAC1E,QAAQ;AAAA,IACR,MAAM,EAAE,GAAG,MAAM;AAAA,IACjB,aAAa;AAAA,IACb,GAAG;AAAA,EACL,CAAC;AACD,SAAO,iCAAiC,MAAM,IAAI,EAAE;AACtD;AASA,eAAsB,oBACpB,QACA,QACA,UAA2B,CAAC,GACU;AACtC,QAAM,OAAO,MAAM,SAAkB,QAAQ,gCAAgC;AAAA,IAC3E,QAAQ;AAAA,IACR,MAAM,EAAE,OAAO;AAAA,IACf,aAAa;AAAA,IACb,GAAG;AAAA,EACL,CAAC;AACD,SAAO,kCAAkC,MAAM,IAAI;AACrD;AAQA,eAAsB,iBACpB,QACA,QACA,UAA2B,CAAC,GACO;AACnC,QAAM,OAAO,MAAM,SAAkB,QAAQ,6BAA6B;AAAA,IACxE,QAAQ;AAAA,IACR,MAAM,EAAE,OAAO;AAAA,IACf,aAAa;AAAA,IACb,GAAG;AAAA,EACL,CAAC;AACD,SAAO,+BAA+B,MAAM,IAAI;AAClD;","names":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// src/query/fetchers/external-accounts.ts
|
|
2
|
+
import {
|
|
3
|
+
apiFetch,
|
|
4
|
+
encodeIdentifier,
|
|
5
|
+
apiWrite
|
|
6
|
+
} from "../client.js";
|
|
7
|
+
async function fetchExternalAccounts(config, handleOrDid, options = {}) {
|
|
8
|
+
const path = `/api/profile/${encodeIdentifier(handleOrDid)}/external-accounts`;
|
|
9
|
+
try {
|
|
10
|
+
const data = await apiFetch(config, path, {
|
|
11
|
+
credentials: "include",
|
|
12
|
+
...options
|
|
13
|
+
});
|
|
14
|
+
return data.accounts ?? [];
|
|
15
|
+
} catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function createExternalAccount(config, data, options = {}) {
|
|
20
|
+
return apiWrite(
|
|
21
|
+
config,
|
|
22
|
+
"/api/profile/external-accounts",
|
|
23
|
+
"POST",
|
|
24
|
+
{ body: data, ...options }
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
function updateExternalAccount(config, rkey, data, options = {}) {
|
|
28
|
+
return apiWrite(config, `/api/profile/external-accounts/${encodeURIComponent(rkey)}`, "PUT", {
|
|
29
|
+
body: data,
|
|
30
|
+
...options
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function deleteExternalAccount(config, rkey, options = {}) {
|
|
34
|
+
return apiWrite(
|
|
35
|
+
config,
|
|
36
|
+
`/api/profile/external-accounts/${encodeURIComponent(rkey)}`,
|
|
37
|
+
"DELETE",
|
|
38
|
+
options
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function setExternalAccountPrimary(config, rkey, options = {}) {
|
|
42
|
+
return apiWrite(
|
|
43
|
+
config,
|
|
44
|
+
`/api/profile/external-accounts/${encodeURIComponent(rkey)}/primary`,
|
|
45
|
+
"PUT",
|
|
46
|
+
options
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
function unsetExternalAccountPrimary(config, rkey, options = {}) {
|
|
50
|
+
return apiWrite(
|
|
51
|
+
config,
|
|
52
|
+
`/api/profile/external-accounts/${encodeURIComponent(rkey)}/primary`,
|
|
53
|
+
"DELETE",
|
|
54
|
+
options
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
function verifyExternalAccount(config, rkey, options = {}) {
|
|
58
|
+
return apiWrite(
|
|
59
|
+
config,
|
|
60
|
+
`/api/profile/external-accounts/${encodeURIComponent(rkey)}/verify`,
|
|
61
|
+
"POST",
|
|
62
|
+
{ body: {}, ...options }
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
createExternalAccount,
|
|
67
|
+
deleteExternalAccount,
|
|
68
|
+
fetchExternalAccounts,
|
|
69
|
+
setExternalAccountPrimary,
|
|
70
|
+
unsetExternalAccountPrimary,
|
|
71
|
+
updateExternalAccount,
|
|
72
|
+
verifyExternalAccount
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=external-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/external-accounts.ts"],"sourcesContent":["import type { ExternalAccount } from '../../types/index.js';\nimport {\n apiFetch,\n encodeIdentifier,\n apiWrite,\n type ApiFetchOptions,\n type SifaApiConfig,\n type WriteResult,\n} from '../client.js';\n\n/** Body accepted by {@link createExternalAccount} / {@link updateExternalAccount}. */\nexport interface ExternalAccountInput {\n platform: string;\n url: string;\n label?: string;\n feedUrl?: string;\n}\n\n/** Extended create result for {@link createExternalAccount}. */\nexport interface CreateExternalAccountResult extends WriteResult {\n rkey?: string;\n feedUrl?: string | null;\n}\n\n/** Extended write result for {@link verifyExternalAccount}. */\nexport interface VerifyExternalAccountResult extends WriteResult {\n verified?: boolean;\n verifiedVia?: string;\n}\n\n/** List external accounts attached to a profile. Returns `[]` on error. */\nexport async function fetchExternalAccounts(\n config: SifaApiConfig,\n handleOrDid: string,\n options: ApiFetchOptions = {},\n): Promise<ExternalAccount[]> {\n const path = `/api/profile/${encodeIdentifier(handleOrDid)}/external-accounts`;\n try {\n const data = await apiFetch<{ accounts?: ExternalAccount[] }>(config, path, {\n credentials: 'include',\n ...options,\n });\n return data.accounts ?? [];\n } catch {\n return [];\n }\n}\n\n/**\n * Create a new external account record. Returns the newly-created `rkey`\n * and the server-resolved `feedUrl` (sifa-api inspects the target for\n * RSS feeds on platforms that publish them).\n */\nexport function createExternalAccount(\n config: SifaApiConfig,\n data: ExternalAccountInput,\n options: ApiFetchOptions = {},\n): Promise<CreateExternalAccountResult> {\n return apiWrite<{ rkey?: string; feedUrl?: string | null }>(\n config,\n '/api/profile/external-accounts',\n 'POST',\n { body: data, ...options },\n );\n}\n\n/** Update an existing external account by `rkey`. */\nexport function updateExternalAccount(\n config: SifaApiConfig,\n rkey: string,\n data: ExternalAccountInput,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(config, `/api/profile/external-accounts/${encodeURIComponent(rkey)}`, 'PUT', {\n body: data,\n ...options,\n });\n}\n\n/** Delete an external account by `rkey`. */\nexport function deleteExternalAccount(\n config: SifaApiConfig,\n rkey: string,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(\n config,\n `/api/profile/external-accounts/${encodeURIComponent(rkey)}`,\n 'DELETE',\n options,\n );\n}\n\n/** Mark an external account as the user's primary. */\nexport function setExternalAccountPrimary(\n config: SifaApiConfig,\n rkey: string,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(\n config,\n `/api/profile/external-accounts/${encodeURIComponent(rkey)}/primary`,\n 'PUT',\n options,\n );\n}\n\n/** Clear the \"primary\" flag on an external account. */\nexport function unsetExternalAccountPrimary(\n config: SifaApiConfig,\n rkey: string,\n options: ApiFetchOptions = {},\n): Promise<WriteResult> {\n return apiWrite(\n config,\n `/api/profile/external-accounts/${encodeURIComponent(rkey)}/primary`,\n 'DELETE',\n options,\n );\n}\n\n/**\n * Run server-side verification on an external account (e.g. inspect\n * the target for a keytrace claim). Returns `{ verified, verifiedVia }`\n * on success.\n */\nexport function verifyExternalAccount(\n config: SifaApiConfig,\n rkey: string,\n options: ApiFetchOptions = {},\n): Promise<VerifyExternalAccountResult> {\n return apiWrite<{ verified?: boolean; verifiedVia?: string }>(\n config,\n `/api/profile/external-accounts/${encodeURIComponent(rkey)}/verify`,\n 'POST',\n { body: {}, ...options },\n );\n}\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAuBP,eAAsB,sBACpB,QACA,aACA,UAA2B,CAAC,GACA;AAC5B,QAAM,OAAO,gBAAgB,iBAAiB,WAAW,CAAC;AAC1D,MAAI;AACF,UAAM,OAAO,MAAM,SAA2C,QAAQ,MAAM;AAAA,MAC1E,aAAa;AAAA,MACb,GAAG;AAAA,IACL,CAAC;AACD,WAAO,KAAK,YAAY,CAAC;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAOO,SAAS,sBACd,QACA,MACA,UAA2B,CAAC,GACU;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,MAAM,MAAM,GAAG,QAAQ;AAAA,EAC3B;AACF;AAGO,SAAS,sBACd,QACA,MACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO,SAAS,QAAQ,kCAAkC,mBAAmB,IAAI,CAAC,IAAI,OAAO;AAAA,IAC3F,MAAM;AAAA,IACN,GAAG;AAAA,EACL,CAAC;AACH;AAGO,SAAS,sBACd,QACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO;AAAA,IACL;AAAA,IACA,kCAAkC,mBAAmB,IAAI,CAAC;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACF;AAGO,SAAS,0BACd,QACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO;AAAA,IACL;AAAA,IACA,kCAAkC,mBAAmB,IAAI,CAAC;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACF;AAGO,SAAS,4BACd,QACA,MACA,UAA2B,CAAC,GACN;AACtB,SAAO;AAAA,IACL;AAAA,IACA,kCAAkC,mBAAmB,IAAI,CAAC;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACF;AAOO,SAAS,sBACd,QACA,MACA,UAA2B,CAAC,GACU;AACtC,SAAO;AAAA,IACL;AAAA,IACA,kCAAkC,mBAAmB,IAAI,CAAC;AAAA,IAC1D;AAAA,IACA,EAAE,MAAM,CAAC,GAAG,GAAG,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// src/query/fetchers/follow-extras.ts
|
|
2
|
+
import { encodeIdentifier, apiFetch } from "../client.js";
|
|
3
|
+
function buildListPath(prefix, opts) {
|
|
4
|
+
const params = new URLSearchParams();
|
|
5
|
+
if (opts.cursor) params.set("cursor", opts.cursor);
|
|
6
|
+
if (opts.limit) params.set("limit", String(opts.limit));
|
|
7
|
+
const qs = params.toString();
|
|
8
|
+
return `${prefix}${qs ? `?${qs}` : ""}`;
|
|
9
|
+
}
|
|
10
|
+
async function fetchFollowProfilePage(config, path, opts) {
|
|
11
|
+
const headers = { ...opts.headers ?? {} };
|
|
12
|
+
if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
|
|
13
|
+
try {
|
|
14
|
+
const res = await apiFetch(
|
|
15
|
+
config,
|
|
16
|
+
path,
|
|
17
|
+
{ credentials: "include", cache: "no-store", ...opts, headers }
|
|
18
|
+
);
|
|
19
|
+
return { items: res.items ?? [], cursor: res.cursor ?? null };
|
|
20
|
+
} catch {
|
|
21
|
+
return { items: [], cursor: null };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function getMutuals(config, handleOrDid, opts = {}) {
|
|
25
|
+
return fetchFollowProfilePage(
|
|
26
|
+
config,
|
|
27
|
+
buildListPath(`/api/profile/${encodeIdentifier(handleOrDid)}/mutuals`, opts),
|
|
28
|
+
opts
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
async function getBlueskySuggestions(config, opts = {}) {
|
|
32
|
+
return fetchFollowProfilePage(config, buildListPath("/api/me/bluesky-suggestions", opts), opts);
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
getBlueskySuggestions,
|
|
36
|
+
getMutuals
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=follow-extras.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/follow-extras.ts"],"sourcesContent":["import { encodeIdentifier, apiFetch, type ApiFetchOptions, type SifaApiConfig } from '../client.js';\nimport type { FollowProfileItem } from '../../schemas/follow-profile.js';\n\n/**\n * Options shared by the cursor-paginated follow-graph endpoints introduced in\n * `sifa-api#674` (mutuals + bluesky-suggestions). Mirrors\n * `FetchFollowListOptions` in `./follow.ts` but the response wrapper here uses\n * the `{ items, cursor }` shape (not `{ follows, cursor }`).\n */\nexport interface FetchFollowProfilePageOptions extends ApiFetchOptions {\n cursor?: string;\n limit?: number;\n /**\n * Pass the caller's `Cookie` header on Next.js RSC server-side calls\n * (mirrors `FetchFollowListOptions`; required for authenticated server\n * fetches because `credentials: 'include'` does not propagate cookies from\n * RSC).\n */\n cookieHeader?: string;\n}\n\n/** Page of {@link FollowProfileItem} rows with an opaque next-page cursor. */\nexport interface FollowProfilePageResponse {\n items: FollowProfileItem[];\n cursor: string | null;\n}\n\nfunction buildListPath(prefix: string, opts: FetchFollowProfilePageOptions): string {\n const params = new URLSearchParams();\n if (opts.cursor) params.set('cursor', opts.cursor);\n if (opts.limit) params.set('limit', String(opts.limit));\n const qs = params.toString();\n return `${prefix}${qs ? `?${qs}` : ''}`;\n}\n\nasync function fetchFollowProfilePage(\n config: SifaApiConfig,\n path: string,\n opts: FetchFollowProfilePageOptions,\n): Promise<FollowProfilePageResponse> {\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n if (opts.cookieHeader) headers.cookie = opts.cookieHeader;\n try {\n const res = await apiFetch<{ items?: FollowProfileItem[]; cursor?: string | null }>(\n config,\n path,\n { credentials: 'include', cache: 'no-store', ...opts, headers },\n );\n return { items: res.items ?? [], cursor: res.cursor ?? null };\n } catch {\n return { items: [], cursor: null };\n }\n}\n\n/**\n * Cursor-paginated list of mutual sifa-source follows for `handleOrDid`\n * (X↔Y both follow each other on Sifa). Backed by\n * `GET /api/profile/{handleOrDid}/mutuals` from `sifa-api#674`. Public —\n * does not require auth. Returns an empty page on error.\n */\nexport async function getMutuals(\n config: SifaApiConfig,\n handleOrDid: string,\n opts: FetchFollowProfilePageOptions = {},\n): Promise<FollowProfilePageResponse> {\n return fetchFollowProfilePage(\n config,\n buildListPath(`/api/profile/${encodeIdentifier(handleOrDid)}/mutuals`, opts),\n opts,\n );\n}\n\n/**\n * Cursor-paginated list of Sifa users the viewer follows on Bluesky but NOT\n * on Sifa, filtered to people active on Sifa. Backed by\n * `GET /api/me/bluesky-suggestions` from `sifa-api#674`. Auth-required.\n * Returns an empty page on error.\n */\nexport async function getBlueskySuggestions(\n config: SifaApiConfig,\n opts: FetchFollowProfilePageOptions = {},\n): Promise<FollowProfilePageResponse> {\n return fetchFollowProfilePage(config, buildListPath('/api/me/bluesky-suggestions', opts), opts);\n}\n"],"mappings":";AAAA,SAAS,kBAAkB,gBAA0D;AA2BrF,SAAS,cAAc,QAAgB,MAA6C;AAClF,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,MAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACtD,QAAM,KAAK,OAAO,SAAS;AAC3B,SAAO,GAAG,MAAM,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE;AACvC;AAEA,eAAe,uBACb,QACA,MACA,MACoC;AACpC,QAAM,UAAkC,EAAE,GAAI,KAAK,WAAW,CAAC,EAAG;AAClE,MAAI,KAAK,aAAc,SAAQ,SAAS,KAAK;AAC7C,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,EAAE,aAAa,WAAW,OAAO,YAAY,GAAG,MAAM,QAAQ;AAAA,IAChE;AACA,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,GAAG,QAAQ,IAAI,UAAU,KAAK;AAAA,EAC9D,QAAQ;AACN,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,KAAK;AAAA,EACnC;AACF;AAQA,eAAsB,WACpB,QACA,aACA,OAAsC,CAAC,GACH;AACpC,SAAO;AAAA,IACL;AAAA,IACA,cAAc,gBAAgB,iBAAiB,WAAW,CAAC,YAAY,IAAI;AAAA,IAC3E;AAAA,EACF;AACF;AAQA,eAAsB,sBACpB,QACA,OAAsC,CAAC,GACH;AACpC,SAAO,uBAAuB,QAAQ,cAAc,+BAA+B,IAAI,GAAG,IAAI;AAChG;","names":[]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// src/query/fetchers/follow.ts
|
|
2
|
+
import {
|
|
3
|
+
apiFetch,
|
|
4
|
+
encodeIdentifier,
|
|
5
|
+
apiWrite
|
|
6
|
+
} from "../client.js";
|
|
7
|
+
async function fetchFollowing(config, opts = {}) {
|
|
8
|
+
const params = new URLSearchParams();
|
|
9
|
+
if (opts.source) params.set("source", opts.source);
|
|
10
|
+
if (opts.cursor) params.set("cursor", opts.cursor);
|
|
11
|
+
if (opts.limit) params.set("limit", String(opts.limit));
|
|
12
|
+
const qs = params.toString();
|
|
13
|
+
try {
|
|
14
|
+
return await apiFetch(config, `/api/following${qs ? `?${qs}` : ""}`, {
|
|
15
|
+
credentials: "include",
|
|
16
|
+
cache: "no-store",
|
|
17
|
+
...opts
|
|
18
|
+
});
|
|
19
|
+
} catch {
|
|
20
|
+
return { follows: [] };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function followUser(config, handle, opts = {}) {
|
|
24
|
+
const { note, ...rest } = opts;
|
|
25
|
+
return apiWrite(
|
|
26
|
+
config,
|
|
27
|
+
`/api/follow/${encodeIdentifier(handle)}`,
|
|
28
|
+
"POST",
|
|
29
|
+
{
|
|
30
|
+
body: note !== void 0 ? { note } : void 0,
|
|
31
|
+
...rest
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
function unfollowUser(config, handle, opts = {}) {
|
|
36
|
+
return apiWrite(config, `/api/follow/${encodeIdentifier(handle)}`, "DELETE", opts);
|
|
37
|
+
}
|
|
38
|
+
function buildListPath(prefix, opts) {
|
|
39
|
+
const params = new URLSearchParams();
|
|
40
|
+
if (opts.cursor) params.set("cursor", opts.cursor);
|
|
41
|
+
if (opts.limit) params.set("limit", String(opts.limit));
|
|
42
|
+
const qs = params.toString();
|
|
43
|
+
return `${prefix}${qs ? `?${qs}` : ""}`;
|
|
44
|
+
}
|
|
45
|
+
async function getFollowers(config, handle, opts = {}) {
|
|
46
|
+
const headers = { ...opts.headers ?? {} };
|
|
47
|
+
if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
|
|
48
|
+
try {
|
|
49
|
+
const res = await apiFetch(
|
|
50
|
+
config,
|
|
51
|
+
buildListPath(`/api/profile/${encodeIdentifier(handle)}/followers`, opts),
|
|
52
|
+
{ credentials: "include", cache: "no-store", ...opts, headers }
|
|
53
|
+
);
|
|
54
|
+
return { follows: res.follows, cursor: res.cursor ?? null };
|
|
55
|
+
} catch {
|
|
56
|
+
return { follows: [], cursor: null };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function getFollowing(config, handle, opts = {}) {
|
|
60
|
+
const headers = { ...opts.headers ?? {} };
|
|
61
|
+
if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
|
|
62
|
+
try {
|
|
63
|
+
const res = await apiFetch(
|
|
64
|
+
config,
|
|
65
|
+
buildListPath(`/api/profile/${encodeIdentifier(handle)}/following`, opts),
|
|
66
|
+
{ credentials: "include", cache: "no-store", ...opts, headers }
|
|
67
|
+
);
|
|
68
|
+
return { follows: res.follows, cursor: res.cursor ?? null };
|
|
69
|
+
} catch {
|
|
70
|
+
return { follows: [], cursor: null };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
var FOLLOWING_FEED_LXM = "id.sifa.feed.getFollowingFeed";
|
|
74
|
+
async function fetchFollowingFeed(config, opts = {}) {
|
|
75
|
+
const params = new URLSearchParams();
|
|
76
|
+
if (opts.limit) params.set("limit", String(opts.limit));
|
|
77
|
+
if (opts.app) params.set("app", opts.app);
|
|
78
|
+
else if (opts.includeBluesky) params.set("includeBluesky", "true");
|
|
79
|
+
const qs = params.toString();
|
|
80
|
+
const headers = { ...opts.headers ?? {} };
|
|
81
|
+
if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
|
|
82
|
+
if (config.getAuthToken) {
|
|
83
|
+
const token = await config.getAuthToken(FOLLOWING_FEED_LXM);
|
|
84
|
+
if (token) headers.Authorization = `Bearer ${token}`;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
return await apiFetch(
|
|
88
|
+
config,
|
|
89
|
+
`/api/following/feed${qs ? `?${qs}` : ""}`,
|
|
90
|
+
{ credentials: "include", cache: "no-store", ...opts, headers }
|
|
91
|
+
);
|
|
92
|
+
} catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export {
|
|
97
|
+
FOLLOWING_FEED_LXM,
|
|
98
|
+
fetchFollowing,
|
|
99
|
+
fetchFollowingFeed,
|
|
100
|
+
followUser,
|
|
101
|
+
getFollowers,
|
|
102
|
+
getFollowing,
|
|
103
|
+
unfollowUser
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=follow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/follow.ts"],"sourcesContent":["import {\n apiFetch,\n encodeIdentifier,\n apiWrite,\n type ApiFetchOptions,\n type SifaApiConfig,\n type WriteResult,\n} from '../client.js';\nimport type { ActivityFeedResponse } from './activity.js';\n\nexport interface FollowProfile {\n did: string;\n handle: string;\n displayName?: string;\n headline?: string;\n avatarUrl?: string;\n source: string;\n claimed: boolean;\n followedAt: string;\n blueskyVerified?: boolean;\n blueskyVerifiedAt?: string | null;\n}\n\nexport interface FollowingResponse {\n follows: FollowProfile[];\n cursor?: string;\n}\n\n/** People the authenticated user follows. Empty on error. */\nexport async function fetchFollowing(\n config: SifaApiConfig,\n opts: { source?: string; cursor?: string; limit?: number } & ApiFetchOptions = {},\n): Promise<FollowingResponse> {\n const params = new URLSearchParams();\n if (opts.source) params.set('source', opts.source);\n if (opts.cursor) params.set('cursor', opts.cursor);\n if (opts.limit) params.set('limit', String(opts.limit));\n const qs = params.toString();\n\n try {\n return await apiFetch<FollowingResponse>(config, `/api/following${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n cache: 'no-store',\n ...opts,\n });\n } catch {\n return { follows: [] };\n }\n}\n\n/**\n * Result of {@link followUser}. Extends {@link WriteResult} with the\n * follow `rkey` returned by sifa-api on success. Self-follow + invalid\n * handle surface as `success: false` with the server-provided message;\n * dup-follow is idempotent (sifa-api E7) and resolves as `success: true`.\n */\nexport interface FollowUserResult extends WriteResult {\n rkey?: string;\n /** DID of the followed subject (server-resolved from the handle). */\n subjectDid?: string;\n}\n\n/**\n * Create an `id.sifa.graph.follow` record on the caller's PDS via the\n * AppView. Idempotent on duplicate (server catches the unique-violation\n * and returns 200, per sifa-api#673 E7).\n */\nexport function followUser(\n config: SifaApiConfig,\n handle: string,\n opts: { note?: string } & Omit<ApiFetchOptions, 'method' | 'body'> = {},\n): Promise<FollowUserResult> {\n const { note, ...rest } = opts;\n return apiWrite<{ rkey?: string; subjectDid?: string }>(\n config,\n `/api/follow/${encodeIdentifier(handle)}`,\n 'POST',\n {\n body: note !== undefined ? { note } : undefined,\n ...rest,\n },\n );\n}\n\n/** Delete the authenticated viewer's `id.sifa.graph.follow` for `handle`. */\nexport function unfollowUser(\n config: SifaApiConfig,\n handle: string,\n opts: Omit<ApiFetchOptions, 'method' | 'body'> = {},\n): Promise<WriteResult> {\n return apiWrite(config, `/api/follow/${encodeIdentifier(handle)}`, 'DELETE', opts);\n}\n\nexport interface FollowListPage {\n follows: FollowProfile[];\n cursor: string | null;\n}\n\nexport interface FetchFollowListOptions extends ApiFetchOptions {\n cursor?: string;\n limit?: number;\n /**\n * Pass the caller's `Cookie` header on Next.js RSC server-side calls\n * (mirrors {@link FetchActivityFeedOptions}; required for authenticated\n * server fetches because `credentials: 'include'` does not propagate\n * cookies from RSC).\n */\n cookieHeader?: string;\n}\n\nfunction buildListPath(prefix: string, opts: FetchFollowListOptions): string {\n const params = new URLSearchParams();\n if (opts.cursor) params.set('cursor', opts.cursor);\n if (opts.limit) params.set('limit', String(opts.limit));\n const qs = params.toString();\n return `${prefix}${qs ? `?${qs}` : ''}`;\n}\n\n/**\n * Paginated list of `handle`'s followers. Returns an empty page on error\n * so the UI can render a graceful \"no followers yet\" state.\n */\nexport async function getFollowers(\n config: SifaApiConfig,\n handle: string,\n opts: FetchFollowListOptions = {},\n): Promise<FollowListPage> {\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n if (opts.cookieHeader) headers.cookie = opts.cookieHeader;\n try {\n const res = await apiFetch<{ follows: FollowProfile[]; cursor?: string | null }>(\n config,\n buildListPath(`/api/profile/${encodeIdentifier(handle)}/followers`, opts),\n { credentials: 'include', cache: 'no-store', ...opts, headers },\n );\n return { follows: res.follows, cursor: res.cursor ?? null };\n } catch {\n return { follows: [], cursor: null };\n }\n}\n\n/** Paginated list of who `handle` follows. */\nexport async function getFollowing(\n config: SifaApiConfig,\n handle: string,\n opts: FetchFollowListOptions = {},\n): Promise<FollowListPage> {\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n if (opts.cookieHeader) headers.cookie = opts.cookieHeader;\n try {\n const res = await apiFetch<{ follows: FollowProfile[]; cursor?: string | null }>(\n config,\n buildListPath(`/api/profile/${encodeIdentifier(handle)}/following`, opts),\n { credentials: 'include', cache: 'no-store', ...opts, headers },\n );\n return { follows: res.follows, cursor: res.cursor ?? null };\n } catch {\n return { follows: [], cursor: null };\n }\n}\n\n/** The method binding for the following-feed service-auth token; MUST match the\n * sifa-api endpoint's `lxm`. */\nexport const FOLLOWING_FEED_LXM = 'id.sifa.feed.getFollowingFeed';\n\n/** One app the viewer's network is active on, for the feed's source tabs. */\nexport interface FollowingFeedApp {\n /** Registry app id, e.g. `tangled`. Pass back as {@link FetchFollowingFeedOptions.app}. */\n id: string;\n name: string;\n /** Summed recent activity across the network; the tab ordering. */\n count: number;\n}\n\n/**\n * Why a following-feed page came back empty. Lets a client say something true\n * per case instead of one catch-all sentence, and point at the right next step.\n */\nexport type FollowingFeedEmptyReason =\n | 'no_follows'\n | 'no_visible_follows'\n | 'no_cross_app_activity'\n | 'no_recent_records'\n | 'all_hidden'\n | 'nothing_renderable'\n | 'hydration_failed';\n\n/** Options for {@link fetchFollowingFeed}. */\nexport interface FetchFollowingFeedOptions extends ApiFetchOptions {\n limit?: number;\n /**\n * Opt in to the viewer's Bluesky activity too. Off by default: the point of\n * the feed is what connections do on OTHER apps.\n *\n * Ignored when {@link app} is set, since a source tab selects one app.\n */\n includeBluesky?: boolean;\n /**\n * Restrict the page to one app (a registry id from the response's `apps`).\n * This is what a source tab selects. `app: 'bluesky'` selects Bluesky even\n * though it is excluded from the default mixed view.\n */\n app?: string;\n /** Forward a `Cookie` header on Next.js RSC server-side calls (web). */\n cookieHeader?: string;\n}\n\n/** The following feed's response: an activity feed plus its tab metadata. */\nexport interface FollowingFeedResponse extends ActivityFeedResponse {\n /**\n * Apps the viewer's network is actually active on, most active first.\n * Present on empty pages too, so a client's tabs survive a quiet tab.\n */\n apps?: FollowingFeedApp[];\n /** Set only when `items` is empty. */\n reason?: FollowingFeedEmptyReason;\n}\n\n/**\n * The viewer's cross-app following feed: what OTHER apps their connections use\n * (Tangled, WhiteWind, Smoke Signal, ...) — Bluesky is excluded server-side by\n * default, as it is the least interesting part and other apps already surface\n * it. Pass `includeBluesky: true` to bring it back in.\n *\n * Auth is identity-only server-side, so the NATIVE app supplies\n * `config.getAuthToken` to mint a service-auth Bearer, while WEB relies on its\n * session cookie (`credentials: 'include'`). Returns `null` on error. v1 is a\n * finite first page (no cursor yet).\n */\nexport async function fetchFollowingFeed(\n config: SifaApiConfig,\n opts: FetchFollowingFeedOptions = {},\n): Promise<FollowingFeedResponse | null> {\n const params = new URLSearchParams();\n if (opts.limit) params.set('limit', String(opts.limit));\n // A selected tab decides Bluesky on its own, so the flag is not also sent.\n if (opts.app) params.set('app', opts.app);\n else if (opts.includeBluesky) params.set('includeBluesky', 'true');\n const qs = params.toString();\n\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n if (opts.cookieHeader) headers.cookie = opts.cookieHeader;\n if (config.getAuthToken) {\n const token = await config.getAuthToken(FOLLOWING_FEED_LXM);\n if (token) headers.Authorization = `Bearer ${token}`;\n }\n\n try {\n return await apiFetch<FollowingFeedResponse>(\n config,\n `/api/following/feed${qs ? `?${qs}` : ''}`,\n { credentials: 'include', cache: 'no-store', ...opts, headers },\n );\n } catch {\n return null;\n }\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAsBP,eAAsB,eACpB,QACA,OAA+E,CAAC,GACpD;AAC5B,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,MAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,MAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACtD,QAAM,KAAK,OAAO,SAAS;AAE3B,MAAI;AACF,WAAO,MAAM,SAA4B,QAAQ,iBAAiB,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI;AAAA,MACtF,aAAa;AAAA,MACb,OAAO;AAAA,MACP,GAAG;AAAA,IACL,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,EAAE,SAAS,CAAC,EAAE;AAAA,EACvB;AACF;AAmBO,SAAS,WACd,QACA,QACA,OAAqE,CAAC,GAC3C;AAC3B,QAAM,EAAE,MAAM,GAAG,KAAK,IAAI;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,eAAe,iBAAiB,MAAM,CAAC;AAAA,IACvC;AAAA,IACA;AAAA,MACE,MAAM,SAAS,SAAY,EAAE,KAAK,IAAI;AAAA,MACtC,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAGO,SAAS,aACd,QACA,QACA,OAAiD,CAAC,GAC5B;AACtB,SAAO,SAAS,QAAQ,eAAe,iBAAiB,MAAM,CAAC,IAAI,UAAU,IAAI;AACnF;AAmBA,SAAS,cAAc,QAAgB,MAAsC;AAC3E,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,MAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACtD,QAAM,KAAK,OAAO,SAAS;AAC3B,SAAO,GAAG,MAAM,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE;AACvC;AAMA,eAAsB,aACpB,QACA,QACA,OAA+B,CAAC,GACP;AACzB,QAAM,UAAkC,EAAE,GAAI,KAAK,WAAW,CAAC,EAAG;AAClE,MAAI,KAAK,aAAc,SAAQ,SAAS,KAAK;AAC7C,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA,cAAc,gBAAgB,iBAAiB,MAAM,CAAC,cAAc,IAAI;AAAA,MACxE,EAAE,aAAa,WAAW,OAAO,YAAY,GAAG,MAAM,QAAQ;AAAA,IAChE;AACA,WAAO,EAAE,SAAS,IAAI,SAAS,QAAQ,IAAI,UAAU,KAAK;AAAA,EAC5D,QAAQ;AACN,WAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,KAAK;AAAA,EACrC;AACF;AAGA,eAAsB,aACpB,QACA,QACA,OAA+B,CAAC,GACP;AACzB,QAAM,UAAkC,EAAE,GAAI,KAAK,WAAW,CAAC,EAAG;AAClE,MAAI,KAAK,aAAc,SAAQ,SAAS,KAAK;AAC7C,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA,cAAc,gBAAgB,iBAAiB,MAAM,CAAC,cAAc,IAAI;AAAA,MACxE,EAAE,aAAa,WAAW,OAAO,YAAY,GAAG,MAAM,QAAQ;AAAA,IAChE;AACA,WAAO,EAAE,SAAS,IAAI,SAAS,QAAQ,IAAI,UAAU,KAAK;AAAA,EAC5D,QAAQ;AACN,WAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,KAAK;AAAA,EACrC;AACF;AAIO,IAAM,qBAAqB;AAkElC,eAAsB,mBACpB,QACA,OAAkC,CAAC,GACI;AACvC,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AAEtD,MAAI,KAAK,IAAK,QAAO,IAAI,OAAO,KAAK,GAAG;AAAA,WAC/B,KAAK,eAAgB,QAAO,IAAI,kBAAkB,MAAM;AACjE,QAAM,KAAK,OAAO,SAAS;AAE3B,QAAM,UAAkC,EAAE,GAAI,KAAK,WAAW,CAAC,EAAG;AAClE,MAAI,KAAK,aAAc,SAAQ,SAAS,KAAK;AAC7C,MAAI,OAAO,cAAc;AACvB,UAAM,QAAQ,MAAM,OAAO,aAAa,kBAAkB;AAC1D,QAAI,MAAO,SAAQ,gBAAgB,UAAU,KAAK;AAAA,EACpD;AAEA,MAAI;AACF,WAAO,MAAM;AAAA,MACX;AAAA,MACA,sBAAsB,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,MACxC,EAAE,aAAa,WAAW,OAAO,YAAY,GAAG,MAAM,QAAQ;AAAA,IAChE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// src/query/fetchers/get-profile-view.ts
|
|
2
|
+
import {
|
|
3
|
+
ApiError,
|
|
4
|
+
apiFetch,
|
|
5
|
+
encodeIdentifier
|
|
6
|
+
} from "../client.js";
|
|
7
|
+
async function fetchGetProfileView(config, actor, options = {}) {
|
|
8
|
+
const path = `/xrpc/id.sifa.getProfileView?actor=${encodeIdentifier(actor)}`;
|
|
9
|
+
try {
|
|
10
|
+
return await apiFetch(config, path, { retryOn429: true, ...options });
|
|
11
|
+
} catch (e) {
|
|
12
|
+
if (e instanceof ApiError && e.status === 400 && typeof e.body === "object" && e.body !== null && e.body.error === "ProfileNotFound") {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
throw e;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
fetchGetProfileView
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=get-profile-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/query/fetchers/get-profile-view.ts"],"sourcesContent":["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"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAaP,eAAsB,oBACpB,QACA,OACA,UAA2B,CAAC,GACC;AAC7B,QAAM,OAAO,sCAAsC,iBAAiB,KAAK,CAAC;AAC1E,MAAI;AACF,WAAO,MAAM,SAAsB,QAAQ,MAAM,EAAE,YAAY,MAAM,GAAG,QAAQ,CAAC;AAAA,EACnF,SAAS,GAAG;AACV,QACE,aAAa,YACb,EAAE,WAAW,OACb,OAAO,EAAE,SAAS,YAClB,EAAE,SAAS,QACV,EAAE,KAA6B,UAAU,mBAC1C;AACA,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;","names":[]}
|