@doist/todoist-api-typescript 5.8.0 → 6.0.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.
Files changed (88) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/authentication.js +158 -0
  3. package/dist/cjs/consts/endpoints.js +74 -0
  4. package/dist/{index.js → cjs/index.js} +1 -1
  5. package/dist/cjs/package.json +1 -0
  6. package/dist/cjs/rest-client.js +124 -0
  7. package/dist/{testUtils → cjs/test-utils}/asserts.js +1 -1
  8. package/dist/{testUtils → cjs/test-utils}/mocks.js +8 -4
  9. package/dist/cjs/test-utils/msw-setup.js +27 -0
  10. package/dist/{testUtils/testDefaults.js → cjs/test-utils/test-defaults.js} +41 -52
  11. package/dist/cjs/todoist-api.js +1235 -0
  12. package/dist/{types → cjs/types}/entities.js +78 -31
  13. package/dist/cjs/types/errors.js +22 -0
  14. package/dist/cjs/types/http.js +22 -0
  15. package/dist/cjs/utils/case-conversion.js +69 -0
  16. package/dist/{utils → cjs/utils}/colors.js +3 -3
  17. package/dist/cjs/utils/fetch-with-retry.js +150 -0
  18. package/dist/{utils → cjs/utils}/index.js +4 -4
  19. package/dist/cjs/utils/multipart-upload.js +126 -0
  20. package/dist/{utils → cjs/utils}/processing-helpers.js +3 -3
  21. package/dist/{utils → cjs/utils}/sanitization.js +17 -28
  22. package/dist/{utils/urlHelpers.js → cjs/utils/url-helpers.js} +15 -15
  23. package/dist/{utils → cjs/utils}/validators.js +28 -1
  24. package/dist/esm/authentication.js +151 -0
  25. package/dist/esm/consts/endpoints.js +65 -0
  26. package/dist/esm/index.js +4 -0
  27. package/dist/esm/rest-client.js +119 -0
  28. package/dist/esm/test-utils/asserts.js +8 -0
  29. package/dist/esm/test-utils/mocks.js +10 -0
  30. package/dist/esm/test-utils/msw-setup.js +22 -0
  31. package/dist/esm/test-utils/test-defaults.js +198 -0
  32. package/dist/esm/todoist-api.js +1231 -0
  33. package/dist/esm/types/entities.js +366 -0
  34. package/dist/esm/types/errors.js +18 -0
  35. package/dist/esm/types/http.js +18 -0
  36. package/dist/esm/types/index.js +3 -0
  37. package/dist/esm/types/requests.js +1 -0
  38. package/dist/esm/types/sync.js +1 -0
  39. package/dist/esm/utils/activity-helpers.js +36 -0
  40. package/dist/esm/utils/case-conversion.js +61 -0
  41. package/dist/esm/utils/colors.js +215 -0
  42. package/dist/esm/utils/fetch-with-retry.js +147 -0
  43. package/dist/esm/utils/index.js +3 -0
  44. package/dist/esm/utils/multipart-upload.js +120 -0
  45. package/dist/esm/utils/processing-helpers.js +12 -0
  46. package/dist/esm/utils/sanitization.js +112 -0
  47. package/dist/esm/utils/url-helpers.js +68 -0
  48. package/dist/esm/utils/validators.js +97 -0
  49. package/dist/{authentication.d.ts → types/authentication.d.ts} +6 -1
  50. package/dist/{consts → types/consts}/endpoints.d.ts +11 -0
  51. package/dist/types/index.d.ts +4 -3
  52. package/dist/types/rest-client.d.ts +15 -0
  53. package/dist/types/test-utils/msw-setup.d.ts +3 -0
  54. package/dist/{TodoistApi.d.ts → types/todoist-api.d.ts} +91 -2
  55. package/dist/types/{entities.d.ts → types/entities.d.ts} +119 -0
  56. package/dist/types/types/http.d.ts +68 -0
  57. package/dist/types/types/index.d.ts +3 -0
  58. package/dist/types/{requests.d.ts → types/requests.d.ts} +137 -0
  59. package/dist/types/utils/case-conversion.d.ts +12 -0
  60. package/dist/types/utils/fetch-with-retry.d.ts +11 -0
  61. package/dist/types/utils/index.d.ts +3 -0
  62. package/dist/types/utils/multipart-upload.d.ts +50 -0
  63. package/dist/{utils → types/utils}/validators.d.ts +7 -1
  64. package/package.json +24 -8
  65. package/dist/TodoistApi.js +0 -1209
  66. package/dist/authentication.js +0 -199
  67. package/dist/consts/endpoints.js +0 -50
  68. package/dist/index.d.ts +0 -4
  69. package/dist/restClient.d.ts +0 -5
  70. package/dist/restClient.js +0 -170
  71. package/dist/types/errors.js +0 -39
  72. package/dist/types/http.d.ts +0 -1
  73. package/dist/types/http.js +0 -2
  74. package/dist/utils/index.d.ts +0 -3
  75. /package/dist/{types → cjs/types}/index.js +0 -0
  76. /package/dist/{types → cjs/types}/requests.js +0 -0
  77. /package/dist/{types → cjs/types}/sync.js +0 -0
  78. /package/dist/{utils → cjs/utils}/activity-helpers.js +0 -0
  79. /package/dist/{testUtils → types/test-utils}/asserts.d.ts +0 -0
  80. /package/dist/{testUtils → types/test-utils}/mocks.d.ts +0 -0
  81. /package/dist/{testUtils/testDefaults.d.ts → types/test-utils/test-defaults.d.ts} +0 -0
  82. /package/dist/types/{errors.d.ts → types/errors.d.ts} +0 -0
  83. /package/dist/types/{sync.d.ts → types/sync.d.ts} +0 -0
  84. /package/dist/{utils → types/utils}/activity-helpers.d.ts +0 -0
  85. /package/dist/{utils → types/utils}/colors.d.ts +0 -0
  86. /package/dist/{utils → types/utils}/processing-helpers.d.ts +0 -0
  87. /package/dist/{utils → types/utils}/sanitization.d.ts +0 -0
  88. /package/dist/{utils/urlHelpers.d.ts → types/utils/url-helpers.d.ts} +0 -0
@@ -1,199 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.getAuthStateParameter = getAuthStateParameter;
40
- exports.getAuthorizationUrl = getAuthorizationUrl;
41
- exports.getAuthToken = getAuthToken;
42
- exports.revokeAuthToken = revokeAuthToken;
43
- exports.revokeToken = revokeToken;
44
- var restClient_1 = require("./restClient");
45
- var uuid_1 = require("uuid");
46
- var types_1 = require("./types");
47
- var endpoints_1 = require("./consts/endpoints");
48
- /**
49
- * Creates a Basic Authentication header value from client credentials.
50
- * @param clientId - The OAuth client ID
51
- * @param clientSecret - The OAuth client secret
52
- * @returns The Basic Auth header value (without the 'Basic ' prefix)
53
- */
54
- function createBasicAuthHeader(clientId, clientSecret) {
55
- var credentials = "".concat(clientId, ":").concat(clientSecret);
56
- return Buffer.from(credentials).toString('base64');
57
- }
58
- /**
59
- * Generates a random state parameter for OAuth2 authorization.
60
- * The state parameter helps prevent CSRF attacks.
61
- *
62
- * @example
63
- * ```typescript
64
- * const state = getAuthStateParameter()
65
- * // Store state in session
66
- * const authUrl = getAuthorizationUrl(clientId, ['data:read'], state)
67
- * ```
68
- *
69
- * @returns A random UUID v4 string
70
- */
71
- function getAuthStateParameter() {
72
- return (0, uuid_1.v4)();
73
- }
74
- /**
75
- * Generates the authorization URL for the OAuth2 flow.
76
- *
77
- * @example
78
- * ```typescript
79
- * const url = getAuthorizationUrl(
80
- * 'your-client-id',
81
- * ['data:read', 'task:add'],
82
- * state
83
- * )
84
- * // Redirect user to url
85
- * ```
86
- *
87
- * @returns The full authorization URL to redirect users to
88
- * @see https://todoist.com/api/v1/docs#tag/Authorization/OAuth
89
- */
90
- function getAuthorizationUrl(clientId, permissions, state, baseUrl) {
91
- if (!(permissions === null || permissions === void 0 ? void 0 : permissions.length)) {
92
- throw new Error('At least one scope value should be passed for permissions.');
93
- }
94
- var scope = permissions.join(',');
95
- return "".concat((0, endpoints_1.getAuthBaseUri)(baseUrl)).concat(endpoints_1.ENDPOINT_AUTHORIZATION, "?client_id=").concat(clientId, "&scope=").concat(scope, "&state=").concat(state);
96
- }
97
- /**
98
- * Exchanges an authorization code for an access token.
99
- *
100
- * @example
101
- * ```typescript
102
- * const { accessToken } = await getAuthToken({
103
- * clientId: 'your-client-id',
104
- * clientSecret: 'your-client-secret',
105
- * code: authCode
106
- * })
107
- * ```
108
- *
109
- * @returns The access token response
110
- * @throws {@link TodoistRequestError} If the token exchange fails
111
- */
112
- function getAuthToken(args, baseUrl) {
113
- return __awaiter(this, void 0, void 0, function () {
114
- var response;
115
- var _a;
116
- return __generator(this, function (_b) {
117
- switch (_b.label) {
118
- case 0: return [4 /*yield*/, (0, restClient_1.request)('POST', (0, endpoints_1.getAuthBaseUri)(baseUrl), endpoints_1.ENDPOINT_GET_TOKEN, undefined, args)];
119
- case 1:
120
- response = _b.sent();
121
- if (response.status !== 200 || !((_a = response.data) === null || _a === void 0 ? void 0 : _a.accessToken)) {
122
- throw new types_1.TodoistRequestError('Authentication token exchange failed.', response.status, response.data);
123
- }
124
- return [2 /*return*/, response.data];
125
- }
126
- });
127
- });
128
- }
129
- /**
130
- * Revokes an access token, making it invalid for future use.
131
- *
132
- * @example
133
- * ```typescript
134
- * await revokeAuthToken({
135
- * clientId: 'your-client-id',
136
- * clientSecret: 'your-client-secret',
137
- * accessToken: token
138
- * })
139
- * ```
140
- *
141
- * @deprecated Use {@link revokeToken} instead. This function uses a legacy endpoint that will be removed in a future version. The new function uses the RFC 7009 compliant endpoint.
142
- * @returns True if revocation was successful
143
- * @see https://todoist.com/api/v1/docs#tag/Authorization/operation/revoke_access_token_api_api_v1_access_tokens_delete
144
- */
145
- function revokeAuthToken(args, baseUrl) {
146
- return __awaiter(this, void 0, void 0, function () {
147
- var response;
148
- return __generator(this, function (_a) {
149
- switch (_a.label) {
150
- case 0: return [4 /*yield*/, (0, restClient_1.request)('POST', (0, endpoints_1.getSyncBaseUri)(baseUrl), endpoints_1.ENDPOINT_REVOKE_TOKEN, undefined, args)];
151
- case 1:
152
- response = _a.sent();
153
- return [2 /*return*/, (0, restClient_1.isSuccess)(response)];
154
- }
155
- });
156
- });
157
- }
158
- /**
159
- * Revokes a token using the RFC 7009 OAuth 2.0 Token Revocation standard.
160
- *
161
- * This function uses HTTP Basic Authentication with client credentials and follows
162
- * the RFC 7009 specification for token revocation.
163
- *
164
- * @example
165
- * ```typescript
166
- * await revokeToken({
167
- * clientId: 'your-client-id',
168
- * clientSecret: 'your-client-secret',
169
- * token: 'access-token-to-revoke'
170
- * })
171
- * ```
172
- *
173
- * @returns True if revocation was successful
174
- * @see https://datatracker.ietf.org/doc/html/rfc7009
175
- * @see https://todoist.com/api/v1/docs#tag/Authorization
176
- */
177
- function revokeToken(args, baseUrl) {
178
- return __awaiter(this, void 0, void 0, function () {
179
- var clientId, clientSecret, token, basicAuth, customHeaders, requestBody, response;
180
- return __generator(this, function (_a) {
181
- switch (_a.label) {
182
- case 0:
183
- clientId = args.clientId, clientSecret = args.clientSecret, token = args.token;
184
- basicAuth = createBasicAuthHeader(clientId, clientSecret);
185
- customHeaders = {
186
- Authorization: "Basic ".concat(basicAuth),
187
- };
188
- requestBody = {
189
- token: token,
190
- token_type_hint: 'access_token',
191
- };
192
- return [4 /*yield*/, (0, restClient_1.request)('POST', (0, endpoints_1.getSyncBaseUri)(baseUrl), endpoints_1.ENDPOINT_REVOKE, undefined, requestBody, undefined, false, customHeaders)];
193
- case 1:
194
- response = _a.sent();
195
- return [2 /*return*/, (0, restClient_1.isSuccess)(response)];
196
- }
197
- });
198
- });
199
- }
@@ -1,50 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ENDPOINT_REVOKE = exports.ENDPOINT_REVOKE_TOKEN = exports.ENDPOINT_GET_TOKEN = exports.ENDPOINT_AUTHORIZATION = exports.ENDPOINT_SYNC = exports.ENDPOINT_SYNC_QUICK_ADD = exports.PROJECT_UNARCHIVE = exports.PROJECT_ARCHIVE = exports.ENDPOINT_REST_UPLOADS = exports.ENDPOINT_REST_ACTIVITIES = exports.ENDPOINT_REST_PRODUCTIVITY = exports.ENDPOINT_REST_USER = exports.ENDPOINT_REST_PROJECT_COLLABORATORS = exports.ENDPOINT_REST_PROJECTS_ARCHIVED = exports.ENDPOINT_REST_PROJECTS = exports.ENDPOINT_REST_TASK_MOVE = exports.ENDPOINT_REST_TASK_REOPEN = exports.ENDPOINT_REST_TASK_CLOSE = exports.ENDPOINT_REST_COMMENTS = exports.ENDPOINT_REST_LABELS_SHARED_REMOVE = exports.ENDPOINT_REST_LABELS_SHARED_RENAME = exports.ENDPOINT_REST_LABELS_SHARED = exports.ENDPOINT_REST_LABELS = exports.ENDPOINT_REST_SECTIONS = exports.ENDPOINT_REST_TASKS_COMPLETED_SEARCH = exports.ENDPOINT_REST_TASKS_COMPLETED_BY_DUE_DATE = exports.ENDPOINT_REST_TASKS_COMPLETED_BY_COMPLETION_DATE = exports.ENDPOINT_REST_TASKS_FILTER = exports.ENDPOINT_REST_TASKS = exports.API_BASE_URI = exports.API_VERSION = exports.TODOIST_WEB_URI = void 0;
4
- exports.getSyncBaseUri = getSyncBaseUri;
5
- exports.getAuthBaseUri = getAuthBaseUri;
6
- var BASE_URI = 'https://api.todoist.com';
7
- var TODOIST_URI = 'https://todoist.com';
8
- exports.TODOIST_WEB_URI = 'https://app.todoist.com/app';
9
- // The API version is not configurable, to ensure
10
- // compatibility between the API and the client.
11
- exports.API_VERSION = 'v1';
12
- exports.API_BASE_URI = "/api/".concat(exports.API_VERSION, "/");
13
- var API_AUTHORIZATION_BASE_URI = '/oauth/';
14
- function getSyncBaseUri(domainBase) {
15
- if (domainBase === void 0) { domainBase = BASE_URI; }
16
- return new URL(exports.API_BASE_URI, domainBase).toString();
17
- }
18
- function getAuthBaseUri(domainBase) {
19
- if (domainBase === void 0) { domainBase = TODOIST_URI; }
20
- return new URL(API_AUTHORIZATION_BASE_URI, domainBase).toString();
21
- }
22
- exports.ENDPOINT_REST_TASKS = 'tasks';
23
- exports.ENDPOINT_REST_TASKS_FILTER = exports.ENDPOINT_REST_TASKS + '/filter';
24
- exports.ENDPOINT_REST_TASKS_COMPLETED_BY_COMPLETION_DATE = exports.ENDPOINT_REST_TASKS + '/completed/by_completion_date';
25
- exports.ENDPOINT_REST_TASKS_COMPLETED_BY_DUE_DATE = exports.ENDPOINT_REST_TASKS + '/completed/by_due_date';
26
- exports.ENDPOINT_REST_TASKS_COMPLETED_SEARCH = 'completed/search';
27
- exports.ENDPOINT_REST_SECTIONS = 'sections';
28
- exports.ENDPOINT_REST_LABELS = 'labels';
29
- exports.ENDPOINT_REST_LABELS_SHARED = exports.ENDPOINT_REST_LABELS + '/shared';
30
- exports.ENDPOINT_REST_LABELS_SHARED_RENAME = exports.ENDPOINT_REST_LABELS_SHARED + '/rename';
31
- exports.ENDPOINT_REST_LABELS_SHARED_REMOVE = exports.ENDPOINT_REST_LABELS_SHARED + '/remove';
32
- exports.ENDPOINT_REST_COMMENTS = 'comments';
33
- exports.ENDPOINT_REST_TASK_CLOSE = 'close';
34
- exports.ENDPOINT_REST_TASK_REOPEN = 'reopen';
35
- exports.ENDPOINT_REST_TASK_MOVE = 'move';
36
- exports.ENDPOINT_REST_PROJECTS = 'projects';
37
- exports.ENDPOINT_REST_PROJECTS_ARCHIVED = exports.ENDPOINT_REST_PROJECTS + '/archived';
38
- exports.ENDPOINT_REST_PROJECT_COLLABORATORS = 'collaborators';
39
- exports.ENDPOINT_REST_USER = 'user';
40
- exports.ENDPOINT_REST_PRODUCTIVITY = exports.ENDPOINT_REST_TASKS + '/completed/stats';
41
- exports.ENDPOINT_REST_ACTIVITIES = 'activities';
42
- exports.ENDPOINT_REST_UPLOADS = 'uploads';
43
- exports.PROJECT_ARCHIVE = 'archive';
44
- exports.PROJECT_UNARCHIVE = 'unarchive';
45
- exports.ENDPOINT_SYNC_QUICK_ADD = exports.ENDPOINT_REST_TASKS + '/quick';
46
- exports.ENDPOINT_SYNC = 'sync';
47
- exports.ENDPOINT_AUTHORIZATION = 'authorize';
48
- exports.ENDPOINT_GET_TOKEN = 'access_token';
49
- exports.ENDPOINT_REVOKE_TOKEN = 'access_tokens/revoke';
50
- exports.ENDPOINT_REVOKE = 'revoke';
package/dist/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './TodoistApi';
2
- export * from './authentication';
3
- export * from './types';
4
- export * from './utils';
@@ -1,5 +0,0 @@
1
- import { AxiosResponse } from 'axios';
2
- import { HttpMethod } from './types/http';
3
- export declare function paramsSerializer(params: Record<string, unknown>): string;
4
- export declare function isSuccess(response: AxiosResponse): boolean;
5
- export declare function request<T>(httpMethod: HttpMethod, baseUri: string, relativePath: string, apiToken?: string, payload?: Record<string, unknown>, requestId?: string, hasSyncCommands?: boolean, customHeaders?: Record<string, string>): Promise<AxiosResponse<T>>;
@@ -1,170 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __importDefault = (this && this.__importDefault) || function (mod) {
50
- return (mod && mod.__esModule) ? mod : { "default": mod };
51
- };
52
- Object.defineProperty(exports, "__esModule", { value: true });
53
- exports.paramsSerializer = paramsSerializer;
54
- exports.isSuccess = isSuccess;
55
- exports.request = request;
56
- // eslint-disable-next-line import/no-named-as-default
57
- var axios_1 = __importDefault(require("axios"));
58
- var axios_case_converter_1 = __importDefault(require("axios-case-converter"));
59
- var errors_1 = require("./types/errors");
60
- var uuid_1 = require("uuid");
61
- var axios_retry_1 = __importDefault(require("axios-retry"));
62
- var endpoints_1 = require("./consts/endpoints");
63
- var processing_helpers_1 = require("./utils/processing-helpers");
64
- function paramsSerializer(params) {
65
- var qs = new URLSearchParams();
66
- Object.keys(params).forEach(function (key) {
67
- var value = params[key];
68
- if (value != null) {
69
- if (Array.isArray(value)) {
70
- qs.append(key, value.join(','));
71
- }
72
- else {
73
- qs.append(key, String(value));
74
- }
75
- }
76
- });
77
- return qs.toString();
78
- }
79
- var defaultHeaders = {
80
- 'Content-Type': 'application/json',
81
- };
82
- function getAuthHeader(apiKey) {
83
- return "Bearer ".concat(apiKey);
84
- }
85
- function isNetworkError(error) {
86
- return Boolean(!error.response && error.code !== 'ECONNABORTED');
87
- }
88
- function getRetryDelay(retryCount) {
89
- return retryCount === 1 ? 0 : 500;
90
- }
91
- function isAxiosError(error) {
92
- return Boolean(error === null || error === void 0 ? void 0 : error.isAxiosError);
93
- }
94
- function getTodoistRequestError(error, originalStack) {
95
- var requestError = new errors_1.TodoistRequestError(error.message);
96
- requestError.stack = isAxiosError(error) && originalStack ? originalStack.stack : error.stack;
97
- if (isAxiosError(error) && error.response) {
98
- requestError.httpStatusCode = error.response.status;
99
- requestError.responseData = error.response.data;
100
- }
101
- return requestError;
102
- }
103
- function getRequestConfiguration(baseURL, apiToken, requestId, customHeaders) {
104
- var authHeader = apiToken ? { Authorization: getAuthHeader(apiToken) } : undefined;
105
- var requestIdHeader = requestId ? { 'X-Request-Id': requestId } : undefined;
106
- var headers = __assign(__assign(__assign(__assign({}, defaultHeaders), authHeader), requestIdHeader), customHeaders);
107
- return { baseURL: baseURL, headers: headers };
108
- }
109
- function getAxiosClient(baseURL, apiToken, requestId, customHeaders) {
110
- var configuration = getRequestConfiguration(baseURL, apiToken, requestId, customHeaders);
111
- var client = (0, axios_case_converter_1.default)(axios_1.default.create(configuration), {
112
- caseFunctions: {
113
- camel: processing_helpers_1.customCamelCase,
114
- },
115
- });
116
- (0, axios_retry_1.default)(client, {
117
- retries: 3,
118
- retryCondition: isNetworkError,
119
- retryDelay: getRetryDelay,
120
- });
121
- return client;
122
- }
123
- function isSuccess(response) {
124
- return response.status >= 200 && response.status < 300;
125
- }
126
- function request(httpMethod, baseUri, relativePath, apiToken, payload, requestId, hasSyncCommands, customHeaders) {
127
- return __awaiter(this, void 0, void 0, function () {
128
- var originalStack, axiosClient, _a, error_1;
129
- return __generator(this, function (_b) {
130
- switch (_b.label) {
131
- case 0:
132
- originalStack = new Error();
133
- _b.label = 1;
134
- case 1:
135
- _b.trys.push([1, 9, , 10]);
136
- // Sync api don't allow a request id in the CORS
137
- if (httpMethod === 'POST' && !requestId && !baseUri.includes(endpoints_1.API_BASE_URI)) {
138
- requestId = (0, uuid_1.v4)();
139
- }
140
- axiosClient = getAxiosClient(baseUri, apiToken, requestId, customHeaders);
141
- _a = httpMethod;
142
- switch (_a) {
143
- case 'GET': return [3 /*break*/, 2];
144
- case 'POST': return [3 /*break*/, 4];
145
- case 'DELETE': return [3 /*break*/, 6];
146
- }
147
- return [3 /*break*/, 8];
148
- case 2: return [4 /*yield*/, axiosClient.get(relativePath, {
149
- params: payload,
150
- paramsSerializer: {
151
- serialize: paramsSerializer,
152
- },
153
- })];
154
- case 3: return [2 /*return*/, _b.sent()];
155
- case 4: return [4 /*yield*/, axiosClient.post(relativePath, hasSyncCommands ? JSON.stringify(payload) : payload)];
156
- case 5: return [2 /*return*/, _b.sent()];
157
- case 6: return [4 /*yield*/, axiosClient.delete(relativePath)];
158
- case 7: return [2 /*return*/, _b.sent()];
159
- case 8: return [3 /*break*/, 10];
160
- case 9:
161
- error_1 = _b.sent();
162
- if (!isAxiosError(error_1) && !(error_1 instanceof Error)) {
163
- throw new Error('An unknown error occurred during the request');
164
- }
165
- throw getTodoistRequestError(error_1, originalStack);
166
- case 10: return [2 /*return*/];
167
- }
168
- });
169
- });
170
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.TodoistRequestError = void 0;
19
- var ts_custom_error_1 = require("ts-custom-error");
20
- var authenticationErrorCodes = [401, 403];
21
- var TodoistRequestError = /** @class */ (function (_super) {
22
- __extends(TodoistRequestError, _super);
23
- function TodoistRequestError(message, httpStatusCode, responseData) {
24
- var _this = _super.call(this, message) || this;
25
- _this.message = message;
26
- _this.httpStatusCode = httpStatusCode;
27
- _this.responseData = responseData;
28
- _this.isAuthenticationError = function () {
29
- if (!_this.httpStatusCode) {
30
- return false;
31
- }
32
- return authenticationErrorCodes.includes(_this.httpStatusCode);
33
- };
34
- Object.defineProperty(_this, 'name', { value: 'TodoistRequestError' });
35
- return _this;
36
- }
37
- return TodoistRequestError;
38
- }(ts_custom_error_1.CustomError));
39
- exports.TodoistRequestError = TodoistRequestError;
@@ -1 +0,0 @@
1
- export type HttpMethod = 'POST' | 'GET' | 'DELETE';
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +0,0 @@
1
- export * from './colors';
2
- export * from './sanitization';
3
- export { getTaskUrl, getProjectUrl, getSectionUrl } from './urlHelpers';
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes