@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.
- package/README.md +1 -1
- package/dist/cjs/authentication.js +158 -0
- package/dist/cjs/consts/endpoints.js +74 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/rest-client.js +124 -0
- package/dist/{testUtils → cjs/test-utils}/asserts.js +1 -1
- package/dist/{testUtils → cjs/test-utils}/mocks.js +8 -4
- package/dist/cjs/test-utils/msw-setup.js +27 -0
- package/dist/{testUtils/testDefaults.js → cjs/test-utils/test-defaults.js} +41 -52
- package/dist/cjs/todoist-api.js +1235 -0
- package/dist/{types → cjs/types}/entities.js +78 -31
- package/dist/cjs/types/errors.js +22 -0
- package/dist/cjs/types/http.js +22 -0
- package/dist/cjs/utils/case-conversion.js +69 -0
- package/dist/{utils → cjs/utils}/colors.js +3 -3
- package/dist/cjs/utils/fetch-with-retry.js +150 -0
- package/dist/{utils → cjs/utils}/index.js +4 -4
- package/dist/cjs/utils/multipart-upload.js +126 -0
- package/dist/{utils → cjs/utils}/processing-helpers.js +3 -3
- package/dist/{utils → cjs/utils}/sanitization.js +17 -28
- package/dist/{utils/urlHelpers.js → cjs/utils/url-helpers.js} +15 -15
- package/dist/{utils → cjs/utils}/validators.js +28 -1
- package/dist/esm/authentication.js +151 -0
- package/dist/esm/consts/endpoints.js +65 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/rest-client.js +119 -0
- package/dist/esm/test-utils/asserts.js +8 -0
- package/dist/esm/test-utils/mocks.js +10 -0
- package/dist/esm/test-utils/msw-setup.js +22 -0
- package/dist/esm/test-utils/test-defaults.js +198 -0
- package/dist/esm/todoist-api.js +1231 -0
- package/dist/esm/types/entities.js +366 -0
- package/dist/esm/types/errors.js +18 -0
- package/dist/esm/types/http.js +18 -0
- package/dist/esm/types/index.js +3 -0
- package/dist/esm/types/requests.js +1 -0
- package/dist/esm/types/sync.js +1 -0
- package/dist/esm/utils/activity-helpers.js +36 -0
- package/dist/esm/utils/case-conversion.js +61 -0
- package/dist/esm/utils/colors.js +215 -0
- package/dist/esm/utils/fetch-with-retry.js +147 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/multipart-upload.js +120 -0
- package/dist/esm/utils/processing-helpers.js +12 -0
- package/dist/esm/utils/sanitization.js +112 -0
- package/dist/esm/utils/url-helpers.js +68 -0
- package/dist/esm/utils/validators.js +97 -0
- package/dist/{authentication.d.ts → types/authentication.d.ts} +6 -1
- package/dist/{consts → types/consts}/endpoints.d.ts +11 -0
- package/dist/types/index.d.ts +4 -3
- package/dist/types/rest-client.d.ts +15 -0
- package/dist/types/test-utils/msw-setup.d.ts +3 -0
- package/dist/{TodoistApi.d.ts → types/todoist-api.d.ts} +91 -2
- package/dist/types/{entities.d.ts → types/entities.d.ts} +119 -0
- package/dist/types/types/http.d.ts +68 -0
- package/dist/types/types/index.d.ts +3 -0
- package/dist/types/{requests.d.ts → types/requests.d.ts} +137 -0
- package/dist/types/utils/case-conversion.d.ts +12 -0
- package/dist/types/utils/fetch-with-retry.d.ts +11 -0
- package/dist/types/utils/index.d.ts +3 -0
- package/dist/types/utils/multipart-upload.d.ts +50 -0
- package/dist/{utils → types/utils}/validators.d.ts +7 -1
- package/package.json +24 -8
- package/dist/TodoistApi.js +0 -1209
- package/dist/authentication.js +0 -199
- package/dist/consts/endpoints.js +0 -50
- package/dist/index.d.ts +0 -4
- package/dist/restClient.d.ts +0 -5
- package/dist/restClient.js +0 -170
- package/dist/types/errors.js +0 -39
- package/dist/types/http.d.ts +0 -1
- package/dist/types/http.js +0 -2
- package/dist/utils/index.d.ts +0 -3
- /package/dist/{types → cjs/types}/index.js +0 -0
- /package/dist/{types → cjs/types}/requests.js +0 -0
- /package/dist/{types → cjs/types}/sync.js +0 -0
- /package/dist/{utils → cjs/utils}/activity-helpers.js +0 -0
- /package/dist/{testUtils → types/test-utils}/asserts.d.ts +0 -0
- /package/dist/{testUtils → types/test-utils}/mocks.d.ts +0 -0
- /package/dist/{testUtils/testDefaults.d.ts → types/test-utils/test-defaults.d.ts} +0 -0
- /package/dist/types/{errors.d.ts → types/errors.d.ts} +0 -0
- /package/dist/types/{sync.d.ts → types/sync.d.ts} +0 -0
- /package/dist/{utils → types/utils}/activity-helpers.d.ts +0 -0
- /package/dist/{utils → types/utils}/colors.d.ts +0 -0
- /package/dist/{utils → types/utils}/processing-helpers.d.ts +0 -0
- /package/dist/{utils → types/utils}/sanitization.d.ts +0 -0
- /package/dist/{utils/urlHelpers.d.ts → types/utils/url-helpers.d.ts} +0 -0
package/dist/authentication.js
DELETED
|
@@ -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
|
-
}
|
package/dist/consts/endpoints.js
DELETED
|
@@ -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
package/dist/restClient.d.ts
DELETED
|
@@ -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>>;
|
package/dist/restClient.js
DELETED
|
@@ -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
|
-
}
|
package/dist/types/errors.js
DELETED
|
@@ -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;
|
package/dist/types/http.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type HttpMethod = 'POST' | 'GET' | 'DELETE';
|
package/dist/types/http.js
DELETED
package/dist/utils/index.d.ts
DELETED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|