@cavuno/board 1.19.0 → 1.20.0
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/index.d.mts +605 -204
- package/dist/index.d.ts +605 -204
- package/dist/index.js +259 -1
- package/dist/index.mjs +259 -1
- package/package.json +1 -1
- package/skills/manifest.json +1 -1
package/dist/index.js
CHANGED
|
@@ -149,7 +149,7 @@ async function clearSession(storage) {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
// src/version.ts
|
|
152
|
-
var SDK_VERSION = "1.
|
|
152
|
+
var SDK_VERSION = "1.20.0";
|
|
153
153
|
|
|
154
154
|
// src/client.ts
|
|
155
155
|
function isRawBody(body) {
|
|
@@ -374,6 +374,74 @@ function authNamespace(client) {
|
|
|
374
374
|
method: "POST",
|
|
375
375
|
body
|
|
376
376
|
});
|
|
377
|
+
},
|
|
378
|
+
/**
|
|
379
|
+
* Request a passwordless magic link. The API always resolves 204
|
|
380
|
+
* when the request is accepted; the email link lands on the
|
|
381
|
+
* board/starter `/auth/magic-link` route.
|
|
382
|
+
*
|
|
383
|
+
* @example
|
|
384
|
+
* await board.auth.requestMagicLink({
|
|
385
|
+
* email: 'a@b.com',
|
|
386
|
+
* returnTo: '/account',
|
|
387
|
+
* });
|
|
388
|
+
*/
|
|
389
|
+
requestMagicLink(body, options) {
|
|
390
|
+
return client.fetch("/auth/magic-link", {
|
|
391
|
+
...options,
|
|
392
|
+
method: "POST",
|
|
393
|
+
body
|
|
394
|
+
});
|
|
395
|
+
},
|
|
396
|
+
/**
|
|
397
|
+
* Consume a magic-link token and persist the returned bearer pair.
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* await board.auth.consumeMagicLink({ token });
|
|
401
|
+
*/
|
|
402
|
+
async consumeMagicLink(body, options) {
|
|
403
|
+
const session = await client.fetch(
|
|
404
|
+
"/auth/magic-link/consume",
|
|
405
|
+
{
|
|
406
|
+
...options,
|
|
407
|
+
method: "POST",
|
|
408
|
+
body
|
|
409
|
+
}
|
|
410
|
+
);
|
|
411
|
+
return persist(session);
|
|
412
|
+
},
|
|
413
|
+
/**
|
|
414
|
+
* Build a provider authorization URL. The SDK returns the URL; the
|
|
415
|
+
* host app owns browser navigation.
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* const { authorizeUrl } = await board.auth.getOAuthAuthorizationUrl('google');
|
|
419
|
+
* window.location.href = authorizeUrl;
|
|
420
|
+
*/
|
|
421
|
+
getOAuthAuthorizationUrl(provider, query, options) {
|
|
422
|
+
return client.fetch(`/auth/oauth/${provider}`, {
|
|
423
|
+
...options,
|
|
424
|
+
method: "GET",
|
|
425
|
+
query
|
|
426
|
+
});
|
|
427
|
+
},
|
|
428
|
+
/**
|
|
429
|
+
* Exchange the provider callback one-time token and persist the
|
|
430
|
+
* returned bearer pair.
|
|
431
|
+
*
|
|
432
|
+
* @example
|
|
433
|
+
* await board.auth.exchangeOAuth({ token });
|
|
434
|
+
*/
|
|
435
|
+
async exchangeOAuth(body, options) {
|
|
436
|
+
const session = await client.fetch(
|
|
437
|
+
"/auth/oauth/exchange",
|
|
438
|
+
{
|
|
439
|
+
...options,
|
|
440
|
+
method: "POST",
|
|
441
|
+
body
|
|
442
|
+
}
|
|
443
|
+
);
|
|
444
|
+
return persist(session);
|
|
377
445
|
}
|
|
378
446
|
};
|
|
379
447
|
}
|
|
@@ -842,6 +910,196 @@ function meNamespace(client) {
|
|
|
842
910
|
retrieve(query, options) {
|
|
843
911
|
return client.fetch("/me", { ...options, query });
|
|
844
912
|
},
|
|
913
|
+
/**
|
|
914
|
+
* Permanently delete my account and all dependent data (profile,
|
|
915
|
+
* collections, saved jobs, alerts, avatar/resume files). Synchronous and
|
|
916
|
+
* irreversible — resolves void once the cascade completes (204).
|
|
917
|
+
*
|
|
918
|
+
* @example
|
|
919
|
+
* await board.me.delete();
|
|
920
|
+
*/
|
|
921
|
+
delete(options) {
|
|
922
|
+
return client.fetch("/me", { ...options, method: "DELETE" });
|
|
923
|
+
},
|
|
924
|
+
/**
|
|
925
|
+
* The authenticated candidate's own account self-service (doc 32).
|
|
926
|
+
* `profile.*` is the lean profile singleton + (commit 2+) its
|
|
927
|
+
* experience / education / skills / languages collections + avatar.
|
|
928
|
+
*/
|
|
929
|
+
profile: {
|
|
930
|
+
/**
|
|
931
|
+
* Retrieve my lean candidate profile.
|
|
932
|
+
*
|
|
933
|
+
* @example
|
|
934
|
+
* const profile = await board.me.profile.retrieve();
|
|
935
|
+
*/
|
|
936
|
+
retrieve(query, options) {
|
|
937
|
+
return client.fetch("/me/profile", {
|
|
938
|
+
...options,
|
|
939
|
+
query
|
|
940
|
+
});
|
|
941
|
+
},
|
|
942
|
+
/**
|
|
943
|
+
* Update my candidate profile. Optional-field merge-patch — omitted
|
|
944
|
+
* fields stay unchanged.
|
|
945
|
+
*
|
|
946
|
+
* @example
|
|
947
|
+
* await board.me.profile.update({ headline: 'Staff Engineer' });
|
|
948
|
+
*/
|
|
949
|
+
update(body, query, options) {
|
|
950
|
+
return client.fetch("/me/profile", {
|
|
951
|
+
...options,
|
|
952
|
+
method: "PATCH",
|
|
953
|
+
body,
|
|
954
|
+
query
|
|
955
|
+
});
|
|
956
|
+
},
|
|
957
|
+
/**
|
|
958
|
+
* Check whether a handle is available for me on this board (my own
|
|
959
|
+
* current handle counts as available). Advisory — `update` re-checks.
|
|
960
|
+
*
|
|
961
|
+
* @example
|
|
962
|
+
* const { available } = await board.me.profile.handleAvailable('jane');
|
|
963
|
+
*/
|
|
964
|
+
handleAvailable(handle, options) {
|
|
965
|
+
return client.fetch(
|
|
966
|
+
"/me/profile/handle-available",
|
|
967
|
+
{ ...options, query: { handle } }
|
|
968
|
+
);
|
|
969
|
+
},
|
|
970
|
+
/** List my experience entries. */
|
|
971
|
+
listExperience(options) {
|
|
972
|
+
return client.fetch(
|
|
973
|
+
"/me/profile/experience",
|
|
974
|
+
options
|
|
975
|
+
);
|
|
976
|
+
},
|
|
977
|
+
/** Add an experience entry. */
|
|
978
|
+
createExperience(body, options) {
|
|
979
|
+
return client.fetch("/me/profile/experience", {
|
|
980
|
+
...options,
|
|
981
|
+
method: "POST",
|
|
982
|
+
body
|
|
983
|
+
});
|
|
984
|
+
},
|
|
985
|
+
/** Update an experience entry (merge-patch). */
|
|
986
|
+
updateExperience(id, body, options) {
|
|
987
|
+
return client.fetch(
|
|
988
|
+
`/me/profile/experience/${encodeURIComponent(id)}`,
|
|
989
|
+
{ ...options, method: "PATCH", body }
|
|
990
|
+
);
|
|
991
|
+
},
|
|
992
|
+
/** Delete an experience entry. */
|
|
993
|
+
deleteExperience(id, options) {
|
|
994
|
+
return client.fetch(
|
|
995
|
+
`/me/profile/experience/${encodeURIComponent(id)}`,
|
|
996
|
+
{ ...options, method: "DELETE" }
|
|
997
|
+
);
|
|
998
|
+
},
|
|
999
|
+
/** List my education entries. */
|
|
1000
|
+
listEducation(options) {
|
|
1001
|
+
return client.fetch(
|
|
1002
|
+
"/me/profile/education",
|
|
1003
|
+
options
|
|
1004
|
+
);
|
|
1005
|
+
},
|
|
1006
|
+
/** Add an education entry. */
|
|
1007
|
+
createEducation(body, options) {
|
|
1008
|
+
return client.fetch("/me/profile/education", {
|
|
1009
|
+
...options,
|
|
1010
|
+
method: "POST",
|
|
1011
|
+
body
|
|
1012
|
+
});
|
|
1013
|
+
},
|
|
1014
|
+
/** Update an education entry (merge-patch). */
|
|
1015
|
+
updateEducation(id, body, options) {
|
|
1016
|
+
return client.fetch(
|
|
1017
|
+
`/me/profile/education/${encodeURIComponent(id)}`,
|
|
1018
|
+
{ ...options, method: "PATCH", body }
|
|
1019
|
+
);
|
|
1020
|
+
},
|
|
1021
|
+
/** Delete an education entry. */
|
|
1022
|
+
deleteEducation(id, options) {
|
|
1023
|
+
return client.fetch(
|
|
1024
|
+
`/me/profile/education/${encodeURIComponent(id)}`,
|
|
1025
|
+
{ ...options, method: "DELETE" }
|
|
1026
|
+
);
|
|
1027
|
+
},
|
|
1028
|
+
/** List my skills. */
|
|
1029
|
+
listSkills(options) {
|
|
1030
|
+
return client.fetch(
|
|
1031
|
+
"/me/profile/skills",
|
|
1032
|
+
options
|
|
1033
|
+
);
|
|
1034
|
+
},
|
|
1035
|
+
/** Replace my skills with the provided ordered names. */
|
|
1036
|
+
updateSkills(body, options) {
|
|
1037
|
+
return client.fetch(
|
|
1038
|
+
"/me/profile/skills",
|
|
1039
|
+
{ ...options, method: "PUT", body }
|
|
1040
|
+
);
|
|
1041
|
+
},
|
|
1042
|
+
/** List my languages. */
|
|
1043
|
+
listLanguages(options) {
|
|
1044
|
+
return client.fetch(
|
|
1045
|
+
"/me/profile/languages",
|
|
1046
|
+
options
|
|
1047
|
+
);
|
|
1048
|
+
},
|
|
1049
|
+
/** Replace my languages with the provided ordered set. */
|
|
1050
|
+
updateLanguages(body, options) {
|
|
1051
|
+
return client.fetch(
|
|
1052
|
+
"/me/profile/languages",
|
|
1053
|
+
{ ...options, method: "PUT", body }
|
|
1054
|
+
);
|
|
1055
|
+
},
|
|
1056
|
+
/**
|
|
1057
|
+
* Upload my avatar (JPEG/PNG/WebP, ≤5 MB) via a single multipart POST.
|
|
1058
|
+
*
|
|
1059
|
+
* @example
|
|
1060
|
+
* await board.me.profile.uploadAvatar(file);
|
|
1061
|
+
*/
|
|
1062
|
+
uploadAvatar(file, options) {
|
|
1063
|
+
const form = new FormData();
|
|
1064
|
+
form.append("file", file);
|
|
1065
|
+
return client.fetch("/me/profile/avatar", {
|
|
1066
|
+
...options,
|
|
1067
|
+
method: "POST",
|
|
1068
|
+
body: form
|
|
1069
|
+
});
|
|
1070
|
+
}
|
|
1071
|
+
},
|
|
1072
|
+
/**
|
|
1073
|
+
* Signed-in notification preferences + the anonymous email-link
|
|
1074
|
+
* unsubscribe branch (doc 32).
|
|
1075
|
+
*/
|
|
1076
|
+
notificationPreferences: {
|
|
1077
|
+
/** List every notification channel + its subscribed state. */
|
|
1078
|
+
retrieve(options) {
|
|
1079
|
+
return client.fetch(
|
|
1080
|
+
"/me/notification-preferences",
|
|
1081
|
+
options
|
|
1082
|
+
);
|
|
1083
|
+
},
|
|
1084
|
+
/** Toggle one channel; returns the full updated set. */
|
|
1085
|
+
update(body, options) {
|
|
1086
|
+
return client.fetch(
|
|
1087
|
+
"/me/notification-preferences",
|
|
1088
|
+
{ ...options, method: "PUT", body }
|
|
1089
|
+
);
|
|
1090
|
+
},
|
|
1091
|
+
/**
|
|
1092
|
+
* Anonymous one-click unsubscribe via an HMAC email-link token — no
|
|
1093
|
+
* session. Resolves void on success (204).
|
|
1094
|
+
*/
|
|
1095
|
+
unsubscribeWithToken(body, options) {
|
|
1096
|
+
return client.fetch("/me/notification-preferences/unsubscribe", {
|
|
1097
|
+
...options,
|
|
1098
|
+
method: "POST",
|
|
1099
|
+
body
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
},
|
|
845
1103
|
savedJobs: {
|
|
846
1104
|
/**
|
|
847
1105
|
* List the authenticated user's saved jobs (each embeds the full
|
package/dist/index.mjs
CHANGED
|
@@ -109,7 +109,7 @@ async function clearSession(storage) {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
// src/version.ts
|
|
112
|
-
var SDK_VERSION = "1.
|
|
112
|
+
var SDK_VERSION = "1.20.0";
|
|
113
113
|
|
|
114
114
|
// src/client.ts
|
|
115
115
|
function isRawBody(body) {
|
|
@@ -334,6 +334,74 @@ function authNamespace(client) {
|
|
|
334
334
|
method: "POST",
|
|
335
335
|
body
|
|
336
336
|
});
|
|
337
|
+
},
|
|
338
|
+
/**
|
|
339
|
+
* Request a passwordless magic link. The API always resolves 204
|
|
340
|
+
* when the request is accepted; the email link lands on the
|
|
341
|
+
* board/starter `/auth/magic-link` route.
|
|
342
|
+
*
|
|
343
|
+
* @example
|
|
344
|
+
* await board.auth.requestMagicLink({
|
|
345
|
+
* email: 'a@b.com',
|
|
346
|
+
* returnTo: '/account',
|
|
347
|
+
* });
|
|
348
|
+
*/
|
|
349
|
+
requestMagicLink(body, options) {
|
|
350
|
+
return client.fetch("/auth/magic-link", {
|
|
351
|
+
...options,
|
|
352
|
+
method: "POST",
|
|
353
|
+
body
|
|
354
|
+
});
|
|
355
|
+
},
|
|
356
|
+
/**
|
|
357
|
+
* Consume a magic-link token and persist the returned bearer pair.
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* await board.auth.consumeMagicLink({ token });
|
|
361
|
+
*/
|
|
362
|
+
async consumeMagicLink(body, options) {
|
|
363
|
+
const session = await client.fetch(
|
|
364
|
+
"/auth/magic-link/consume",
|
|
365
|
+
{
|
|
366
|
+
...options,
|
|
367
|
+
method: "POST",
|
|
368
|
+
body
|
|
369
|
+
}
|
|
370
|
+
);
|
|
371
|
+
return persist(session);
|
|
372
|
+
},
|
|
373
|
+
/**
|
|
374
|
+
* Build a provider authorization URL. The SDK returns the URL; the
|
|
375
|
+
* host app owns browser navigation.
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* const { authorizeUrl } = await board.auth.getOAuthAuthorizationUrl('google');
|
|
379
|
+
* window.location.href = authorizeUrl;
|
|
380
|
+
*/
|
|
381
|
+
getOAuthAuthorizationUrl(provider, query, options) {
|
|
382
|
+
return client.fetch(`/auth/oauth/${provider}`, {
|
|
383
|
+
...options,
|
|
384
|
+
method: "GET",
|
|
385
|
+
query
|
|
386
|
+
});
|
|
387
|
+
},
|
|
388
|
+
/**
|
|
389
|
+
* Exchange the provider callback one-time token and persist the
|
|
390
|
+
* returned bearer pair.
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* await board.auth.exchangeOAuth({ token });
|
|
394
|
+
*/
|
|
395
|
+
async exchangeOAuth(body, options) {
|
|
396
|
+
const session = await client.fetch(
|
|
397
|
+
"/auth/oauth/exchange",
|
|
398
|
+
{
|
|
399
|
+
...options,
|
|
400
|
+
method: "POST",
|
|
401
|
+
body
|
|
402
|
+
}
|
|
403
|
+
);
|
|
404
|
+
return persist(session);
|
|
337
405
|
}
|
|
338
406
|
};
|
|
339
407
|
}
|
|
@@ -802,6 +870,196 @@ function meNamespace(client) {
|
|
|
802
870
|
retrieve(query, options) {
|
|
803
871
|
return client.fetch("/me", { ...options, query });
|
|
804
872
|
},
|
|
873
|
+
/**
|
|
874
|
+
* Permanently delete my account and all dependent data (profile,
|
|
875
|
+
* collections, saved jobs, alerts, avatar/resume files). Synchronous and
|
|
876
|
+
* irreversible — resolves void once the cascade completes (204).
|
|
877
|
+
*
|
|
878
|
+
* @example
|
|
879
|
+
* await board.me.delete();
|
|
880
|
+
*/
|
|
881
|
+
delete(options) {
|
|
882
|
+
return client.fetch("/me", { ...options, method: "DELETE" });
|
|
883
|
+
},
|
|
884
|
+
/**
|
|
885
|
+
* The authenticated candidate's own account self-service (doc 32).
|
|
886
|
+
* `profile.*` is the lean profile singleton + (commit 2+) its
|
|
887
|
+
* experience / education / skills / languages collections + avatar.
|
|
888
|
+
*/
|
|
889
|
+
profile: {
|
|
890
|
+
/**
|
|
891
|
+
* Retrieve my lean candidate profile.
|
|
892
|
+
*
|
|
893
|
+
* @example
|
|
894
|
+
* const profile = await board.me.profile.retrieve();
|
|
895
|
+
*/
|
|
896
|
+
retrieve(query, options) {
|
|
897
|
+
return client.fetch("/me/profile", {
|
|
898
|
+
...options,
|
|
899
|
+
query
|
|
900
|
+
});
|
|
901
|
+
},
|
|
902
|
+
/**
|
|
903
|
+
* Update my candidate profile. Optional-field merge-patch — omitted
|
|
904
|
+
* fields stay unchanged.
|
|
905
|
+
*
|
|
906
|
+
* @example
|
|
907
|
+
* await board.me.profile.update({ headline: 'Staff Engineer' });
|
|
908
|
+
*/
|
|
909
|
+
update(body, query, options) {
|
|
910
|
+
return client.fetch("/me/profile", {
|
|
911
|
+
...options,
|
|
912
|
+
method: "PATCH",
|
|
913
|
+
body,
|
|
914
|
+
query
|
|
915
|
+
});
|
|
916
|
+
},
|
|
917
|
+
/**
|
|
918
|
+
* Check whether a handle is available for me on this board (my own
|
|
919
|
+
* current handle counts as available). Advisory — `update` re-checks.
|
|
920
|
+
*
|
|
921
|
+
* @example
|
|
922
|
+
* const { available } = await board.me.profile.handleAvailable('jane');
|
|
923
|
+
*/
|
|
924
|
+
handleAvailable(handle, options) {
|
|
925
|
+
return client.fetch(
|
|
926
|
+
"/me/profile/handle-available",
|
|
927
|
+
{ ...options, query: { handle } }
|
|
928
|
+
);
|
|
929
|
+
},
|
|
930
|
+
/** List my experience entries. */
|
|
931
|
+
listExperience(options) {
|
|
932
|
+
return client.fetch(
|
|
933
|
+
"/me/profile/experience",
|
|
934
|
+
options
|
|
935
|
+
);
|
|
936
|
+
},
|
|
937
|
+
/** Add an experience entry. */
|
|
938
|
+
createExperience(body, options) {
|
|
939
|
+
return client.fetch("/me/profile/experience", {
|
|
940
|
+
...options,
|
|
941
|
+
method: "POST",
|
|
942
|
+
body
|
|
943
|
+
});
|
|
944
|
+
},
|
|
945
|
+
/** Update an experience entry (merge-patch). */
|
|
946
|
+
updateExperience(id, body, options) {
|
|
947
|
+
return client.fetch(
|
|
948
|
+
`/me/profile/experience/${encodeURIComponent(id)}`,
|
|
949
|
+
{ ...options, method: "PATCH", body }
|
|
950
|
+
);
|
|
951
|
+
},
|
|
952
|
+
/** Delete an experience entry. */
|
|
953
|
+
deleteExperience(id, options) {
|
|
954
|
+
return client.fetch(
|
|
955
|
+
`/me/profile/experience/${encodeURIComponent(id)}`,
|
|
956
|
+
{ ...options, method: "DELETE" }
|
|
957
|
+
);
|
|
958
|
+
},
|
|
959
|
+
/** List my education entries. */
|
|
960
|
+
listEducation(options) {
|
|
961
|
+
return client.fetch(
|
|
962
|
+
"/me/profile/education",
|
|
963
|
+
options
|
|
964
|
+
);
|
|
965
|
+
},
|
|
966
|
+
/** Add an education entry. */
|
|
967
|
+
createEducation(body, options) {
|
|
968
|
+
return client.fetch("/me/profile/education", {
|
|
969
|
+
...options,
|
|
970
|
+
method: "POST",
|
|
971
|
+
body
|
|
972
|
+
});
|
|
973
|
+
},
|
|
974
|
+
/** Update an education entry (merge-patch). */
|
|
975
|
+
updateEducation(id, body, options) {
|
|
976
|
+
return client.fetch(
|
|
977
|
+
`/me/profile/education/${encodeURIComponent(id)}`,
|
|
978
|
+
{ ...options, method: "PATCH", body }
|
|
979
|
+
);
|
|
980
|
+
},
|
|
981
|
+
/** Delete an education entry. */
|
|
982
|
+
deleteEducation(id, options) {
|
|
983
|
+
return client.fetch(
|
|
984
|
+
`/me/profile/education/${encodeURIComponent(id)}`,
|
|
985
|
+
{ ...options, method: "DELETE" }
|
|
986
|
+
);
|
|
987
|
+
},
|
|
988
|
+
/** List my skills. */
|
|
989
|
+
listSkills(options) {
|
|
990
|
+
return client.fetch(
|
|
991
|
+
"/me/profile/skills",
|
|
992
|
+
options
|
|
993
|
+
);
|
|
994
|
+
},
|
|
995
|
+
/** Replace my skills with the provided ordered names. */
|
|
996
|
+
updateSkills(body, options) {
|
|
997
|
+
return client.fetch(
|
|
998
|
+
"/me/profile/skills",
|
|
999
|
+
{ ...options, method: "PUT", body }
|
|
1000
|
+
);
|
|
1001
|
+
},
|
|
1002
|
+
/** List my languages. */
|
|
1003
|
+
listLanguages(options) {
|
|
1004
|
+
return client.fetch(
|
|
1005
|
+
"/me/profile/languages",
|
|
1006
|
+
options
|
|
1007
|
+
);
|
|
1008
|
+
},
|
|
1009
|
+
/** Replace my languages with the provided ordered set. */
|
|
1010
|
+
updateLanguages(body, options) {
|
|
1011
|
+
return client.fetch(
|
|
1012
|
+
"/me/profile/languages",
|
|
1013
|
+
{ ...options, method: "PUT", body }
|
|
1014
|
+
);
|
|
1015
|
+
},
|
|
1016
|
+
/**
|
|
1017
|
+
* Upload my avatar (JPEG/PNG/WebP, ≤5 MB) via a single multipart POST.
|
|
1018
|
+
*
|
|
1019
|
+
* @example
|
|
1020
|
+
* await board.me.profile.uploadAvatar(file);
|
|
1021
|
+
*/
|
|
1022
|
+
uploadAvatar(file, options) {
|
|
1023
|
+
const form = new FormData();
|
|
1024
|
+
form.append("file", file);
|
|
1025
|
+
return client.fetch("/me/profile/avatar", {
|
|
1026
|
+
...options,
|
|
1027
|
+
method: "POST",
|
|
1028
|
+
body: form
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
},
|
|
1032
|
+
/**
|
|
1033
|
+
* Signed-in notification preferences + the anonymous email-link
|
|
1034
|
+
* unsubscribe branch (doc 32).
|
|
1035
|
+
*/
|
|
1036
|
+
notificationPreferences: {
|
|
1037
|
+
/** List every notification channel + its subscribed state. */
|
|
1038
|
+
retrieve(options) {
|
|
1039
|
+
return client.fetch(
|
|
1040
|
+
"/me/notification-preferences",
|
|
1041
|
+
options
|
|
1042
|
+
);
|
|
1043
|
+
},
|
|
1044
|
+
/** Toggle one channel; returns the full updated set. */
|
|
1045
|
+
update(body, options) {
|
|
1046
|
+
return client.fetch(
|
|
1047
|
+
"/me/notification-preferences",
|
|
1048
|
+
{ ...options, method: "PUT", body }
|
|
1049
|
+
);
|
|
1050
|
+
},
|
|
1051
|
+
/**
|
|
1052
|
+
* Anonymous one-click unsubscribe via an HMAC email-link token — no
|
|
1053
|
+
* session. Resolves void on success (204).
|
|
1054
|
+
*/
|
|
1055
|
+
unsubscribeWithToken(body, options) {
|
|
1056
|
+
return client.fetch("/me/notification-preferences/unsubscribe", {
|
|
1057
|
+
...options,
|
|
1058
|
+
method: "POST",
|
|
1059
|
+
body
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
1062
|
+
},
|
|
805
1063
|
savedJobs: {
|
|
806
1064
|
/**
|
|
807
1065
|
* List the authenticated user's saved jobs (each embeds the full
|
package/package.json
CHANGED
package/skills/manifest.json
CHANGED