@singi-labs/sifa-sdk 0.19.44 → 0.19.45
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.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 +100 -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 +29 -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 +1 -1
- package/dist/index.js +675 -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.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 +31 -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.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.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,369 @@
|
|
|
1
|
+
// src/cards/app-url-patterns.ts
|
|
2
|
+
var APP_URL_PATTERNS = Object.freeze({
|
|
3
|
+
bluesky: {
|
|
4
|
+
urlPattern: "https://bsky.app/profile/{handle}/post/{rkey}",
|
|
5
|
+
profileUrlPattern: "https://bsky.app/profile/{handle}"
|
|
6
|
+
},
|
|
7
|
+
tangled: {
|
|
8
|
+
profileUrlPattern: "https://tangled.sh/{handle}"
|
|
9
|
+
},
|
|
10
|
+
// Community-calendar events (community.lexicon.calendar.*, incl. records
|
|
11
|
+
// originally authored in the decommissioned Smoke Signal). atmo.rsvp resolves
|
|
12
|
+
// any such event by did+rkey, so links point there. Internal id kept as
|
|
13
|
+
// `smokesignal` for continuity with existing token/color keys.
|
|
14
|
+
smokesignal: {
|
|
15
|
+
urlPattern: "https://atmo.rsvp/p/{did}/e/{rkey}",
|
|
16
|
+
profileUrlPattern: "https://atmo.rsvp/p/{did}"
|
|
17
|
+
},
|
|
18
|
+
whitewind: {
|
|
19
|
+
urlPattern: "https://whtwnd.com/{handle}/{rkey}",
|
|
20
|
+
profileUrlPattern: "https://whtwnd.com/{handle}"
|
|
21
|
+
},
|
|
22
|
+
frontpage: {
|
|
23
|
+
urlPattern: "https://frontpage.fyi/post/{did}/{rkey}",
|
|
24
|
+
profileUrlPattern: "https://frontpage.fyi/profile/{did}"
|
|
25
|
+
},
|
|
26
|
+
linkat: {
|
|
27
|
+
profileUrlPattern: "https://linkat.blue/{handle}"
|
|
28
|
+
},
|
|
29
|
+
pastesphere: {
|
|
30
|
+
urlPattern: "https://pastesphere.link/user/{handle}/snippet/{rkey}",
|
|
31
|
+
profileUrlPattern: "https://pastesphere.link/user/{handle}"
|
|
32
|
+
},
|
|
33
|
+
kipclip: {
|
|
34
|
+
profileUrlPattern: "https://kipclip.com/{handle}"
|
|
35
|
+
},
|
|
36
|
+
keytrace: {
|
|
37
|
+
profileUrlPattern: "https://keytrace.dev/@{handle}"
|
|
38
|
+
},
|
|
39
|
+
sifa: {
|
|
40
|
+
profileUrlPattern: "https://sifa.id/p/{handle}"
|
|
41
|
+
},
|
|
42
|
+
popfeed: {
|
|
43
|
+
urlPattern: "https://popfeed.social/profile/{handle}",
|
|
44
|
+
profileUrlPattern: "https://popfeed.social/profile/{handle}"
|
|
45
|
+
},
|
|
46
|
+
streamplace: {
|
|
47
|
+
profileUrlPattern: "https://stream.place/{handle}"
|
|
48
|
+
},
|
|
49
|
+
semble: {
|
|
50
|
+
profileUrlPattern: "https://semble.so/profile/{handle}"
|
|
51
|
+
},
|
|
52
|
+
grain: {
|
|
53
|
+
urlPattern: "https://grain.social/profile/{did}/gallery/{rkey}",
|
|
54
|
+
profileUrlPattern: "https://grain.social/profile/{did}"
|
|
55
|
+
},
|
|
56
|
+
youandme: { profileUrlPattern: "https://youandme.at" },
|
|
57
|
+
// atmoBB per-item thread/reply URLs are built bespoke in resolve-card-url.ts
|
|
58
|
+
// (raw-colon /t/{did}/{rkey}); this is only the member-profile fallback.
|
|
59
|
+
atmobb: { profileUrlPattern: "https://atmobb.app/members/{did}" },
|
|
60
|
+
// anisota: upgraded with per-record URL pattern below.
|
|
61
|
+
margin: { profileUrlPattern: "https://margin.at" },
|
|
62
|
+
beaconbits: { profileUrlPattern: "https://beaconbits.app" },
|
|
63
|
+
bookhive: { profileUrlPattern: "https://bookhive.buzz/profile/{handle}" },
|
|
64
|
+
colibri: { profileUrlPattern: "https://colibri.social" },
|
|
65
|
+
collectivesocial: { profileUrlPattern: "https://app.collectivesocial.app" },
|
|
66
|
+
github: {},
|
|
67
|
+
asq: {
|
|
68
|
+
// Questions live at /q/{did}/{rkey}. Answer cards build their own URL
|
|
69
|
+
// from the parsed subject.uri (which points to the question), so the
|
|
70
|
+
// pattern below is invoked only for question records.
|
|
71
|
+
urlPattern: "https://asq.fyi/q/{did}/{rkey}",
|
|
72
|
+
profileUrlPattern: "https://asq.fyi"
|
|
73
|
+
},
|
|
74
|
+
passports: {
|
|
75
|
+
// Per-record URLs don't exist on passports.social — its SvelteKit routes
|
|
76
|
+
// stop at /profile/{handle}/{passport_slug}. Profile-level fallback only.
|
|
77
|
+
profileUrlPattern: "https://passports.social/profile/{handle}"
|
|
78
|
+
},
|
|
79
|
+
leaflet: {
|
|
80
|
+
// Per-document URLs are short and rkey-only: https://leaflet.pub/{rkey}.
|
|
81
|
+
// Each publication has its own base_path subdomain (e.g. zzstoatzz.leaflet.pub)
|
|
82
|
+
// but the canonical short URL renders the same document. There is no
|
|
83
|
+
// per-user profile route on leaflet.pub, so the profile fallback points
|
|
84
|
+
// at the marketing site.
|
|
85
|
+
urlPattern: "https://leaflet.pub/{rkey}",
|
|
86
|
+
profileUrlPattern: "https://leaflet.pub"
|
|
87
|
+
},
|
|
88
|
+
spark: {
|
|
89
|
+
// Verified live: GET /post/{did}/{rkey} returns 200.
|
|
90
|
+
urlPattern: "https://sprk.so/post/{did}/{rkey}",
|
|
91
|
+
profileUrlPattern: "https://sprk.so/profile/{handle}"
|
|
92
|
+
},
|
|
93
|
+
anisota: {
|
|
94
|
+
urlPattern: "https://anisota.net/post/{did}/{rkey}",
|
|
95
|
+
profileUrlPattern: "https://anisota.net/profile/{handle}"
|
|
96
|
+
},
|
|
97
|
+
nooki: {
|
|
98
|
+
// Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —
|
|
99
|
+
// can't be constructed from a record. Profile fallback only.
|
|
100
|
+
profileUrlPattern: "https://nooki.me/user/{handle}"
|
|
101
|
+
},
|
|
102
|
+
atstore: {
|
|
103
|
+
// atstore.fyi has no user-profile pages (the legacy `/@{handle}` pattern
|
|
104
|
+
// resolved to a 404), and no per-review deep link exists. The per-product
|
|
105
|
+
// page (https://atstore.fyi/products/{slug}) is the most specific URL
|
|
106
|
+
// available — resolveCardUrl builds it from record.listingMeta.slug,
|
|
107
|
+
// which sifa-api enriches by resolving the review's `subject` to the
|
|
108
|
+
// referenced listing.detail record.
|
|
109
|
+
profileUrlPattern: "https://atstore.fyi"
|
|
110
|
+
},
|
|
111
|
+
plyr: {
|
|
112
|
+
// SPA — per-record URLs require JS routing. plyr.fm doesn't expose a
|
|
113
|
+
// public per-handle profile page server-side either; falls back to root.
|
|
114
|
+
profileUrlPattern: "https://plyr.fm"
|
|
115
|
+
},
|
|
116
|
+
atfund: {
|
|
117
|
+
// at.fund is auth-gated — `/give/{did}` 307s to `/` when not signed in,
|
|
118
|
+
// and there's no public per-endorsement permalink. Profile fallback only,
|
|
119
|
+
// pointing at the main /give listing.
|
|
120
|
+
profileUrlPattern: "https://www.at.fund/give"
|
|
121
|
+
},
|
|
122
|
+
crate: {
|
|
123
|
+
// Crate (app.crate.social) is an authoring dashboard with no public
|
|
124
|
+
// per-record viewer or per-handle profile page — records are designed to
|
|
125
|
+
// render on the maker's own site. `content` cards link out via
|
|
126
|
+
// record.canonicalUrl (handled in resolveCardUrl); `note` records have no
|
|
127
|
+
// public URL and render non-clickable. So no app-level pattern applies.
|
|
128
|
+
},
|
|
129
|
+
guestbook: {
|
|
130
|
+
// Guestbook (dev.baileytownsend.guestbook) is a self-hosted, cross-site
|
|
131
|
+
// widget: each site owner renders their own guestbook wherever they choose,
|
|
132
|
+
// so there is no canonical public per-entry viewer or per-handle profile
|
|
133
|
+
// page. Entries render non-clickable. Same shape as crate `note`.
|
|
134
|
+
},
|
|
135
|
+
atmorsvp: {
|
|
136
|
+
// atmo.rsvp events live at /p/{did}/e/{rkey}. The per-item pattern is used
|
|
137
|
+
// for the event record itself; checkin records build their URL from the
|
|
138
|
+
// referenced event uri in resolveCardUrl (mirrors smokesignal rsvp).
|
|
139
|
+
urlPattern: "https://atmo.rsvp/p/{did}/e/{rkey}",
|
|
140
|
+
profileUrlPattern: "https://atmo.rsvp/p/{did}"
|
|
141
|
+
},
|
|
142
|
+
opensocial: {
|
|
143
|
+
// Open Social (opensocial.community) is community-management infrastructure
|
|
144
|
+
// with no public per-membership permalink. Profile fallback only.
|
|
145
|
+
profileUrlPattern: "https://opensocial.community"
|
|
146
|
+
},
|
|
147
|
+
atcommons: {
|
|
148
|
+
// eu.atcommons.member records are self-asserted and live in the member's
|
|
149
|
+
// own repo; the commons sites (atproto.eu, atproto.nl) render a single
|
|
150
|
+
// members directory with no per-member permalink. Profile fallback only.
|
|
151
|
+
profileUrlPattern: "https://atproto.eu/members"
|
|
152
|
+
},
|
|
153
|
+
kevara: {
|
|
154
|
+
// Kevara (professional network) has no live public web surface yet — its
|
|
155
|
+
// domain doesn't resolve and there's no per-record viewer. Recognized so
|
|
156
|
+
// the speaker-directory card renders with the right pill, but non-clickable.
|
|
157
|
+
},
|
|
158
|
+
atcr: {
|
|
159
|
+
// ATCR repositories live at /r/{handle}/{repository}, where the rkey of an
|
|
160
|
+
// io.atcr.repo.page record is the repository name. Verified live: GET
|
|
161
|
+
// /r/{handle}/{rkey} and /u/{handle} both return 200.
|
|
162
|
+
urlPattern: "https://atcr.io/r/{handle}/{rkey}",
|
|
163
|
+
profileUrlPattern: "https://atcr.io/u/{handle}"
|
|
164
|
+
},
|
|
165
|
+
kich: {
|
|
166
|
+
// Kich recipe viewer. Verified: GET /recipes/{rkey} returns 200 (the SPA
|
|
167
|
+
// renders the recipe by rkey); /recipe/{rkey} 404s. No public per-handle
|
|
168
|
+
// profile page, so the profile fallback points at the app root.
|
|
169
|
+
urlPattern: "https://kich.io/recipes/{rkey}",
|
|
170
|
+
profileUrlPattern: "https://kich.io"
|
|
171
|
+
},
|
|
172
|
+
pinksea: {
|
|
173
|
+
// PinkSea oekaki viewer. Verified live: GET /{did}/oekaki/{rkey} returns
|
|
174
|
+
// 200 AND its og:image resolves to harbor.pinksea.art/{did}/{blobCid}
|
|
175
|
+
// carrying the same CID as the record, so the route really is per-record
|
|
176
|
+
// and not just an SPA catch-all.
|
|
177
|
+
urlPattern: "https://pinksea.art/{did}/oekaki/{rkey}",
|
|
178
|
+
profileUrlPattern: "https://pinksea.art/{did}"
|
|
179
|
+
},
|
|
180
|
+
hypercerts: {
|
|
181
|
+
// No confirmed public per-record viewer. hyperscan.dev is a network-wide
|
|
182
|
+
// search explorer (its input takes "DID, handle, AT-URI, or PDS host"),
|
|
183
|
+
// and hypercerts.org 404s on every claim route tried. Recognized so the
|
|
184
|
+
// pill renders, but cards stay non-clickable.
|
|
185
|
+
},
|
|
186
|
+
certified: {
|
|
187
|
+
// certified.app is fully client-rendered and returns an identical
|
|
188
|
+
// "Loading" shell for a real DID and a nonsense one, so no per-record
|
|
189
|
+
// route could be verified. Non-clickable until one is confirmed.
|
|
190
|
+
},
|
|
191
|
+
impactindexer: {
|
|
192
|
+
// Reviews are surfaced through hyperscan.dev/review, which has no
|
|
193
|
+
// per-record route. Non-clickable.
|
|
194
|
+
},
|
|
195
|
+
recipe: {
|
|
196
|
+
// recipe.exchange viewer. Verified: GET /recipes/{rkey} returns 200 (rkey
|
|
197
|
+
// alone; no did needed) and /profiles/{handle} returns 200 for the author
|
|
198
|
+
// page. /recipe/{rkey} 404s.
|
|
199
|
+
urlPattern: "https://recipe.exchange/recipes/{rkey}",
|
|
200
|
+
profileUrlPattern: "https://recipe.exchange/profiles/{handle}"
|
|
201
|
+
},
|
|
202
|
+
aetherdocs: {
|
|
203
|
+
// Aether OS is a browser OS — presentations open inside it and there's no
|
|
204
|
+
// public per-record viewer. The card embeds the deck from the record; the
|
|
205
|
+
// outbound link points at the author's Aether OS space (mirrors aetheros).
|
|
206
|
+
profileUrlPattern: "https://aetheros.computer/{handle}"
|
|
207
|
+
},
|
|
208
|
+
zeens: {
|
|
209
|
+
// Zeens (zeens.app) still uses its former app.photosky.* namespace. The
|
|
210
|
+
// app redirects /collection/{handle}/{rkey} to the canonical path below.
|
|
211
|
+
urlPattern: "https://zeens.app/profile/{handle}/collections/{rkey}",
|
|
212
|
+
profileUrlPattern: "https://zeens.app/profile/{handle}"
|
|
213
|
+
},
|
|
214
|
+
chive: {
|
|
215
|
+
// Chive's eprint route is a catch-all that decodes a single URI-encoded
|
|
216
|
+
// at-uri segment: /eprints/<encodeURIComponent(at://did/nsid/rkey)>.
|
|
217
|
+
// {did} and {rkey} are URI-encoded on interpolation, so the separators
|
|
218
|
+
// are pre-encoded as literals here rather than resolved bespoke.
|
|
219
|
+
urlPattern: "https://chive.pub/eprints/at%3A%2F%2F{did}%2Fpub.chive.eprint.submission%2F{rkey}",
|
|
220
|
+
profileUrlPattern: "https://chive.pub/authors/{did}"
|
|
221
|
+
},
|
|
222
|
+
dropanchor: {
|
|
223
|
+
// Dropanchor (dropanchor.app) renders each check-in at /checkin/{rkey} —
|
|
224
|
+
// the record's own rkey, no did/handle needed. Documented as the OG-tagged
|
|
225
|
+
// share URL in the dropanchorapp repos. A self-permalink for this record.
|
|
226
|
+
urlPattern: "https://dropanchor.app/checkin/{rkey}"
|
|
227
|
+
},
|
|
228
|
+
askeverything: {
|
|
229
|
+
// Ask Everything (askeverything.app) keys its public answer route
|
|
230
|
+
// (/answer/{id}) on an internal DB id, not the atproto rkey, so there's no
|
|
231
|
+
// per-record permalink we can build from {did, rkey}. Its profile route
|
|
232
|
+
// /profile/{handle} does resolve by atproto handle, so fall back to that.
|
|
233
|
+
profileUrlPattern: "https://askeverything.app/profile/{handle}"
|
|
234
|
+
},
|
|
235
|
+
greengale: {
|
|
236
|
+
// GreenGale (greengale.app) renders each blog entry at /{handle}/{rkey}.
|
|
237
|
+
// Verified live against a real post. Self-permalink for this record.
|
|
238
|
+
urlPattern: "https://greengale.app/{handle}/{rkey}",
|
|
239
|
+
profileUrlPattern: "https://greengale.app/{handle}"
|
|
240
|
+
},
|
|
241
|
+
kut: {
|
|
242
|
+
// Kut (kut.social) is a community app. A membership record has no page of
|
|
243
|
+
// its own; the card links to the community it joined, built from the
|
|
244
|
+
// membership's community.uri in resolve-card-url. Homepage fallback only.
|
|
245
|
+
profileUrlPattern: "https://kut.social"
|
|
246
|
+
},
|
|
247
|
+
atmob: {
|
|
248
|
+
// atmob (atmob.in) is a paste app. Its SPA viewer renders any paste by its
|
|
249
|
+
// full at-uri via a `?uri=` query param (verified in the app's app.js:
|
|
250
|
+
// `location.search = ?uri=${encodeURIComponent(uri)}`). Both paste.document
|
|
251
|
+
// and paste.bundle share that viewer, so the per-record URL is built
|
|
252
|
+
// bespoke from the item's own uri in resolve-card-url. No pattern here.
|
|
253
|
+
},
|
|
254
|
+
tokono: {
|
|
255
|
+
// tokono (tokono.ma) hosts "bring your own video" records, but tokono.ma is
|
|
256
|
+
// the owner's static personal site with no public per-video viewer route.
|
|
257
|
+
// Cards render non-clickable.
|
|
258
|
+
},
|
|
259
|
+
portable: {
|
|
260
|
+
// agency.portable (handle portable.agency) has no resolving website, and a
|
|
261
|
+
// membership record has no page of its own. Cards render non-clickable.
|
|
262
|
+
},
|
|
263
|
+
rpgactor: {
|
|
264
|
+
// rpg.actor renders one character page per player, holding the sprite and
|
|
265
|
+
// every equipped item. Sprites (rkey self) and items (rkey = item id) have
|
|
266
|
+
// no page of their own, so both link to the player. Verified live:
|
|
267
|
+
// GET /{handle} returns 200 with og:url https://rpg.actor/{handle}.
|
|
268
|
+
profileUrlPattern: "https://rpg.actor/{handle}"
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
var COLLECTION_TO_APP = [
|
|
272
|
+
["app.bsky.", "bluesky"],
|
|
273
|
+
["sh.tangled.", "tangled"],
|
|
274
|
+
["events.smokesignal.", "smokesignal"],
|
|
275
|
+
["community.lexicon.calendar.", "smokesignal"],
|
|
276
|
+
["community.lexicon.bookmarks.", "kipclip"],
|
|
277
|
+
["com.kipclip.", "kipclip"],
|
|
278
|
+
["blue.flashes.", "flashes"],
|
|
279
|
+
["social.grain.", "grain"],
|
|
280
|
+
["pics.pixl.", "pixl"],
|
|
281
|
+
["com.whtwnd.", "whitewind"],
|
|
282
|
+
["fyi.unravel.frontpage.", "frontpage"],
|
|
283
|
+
["social.psky.", "picosky"],
|
|
284
|
+
["blue.linkat.", "linkat"],
|
|
285
|
+
["link.pastesphere.", "pastesphere"],
|
|
286
|
+
["site.standard.", "standard"],
|
|
287
|
+
["computer.aetheros.", "aetheros"],
|
|
288
|
+
["space.roomy.", "roomy"],
|
|
289
|
+
["dev.keytrace.", "keytrace"],
|
|
290
|
+
["social.popfeed.", "popfeed"],
|
|
291
|
+
["app.popsky.", "popfeed"],
|
|
292
|
+
["place.stream.", "streamplace"],
|
|
293
|
+
["app.sidetrail.", "semble"],
|
|
294
|
+
["network.cosmik.", "cosmik"],
|
|
295
|
+
["id.sifa.", "sifa"],
|
|
296
|
+
["forum.barazo.", "barazo"],
|
|
297
|
+
["xyz.statusphere.", "statusphere"],
|
|
298
|
+
["at.youandme.", "youandme"],
|
|
299
|
+
["net.anisota.", "anisota"],
|
|
300
|
+
["at.margin.", "margin"],
|
|
301
|
+
["app.beaconbits.", "beaconbits"],
|
|
302
|
+
["buzz.bookhive.", "bookhive"],
|
|
303
|
+
["social.colibri.", "colibri"],
|
|
304
|
+
["social.passports.", "passports"],
|
|
305
|
+
["fyi.asq.", "asq"],
|
|
306
|
+
["pub.leaflet.", "leaflet"],
|
|
307
|
+
["so.sprk.", "spark"],
|
|
308
|
+
["community.nooki.", "nooki"],
|
|
309
|
+
["fyi.atstore.", "atstore"],
|
|
310
|
+
["fm.plyr.", "plyr"],
|
|
311
|
+
["fund.at.", "atfund"],
|
|
312
|
+
["social.crate.", "crate"],
|
|
313
|
+
["quest.atmo.", "atmorsvp"],
|
|
314
|
+
["community.opensocial.", "opensocial"],
|
|
315
|
+
["eu.atcommons.", "atcommons"],
|
|
316
|
+
["is.kevara.", "kevara"],
|
|
317
|
+
["io.atcr.", "atcr"],
|
|
318
|
+
// Batch onboard — named pills for apps that were leaking as raw NSIDs.
|
|
319
|
+
["app.mcp.", "mcp"],
|
|
320
|
+
["app.userinput.", "userinput"],
|
|
321
|
+
["com.minomobi.", "minomobi"],
|
|
322
|
+
["com.voxport.", "voxport"],
|
|
323
|
+
["community.lexicon.badge.", "badges"],
|
|
324
|
+
["dev.atvouch.", "atvouch"],
|
|
325
|
+
["io.calabro.watsm.", "watsm"],
|
|
326
|
+
["li.plonk.", "plonk"],
|
|
327
|
+
["net.alternativeproto.", "alternativeproto"],
|
|
328
|
+
["one.papili.", "papili"],
|
|
329
|
+
["org.v-it.", "vit"],
|
|
330
|
+
["st.lifepo.", "lifepo"],
|
|
331
|
+
["stream.thought.", "streamthought"],
|
|
332
|
+
["tech.waow.", "waow"],
|
|
333
|
+
["wiki.lichen.", "lichen"],
|
|
334
|
+
// Onboard from aramzs.xyz profile audit.
|
|
335
|
+
["os.aether.", "aetherdocs"],
|
|
336
|
+
["io.kich.recipe.recipe", "kich"],
|
|
337
|
+
// Onboard from moll.dev profile audit.
|
|
338
|
+
["exchange.recipe.recipe", "recipe"],
|
|
339
|
+
// Onboard from willow.sh profile audit.
|
|
340
|
+
["dev.baileytownsend.guestbook.", "guestbook"],
|
|
341
|
+
// Onboard from trezy.codes profile audit.
|
|
342
|
+
["app.atmobb.", "atmobb"],
|
|
343
|
+
// Onboard from aaronstevenwhite.io profile audit.
|
|
344
|
+
["pub.chive.", "chive"],
|
|
345
|
+
// Onboard from helene-cook.eu profile audit. Zeens kept its old NSID.
|
|
346
|
+
["app.photosky.", "zeens"],
|
|
347
|
+
// Onboard from the holke.xyz profile audit.
|
|
348
|
+
["org.hypercerts.", "hypercerts"],
|
|
349
|
+
["app.certified.", "certified"],
|
|
350
|
+
["org.impactindexer.", "impactindexer"],
|
|
351
|
+
["com.shinolabs.pinksea.", "pinksea"],
|
|
352
|
+
// Onboard from tijs.org profile audit.
|
|
353
|
+
["app.dropanchor.", "dropanchor"],
|
|
354
|
+
// Onboard from angrydutchman.houseofmadness.org profile audit.
|
|
355
|
+
["app.askeverything.", "askeverything"],
|
|
356
|
+
["app.greengale.", "greengale"],
|
|
357
|
+
["social.kut.", "kut"],
|
|
358
|
+
// Onboard from the upcoming profile-of-the-day audit.
|
|
359
|
+
["in.atmob.paste.", "atmob"],
|
|
360
|
+
["ma.tokono.byov.", "tokono"],
|
|
361
|
+
["agency.portable.", "portable"],
|
|
362
|
+
["actor.rpg.", "rpgactor"],
|
|
363
|
+
["equipment.rpg.", "rpgactor"]
|
|
364
|
+
];
|
|
365
|
+
export {
|
|
366
|
+
APP_URL_PATTERNS,
|
|
367
|
+
COLLECTION_TO_APP
|
|
368
|
+
};
|
|
369
|
+
//# sourceMappingURL=app-url-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cards/app-url-patterns.ts"],"sourcesContent":["/**\n * URL patterns per app, mirroring the sifa-web registry.\n *\n * These describe how to build a clickable URL for an activity card given\n * the author's handle/did and the record rkey. The patterns are templates\n * with `{handle}`, `{did}`, and `{rkey}` placeholders; each variable is\n * URI-encoded when interpolated.\n *\n * Tier semantics:\n * - `urlPattern`: per-item URL (a specific post/event/repo). Preferred.\n * - `profileUrlPattern`: per-user profile URL on the app. Fallback.\n *\n * Apps without either pattern are not clickable.\n */\nexport interface AppUrlPatterns {\n urlPattern?: string;\n profileUrlPattern?: string;\n}\n\nexport const APP_URL_PATTERNS: Readonly<Record<string, AppUrlPatterns>> = Object.freeze({\n bluesky: {\n urlPattern: 'https://bsky.app/profile/{handle}/post/{rkey}',\n profileUrlPattern: 'https://bsky.app/profile/{handle}',\n },\n tangled: {\n profileUrlPattern: 'https://tangled.sh/{handle}',\n },\n // Community-calendar events (community.lexicon.calendar.*, incl. records\n // originally authored in the decommissioned Smoke Signal). atmo.rsvp resolves\n // any such event by did+rkey, so links point there. Internal id kept as\n // `smokesignal` for continuity with existing token/color keys.\n smokesignal: {\n urlPattern: 'https://atmo.rsvp/p/{did}/e/{rkey}',\n profileUrlPattern: 'https://atmo.rsvp/p/{did}',\n },\n whitewind: {\n urlPattern: 'https://whtwnd.com/{handle}/{rkey}',\n profileUrlPattern: 'https://whtwnd.com/{handle}',\n },\n frontpage: {\n urlPattern: 'https://frontpage.fyi/post/{did}/{rkey}',\n profileUrlPattern: 'https://frontpage.fyi/profile/{did}',\n },\n linkat: {\n profileUrlPattern: 'https://linkat.blue/{handle}',\n },\n pastesphere: {\n urlPattern: 'https://pastesphere.link/user/{handle}/snippet/{rkey}',\n profileUrlPattern: 'https://pastesphere.link/user/{handle}',\n },\n kipclip: {\n profileUrlPattern: 'https://kipclip.com/{handle}',\n },\n keytrace: {\n profileUrlPattern: 'https://keytrace.dev/@{handle}',\n },\n sifa: {\n profileUrlPattern: 'https://sifa.id/p/{handle}',\n },\n popfeed: {\n urlPattern: 'https://popfeed.social/profile/{handle}',\n profileUrlPattern: 'https://popfeed.social/profile/{handle}',\n },\n streamplace: {\n profileUrlPattern: 'https://stream.place/{handle}',\n },\n semble: {\n profileUrlPattern: 'https://semble.so/profile/{handle}',\n },\n grain: {\n urlPattern: 'https://grain.social/profile/{did}/gallery/{rkey}',\n profileUrlPattern: 'https://grain.social/profile/{did}',\n },\n youandme: { profileUrlPattern: 'https://youandme.at' },\n // atmoBB per-item thread/reply URLs are built bespoke in resolve-card-url.ts\n // (raw-colon /t/{did}/{rkey}); this is only the member-profile fallback.\n atmobb: { profileUrlPattern: 'https://atmobb.app/members/{did}' },\n // anisota: upgraded with per-record URL pattern below.\n margin: { profileUrlPattern: 'https://margin.at' },\n beaconbits: { profileUrlPattern: 'https://beaconbits.app' },\n bookhive: { profileUrlPattern: 'https://bookhive.buzz/profile/{handle}' },\n colibri: { profileUrlPattern: 'https://colibri.social' },\n collectivesocial: { profileUrlPattern: 'https://app.collectivesocial.app' },\n github: {},\n asq: {\n // Questions live at /q/{did}/{rkey}. Answer cards build their own URL\n // from the parsed subject.uri (which points to the question), so the\n // pattern below is invoked only for question records.\n urlPattern: 'https://asq.fyi/q/{did}/{rkey}',\n profileUrlPattern: 'https://asq.fyi',\n },\n passports: {\n // Per-record URLs don't exist on passports.social — its SvelteKit routes\n // stop at /profile/{handle}/{passport_slug}. Profile-level fallback only.\n profileUrlPattern: 'https://passports.social/profile/{handle}',\n },\n leaflet: {\n // Per-document URLs are short and rkey-only: https://leaflet.pub/{rkey}.\n // Each publication has its own base_path subdomain (e.g. zzstoatzz.leaflet.pub)\n // but the canonical short URL renders the same document. There is no\n // per-user profile route on leaflet.pub, so the profile fallback points\n // at the marketing site.\n urlPattern: 'https://leaflet.pub/{rkey}',\n profileUrlPattern: 'https://leaflet.pub',\n },\n spark: {\n // Verified live: GET /post/{did}/{rkey} returns 200.\n urlPattern: 'https://sprk.so/post/{did}/{rkey}',\n profileUrlPattern: 'https://sprk.so/profile/{handle}',\n },\n anisota: {\n urlPattern: 'https://anisota.net/post/{did}/{rkey}',\n profileUrlPattern: 'https://anisota.net/profile/{handle}',\n },\n nooki: {\n // Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —\n // can't be constructed from a record. Profile fallback only.\n profileUrlPattern: 'https://nooki.me/user/{handle}',\n },\n atstore: {\n // atstore.fyi has no user-profile pages (the legacy `/@{handle}` pattern\n // resolved to a 404), and no per-review deep link exists. The per-product\n // page (https://atstore.fyi/products/{slug}) is the most specific URL\n // available — resolveCardUrl builds it from record.listingMeta.slug,\n // which sifa-api enriches by resolving the review's `subject` to the\n // referenced listing.detail record.\n profileUrlPattern: 'https://atstore.fyi',\n },\n plyr: {\n // SPA — per-record URLs require JS routing. plyr.fm doesn't expose a\n // public per-handle profile page server-side either; falls back to root.\n profileUrlPattern: 'https://plyr.fm',\n },\n atfund: {\n // at.fund is auth-gated — `/give/{did}` 307s to `/` when not signed in,\n // and there's no public per-endorsement permalink. Profile fallback only,\n // pointing at the main /give listing.\n profileUrlPattern: 'https://www.at.fund/give',\n },\n crate: {\n // Crate (app.crate.social) is an authoring dashboard with no public\n // per-record viewer or per-handle profile page — records are designed to\n // render on the maker's own site. `content` cards link out via\n // record.canonicalUrl (handled in resolveCardUrl); `note` records have no\n // public URL and render non-clickable. So no app-level pattern applies.\n },\n guestbook: {\n // Guestbook (dev.baileytownsend.guestbook) is a self-hosted, cross-site\n // widget: each site owner renders their own guestbook wherever they choose,\n // so there is no canonical public per-entry viewer or per-handle profile\n // page. Entries render non-clickable. Same shape as crate `note`.\n },\n atmorsvp: {\n // atmo.rsvp events live at /p/{did}/e/{rkey}. The per-item pattern is used\n // for the event record itself; checkin records build their URL from the\n // referenced event uri in resolveCardUrl (mirrors smokesignal rsvp).\n urlPattern: 'https://atmo.rsvp/p/{did}/e/{rkey}',\n profileUrlPattern: 'https://atmo.rsvp/p/{did}',\n },\n opensocial: {\n // Open Social (opensocial.community) is community-management infrastructure\n // with no public per-membership permalink. Profile fallback only.\n profileUrlPattern: 'https://opensocial.community',\n },\n atcommons: {\n // eu.atcommons.member records are self-asserted and live in the member's\n // own repo; the commons sites (atproto.eu, atproto.nl) render a single\n // members directory with no per-member permalink. Profile fallback only.\n profileUrlPattern: 'https://atproto.eu/members',\n },\n kevara: {\n // Kevara (professional network) has no live public web surface yet — its\n // domain doesn't resolve and there's no per-record viewer. Recognized so\n // the speaker-directory card renders with the right pill, but non-clickable.\n },\n atcr: {\n // ATCR repositories live at /r/{handle}/{repository}, where the rkey of an\n // io.atcr.repo.page record is the repository name. Verified live: GET\n // /r/{handle}/{rkey} and /u/{handle} both return 200.\n urlPattern: 'https://atcr.io/r/{handle}/{rkey}',\n profileUrlPattern: 'https://atcr.io/u/{handle}',\n },\n kich: {\n // Kich recipe viewer. Verified: GET /recipes/{rkey} returns 200 (the SPA\n // renders the recipe by rkey); /recipe/{rkey} 404s. No public per-handle\n // profile page, so the profile fallback points at the app root.\n urlPattern: 'https://kich.io/recipes/{rkey}',\n profileUrlPattern: 'https://kich.io',\n },\n pinksea: {\n // PinkSea oekaki viewer. Verified live: GET /{did}/oekaki/{rkey} returns\n // 200 AND its og:image resolves to harbor.pinksea.art/{did}/{blobCid}\n // carrying the same CID as the record, so the route really is per-record\n // and not just an SPA catch-all.\n urlPattern: 'https://pinksea.art/{did}/oekaki/{rkey}',\n profileUrlPattern: 'https://pinksea.art/{did}',\n },\n hypercerts: {\n // No confirmed public per-record viewer. hyperscan.dev is a network-wide\n // search explorer (its input takes \"DID, handle, AT-URI, or PDS host\"),\n // and hypercerts.org 404s on every claim route tried. Recognized so the\n // pill renders, but cards stay non-clickable.\n },\n certified: {\n // certified.app is fully client-rendered and returns an identical\n // \"Loading\" shell for a real DID and a nonsense one, so no per-record\n // route could be verified. Non-clickable until one is confirmed.\n },\n impactindexer: {\n // Reviews are surfaced through hyperscan.dev/review, which has no\n // per-record route. Non-clickable.\n },\n recipe: {\n // recipe.exchange viewer. Verified: GET /recipes/{rkey} returns 200 (rkey\n // alone; no did needed) and /profiles/{handle} returns 200 for the author\n // page. /recipe/{rkey} 404s.\n urlPattern: 'https://recipe.exchange/recipes/{rkey}',\n profileUrlPattern: 'https://recipe.exchange/profiles/{handle}',\n },\n aetherdocs: {\n // Aether OS is a browser OS — presentations open inside it and there's no\n // public per-record viewer. The card embeds the deck from the record; the\n // outbound link points at the author's Aether OS space (mirrors aetheros).\n profileUrlPattern: 'https://aetheros.computer/{handle}',\n },\n zeens: {\n // Zeens (zeens.app) still uses its former app.photosky.* namespace. The\n // app redirects /collection/{handle}/{rkey} to the canonical path below.\n urlPattern: 'https://zeens.app/profile/{handle}/collections/{rkey}',\n profileUrlPattern: 'https://zeens.app/profile/{handle}',\n },\n chive: {\n // Chive's eprint route is a catch-all that decodes a single URI-encoded\n // at-uri segment: /eprints/<encodeURIComponent(at://did/nsid/rkey)>.\n // {did} and {rkey} are URI-encoded on interpolation, so the separators\n // are pre-encoded as literals here rather than resolved bespoke.\n urlPattern: 'https://chive.pub/eprints/at%3A%2F%2F{did}%2Fpub.chive.eprint.submission%2F{rkey}',\n profileUrlPattern: 'https://chive.pub/authors/{did}',\n },\n dropanchor: {\n // Dropanchor (dropanchor.app) renders each check-in at /checkin/{rkey} —\n // the record's own rkey, no did/handle needed. Documented as the OG-tagged\n // share URL in the dropanchorapp repos. A self-permalink for this record.\n urlPattern: 'https://dropanchor.app/checkin/{rkey}',\n },\n askeverything: {\n // Ask Everything (askeverything.app) keys its public answer route\n // (/answer/{id}) on an internal DB id, not the atproto rkey, so there's no\n // per-record permalink we can build from {did, rkey}. Its profile route\n // /profile/{handle} does resolve by atproto handle, so fall back to that.\n profileUrlPattern: 'https://askeverything.app/profile/{handle}',\n },\n greengale: {\n // GreenGale (greengale.app) renders each blog entry at /{handle}/{rkey}.\n // Verified live against a real post. Self-permalink for this record.\n urlPattern: 'https://greengale.app/{handle}/{rkey}',\n profileUrlPattern: 'https://greengale.app/{handle}',\n },\n kut: {\n // Kut (kut.social) is a community app. A membership record has no page of\n // its own; the card links to the community it joined, built from the\n // membership's community.uri in resolve-card-url. Homepage fallback only.\n profileUrlPattern: 'https://kut.social',\n },\n atmob: {\n // atmob (atmob.in) is a paste app. Its SPA viewer renders any paste by its\n // full at-uri via a `?uri=` query param (verified in the app's app.js:\n // `location.search = ?uri=${encodeURIComponent(uri)}`). Both paste.document\n // and paste.bundle share that viewer, so the per-record URL is built\n // bespoke from the item's own uri in resolve-card-url. No pattern here.\n },\n tokono: {\n // tokono (tokono.ma) hosts \"bring your own video\" records, but tokono.ma is\n // the owner's static personal site with no public per-video viewer route.\n // Cards render non-clickable.\n },\n portable: {\n // agency.portable (handle portable.agency) has no resolving website, and a\n // membership record has no page of its own. Cards render non-clickable.\n },\n rpgactor: {\n // rpg.actor renders one character page per player, holding the sprite and\n // every equipped item. Sprites (rkey self) and items (rkey = item id) have\n // no page of their own, so both link to the player. Verified live:\n // GET /{handle} returns 200 with og:url https://rpg.actor/{handle}.\n profileUrlPattern: 'https://rpg.actor/{handle}',\n },\n});\n\n/**\n * Map collection NSID prefixes to app ids. Order matters: longer / more\n * specific prefixes must come before broader ones.\n */\nexport const COLLECTION_TO_APP: ReadonlyArray<readonly [prefix: string, appId: string]> = [\n ['app.bsky.', 'bluesky'],\n ['sh.tangled.', 'tangled'],\n ['events.smokesignal.', 'smokesignal'],\n ['community.lexicon.calendar.', 'smokesignal'],\n ['community.lexicon.bookmarks.', 'kipclip'],\n ['com.kipclip.', 'kipclip'],\n ['blue.flashes.', 'flashes'],\n ['social.grain.', 'grain'],\n ['pics.pixl.', 'pixl'],\n ['com.whtwnd.', 'whitewind'],\n ['fyi.unravel.frontpage.', 'frontpage'],\n ['social.psky.', 'picosky'],\n ['blue.linkat.', 'linkat'],\n ['link.pastesphere.', 'pastesphere'],\n ['site.standard.', 'standard'],\n ['computer.aetheros.', 'aetheros'],\n ['space.roomy.', 'roomy'],\n ['dev.keytrace.', 'keytrace'],\n ['social.popfeed.', 'popfeed'],\n ['app.popsky.', 'popfeed'],\n ['place.stream.', 'streamplace'],\n ['app.sidetrail.', 'semble'],\n ['network.cosmik.', 'cosmik'],\n ['id.sifa.', 'sifa'],\n ['forum.barazo.', 'barazo'],\n ['xyz.statusphere.', 'statusphere'],\n ['at.youandme.', 'youandme'],\n ['net.anisota.', 'anisota'],\n ['at.margin.', 'margin'],\n ['app.beaconbits.', 'beaconbits'],\n ['buzz.bookhive.', 'bookhive'],\n ['social.colibri.', 'colibri'],\n ['social.passports.', 'passports'],\n ['fyi.asq.', 'asq'],\n ['pub.leaflet.', 'leaflet'],\n ['so.sprk.', 'spark'],\n ['community.nooki.', 'nooki'],\n ['fyi.atstore.', 'atstore'],\n ['fm.plyr.', 'plyr'],\n ['fund.at.', 'atfund'],\n ['social.crate.', 'crate'],\n ['quest.atmo.', 'atmorsvp'],\n ['community.opensocial.', 'opensocial'],\n ['eu.atcommons.', 'atcommons'],\n ['is.kevara.', 'kevara'],\n ['io.atcr.', 'atcr'],\n // Batch onboard — named pills for apps that were leaking as raw NSIDs.\n ['app.mcp.', 'mcp'],\n ['app.userinput.', 'userinput'],\n ['com.minomobi.', 'minomobi'],\n ['com.voxport.', 'voxport'],\n ['community.lexicon.badge.', 'badges'],\n ['dev.atvouch.', 'atvouch'],\n ['io.calabro.watsm.', 'watsm'],\n ['li.plonk.', 'plonk'],\n ['net.alternativeproto.', 'alternativeproto'],\n ['one.papili.', 'papili'],\n ['org.v-it.', 'vit'],\n ['st.lifepo.', 'lifepo'],\n ['stream.thought.', 'streamthought'],\n ['tech.waow.', 'waow'],\n ['wiki.lichen.', 'lichen'],\n // Onboard from aramzs.xyz profile audit.\n ['os.aether.', 'aetherdocs'],\n ['io.kich.recipe.recipe', 'kich'],\n // Onboard from moll.dev profile audit.\n ['exchange.recipe.recipe', 'recipe'],\n // Onboard from willow.sh profile audit.\n ['dev.baileytownsend.guestbook.', 'guestbook'],\n // Onboard from trezy.codes profile audit.\n ['app.atmobb.', 'atmobb'],\n // Onboard from aaronstevenwhite.io profile audit.\n ['pub.chive.', 'chive'],\n // Onboard from helene-cook.eu profile audit. Zeens kept its old NSID.\n ['app.photosky.', 'zeens'],\n // Onboard from the holke.xyz profile audit.\n ['org.hypercerts.', 'hypercerts'],\n ['app.certified.', 'certified'],\n ['org.impactindexer.', 'impactindexer'],\n ['com.shinolabs.pinksea.', 'pinksea'],\n // Onboard from tijs.org profile audit.\n ['app.dropanchor.', 'dropanchor'],\n // Onboard from angrydutchman.houseofmadness.org profile audit.\n ['app.askeverything.', 'askeverything'],\n ['app.greengale.', 'greengale'],\n ['social.kut.', 'kut'],\n // Onboard from the upcoming profile-of-the-day audit.\n ['in.atmob.paste.', 'atmob'],\n ['ma.tokono.byov.', 'tokono'],\n ['agency.portable.', 'portable'],\n ['actor.rpg.', 'rpgactor'],\n ['equipment.rpg.', 'rpgactor'],\n];\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/cards/index.ts
|
|
2
|
+
import { APP_URL_PATTERNS, COLLECTION_TO_APP } from "./app-url-patterns.js";
|
|
3
|
+
import {
|
|
4
|
+
getAppIdForCollection,
|
|
5
|
+
resolveCardHealth,
|
|
6
|
+
resolveCardUrl
|
|
7
|
+
} from "./resolve-card-url.js";
|
|
8
|
+
import { ACTIVITY_VISIBILITY_RULES, isVisibleActivityItem } from "./visibility.js";
|
|
9
|
+
import {
|
|
10
|
+
ADULT_CONTENT_LABELS,
|
|
11
|
+
hasAdultContent
|
|
12
|
+
} from "./adult-content.js";
|
|
13
|
+
export {
|
|
14
|
+
ACTIVITY_VISIBILITY_RULES,
|
|
15
|
+
ADULT_CONTENT_LABELS,
|
|
16
|
+
APP_URL_PATTERNS,
|
|
17
|
+
COLLECTION_TO_APP,
|
|
18
|
+
getAppIdForCollection,
|
|
19
|
+
hasAdultContent,
|
|
20
|
+
isVisibleActivityItem,
|
|
21
|
+
resolveCardHealth,
|
|
22
|
+
resolveCardUrl
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cards/index.ts"],"sourcesContent":["export { APP_URL_PATTERNS, COLLECTION_TO_APP, type AppUrlPatterns } from './app-url-patterns.js';\nexport {\n getAppIdForCollection,\n resolveCardHealth,\n resolveCardUrl,\n type ActivityItemForUrl,\n type CardHealth,\n type CardHealthStrategy,\n} from './resolve-card-url.js';\nexport { ACTIVITY_VISIBILITY_RULES, isVisibleActivityItem } from './visibility.js';\nexport {\n ADULT_CONTENT_LABELS,\n hasAdultContent,\n type ActivityLabel,\n type AdultContentLabel,\n} from './adult-content.js';\n"],"mappings":";AAAA,SAAS,kBAAkB,yBAA8C;AACzE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,2BAA2B,6BAA6B;AACjE;AAAA,EACE;AAAA,EACA;AAAA,OAGK;","names":[]}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// src/cards/resolve-card-url.ts
|
|
2
|
+
import { APP_URL_PATTERNS, COLLECTION_TO_APP } from "./app-url-patterns.js";
|
|
3
|
+
function getAppIdForCollection(collection) {
|
|
4
|
+
for (const [prefix, appId] of COLLECTION_TO_APP) {
|
|
5
|
+
if (collection.startsWith(prefix)) return appId;
|
|
6
|
+
}
|
|
7
|
+
const parts = collection.split(".");
|
|
8
|
+
if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;
|
|
9
|
+
return collection;
|
|
10
|
+
}
|
|
11
|
+
function urlHealth(url) {
|
|
12
|
+
return url ? { url, strategy: "url" } : { url: null, strategy: "none" };
|
|
13
|
+
}
|
|
14
|
+
function recordHealth(url) {
|
|
15
|
+
return url ? { url, strategy: "record" } : { url: null, strategy: "none" };
|
|
16
|
+
}
|
|
17
|
+
function interpolate(pattern, vars) {
|
|
18
|
+
let result = pattern;
|
|
19
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
20
|
+
if (result.includes(`{${key}}`)) {
|
|
21
|
+
if (!value) return null;
|
|
22
|
+
result = result.replaceAll(`{${key}}`, encodeURIComponent(value));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
function shouldUseItemPattern(appId, collection) {
|
|
28
|
+
if (appId === "bluesky") {
|
|
29
|
+
return collection === "app.bsky.feed.post";
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
function patternHealth(appId, vars, collection) {
|
|
34
|
+
const patterns = APP_URL_PATTERNS[appId];
|
|
35
|
+
if (!patterns) return { url: null, strategy: "none" };
|
|
36
|
+
if (patterns.urlPattern && shouldUseItemPattern(appId, collection)) {
|
|
37
|
+
const url = interpolate(patterns.urlPattern, vars);
|
|
38
|
+
if (url) return recordHealth(url);
|
|
39
|
+
}
|
|
40
|
+
if (patterns.profileUrlPattern) {
|
|
41
|
+
const url = interpolate(patterns.profileUrlPattern, vars);
|
|
42
|
+
if (url) return urlHealth(url);
|
|
43
|
+
}
|
|
44
|
+
return { url: null, strategy: "none" };
|
|
45
|
+
}
|
|
46
|
+
var TANGLED_REPO_SLUG = /^[a-zA-Z0-9._-]+$/;
|
|
47
|
+
function stringOrNull(value) {
|
|
48
|
+
if (typeof value !== "string") return null;
|
|
49
|
+
const trimmed = value.trim();
|
|
50
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
51
|
+
}
|
|
52
|
+
function parseAtUri(atUri) {
|
|
53
|
+
const match = atUri.match(/^at:\/\/(did:[^/]+)\/[^/]+\/(.+)$/);
|
|
54
|
+
if (!match || !match[1] || !match[2]) return null;
|
|
55
|
+
return { did: match[1], rkey: match[2] };
|
|
56
|
+
}
|
|
57
|
+
function resolveCardHealth(item) {
|
|
58
|
+
const { collection, record, uri, rkey, authorDid, authorHandle } = item;
|
|
59
|
+
const appId = getAppIdForCollection(collection);
|
|
60
|
+
if (collection.startsWith("sh.tangled.")) {
|
|
61
|
+
const repoName = stringOrNull(record.name) ?? (collection === "sh.tangled.repo" ? rkey : null);
|
|
62
|
+
if (repoName && authorHandle && TANGLED_REPO_SLUG.test(repoName)) {
|
|
63
|
+
return recordHealth(`https://tangled.sh/${authorHandle}/${repoName}`);
|
|
64
|
+
}
|
|
65
|
+
return patternHealth("tangled", { handle: authorHandle, did: authorDid, rkey }, collection);
|
|
66
|
+
}
|
|
67
|
+
if (collection.startsWith("com.kipclip.") || collection.startsWith("community.lexicon.bookmarks.")) {
|
|
68
|
+
const subject = stringOrNull(record.subject);
|
|
69
|
+
if (subject) return urlHealth(subject);
|
|
70
|
+
return patternHealth("kipclip", { handle: authorHandle, did: authorDid, rkey });
|
|
71
|
+
}
|
|
72
|
+
if (collection === "at.margin.bookmark") {
|
|
73
|
+
return urlHealth(stringOrNull(record.source));
|
|
74
|
+
}
|
|
75
|
+
if (collection === "at.margin.annotation" || collection === "at.margin.note") {
|
|
76
|
+
const target = record.target;
|
|
77
|
+
if (target != null && typeof target === "object") {
|
|
78
|
+
const source = stringOrNull(target.source);
|
|
79
|
+
if (source) return urlHealth(source);
|
|
80
|
+
}
|
|
81
|
+
return urlHealth(APP_URL_PATTERNS.margin?.profileUrlPattern ?? null);
|
|
82
|
+
}
|
|
83
|
+
if (collection === "community.lexicon.calendar.rsvp") {
|
|
84
|
+
const subject = record.subject;
|
|
85
|
+
if (subject != null && typeof subject === "object") {
|
|
86
|
+
const subjectUri = stringOrNull(subject.uri);
|
|
87
|
+
if (subjectUri) {
|
|
88
|
+
const parsed = parseAtUri(subjectUri);
|
|
89
|
+
if (parsed) {
|
|
90
|
+
return urlHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { url: null, strategy: "none" };
|
|
95
|
+
}
|
|
96
|
+
if (collection === "community.lexicon.calendar.event") {
|
|
97
|
+
const parsed = parseAtUri(uri);
|
|
98
|
+
if (parsed) {
|
|
99
|
+
return recordHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);
|
|
100
|
+
}
|
|
101
|
+
return { url: null, strategy: "none" };
|
|
102
|
+
}
|
|
103
|
+
if (collection === "quest.atmo.event") {
|
|
104
|
+
const parsed = parseAtUri(uri);
|
|
105
|
+
if (parsed) {
|
|
106
|
+
return recordHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);
|
|
107
|
+
}
|
|
108
|
+
return { url: null, strategy: "none" };
|
|
109
|
+
}
|
|
110
|
+
if (collection === "quest.atmo.checkin") {
|
|
111
|
+
const eventUri = stringOrNull(record.event);
|
|
112
|
+
if (eventUri) {
|
|
113
|
+
const parsed = parseAtUri(eventUri);
|
|
114
|
+
if (parsed) {
|
|
115
|
+
return urlHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { url: null, strategy: "none" };
|
|
119
|
+
}
|
|
120
|
+
if (collection === "app.atmobb.discussion.reply") {
|
|
121
|
+
const thread = record.thread;
|
|
122
|
+
if (thread != null && typeof thread === "object") {
|
|
123
|
+
const threadUri = stringOrNull(thread.uri);
|
|
124
|
+
if (threadUri) {
|
|
125
|
+
const parsed = parseAtUri(threadUri);
|
|
126
|
+
if (parsed) {
|
|
127
|
+
return urlHealth(`https://atmobb.app/t/${parsed.did}/${parsed.rkey}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { url: null, strategy: "none" };
|
|
132
|
+
}
|
|
133
|
+
if (collection === "app.atmobb.discussion.thread") {
|
|
134
|
+
const parsed = parseAtUri(uri);
|
|
135
|
+
if (parsed) {
|
|
136
|
+
return recordHealth(`https://atmobb.app/t/${parsed.did}/${parsed.rkey}`);
|
|
137
|
+
}
|
|
138
|
+
return { url: null, strategy: "none" };
|
|
139
|
+
}
|
|
140
|
+
if (collection === "social.kut.community.membership") {
|
|
141
|
+
const community = record.community;
|
|
142
|
+
const communityUri = typeof community === "string" ? community : (
|
|
143
|
+
// Narrow the object branch to read an optional `uri`. The membership
|
|
144
|
+
// lexicon carries `community` as a bare at-uri string today; the cast
|
|
145
|
+
// tolerates a future strongRef `{ uri, cid }` shape without assuming it.
|
|
146
|
+
community != null && typeof community === "object" ? stringOrNull(community.uri) : null
|
|
147
|
+
);
|
|
148
|
+
if (communityUri) {
|
|
149
|
+
const parsed = parseAtUri(communityUri);
|
|
150
|
+
if (parsed) {
|
|
151
|
+
return urlHealth(`https://kut.social/community/${encodeURIComponent(parsed.rkey)}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return urlHealth(APP_URL_PATTERNS.kut?.profileUrlPattern ?? null);
|
|
155
|
+
}
|
|
156
|
+
if (collection === "fyi.atstore.listing.review") {
|
|
157
|
+
const listingMeta = record.listingMeta;
|
|
158
|
+
if (listingMeta != null && typeof listingMeta === "object") {
|
|
159
|
+
const slug = stringOrNull(listingMeta.slug);
|
|
160
|
+
if (slug) return urlHealth(`https://atstore.fyi/products/${encodeURIComponent(slug)}`);
|
|
161
|
+
}
|
|
162
|
+
return urlHealth(APP_URL_PATTERNS.atstore?.profileUrlPattern ?? null);
|
|
163
|
+
}
|
|
164
|
+
if (collection === "social.crate.content") {
|
|
165
|
+
return urlHealth(stringOrNull(record.canonicalUrl));
|
|
166
|
+
}
|
|
167
|
+
if (collection === "social.crate.note") {
|
|
168
|
+
return { url: null, strategy: "none" };
|
|
169
|
+
}
|
|
170
|
+
if (collection.startsWith("site.standard.")) {
|
|
171
|
+
const siteUrl = stringOrNull(record.siteUrl);
|
|
172
|
+
const path = stringOrNull(record.path);
|
|
173
|
+
if (siteUrl && path) return urlHealth(`${siteUrl}${path}`);
|
|
174
|
+
if (siteUrl) return urlHealth(siteUrl);
|
|
175
|
+
}
|
|
176
|
+
if (collection === "io.kich.recipe.recipe") {
|
|
177
|
+
return patternHealth("kich", { handle: authorHandle, did: authorDid, rkey }, collection);
|
|
178
|
+
}
|
|
179
|
+
if (collection === "exchange.recipe.recipe") {
|
|
180
|
+
return patternHealth("recipe", { handle: authorHandle, did: authorDid, rkey }, collection);
|
|
181
|
+
}
|
|
182
|
+
if (collection.startsWith("in.atmob.paste.")) {
|
|
183
|
+
if (uri) return recordHealth(`https://atmob.in/?uri=${encodeURIComponent(uri)}`);
|
|
184
|
+
return { url: null, strategy: "none" };
|
|
185
|
+
}
|
|
186
|
+
const recordUrl = stringOrNull(record.url);
|
|
187
|
+
if (recordUrl) return urlHealth(recordUrl);
|
|
188
|
+
return patternHealth(appId, { handle: authorHandle, did: authorDid, rkey }, collection);
|
|
189
|
+
}
|
|
190
|
+
function resolveCardUrl(item) {
|
|
191
|
+
return resolveCardHealth(item).url;
|
|
192
|
+
}
|
|
193
|
+
export {
|
|
194
|
+
getAppIdForCollection,
|
|
195
|
+
resolveCardHealth,
|
|
196
|
+
resolveCardUrl
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=resolve-card-url.js.map
|