@ewanc26/atproto 0.2.7 → 0.2.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEX,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EAIzB,QAAQ,EACR,MAAM,YAAY,CAAC;AAiEpB,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAgEvC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,yBAAyB,CAAC,CA+EpC;AAED,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CAiBhC"}
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EAIzB,QAAQ,EACR,MAAM,YAAY,CAAC;AAiEpB,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAwDvC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,yBAAyB,CAAC,CAuEpC;AAED,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CAiBhC"}
package/dist/documents.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { cache } from './cache.js';
2
- import { withFallback, resolveIdentity } from './agents.js';
2
+ import { resolveIdentity } from './agents.js';
3
3
  import { buildPdsBlobUrl } from './media.js';
4
+ import { fetchAllRecords } from './pagination/index.js';
4
5
  async function getBlobUrl(did, blob, fetchFn) {
5
6
  try {
6
7
  const cid = blob.ref?.$link || blob.cid;
@@ -34,14 +35,11 @@ export async function fetchPublications(did, fetchFn) {
34
35
  return cached;
35
36
  const publications = [];
36
37
  try {
37
- const publicationsRecords = await withFallback(did, async (agent) => {
38
- const response = await agent.com.atproto.repo.listRecords({
39
- repo: did,
40
- collection: 'site.standard.publication',
41
- limit: 100
42
- });
43
- return response.data.records;
44
- }, true, fetchFn);
38
+ const publicationsRecords = await fetchAllRecords({
39
+ repo: did,
40
+ collection: 'site.standard.publication',
41
+ fetchFn
42
+ });
45
43
  for (const pubRecord of publicationsRecords) {
46
44
  const pubValue = pubRecord.value;
47
45
  const rkey = pubRecord.uri.split('/').pop() || '';
@@ -94,14 +92,11 @@ export async function fetchDocuments(did, fetchFn) {
94
92
  for (const pub of publicationsData.publications) {
95
93
  publicationsMap.set(pub.uri, pub);
96
94
  }
97
- const documentsRecords = await withFallback(did, async (agent) => {
98
- const response = await agent.com.atproto.repo.listRecords({
99
- repo: did,
100
- collection: 'site.standard.document',
101
- limit: 100
102
- });
103
- return response.data.records;
104
- }, true, fetchFn);
95
+ const documentsRecords = await fetchAllRecords({
96
+ repo: did,
97
+ collection: 'site.standard.document',
98
+ fetchFn
99
+ });
105
100
  for (const docRecord of documentsRecords) {
106
101
  const docValue = docRecord.value;
107
102
  const rkey = docRecord.uri.split('/').pop() || '';
package/dist/fetch.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ProfileData, SiteInfoData, LinkData, MusicStatusData, KibunStatusData, TangledReposData, PopfeedReview } from './types.js';
1
+ import type { ProfileData, SiteInfoData, LinkData, MusicStatusData, KibunStatusData, TangledReposData, PopfeedReview, SifaProfileData, SifaSkill, SifaProject, SifaLanguage, SifaCertification, SifaExternalAccount } from './types.js';
2
2
  export declare function fetchProfile(did: string, fetchFn?: typeof fetch): Promise<ProfileData>;
3
3
  export declare function fetchSiteInfo(did: string, fetchFn?: typeof fetch): Promise<SiteInfoData | null>;
4
4
  export declare function fetchLinks(did: string, fetchFn?: typeof fetch): Promise<LinkData | null>;
@@ -6,4 +6,10 @@ export declare function fetchMusicStatus(did: string, fetchFn?: typeof fetch): P
6
6
  export declare function fetchKibunStatus(did: string, fetchFn?: typeof fetch): Promise<KibunStatusData | null>;
7
7
  export declare function fetchRecentPopfeedReviews(did: string, limit?: number, fetchFn?: typeof fetch): Promise<PopfeedReview[]>;
8
8
  export declare function fetchTangledRepos(did: string, fetchFn?: typeof fetch): Promise<TangledReposData | null>;
9
+ export declare function fetchSifaProfile(did: string, fetchFn?: typeof fetch): Promise<SifaProfileData | null>;
10
+ export declare function fetchSifaSkills(did: string, fetchFn?: typeof fetch): Promise<SifaSkill[]>;
11
+ export declare function fetchSifaProjects(did: string, fetchFn?: typeof fetch): Promise<SifaProject[]>;
12
+ export declare function fetchSifaLanguages(did: string, fetchFn?: typeof fetch): Promise<SifaLanguage[]>;
13
+ export declare function fetchSifaCertifications(did: string, fetchFn?: typeof fetch): Promise<SifaCertification[]>;
14
+ export declare function fetchSifaExternalAccounts(did: string, fetchFn?: typeof fetch): Promise<SifaExternalAccount[]>;
9
15
  //# sourceMappingURL=fetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,eAAe,EAEf,gBAAgB,EAChB,aAAa,EAGb,MAAM,YAAY,CAAC;AAEpB,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAgD5F;AAED,wBAAsB,aAAa,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgC9B;AAED,wBAAsB,UAAU,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2B1B;AAED,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkIjC;AAED,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmCjC;AAED,wBAAsB,yBAAyB,CAC9C,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAgD1B;AAED,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA2ClC"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,eAAe,EAEf,gBAAgB,EAChB,aAAa,EAGb,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAgD5F;AAED,wBAAsB,aAAa,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgC9B;AAED,wBAAsB,UAAU,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2B1B;AAED,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkIjC;AAED,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmCjC;AAED,wBAAsB,yBAAyB,CAC9C,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAgD1B;AAED,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA2ClC;AAID,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAqCjC;AAED,wBAAsB,eAAe,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAkCtB;AAED,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,WAAW,EAAE,CAAC,CA0CxB;AAED,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC,CAkCzB;AAED,wBAAsB,uBAAuB,CAC5C,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyC9B;AAED,wBAAsB,yBAAyB,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAqChC"}
package/dist/fetch.js CHANGED
@@ -321,3 +321,203 @@ export async function fetchTangledRepos(did, fetchFn) {
321
321
  return null;
322
322
  }
323
323
  }
324
+ // Sifa Professional Profile fetch functions
325
+ export async function fetchSifaProfile(did, fetchFn) {
326
+ const cacheKey = `sifa:profile:${did}`;
327
+ const cached = cache.get(cacheKey);
328
+ if (cached)
329
+ return cached;
330
+ try {
331
+ const result = await withFallback(did, async (agent) => {
332
+ const response = await agent.com.atproto.repo.getRecord({
333
+ repo: did,
334
+ collection: 'id.sifa.profile.self',
335
+ rkey: 'self'
336
+ });
337
+ return response.data;
338
+ }, true, fetchFn);
339
+ if (!result?.value)
340
+ return null;
341
+ const value = result.value;
342
+ const data = {
343
+ headline: value.headline,
344
+ about: value.about,
345
+ industry: value.industry,
346
+ location: value.location,
347
+ openTo: value.openTo || [],
348
+ preferredWorkplace: value.preferredWorkplace || [],
349
+ langs: value.langs || [],
350
+ createdAt: value.createdAt
351
+ };
352
+ cache.set(cacheKey, data);
353
+ return data;
354
+ }
355
+ catch {
356
+ return null;
357
+ }
358
+ }
359
+ export async function fetchSifaSkills(did, fetchFn) {
360
+ const cacheKey = `sifa:skills:${did}`;
361
+ const cached = cache.get(cacheKey);
362
+ if (cached)
363
+ return cached;
364
+ try {
365
+ const records = await withFallback(did, async (agent) => {
366
+ const response = await agent.com.atproto.repo.listRecords({
367
+ repo: did,
368
+ collection: 'id.sifa.profile.skill',
369
+ limit: 100
370
+ });
371
+ return response.data.records;
372
+ }, true, fetchFn);
373
+ const data = records.map((record) => {
374
+ const value = record.value;
375
+ return {
376
+ name: value.name,
377
+ category: value.category,
378
+ uri: record.uri
379
+ };
380
+ });
381
+ cache.set(cacheKey, data);
382
+ return data;
383
+ }
384
+ catch {
385
+ return [];
386
+ }
387
+ }
388
+ export async function fetchSifaProjects(did, fetchFn) {
389
+ const cacheKey = `sifa:projects:${did}`;
390
+ const cached = cache.get(cacheKey);
391
+ if (cached)
392
+ return cached;
393
+ try {
394
+ const records = await withFallback(did, async (agent) => {
395
+ const response = await agent.com.atproto.repo.listRecords({
396
+ repo: did,
397
+ collection: 'id.sifa.profile.project',
398
+ limit: 100
399
+ });
400
+ return response.data.records;
401
+ }, true, fetchFn);
402
+ const data = records.map((record) => {
403
+ const value = record.value;
404
+ return {
405
+ name: value.name,
406
+ description: value.description,
407
+ url: value.url,
408
+ startedAt: value.startedAt,
409
+ uri: record.uri
410
+ };
411
+ });
412
+ data.sort((a, b) => {
413
+ if (!a.startedAt)
414
+ return 1;
415
+ if (!b.startedAt)
416
+ return -1;
417
+ return new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime();
418
+ });
419
+ cache.set(cacheKey, data);
420
+ return data;
421
+ }
422
+ catch {
423
+ return [];
424
+ }
425
+ }
426
+ export async function fetchSifaLanguages(did, fetchFn) {
427
+ const cacheKey = `sifa:languages:${did}`;
428
+ const cached = cache.get(cacheKey);
429
+ if (cached)
430
+ return cached;
431
+ try {
432
+ const records = await withFallback(did, async (agent) => {
433
+ const response = await agent.com.atproto.repo.listRecords({
434
+ repo: did,
435
+ collection: 'id.sifa.profile.language',
436
+ limit: 100
437
+ });
438
+ return response.data.records;
439
+ }, true, fetchFn);
440
+ const data = records.map((record) => {
441
+ const value = record.value;
442
+ return {
443
+ name: value.name,
444
+ proficiency: value.proficiency,
445
+ uri: record.uri
446
+ };
447
+ });
448
+ cache.set(cacheKey, data);
449
+ return data;
450
+ }
451
+ catch {
452
+ return [];
453
+ }
454
+ }
455
+ export async function fetchSifaCertifications(did, fetchFn) {
456
+ const cacheKey = `sifa:certifications:${did}`;
457
+ const cached = cache.get(cacheKey);
458
+ if (cached)
459
+ return cached;
460
+ try {
461
+ const records = await withFallback(did, async (agent) => {
462
+ const response = await agent.com.atproto.repo.listRecords({
463
+ repo: did,
464
+ collection: 'id.sifa.profile.certification',
465
+ limit: 100
466
+ });
467
+ return response.data.records;
468
+ }, true, fetchFn);
469
+ const data = records.map((record) => {
470
+ const value = record.value;
471
+ return {
472
+ name: value.name,
473
+ authority: value.authority,
474
+ issuedAt: value.issuedAt,
475
+ uri: record.uri
476
+ };
477
+ });
478
+ data.sort((a, b) => {
479
+ if (!a.issuedAt)
480
+ return 1;
481
+ if (!b.issuedAt)
482
+ return -1;
483
+ return new Date(b.issuedAt).getTime() - new Date(a.issuedAt).getTime();
484
+ });
485
+ cache.set(cacheKey, data);
486
+ return data;
487
+ }
488
+ catch {
489
+ return [];
490
+ }
491
+ }
492
+ export async function fetchSifaExternalAccounts(did, fetchFn) {
493
+ const cacheKey = `sifa:externalAccounts:${did}`;
494
+ const cached = cache.get(cacheKey);
495
+ if (cached)
496
+ return cached;
497
+ try {
498
+ const records = await withFallback(did, async (agent) => {
499
+ const response = await agent.com.atproto.repo.listRecords({
500
+ repo: did,
501
+ collection: 'id.sifa.profile.externalAccount',
502
+ limit: 100
503
+ });
504
+ return response.data.records;
505
+ }, true, fetchFn);
506
+ const data = records.map((record) => {
507
+ const value = record.value;
508
+ return {
509
+ platform: value.platform,
510
+ url: value.url,
511
+ label: value.label,
512
+ feedUrl: value.feedUrl,
513
+ isPrimary: value.isPrimary,
514
+ uri: record.uri
515
+ };
516
+ });
517
+ cache.set(cacheKey, data);
518
+ return data;
519
+ }
520
+ catch {
521
+ return [];
522
+ }
523
+ }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export type { PopfeedReview, PopfeedCreativeWorkType, PopfeedMainCreditRole, ProfileData, StatusData, SiteInfoData, LinkData, LinkCard, BlueskyPost, BlogPost, BlogPostsData, PostAuthor, ExternalLink, Facet, Technology, License, BasedOnItem, RelatedService, Repository, Credit, SectionLicense, ResolvedIdentity, CacheEntry, MusicStatusData, MusicArtist, KibunStatusData, TangledRepo, TangledReposData, StandardSitePublication, StandardSitePublicationsData, StandardSiteDocument, StandardSiteDocumentsData, StandardSiteBasicTheme, StandardSiteThemeColor } from './types.js';
2
- export { fetchProfile, fetchSiteInfo, fetchLinks, fetchMusicStatus, fetchKibunStatus, fetchTangledRepos, fetchRecentPopfeedReviews } from './fetch.js';
1
+ export type { PopfeedReview, PopfeedCreativeWorkType, PopfeedMainCreditRole, ProfileData, StatusData, SiteInfoData, LinkData, LinkCard, BlueskyPost, BlogPost, BlogPostsData, PostAuthor, ExternalLink, Facet, Technology, License, BasedOnItem, RelatedService, Repository, Credit, SectionLicense, ResolvedIdentity, CacheEntry, MusicStatusData, MusicArtist, KibunStatusData, TangledRepo, TangledReposData, StandardSitePublication, StandardSitePublicationsData, StandardSiteDocument, StandardSiteDocumentsData, StandardSiteBasicTheme, StandardSiteThemeColor, SifaProfileData, SifaSkill, SifaProject, SifaLanguage, SifaCertification, SifaExternalAccount, SifaLocation } from './types.js';
2
+ export { fetchProfile, fetchSiteInfo, fetchLinks, fetchMusicStatus, fetchKibunStatus, fetchTangledRepos, fetchRecentPopfeedReviews, fetchSifaProfile, fetchSifaSkills, fetchSifaProjects, fetchSifaLanguages, fetchSifaCertifications, fetchSifaExternalAccounts } from './fetch.js';
3
3
  export { fetchPublications, fetchDocuments, fetchRecentDocuments, fetchBlogPosts } from './documents.js';
4
4
  export { fetchLatestBlueskyPost, fetchPostFromUri } from './posts.js';
5
5
  export { buildPdsBlobUrl, extractCidFromImageObject, extractImageUrlsFromValue } from './media.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACX,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,EACL,UAAU,EACV,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErJ,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gCAAgC,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACX,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,EACL,UAAU,EACV,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErJ,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gCAAgC,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Key API difference from the app's src/lib/services/atproto:
3
3
  // All functions that previously read PUBLIC_ATPROTO_DID from the environment
4
4
  // now accept `did: string` as their first argument.
5
- export { fetchProfile, fetchSiteInfo, fetchLinks, fetchMusicStatus, fetchKibunStatus, fetchTangledRepos, fetchRecentPopfeedReviews } from './fetch.js';
5
+ export { fetchProfile, fetchSiteInfo, fetchLinks, fetchMusicStatus, fetchKibunStatus, fetchTangledRepos, fetchRecentPopfeedReviews, fetchSifaProfile, fetchSifaSkills, fetchSifaProjects, fetchSifaLanguages, fetchSifaCertifications, fetchSifaExternalAccounts } from './fetch.js';
6
6
  export { fetchPublications, fetchDocuments, fetchRecentDocuments, fetchBlogPosts } from './documents.js';
7
7
  export { fetchLatestBlueskyPost, fetchPostFromUri } from './posts.js';
8
8
  export { buildPdsBlobUrl, extractCidFromImageObject, extractImageUrlsFromValue } from './media.js';
package/dist/types.d.ts CHANGED
@@ -282,4 +282,50 @@ export interface PopfeedReview {
282
282
  containsSpoilers?: boolean;
283
283
  isRevisit?: boolean;
284
284
  }
285
+ export interface SifaLocation {
286
+ countryCode: string;
287
+ region?: string;
288
+ city?: string;
289
+ }
290
+ export interface SifaProfileData {
291
+ headline: string;
292
+ about: string;
293
+ industry?: string;
294
+ location?: SifaLocation;
295
+ openTo: string[];
296
+ preferredWorkplace: string[];
297
+ langs: string[];
298
+ createdAt: string;
299
+ }
300
+ export interface SifaSkill {
301
+ name: string;
302
+ category: string;
303
+ uri: string;
304
+ }
305
+ export interface SifaProject {
306
+ name: string;
307
+ description?: string;
308
+ url?: string;
309
+ startedAt?: string;
310
+ uri: string;
311
+ }
312
+ export interface SifaLanguage {
313
+ name: string;
314
+ proficiency: string;
315
+ uri: string;
316
+ }
317
+ export interface SifaCertification {
318
+ name: string;
319
+ authority?: string;
320
+ issuedAt?: string;
321
+ uri: string;
322
+ }
323
+ export interface SifaExternalAccount {
324
+ platform: string;
325
+ url: string;
326
+ label?: string;
327
+ feedUrl?: string;
328
+ isPrimary?: boolean;
329
+ uri: string;
330
+ }
285
331
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ewanc26/atproto",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "AT Protocol service layer extracted from ewancroft.uk",
5
5
  "author": "Ewan Croft",
6
6
  "license": "AGPL-3.0-only",
@@ -35,16 +35,16 @@
35
35
  },
36
36
  "main": "./dist/index.js",
37
37
  "types": "./dist/index.d.ts",
38
+ "scripts": {
39
+ "build": "tsc --project tsconfig.json",
40
+ "dev": "tsc --project tsconfig.json --watch",
41
+ "check": "tsc --noEmit"
42
+ },
38
43
  "peerDependencies": {
39
44
  "@atproto/api": ">=0.13.0"
40
45
  },
41
46
  "devDependencies": {
42
47
  "@atproto/api": "^0.19.3",
43
48
  "typescript": "^5.9.3"
44
- },
45
- "scripts": {
46
- "build": "tsc --project tsconfig.json",
47
- "dev": "tsc --project tsconfig.json --watch",
48
- "check": "tsc --noEmit"
49
49
  }
50
- }
50
+ }
package/src/documents.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { cache } from './cache.js';
2
2
  import { withFallback, resolveIdentity } from './agents.js';
3
3
  import { buildPdsBlobUrl } from './media.js';
4
+ import { fetchAllRecords } from './pagination/index.js';
4
5
  import type {
5
6
  StandardSitePublication,
6
7
  StandardSitePublicationsData,
@@ -86,19 +87,11 @@ export async function fetchPublications(
86
87
  const publications: StandardSitePublication[] = [];
87
88
 
88
89
  try {
89
- const publicationsRecords = await withFallback(
90
- did,
91
- async (agent) => {
92
- const response = await agent.com.atproto.repo.listRecords({
93
- repo: did,
94
- collection: 'site.standard.publication',
95
- limit: 100
96
- });
97
- return response.data.records;
98
- },
99
- true,
90
+ const publicationsRecords = await fetchAllRecords({
91
+ repo: did,
92
+ collection: 'site.standard.publication',
100
93
  fetchFn
101
- );
94
+ });
102
95
 
103
96
  for (const pubRecord of publicationsRecords) {
104
97
  const pubValue = pubRecord.value as unknown as PublicationRecord;
@@ -161,19 +154,11 @@ export async function fetchDocuments(
161
154
  publicationsMap.set(pub.uri, pub);
162
155
  }
163
156
 
164
- const documentsRecords = await withFallback(
165
- did,
166
- async (agent) => {
167
- const response = await agent.com.atproto.repo.listRecords({
168
- repo: did,
169
- collection: 'site.standard.document',
170
- limit: 100
171
- });
172
- return response.data.records;
173
- },
174
- true,
157
+ const documentsRecords = await fetchAllRecords({
158
+ repo: did,
159
+ collection: 'site.standard.document',
175
160
  fetchFn
176
- );
161
+ });
177
162
 
178
163
  for (const docRecord of documentsRecords) {
179
164
  const docValue = docRecord.value as unknown as DocumentRecord;
package/src/fetch.ts CHANGED
@@ -12,7 +12,13 @@ import type {
12
12
  TangledReposData,
13
13
  PopfeedReview,
14
14
  PopfeedCreativeWorkType,
15
- PopfeedMainCreditRole
15
+ PopfeedMainCreditRole,
16
+ SifaProfileData,
17
+ SifaSkill,
18
+ SifaProject,
19
+ SifaLanguage,
20
+ SifaCertification,
21
+ SifaExternalAccount
16
22
  } from './types.js';
17
23
 
18
24
  export async function fetchProfile(did: string, fetchFn?: typeof fetch): Promise<ProfileData> {
@@ -410,3 +416,260 @@ export async function fetchTangledRepos(
410
416
  return null;
411
417
  }
412
418
  }
419
+
420
+ // Sifa Professional Profile fetch functions
421
+
422
+ export async function fetchSifaProfile(
423
+ did: string,
424
+ fetchFn?: typeof fetch
425
+ ): Promise<SifaProfileData | null> {
426
+ const cacheKey = `sifa:profile:${did}`;
427
+ const cached = cache.get<SifaProfileData>(cacheKey);
428
+ if (cached) return cached;
429
+
430
+ try {
431
+ const result = await withFallback(
432
+ did,
433
+ async (agent) => {
434
+ const response = await agent.com.atproto.repo.getRecord({
435
+ repo: did,
436
+ collection: 'id.sifa.profile.self',
437
+ rkey: 'self'
438
+ });
439
+ return response.data;
440
+ },
441
+ true,
442
+ fetchFn
443
+ );
444
+
445
+ if (!result?.value) return null;
446
+ const value = result.value as any;
447
+ const data: SifaProfileData = {
448
+ headline: value.headline,
449
+ about: value.about,
450
+ industry: value.industry,
451
+ location: value.location,
452
+ openTo: value.openTo || [],
453
+ preferredWorkplace: value.preferredWorkplace || [],
454
+ langs: value.langs || [],
455
+ createdAt: value.createdAt
456
+ };
457
+ cache.set(cacheKey, data);
458
+ return data;
459
+ } catch {
460
+ return null;
461
+ }
462
+ }
463
+
464
+ export async function fetchSifaSkills(
465
+ did: string,
466
+ fetchFn?: typeof fetch
467
+ ): Promise<SifaSkill[]> {
468
+ const cacheKey = `sifa:skills:${did}`;
469
+ const cached = cache.get<SifaSkill[]>(cacheKey);
470
+ if (cached) return cached;
471
+
472
+ try {
473
+ const records = await withFallback(
474
+ did,
475
+ async (agent) => {
476
+ const response = await agent.com.atproto.repo.listRecords({
477
+ repo: did,
478
+ collection: 'id.sifa.profile.skill',
479
+ limit: 100
480
+ });
481
+ return response.data.records;
482
+ },
483
+ true,
484
+ fetchFn
485
+ );
486
+
487
+ const data: SifaSkill[] = records.map((record) => {
488
+ const value = record.value as any;
489
+ return {
490
+ name: value.name,
491
+ category: value.category,
492
+ uri: record.uri
493
+ };
494
+ });
495
+
496
+ cache.set(cacheKey, data);
497
+ return data;
498
+ } catch {
499
+ return [];
500
+ }
501
+ }
502
+
503
+ export async function fetchSifaProjects(
504
+ did: string,
505
+ fetchFn?: typeof fetch
506
+ ): Promise<SifaProject[]> {
507
+ const cacheKey = `sifa:projects:${did}`;
508
+ const cached = cache.get<SifaProject[]>(cacheKey);
509
+ if (cached) return cached;
510
+
511
+ try {
512
+ const records = await withFallback(
513
+ did,
514
+ async (agent) => {
515
+ const response = await agent.com.atproto.repo.listRecords({
516
+ repo: did,
517
+ collection: 'id.sifa.profile.project',
518
+ limit: 100
519
+ });
520
+ return response.data.records;
521
+ },
522
+ true,
523
+ fetchFn
524
+ );
525
+
526
+ const data: SifaProject[] = records.map((record) => {
527
+ const value = record.value as any;
528
+ return {
529
+ name: value.name,
530
+ description: value.description,
531
+ url: value.url,
532
+ startedAt: value.startedAt,
533
+ uri: record.uri
534
+ };
535
+ });
536
+
537
+ data.sort((a, b) => {
538
+ if (!a.startedAt) return 1;
539
+ if (!b.startedAt) return -1;
540
+ return new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime();
541
+ });
542
+
543
+ cache.set(cacheKey, data);
544
+ return data;
545
+ } catch {
546
+ return [];
547
+ }
548
+ }
549
+
550
+ export async function fetchSifaLanguages(
551
+ did: string,
552
+ fetchFn?: typeof fetch
553
+ ): Promise<SifaLanguage[]> {
554
+ const cacheKey = `sifa:languages:${did}`;
555
+ const cached = cache.get<SifaLanguage[]>(cacheKey);
556
+ if (cached) return cached;
557
+
558
+ try {
559
+ const records = await withFallback(
560
+ did,
561
+ async (agent) => {
562
+ const response = await agent.com.atproto.repo.listRecords({
563
+ repo: did,
564
+ collection: 'id.sifa.profile.language',
565
+ limit: 100
566
+ });
567
+ return response.data.records;
568
+ },
569
+ true,
570
+ fetchFn
571
+ );
572
+
573
+ const data: SifaLanguage[] = records.map((record) => {
574
+ const value = record.value as any;
575
+ return {
576
+ name: value.name,
577
+ proficiency: value.proficiency,
578
+ uri: record.uri
579
+ };
580
+ });
581
+
582
+ cache.set(cacheKey, data);
583
+ return data;
584
+ } catch {
585
+ return [];
586
+ }
587
+ }
588
+
589
+ export async function fetchSifaCertifications(
590
+ did: string,
591
+ fetchFn?: typeof fetch
592
+ ): Promise<SifaCertification[]> {
593
+ const cacheKey = `sifa:certifications:${did}`;
594
+ const cached = cache.get<SifaCertification[]>(cacheKey);
595
+ if (cached) return cached;
596
+
597
+ try {
598
+ const records = await withFallback(
599
+ did,
600
+ async (agent) => {
601
+ const response = await agent.com.atproto.repo.listRecords({
602
+ repo: did,
603
+ collection: 'id.sifa.profile.certification',
604
+ limit: 100
605
+ });
606
+ return response.data.records;
607
+ },
608
+ true,
609
+ fetchFn
610
+ );
611
+
612
+ const data: SifaCertification[] = records.map((record) => {
613
+ const value = record.value as any;
614
+ return {
615
+ name: value.name,
616
+ authority: value.authority,
617
+ issuedAt: value.issuedAt,
618
+ uri: record.uri
619
+ };
620
+ });
621
+
622
+ data.sort((a, b) => {
623
+ if (!a.issuedAt) return 1;
624
+ if (!b.issuedAt) return -1;
625
+ return new Date(b.issuedAt).getTime() - new Date(a.issuedAt).getTime();
626
+ });
627
+
628
+ cache.set(cacheKey, data);
629
+ return data;
630
+ } catch {
631
+ return [];
632
+ }
633
+ }
634
+
635
+ export async function fetchSifaExternalAccounts(
636
+ did: string,
637
+ fetchFn?: typeof fetch
638
+ ): Promise<SifaExternalAccount[]> {
639
+ const cacheKey = `sifa:externalAccounts:${did}`;
640
+ const cached = cache.get<SifaExternalAccount[]>(cacheKey);
641
+ if (cached) return cached;
642
+
643
+ try {
644
+ const records = await withFallback(
645
+ did,
646
+ async (agent) => {
647
+ const response = await agent.com.atproto.repo.listRecords({
648
+ repo: did,
649
+ collection: 'id.sifa.profile.externalAccount',
650
+ limit: 100
651
+ });
652
+ return response.data.records;
653
+ },
654
+ true,
655
+ fetchFn
656
+ );
657
+
658
+ const data: SifaExternalAccount[] = records.map((record) => {
659
+ const value = record.value as any;
660
+ return {
661
+ platform: value.platform,
662
+ url: value.url,
663
+ label: value.label,
664
+ feedUrl: value.feedUrl,
665
+ isPrimary: value.isPrimary,
666
+ uri: record.uri
667
+ };
668
+ });
669
+
670
+ cache.set(cacheKey, data);
671
+ return data;
672
+ } catch {
673
+ return [];
674
+ }
675
+ }
package/src/index.ts CHANGED
@@ -37,7 +37,14 @@ export type {
37
37
  StandardSiteDocument,
38
38
  StandardSiteDocumentsData,
39
39
  StandardSiteBasicTheme,
40
- StandardSiteThemeColor
40
+ StandardSiteThemeColor,
41
+ SifaProfileData,
42
+ SifaSkill,
43
+ SifaProject,
44
+ SifaLanguage,
45
+ SifaCertification,
46
+ SifaExternalAccount,
47
+ SifaLocation
41
48
  } from './types.js';
42
49
 
43
50
  export {
@@ -47,7 +54,13 @@ export {
47
54
  fetchMusicStatus,
48
55
  fetchKibunStatus,
49
56
  fetchTangledRepos,
50
- fetchRecentPopfeedReviews
57
+ fetchRecentPopfeedReviews,
58
+ fetchSifaProfile,
59
+ fetchSifaSkills,
60
+ fetchSifaProjects,
61
+ fetchSifaLanguages,
62
+ fetchSifaCertifications,
63
+ fetchSifaExternalAccounts
51
64
  } from './fetch.js';
52
65
 
53
66
  export {
package/src/types.ts CHANGED
@@ -322,3 +322,58 @@ export interface PopfeedReview {
322
322
  containsSpoilers?: boolean;
323
323
  isRevisit?: boolean;
324
324
  }
325
+
326
+ // Sifa Professional Profile Types
327
+
328
+ export interface SifaLocation {
329
+ countryCode: string;
330
+ region?: string;
331
+ city?: string;
332
+ }
333
+
334
+ export interface SifaProfileData {
335
+ headline: string;
336
+ about: string;
337
+ industry?: string;
338
+ location?: SifaLocation;
339
+ openTo: string[];
340
+ preferredWorkplace: string[];
341
+ langs: string[];
342
+ createdAt: string;
343
+ }
344
+
345
+ export interface SifaSkill {
346
+ name: string;
347
+ category: string;
348
+ uri: string;
349
+ }
350
+
351
+ export interface SifaProject {
352
+ name: string;
353
+ description?: string;
354
+ url?: string;
355
+ startedAt?: string;
356
+ uri: string;
357
+ }
358
+
359
+ export interface SifaLanguage {
360
+ name: string;
361
+ proficiency: string;
362
+ uri: string;
363
+ }
364
+
365
+ export interface SifaCertification {
366
+ name: string;
367
+ authority?: string;
368
+ issuedAt?: string;
369
+ uri: string;
370
+ }
371
+
372
+ export interface SifaExternalAccount {
373
+ platform: string;
374
+ url: string;
375
+ label?: string;
376
+ feedUrl?: string;
377
+ isPrimary?: boolean;
378
+ uri: string;
379
+ }