├── .github └── FUNDING.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── examples ├── javascript │ ├── actions │ │ ├── deleteAction.js │ │ ├── searchAction.js │ │ ├── searchFieldAction.js │ │ └── updateAction.js │ ├── boards │ │ ├── createBoard.js │ │ ├── deleteBoard.js │ │ ├── searchBoard.js │ │ ├── searchBoardCards.js │ │ ├── searchBoardField.js │ │ ├── searchBoardPromise.js │ │ ├── searchBoardWithFilter.js │ │ ├── searchCards.js │ │ ├── searchClosedCards.js │ │ ├── searchFieldBoard.js │ │ └── updateBoard.js │ ├── cards │ │ ├── createCard.js │ │ ├── deleteCard.js │ │ ├── searchCard.js │ │ ├── searchFieldCard.js │ │ └── updateCard.js │ ├── checklists │ │ ├── createChecklist.js │ │ ├── deleteChecklist.js │ │ ├── searchChecklist.js │ │ ├── searchFieldChecklist.js │ │ └── updateChecklist.js │ ├── enterprises │ │ └── searchEnterprises.js │ ├── labels │ │ ├── createLabel.js │ │ ├── deleteLabel.js │ │ ├── searchLabel.js │ │ └── updateLabel.js │ ├── lists │ │ ├── createList.js │ │ ├── searchFieldList.js │ │ ├── searchList.js │ │ └── updateList.js │ ├── members │ │ ├── searchFieldMember.js │ │ ├── searchMember.js │ │ └── searchMemberBoards.js │ ├── notifications │ │ ├── searchFieldNotification.js │ │ ├── searchNotification.js │ │ └── updateNotification.js │ ├── organizations │ │ ├── createOrganization.js │ │ ├── deleteOrganization.js │ │ ├── searchFieldOrganization.js │ │ ├── searchOrganization.js │ │ └── updateOrganization.js │ └── webhooks │ │ ├── createWebhook.js │ │ ├── deleteWebhook.js │ │ ├── searchFieldWebhook.js │ │ ├── searchWebhook.js │ │ └── updateWebhook.js └── typescript │ ├── .npmrc │ ├── package.json │ └── src │ ├── actions │ ├── delete.ts │ ├── search.ts │ ├── searchField.ts │ └── update.ts │ ├── boards │ ├── create.ts │ ├── delete.ts │ ├── search.ts │ ├── searchCards.ts │ ├── searchField.ts │ └── update.ts │ ├── cards │ ├── create.ts │ ├── delete.ts │ ├── search.ts │ ├── searchField.ts │ └── update.ts │ ├── checklists │ ├── create.ts │ ├── delete.ts │ ├── search.ts │ ├── searchField.ts │ └── update.ts │ ├── enterprises │ └── search.ts │ ├── labels │ ├── create.ts │ ├── delete.ts │ ├── search.ts │ └── update.ts │ ├── lists │ ├── create.ts │ ├── search.ts │ ├── searchField.ts │ └── update.ts │ ├── members │ ├── search.ts │ ├── searchBoards.ts │ └── searchField.ts │ ├── notifications │ ├── search.ts │ ├── searchField.ts │ └── update.ts │ ├── organizations │ ├── create.ts │ ├── delete.ts │ ├── search.ts │ ├── searchField.ts │ └── update.ts │ └── webhooks │ ├── create.ts │ ├── delete.ts │ ├── search.ts │ ├── searchField.ts │ └── update.ts ├── index.d.ts ├── lib ├── Error.js ├── MultipartDataGenerator.js ├── TrelloMethod.basic.js ├── TrelloMethod.js ├── TrelloResource.js ├── Webhooks.js ├── resources │ ├── Actions.js │ ├── Boards.js │ ├── Cards.js │ ├── Checklists.js │ ├── CustomField.js │ ├── Enterprises.js │ ├── Labels.js │ ├── Lists.js │ ├── Members.js │ ├── Notifications.js │ ├── Organizations.js │ └── Webhooks.js ├── trello-node-api.js └── utils.js ├── package.json ├── test ├── initialize │ └── index.ts ├── mocha.opts └── resources │ └── Board.spec.ts └── tsconfig.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: ['paypal.me/bhushankumarL'] 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .npm-debug.log 3 | tags 4 | package-lock.json 5 | .idea -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock = false 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4" 4 | - "5" 5 | - "6" 6 | - "7" 7 | - "8" 8 | sudo: false -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 0.0.9 2 | - Added New Search Methods in Boards API & Cards API 3 | 4 | 0.0.8 5 | - Upgrade library to latest version. 6 | - Search boards using the custom fields 7 | - Add Custom Fields Method in Board API & Card API 8 | 9 | 0.0.7 December 29, 2018 10 | - Add support for the cards filters 11 | - Make the test cases runnable properly 12 | 13 | 0.0.6 June 06, 2018 14 | - Added documentation for example 15 | - Added basic test cases 16 | 17 | 0.0.5 December 06, 2017 18 | - Bug fix 19 | 20 | 0.0.4 December 06, 2017 21 | - Add JavaScript examples : Card, Action, Labels, Webhook etc 22 | - Add TypeScript examples : Boards, Card, Action, Labels, Webhook etc 23 | 24 | 0.0.3 December 02, 2017 25 | - Add support for TypeScript 26 | - Add JavaScript examples 27 | - Add TypeScript examples 28 | - Add travis CI 29 | 30 | 0.0.2 October 15, 2017 31 | - Add details to the README.MD 32 | 33 | 0.0.1 October 15, 2017 34 | - Standard Support : Action, Boards, Cards, Checklists, Enterprises, Labels, Lists, Members, Notifications, Organizations, Webhooks -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2017 Bhushankumar Lilapara 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # trello-node-api (Trello REST API) 2 | [![Version](https://img.shields.io/npm/v/trello-node-api.svg)](https://www.npmjs.org/package/trello-node-api) 3 | [![Build Status](https://travis-ci.org/bhushankumarl/trello-node-api.svg?branch=master)](https://travis-ci.org/bhushankumarl/trello-node-api) 4 | 5 | This API supported Trello's standard REST-style API that accepts/returns JSON requests and Here is the [API reference] (https://developers.trello.com/v1.0/reference) 6 | 7 | You can find [examples here](https://github.com/bhushankumarl/trello-node-api/tree/master/examples). This will help you for faster implmentation of Trello's. 8 | 9 | ##### It does supports EcmaScript 5, EcmaScript 6, EcmaScript 8, TypeScript, async-await, Promises, Callback ! 10 | ##### It does also supports for AWS Lambda like serverless cloud function call. 11 | ##### It supports pure JSON response. 12 | ##### All methods support Promise and Callback both. 13 | ##### Please Feel free to create Issue for any help ! 14 | ##### All developers/contributors are requested to open Pull Request/Merge Request on development branch. Please make sure Test Cases be passed. 15 | 16 | ## Installation 17 | ```bash 18 | npm install trello-node-api --save 19 | ``` 20 | 21 | ## Debugging 22 | 23 | ```bash 24 | export DEBUG=TA:* 25 | ``` 26 | 27 | ## Configuration 28 | 29 | Set your API Key and Secret/Oauth Token. 30 | 31 | ```js 32 | var trelloNode = require('trello-node-api')(apiKey, oauthToken); 33 | ``` 34 | 35 | ## Configuration Using TypeScript 36 | ```typescript 37 | import * as TrelloNodeAPI from 'trello-node-api'; 38 | 39 | const trello = new TrelloNodeAPI(); 40 | trello.setApiKey('apiKey'); 41 | trello.setOauthToken('oauthToken'); 42 | ``` 43 | 44 | ## Pull Request 45 | - Contributors can send their Pull Request to `development` branch. 46 | - Kindly validate test cases & linting before opening new PR. 47 | 48 | ## Do you need an expert? 49 | Are you finding a developer for your world-class product? If yes, please contact here. [Submit your project request here.](https://goo.gl/forms/UofdG5GY5iHMoUWg2) 50 | Originally by [Bhushankumar L](mailto:bhushankumar.lilapara@gmail.com). 51 | 52 | ## Examples 53 | 54 | #### [Actions](https://github.com/bhushankumarl/trello-node-api/wiki/Actions-TypeScript) 55 | 56 | #### [Boards](https://github.com/bhushankumarl/trello-node-api/wiki/Boards-TypeScript) 57 | 58 | #### [Cards](https://github.com/bhushankumarl/trello-node-api/wiki/Cards-TypeScript) 59 | 60 | #### [Checklists](https://github.com/bhushankumarl/trello-node-api/wiki/Checklists-TypeScript) 61 | 62 | #### [Enterprises](https://github.com/bhushankumarl/trello-node-api/wiki/Enterprises-TypeScript) 63 | 64 | #### [Labels](https://github.com/bhushankumarl/trello-node-api/wiki/Labels-TypeScript) 65 | 66 | #### [Lists](https://github.com/bhushankumarl/trello-node-api/wiki/Lists-TypeScript) 67 | 68 | #### [Members](https://github.com/bhushankumarl/trello-node-api/wiki/Members-TypeScript) 69 | 70 | #### [Notifications](https://github.com/bhushankumarl/trello-node-api/wiki/Notifications-TypeScript) 71 | 72 | #### [Organizations](https://github.com/bhushankumarl/trello-node-api/wiki/Organizations-TypeScript) 73 | 74 | #### [Webhooks](https://github.com/bhushankumarl/trello-node-api/wiki/Webhooks-TypeScript) 75 | 76 | ### Actions 77 | #### Delete Action 78 | ``` 79 | Trello.action.del('ACTION_ID').then(function (response) { 80 | console.log('response ', response); 81 | }).catch(function (error) { 82 | console.log('error', error); 83 | }); 84 | ``` 85 | 86 | #### Search Action 87 | ``` 88 | Trello.action.search('ACTION_ID').then(function (response) { 89 | console.log('response ', response); 90 | }).catch(function (error) { 91 | console.log('error', error); 92 | }); 93 | ``` 94 | 95 | #### Search Field Action 96 | ``` 97 | Trello.action.searchField('ACTION_ID', 'FIELD_NAME').then(function (response) { 98 | console.log('response ', response); 99 | }).catch(function (error) { 100 | console.log('error', error); 101 | }); 102 | ``` 103 | 104 | #### Update Action 105 | ``` 106 | var id = 'ACTION_ID'; // REQUIRED 107 | var data = { 108 | text: 'TEXT' // REQUIRED 109 | }; 110 | Trello.action.update(id, data).then(function (response) { 111 | console.log('response ', response); 112 | }).catch(function (error) { 113 | console.log('error', error); 114 | }); 115 | ``` 116 | 117 | ### Boards 118 | #### Create Board 119 | ``` 120 | var data = { 121 | name: 'BOARD_NAME', // REQUIRED 122 | defaultLabels: false, 123 | defaultLists: false, 124 | desc: 'Board description.', 125 | idOrganization: 'ORGANIZATION_ID', 126 | idBoardSource: 'BOARD_ID', 127 | keepFromSource: 'none', 128 | powerUps: 'all', 129 | prefs_permissionLevel: 'private', 130 | prefs_voting: 'disabled', 131 | prefs_comments: 'members', 132 | prefs_invitations: 'members', 133 | prefs_selfJoin: true, 134 | prefs_cardCovers: true, 135 | prefs_background: 'blue', 136 | prefs_cardAging: 'regular' 137 | }; 138 | Trello.board.create(data).then(function (response) { 139 | console.log('response ', response); 140 | }).catch(function (error) { 141 | console.log('error', error); 142 | }); 143 | ``` 144 | 145 | #### Delete Board 146 | ``` 147 | Trello.board.del('BOARD_ID').then(function (response) { 148 | console.log('response ', response); 149 | }).catch(function (error) { 150 | console.log('error', error); 151 | }); 152 | ``` 153 | 154 | #### Search Board 155 | ``` 156 | Trello.board.search('BOARD_ID').then(function (response) { 157 | console.log('response ', response); 158 | }).catch(function (error) { 159 | console.log('error', error); 160 | }); 161 | ``` 162 | 163 | #### Search Board Cards 164 | ``` 165 | Trello.board.searchCards('BOARD_ID').then(function (response) { 166 | console.log('response ', response); 167 | }).catch(function (error) { 168 | console.log('error', error); 169 | }); 170 | ``` 171 | 172 | #### Search Board Field 173 | ``` 174 | var boardId = 'BOARD_ID'; 175 | var field = 'shortUrl'; 176 | Trello.board.searchField(boardId, field).then(function (response) { 177 | console.log('response ', response); 178 | }).catch(function (error) { 179 | console.log('error', error); 180 | }); 181 | ``` 182 | 183 | #### Search Board Promise 184 | ``` 185 | const promises = []; 186 | const boardIds = ['BOARD_ID_1', 'BOARD_ID_2']; 187 | 188 | boardIds.forEach((boardId) => { 189 | promises.push(Trello.board.search(boardId)); 190 | }); 191 | 192 | try { 193 | const boards = await Promise.all(promises); 194 | console.log('boards ', boards); 195 | } catch (error) { 196 | console.error('[trello]', error); 197 | } 198 | ``` 199 | 200 | #### Search Board With Filter 201 | ``` 202 | var boardId = 'BOARD_ID'; 203 | var fields = { 204 | actions: 'all' 205 | }; 206 | Trello.board.search(boardId, fields).then(function (response) { 207 | console.log('response ', response); 208 | }).catch(function (error) { 209 | console.log('error', error); 210 | }); 211 | ``` 212 | 213 | #### Search Cards 214 | ``` 215 | Trello.board.searchCards('BOARD_ID').then(function (response) { 216 | console.log('response ', response); 217 | }).catch(function (error) { 218 | console.log('error', error); 219 | }); 220 | ``` 221 | 222 | #### Search Closed Cards 223 | ``` 224 | Trello.board.searchCardsFilter('BOARD_ID', 'closed').then(function (response) { 225 | console.log('response ', response); 226 | }).catch(function (error) { 227 | console.log('error', error); 228 | }); 229 | ``` 230 | 231 | #### Search Field Board 232 | ``` 233 | Trello.board.searchField('BOARD_ID', 'FIELD_NAME').then(function (response) { 234 | console.log('response ', response); 235 | }).catch(function (error) { 236 | console.log('error', error); 237 | }); 238 | ``` 239 | 240 | #### Update Board 241 | ``` 242 | var id = 'BOARD_ID'; // REQUIRED 243 | var data = { 244 | name: 'BOARD', 245 | desc: 'Board descriptions', 246 | closed: false, 247 | subscribed: false, 248 | idOrganization: 'ORGANIZATION_ID', 249 | prefs_permissionLevel: 'private', 250 | prefs_selfJoin: true, 251 | prefs_cardCovers: true, 252 | prefs_invitations: 'members', 253 | prefs_voting: 'disabled', 254 | prefs_comments: 'members', 255 | prefs_background: 'blue', 256 | prefs_cardAging: 'regular', 257 | prefs_calendarFeedEnabled: false, 258 | labelNames_green: 'Test Label 1', 259 | labelNames_yellow: 'Test Label 2', 260 | labelNames_orange: 'Test Label 3', 261 | labelNames_red: 'Test Label 4', 262 | labelNames_purple: 'Test Label 5', 263 | labelNames_blue: 'Test Label 6' 264 | }; 265 | Trello.board.update(id, data).then(function (response) { 266 | console.log('response ', response); 267 | }).catch(function (error) { 268 | console.log('error', error); 269 | }); 270 | ``` 271 | 272 | ### Cards 273 | #### Create Card 274 | ``` 275 | var data = { 276 | name: 'CARD_NAME', 277 | desc: 'Card description', 278 | pos: 'top', 279 | idList: 'LIST_ID', //REQUIRED 280 | due: null, 281 | dueComplete: false, 282 | idMembers: ['MEMBER_ID', 'MEMBER_ID', 'MEMBER_ID'], 283 | idLabels: ['LABEL_ID', 'LABEL_ID', 'LABEL_ID'], 284 | urlSource: 'https://example.com', 285 | fileSource: 'file', 286 | idCardSource: 'CARD_ID', 287 | keepFromSource: 'attachments,checklists,comments,due,labels,members,stickers' 288 | }; 289 | Trello.card.create(data).then(function (response) { 290 | console.log('response ', response); 291 | }).catch(function (error) { 292 | console.log('error', error); 293 | }); 294 | ``` 295 | 296 | #### Delete Card 297 | ``` 298 | Trello.card.del('CARD_ID').then(function (response) { 299 | console.log('response ', response); 300 | }).catch(function (error) { 301 | console.log('error', error); 302 | }); 303 | ``` 304 | 305 | #### Search Card 306 | ``` 307 | Trello.card.search('CARD_ID').then(function (response) { 308 | console.log('response ', response); 309 | }).catch(function (error) { 310 | console.log('error', error); 311 | }); 312 | ``` 313 | 314 | #### Search Field Card 315 | ``` 316 | Trello.card.searchField('CARD_ID', 'FIELD_NAME').then(function (response) { 317 | console.log('response ', response); 318 | }).catch(function (error) { 319 | console.log('error', error); 320 | }); 321 | ``` 322 | 323 | #### Update Card 324 | ``` 325 | var id = 'CARD_ID'; // REQUIRED 326 | var data = { 327 | name: 'CARD_NAME_TEST', 328 | desc: 'Card description', 329 | closed: false, 330 | idMembers: 'MEMBER_ID,MEMBER_ID,MEMBER_ID', 331 | idAttachmentCover: null, 332 | idList: 'LIST_ID', 333 | idLabels: 'LABEL_ID, LABEL_ID, LABEL_ID', 334 | idBoard: false, 335 | pos: 'top', 336 | due: null, 337 | dueComplete: false, 338 | subscribed: false 339 | }; 340 | Trello.card.update(id, data).then(function (response) { 341 | console.log('response ', response); 342 | }).catch(function (error) { 343 | console.log('error', error); 344 | }); 345 | ``` 346 | 347 | ### Checklists 348 | #### Create Checklist 349 | ``` 350 | var data = { 351 | idCard: 'CARD_ID', // REQUIRED 352 | name: 'CHECKLIST_NAME', 353 | pos: 1 354 | }; 355 | Trello.checklist.create(data).then(function (response) { 356 | console.log('response ', response); 357 | }).catch(function (error) { 358 | console.log('error', error); 359 | }); 360 | ``` 361 | 362 | #### Delete Checklist 363 | ``` 364 | Trello.checklist.del('CHECKLIST_ID').then(function (response) { 365 | console.log('response ', response); 366 | }).catch(function (error) { 367 | console.log('error', error); 368 | }); 369 | ``` 370 | 371 | #### Search Checklist 372 | ``` 373 | Trello.checklist.search('CHECKLIST_ID').then(function (response) { 374 | console.log('response ', response); 375 | }).catch(function (error) { 376 | console.log('error', error); 377 | }); 378 | ``` 379 | 380 | #### Search Field Checklist 381 | ``` 382 | Trello.checklist.searchField('CHECKLIST_ID', 'FIELD_NAME').then(function (response) { 383 | console.log('response ', response); 384 | }).catch(function (error) { 385 | console.log('error', error); 386 | }); 387 | ``` 388 | 389 | #### Update Checklist 390 | ``` 391 | var id = 'CHECKLIST_ID'; // REQUIRED 392 | var data = { 393 | name: 'CHECKLIST_NAME', 394 | pos: 'top' 395 | }; 396 | Trello.checklist.update(id, data).then(function (response) { 397 | console.log('response ', response); 398 | }).catch(function (error) { 399 | console.log('error', error); 400 | }); 401 | ``` 402 | 403 | ### Enterprises 404 | #### Search Enterprises 405 | ``` 406 | Trello.enterprise.search('ENTERPRISE_ID').then(function (response) { 407 | console.log('response ', response); 408 | }).catch(function (error) { 409 | console.log('error', error); 410 | }); 411 | ``` 412 | 413 | ### Labels 414 | #### Create Label 415 | ``` 416 | var data = { 417 | name: 'LABEL_NAME', // REQUIRED 418 | color: 'orange', // REQUIRED 419 | idBoard: 'BOARD_ID' // REQUIRED 420 | }; 421 | Trello.label.create(data).then(function (response) { 422 | console.log('response ', response); 423 | }).catch(function (error) { 424 | console.log('error', error); 425 | }); 426 | ``` 427 | 428 | #### Delete Label 429 | ``` 430 | Trello.label.del('LABEL_ID').then(function (response) { 431 | console.log('response ', response); 432 | }).catch(function (error) { 433 | console.log('error', error); 434 | }); 435 | ``` 436 | 437 | #### Search Label 438 | ``` 439 | Trello.label.search('LABEL_ID').then(function (response) { 440 | console.log('response ', response); 441 | }).catch(function (error) { 442 | console.log('error', error); 443 | }); 444 | ``` 445 | 446 | #### Update Label 447 | ``` 448 | var id = 'LABEL_ID'; // REQUIRED 449 | var data = { 450 | name: 'NAME', 451 | color: 'orange' 452 | }; 453 | Trello.label.update(id, data).then(function (response) { 454 | console.log('response ', response); 455 | }).catch(function (error) { 456 | console.log('error', error); 457 | }); 458 | ``` 459 | 460 | ### Lists 461 | #### Create List 462 | ``` 463 | var data = { 464 | name: 'LIST_NAME', // REQUIRED 465 | idBoard: 'BOARD_ID', // REQUIRED 466 | idListSource: 'LIST_ID', 467 | pos: 'top' 468 | }; 469 | Trello.list.create(data).then(function (response) { 470 | console.log('response ', response); 471 | }).catch(function (error) { 472 | console.log('error', error); 473 | }); 474 | ``` 475 | 476 | #### Search Field List 477 | ``` 478 | Trello.list.searchField('LIST_ID', 'FIELD_NAME').then(function (response) { 479 | console.log('response ', response); 480 | }).catch(function (error) { 481 | console.log('error', error); 482 | }); 483 | ``` 484 | 485 | #### Search List 486 | ``` 487 | Trello.list.search('LIST_ID').then(function (response) { 488 | console.log('response ', response); 489 | }).catch(function (error) { 490 | console.log('error', error); 491 | }); 492 | ``` 493 | 494 | #### Update List 495 | ``` 496 | var id = 'LIST_ID'; // REQUIRED 497 | var data = { 498 | name: 'LIST_NAME', 499 | closed: false, 500 | pos: 'top', 501 | subscribed: false 502 | }; 503 | Trello.list.update(id, data).then(function (response) { 504 | console.log('response ', response); 505 | }).catch(function (error) { 506 | console.log('error', error); 507 | }); 508 | ``` 509 | 510 | ### Members 511 | #### Search Field Member 512 | ``` 513 | Trello.member.searchField('MEMBER_ID', 'FIELD_NAME').then(function (response) { 514 | console.log('response ', response); 515 | }).catch(function (error) { 516 | console.log('error', error); 517 | }); 518 | ``` 519 | 520 | #### Search Member 521 | ``` 522 | Trello.member.search('MEMBER_ID').then(function (response) { 523 | console.log('response ', response); 524 | }).catch(function (error) { 525 | console.log('error', error); 526 | }); 527 | ``` 528 | 529 | #### Search Member Boards 530 | ``` 531 | Trello.member.searchBoards('me').then(function (response) { 532 | console.log('response ', response); 533 | }).catch(function (error) { 534 | console.log('error', error); 535 | }); 536 | ``` 537 | 538 | ### Notifications 539 | #### Search Field Notification 540 | ``` 541 | Trello.notification.searchField('NOTIFICATION_ID', 'FIELD_NAME').then(function (response) { 542 | console.log('response ', response); 543 | }).catch(function (error) { 544 | console.log('error', error); 545 | }); 546 | ``` 547 | 548 | #### Search Notification 549 | ``` 550 | Trello.notification.search('NOTIFICATION_ID').then(function (response) { 551 | console.log('response ', response); 552 | }).catch(function (error) { 553 | console.log('error', error); 554 | }); 555 | ``` 556 | 557 | #### Update Notification 558 | ``` 559 | var id = 'NOTIFICATION_ID'; // REQUIRED 560 | var data = { 561 | unread: false 562 | }; 563 | Trello.notification.update(id, data).then(function (response) { 564 | console.log('response ', response); 565 | }).catch(function (error) { 566 | console.log('error', error); 567 | }); 568 | ``` 569 | 570 | ### Organizations 571 | #### Create Organization 572 | ``` 573 | var data = { 574 | displayName: 'ORGANIZATION_NAME', // REQUIRED 575 | desc: 'Organization description', 576 | name: 'NAME', 577 | website: 'https://example.com' 578 | }; 579 | Trello.organization.create(data).then(function (response) { 580 | console.log('response ', response); 581 | }).catch(function (error) { 582 | console.log('error', error); 583 | }); 584 | ``` 585 | 586 | #### Delete Organization 587 | ``` 588 | Trello.organization.del('ORGANIZATION_ID').then(function (response) { 589 | console.log('response ', response); 590 | }).catch(function (error) { 591 | console.log('error', error); 592 | }); 593 | ``` 594 | 595 | #### Search Field Organization 596 | ``` 597 | Trello.organization.searchField('ORGANIZATION_ID', 'FIELD_NAME').then(function (response) { 598 | console.log('response ', response); 599 | }).catch(function (error) { 600 | console.log('error', error); 601 | }); 602 | ``` 603 | 604 | #### Search Organization 605 | ``` 606 | Trello.organization.search('ORGANIZATION_ID').then(function (response) { 607 | console.log('response ', response); 608 | }).catch(function (error) { 609 | console.log('error', error); 610 | }); 611 | ``` 612 | 613 | #### Update Organization 614 | ``` 615 | var id = 'ORGANIZATION_ID'; // REQUIRED 616 | var data = { 617 | name: 'or123', 618 | displayName: 'ORGANIZATION_DISPLAY_NAME', 619 | desc: 'Organization descriptions', 620 | website: 'https://example.com', 621 | prefs_associatedDomain: 'trello.com', 622 | prefs_externalMembersDisabled: false, 623 | prefs_googleAppsVersion: 1, 624 | prefs_boardVisibilityRestrict_org: 'none', 625 | prefs_boardVisibilityRestrict_private: 'none', 626 | prefs_boardVisibilityRestrict_public: 'none', 627 | prefs_orgInviteRestrict: '*.test.com', 628 | prefs_permissionLevel: 'public' 629 | }; 630 | Trello.organization.update(id, data).then(function (response) { 631 | console.log('response ', response); 632 | }).catch(function (error) { 633 | console.log('error', error); 634 | }); 635 | ``` 636 | 637 | ### Webhooks 638 | #### Create Webhook 639 | ``` 640 | var data = { 641 | description: 'Webhook description', 642 | callbackURL: 'https://mycallbackurl.com/', // REQUIRED 643 | idModel: 'MODEL_ID', // REQUIRED 644 | active: false 645 | }; 646 | Trello.webhook.create(data).then(function (response) { 647 | console.log('response ', response); 648 | }).catch(function (error) { 649 | console.log('error', error); 650 | }); 651 | ``` 652 | 653 | #### Delete Webhook 654 | ``` 655 | Trello.webhook.del('WEBHOOK_ID').then(function (response) { 656 | console.log('response ', response); 657 | }).catch(function (error) { 658 | console.log('error', error); 659 | }); 660 | ``` 661 | 662 | #### Search Field Webhook 663 | ``` 664 | Trello.webhook.searchField('WEBHOOK_ID', 'FIELD_NAME').then(function (response) { 665 | console.log('response ', response); 666 | }).catch(function (error) { 667 | console.log('error', error); 668 | }); 669 | ``` 670 | 671 | #### Search Webhook 672 | ``` 673 | Trello.webhook.search('WEBHOOK_ID').then(function (response) { 674 | console.log('response ', response); 675 | }).catch(function (error) { 676 | console.log('error', error); 677 | }); 678 | ``` 679 | 680 | #### Update Webhook 681 | ``` 682 | var id = 'WEBHOOK_ID'; // REQUIRED 683 | var data = { 684 | displayName: 'ORGANIZATION_DISPLAY_NAME', 685 | description: 'Webhook descriptions', 686 | callbackURL: 'https://mycallbackurl.com/', 687 | idModel: 'MODEL_ID', 688 | active: false 689 | }; 690 | Trello.webhook.update(id, data).then(function (response) { 691 | console.log('response ', response); 692 | }).catch(function (error) { 693 | console.log('error', error); 694 | }); 695 | ``` 696 | 697 | -------------------------------------------------------------------------------- /examples/javascript/actions/deleteAction.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var actionRequest = function () { 7 | Trello.action.del('ACTION_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | actionRequest(); -------------------------------------------------------------------------------- /examples/javascript/actions/searchAction.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var actionRequest = function () { 7 | Trello.action.search('ACTION_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | actionRequest(); -------------------------------------------------------------------------------- /examples/javascript/actions/searchFieldAction.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var actionRequest = function () { 7 | Trello.action.searchField('ACTION_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | actionRequest(); -------------------------------------------------------------------------------- /examples/javascript/actions/updateAction.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var actionRequest = function () { 7 | var id = 'ACTION_ID'; // REQUIRED 8 | var data = { 9 | text: 'TEXT' // REQUIRED 10 | }; 11 | Trello.action.update(id, data).then(function (response) { 12 | console.log('response ', response); 13 | }).catch(function (error) { 14 | console.log('error', error); 15 | }); 16 | }; 17 | 18 | actionRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/createBoard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | var data = { 8 | name: 'BOARD_NAME', // REQUIRED 9 | defaultLabels: false, 10 | defaultLists: false, 11 | desc: 'Board description.', 12 | idOrganization: 'ORGANIZATION_ID', 13 | idBoardSource: 'BOARD_ID', 14 | keepFromSource: 'none', 15 | powerUps: 'all', 16 | prefs_permissionLevel: 'private', 17 | prefs_voting: 'disabled', 18 | prefs_comments: 'members', 19 | prefs_invitations: 'members', 20 | prefs_selfJoin: true, 21 | prefs_cardCovers: true, 22 | prefs_background: 'blue', 23 | prefs_cardAging: 'regular' 24 | }; 25 | Trello.board.create(data).then(function (response) { 26 | console.log('response ', response); 27 | }).catch(function (error) { 28 | console.log('error', error); 29 | }); 30 | }; 31 | 32 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/deleteBoard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | Trello.board.del('BOARD_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchBoard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | Trello.board.search('BOARD_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchBoardCards.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | Trello.board.searchCards('BOARD_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchBoardField.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | var boardId = 'BOARD_ID'; 8 | var field = 'shortUrl'; 9 | Trello.board.searchField(boardId, field).then(function (response) { 10 | console.log('response ', response); 11 | }).catch(function (error) { 12 | console.log('error', error); 13 | }); 14 | }; 15 | 16 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchBoardPromise.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = async function () { 7 | const promises = []; 8 | const boardIds = ['BOARD_ID_1', 'BOARD_ID_2']; 9 | 10 | boardIds.forEach((boardId) => { 11 | promises.push(Trello.board.search(boardId)); 12 | }); 13 | 14 | try { 15 | const boards = await Promise.all(promises); 16 | console.log('boards ', boards); 17 | } catch (error) { 18 | console.error('[trello]', error); 19 | } 20 | }; 21 | 22 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchBoardWithFilter.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | var boardId = 'BOARD_ID'; 8 | var fields = { 9 | actions: 'all' 10 | }; 11 | Trello.board.search(boardId, fields).then(function (response) { 12 | console.log('response ', response); 13 | }).catch(function (error) { 14 | console.log('error', error); 15 | }); 16 | }; 17 | 18 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchCards.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | Trello.board.searchCards('BOARD_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchClosedCards.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | Trello.board.searchCardsFilter('BOARD_ID', 'closed').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/searchFieldBoard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | Trello.board.searchField('BOARD_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/boards/updateBoard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var boardRequest = function () { 7 | var id = 'BOARD_ID'; // REQUIRED 8 | var data = { 9 | name: 'BOARD', 10 | desc: 'Board descriptions', 11 | closed: false, 12 | subscribed: false, 13 | idOrganization: 'ORGANIZATION_ID', 14 | prefs_permissionLevel: 'private', 15 | prefs_selfJoin: true, 16 | prefs_cardCovers: true, 17 | prefs_invitations: 'members', 18 | prefs_voting: 'disabled', 19 | prefs_comments: 'members', 20 | prefs_background: 'blue', 21 | prefs_cardAging: 'regular', 22 | prefs_calendarFeedEnabled: false, 23 | labelNames_green: 'Test Label 1', 24 | labelNames_yellow: 'Test Label 2', 25 | labelNames_orange: 'Test Label 3', 26 | labelNames_red: 'Test Label 4', 27 | labelNames_purple: 'Test Label 5', 28 | labelNames_blue: 'Test Label 6' 29 | }; 30 | Trello.board.update(id, data).then(function (response) { 31 | console.log('response ', response); 32 | }).catch(function (error) { 33 | console.log('error', error); 34 | }); 35 | }; 36 | 37 | boardRequest(); -------------------------------------------------------------------------------- /examples/javascript/cards/createCard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var cardRequest = function () { 7 | var data = { 8 | name: 'CARD_NAME', 9 | desc: 'Card description', 10 | pos: 'top', 11 | idList: 'LIST_ID', //REQUIRED 12 | due: null, 13 | dueComplete: false, 14 | idMembers: ['MEMBER_ID', 'MEMBER_ID', 'MEMBER_ID'], 15 | idLabels: ['LABEL_ID', 'LABEL_ID', 'LABEL_ID'], 16 | urlSource: 'https://example.com', 17 | fileSource: 'file', 18 | idCardSource: 'CARD_ID', 19 | keepFromSource: 'attachments,checklists,comments,due,labels,members,stickers' 20 | }; 21 | Trello.card.create(data).then(function (response) { 22 | console.log('response ', response); 23 | }).catch(function (error) { 24 | console.log('error', error); 25 | }); 26 | }; 27 | 28 | cardRequest(); -------------------------------------------------------------------------------- /examples/javascript/cards/deleteCard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var cardRequest = function () { 7 | Trello.card.del('CARD_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | cardRequest(); -------------------------------------------------------------------------------- /examples/javascript/cards/searchCard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var cardRequest = function () { 7 | Trello.card.search('CARD_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | cardRequest(); -------------------------------------------------------------------------------- /examples/javascript/cards/searchFieldCard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var cardRequest = function () { 7 | Trello.card.searchField('CARD_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | cardRequest(); -------------------------------------------------------------------------------- /examples/javascript/cards/updateCard.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var cardRequest = function () { 7 | var id = 'CARD_ID'; // REQUIRED 8 | var data = { 9 | name: 'CARD_NAME_TEST', 10 | desc: 'Card description', 11 | closed: false, 12 | idMembers: 'MEMBER_ID,MEMBER_ID,MEMBER_ID', 13 | idAttachmentCover: null, 14 | idList: 'LIST_ID', 15 | idLabels: 'LABEL_ID, LABEL_ID, LABEL_ID', 16 | idBoard: false, 17 | pos: 'top', 18 | due: null, 19 | dueComplete: false, 20 | subscribed: false 21 | }; 22 | Trello.card.update(id, data).then(function (response) { 23 | console.log('response ', response); 24 | }).catch(function (error) { 25 | console.log('error', error); 26 | }); 27 | }; 28 | 29 | cardRequest(); -------------------------------------------------------------------------------- /examples/javascript/checklists/createChecklist.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var checklistRequest = function () { 7 | var data = { 8 | idCard: 'CARD_ID', // REQUIRED 9 | name: 'CHECKLIST_NAME', 10 | pos: 1 11 | }; 12 | Trello.checklist.create(data).then(function (response) { 13 | console.log('response ', response); 14 | }).catch(function (error) { 15 | console.log('error', error); 16 | }); 17 | }; 18 | 19 | checklistRequest(); -------------------------------------------------------------------------------- /examples/javascript/checklists/deleteChecklist.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var checklistRequest = function () { 7 | Trello.checklist.del('CHECKLIST_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | checklistRequest(); -------------------------------------------------------------------------------- /examples/javascript/checklists/searchChecklist.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var checklistRequest = function () { 7 | Trello.checklist.search('CHECKLIST_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | checklistRequest(); -------------------------------------------------------------------------------- /examples/javascript/checklists/searchFieldChecklist.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var checklistRequest = function () { 7 | Trello.checklist.searchField('CHECKLIST_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | checklistRequest(); -------------------------------------------------------------------------------- /examples/javascript/checklists/updateChecklist.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var checklistRequest = function () { 7 | var id = 'CHECKLIST_ID'; // REQUIRED 8 | var data = { 9 | name: 'CHECKLIST_NAME', 10 | pos: 'top' 11 | }; 12 | Trello.checklist.update(id, data).then(function (response) { 13 | console.log('response ', response); 14 | }).catch(function (error) { 15 | console.log('error', error); 16 | }); 17 | }; 18 | 19 | checklistRequest(); -------------------------------------------------------------------------------- /examples/javascript/enterprises/searchEnterprises.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var enterpriseRequest = function () { 7 | Trello.enterprise.search('ENTERPRISE_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | enterpriseRequest(); -------------------------------------------------------------------------------- /examples/javascript/labels/createLabel.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var labelRequest = function () { 7 | var data = { 8 | name: 'LABEL_NAME', // REQUIRED 9 | color: 'orange', // REQUIRED 10 | idBoard: 'BOARD_ID' // REQUIRED 11 | }; 12 | Trello.label.create(data).then(function (response) { 13 | console.log('response ', response); 14 | }).catch(function (error) { 15 | console.log('error', error); 16 | }); 17 | }; 18 | 19 | labelRequest(); -------------------------------------------------------------------------------- /examples/javascript/labels/deleteLabel.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var labelRequest = function () { 7 | Trello.label.del('LABEL_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | labelRequest(); -------------------------------------------------------------------------------- /examples/javascript/labels/searchLabel.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var labelRequest = function () { 7 | Trello.label.search('LABEL_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | labelRequest(); -------------------------------------------------------------------------------- /examples/javascript/labels/updateLabel.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var labelRequest = function () { 7 | var id = 'LABEL_ID'; // REQUIRED 8 | var data = { 9 | name: 'NAME', 10 | color: 'orange' 11 | }; 12 | Trello.label.update(id, data).then(function (response) { 13 | console.log('response ', response); 14 | }).catch(function (error) { 15 | console.log('error', error); 16 | }); 17 | }; 18 | 19 | labelRequest(); -------------------------------------------------------------------------------- /examples/javascript/lists/createList.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var listRequest = function () { 7 | var data = { 8 | name: 'LIST_NAME', // REQUIRED 9 | idBoard: 'BOARD_ID', // REQUIRED 10 | idListSource: 'LIST_ID', 11 | pos: 'top' 12 | }; 13 | Trello.list.create(data).then(function (response) { 14 | console.log('response ', response); 15 | }).catch(function (error) { 16 | console.log('error', error); 17 | }); 18 | }; 19 | 20 | listRequest(); -------------------------------------------------------------------------------- /examples/javascript/lists/searchFieldList.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var listRequest = function () { 7 | Trello.list.searchField('LIST_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | listRequest(); -------------------------------------------------------------------------------- /examples/javascript/lists/searchList.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var listRequest = function () { 7 | Trello.list.search('LIST_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | listRequest(); -------------------------------------------------------------------------------- /examples/javascript/lists/updateList.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var listRequest = function () { 7 | var id = 'LIST_ID'; // REQUIRED 8 | var data = { 9 | name: 'LIST_NAME', 10 | closed: false, 11 | pos: 'top', 12 | subscribed: false 13 | }; 14 | Trello.list.update(id, data).then(function (response) { 15 | console.log('response ', response); 16 | }).catch(function (error) { 17 | console.log('error', error); 18 | }); 19 | }; 20 | 21 | listRequest(); -------------------------------------------------------------------------------- /examples/javascript/members/searchFieldMember.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var memberRequest = function () { 7 | Trello.member.searchField('MEMBER_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | memberRequest(); -------------------------------------------------------------------------------- /examples/javascript/members/searchMember.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var memberRequest = function () { 7 | Trello.member.search('MEMBER_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | memberRequest(); -------------------------------------------------------------------------------- /examples/javascript/members/searchMemberBoards.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var memberRequest = function () { 7 | Trello.member.searchBoards('me').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | memberRequest(); -------------------------------------------------------------------------------- /examples/javascript/notifications/searchFieldNotification.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var notificationRequest = function () { 7 | Trello.notification.searchField('NOTIFICATION_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | notificationRequest(); -------------------------------------------------------------------------------- /examples/javascript/notifications/searchNotification.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var notificationRequest = function () { 7 | Trello.notification.search('NOTIFICATION_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | notificationRequest(); -------------------------------------------------------------------------------- /examples/javascript/notifications/updateNotification.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var notificationRequest = function () { 7 | var id = 'NOTIFICATION_ID'; // REQUIRED 8 | var data = { 9 | unread: false 10 | }; 11 | Trello.notification.update(id, data).then(function (response) { 12 | console.log('response ', response); 13 | }).catch(function (error) { 14 | console.log('error', error); 15 | }); 16 | }; 17 | 18 | notificationRequest(); -------------------------------------------------------------------------------- /examples/javascript/organizations/createOrganization.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var organizationsRequest = function () { 7 | var data = { 8 | displayName: 'ORGANIZATION_NAME', // REQUIRED 9 | desc: 'Organization description', 10 | name: 'NAME', 11 | website: 'https://example.com' 12 | }; 13 | Trello.organization.create(data).then(function (response) { 14 | console.log('response ', response); 15 | }).catch(function (error) { 16 | console.log('error', error); 17 | }); 18 | }; 19 | 20 | organizationsRequest(); -------------------------------------------------------------------------------- /examples/javascript/organizations/deleteOrganization.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var organizationsRequest = function () { 7 | Trello.organization.del('ORGANIZATION_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | organizationsRequest(); -------------------------------------------------------------------------------- /examples/javascript/organizations/searchFieldOrganization.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var organizationsRequest = function () { 7 | Trello.organization.searchField('ORGANIZATION_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | organizationsRequest(); -------------------------------------------------------------------------------- /examples/javascript/organizations/searchOrganization.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var organizationsRequest = function () { 7 | Trello.organization.search('ORGANIZATION_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | organizationsRequest(); -------------------------------------------------------------------------------- /examples/javascript/organizations/updateOrganization.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var organizationsRequest = function () { 7 | var id = 'ORGANIZATION_ID'; // REQUIRED 8 | var data = { 9 | name: 'or123', 10 | displayName: 'ORGANIZATION_DISPLAY_NAME', 11 | desc: 'Organization descriptions', 12 | website: 'https://example.com', 13 | prefs_associatedDomain: 'trello.com', 14 | prefs_externalMembersDisabled: false, 15 | prefs_googleAppsVersion: 1, 16 | prefs_boardVisibilityRestrict_org: 'none', 17 | prefs_boardVisibilityRestrict_private: 'none', 18 | prefs_boardVisibilityRestrict_public: 'none', 19 | prefs_orgInviteRestrict: '*.test.com', 20 | prefs_permissionLevel: 'public' 21 | }; 22 | Trello.organization.update(id, data).then(function (response) { 23 | console.log('response ', response); 24 | }).catch(function (error) { 25 | console.log('error', error); 26 | }); 27 | }; 28 | 29 | organizationsRequest(); -------------------------------------------------------------------------------- /examples/javascript/webhooks/createWebhook.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var webhookRequest = function () { 7 | var data = { 8 | description: 'Webhook description', 9 | callbackURL: 'https://mycallbackurl.com/', // REQUIRED 10 | idModel: 'MODEL_ID', // REQUIRED 11 | active: false 12 | }; 13 | Trello.webhook.create(data).then(function (response) { 14 | console.log('response ', response); 15 | }).catch(function (error) { 16 | console.log('error', error); 17 | }); 18 | }; 19 | 20 | webhookRequest(); -------------------------------------------------------------------------------- /examples/javascript/webhooks/deleteWebhook.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var webhookRequest = function () { 7 | Trello.webhook.del('WEBHOOK_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | webhookRequest(); -------------------------------------------------------------------------------- /examples/javascript/webhooks/searchFieldWebhook.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var webhookRequest = function () { 7 | Trello.webhook.searchField('WEBHOOK_ID', 'FIELD_NAME').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | webhookRequest(); -------------------------------------------------------------------------------- /examples/javascript/webhooks/searchWebhook.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var webhookRequest = function () { 7 | Trello.webhook.search('WEBHOOK_ID').then(function (response) { 8 | console.log('response ', response); 9 | }).catch(function (error) { 10 | console.log('error', error); 11 | }); 12 | }; 13 | 14 | webhookRequest(); -------------------------------------------------------------------------------- /examples/javascript/webhooks/updateWebhook.js: -------------------------------------------------------------------------------- 1 | var apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | var oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | 4 | var Trello = require('../../../lib/trello-node-api')(apiKey, oauthToken); 5 | 6 | var webhookRequest = function () { 7 | var id = 'WEBHOOK_ID'; // REQUIRED 8 | var data = { 9 | displayName: 'ORGANIZATION_DISPLAY_NAME', 10 | description: 'Webhook descriptions', 11 | callbackURL: 'https://mycallbackurl.com/', 12 | idModel: 'MODEL_ID', 13 | active: false 14 | }; 15 | Trello.webhook.update(id, data).then(function (response) { 16 | console.log('response ', response); 17 | }).catch(function (error) { 18 | console.log('error', error); 19 | }); 20 | }; 21 | 22 | webhookRequest(); -------------------------------------------------------------------------------- /examples/typescript/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock = false 2 | -------------------------------------------------------------------------------- /examples/typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "trello-sample", 3 | "version": "1.0.0", 4 | "description": "trello", 5 | "license": "MIT", 6 | "dependencies": { 7 | "@types/node": "^8.0.53", 8 | "@types/es6-promise": "0.0.33", 9 | "babel-eslint": "^8.0.1", 10 | "babel-preset-node6": "^11.0.0", 11 | "trello-node-api": "*" 12 | }, 13 | "devDependencies": {} 14 | } 15 | -------------------------------------------------------------------------------- /examples/typescript/src/actions/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let actionRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.action.del('ACTION_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | actionRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/actions/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let actionRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.action.search('ACTION_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | actionRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/actions/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let actionRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.action.searchField('ACTION_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | actionRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/actions/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let actionRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'ACTION_ID'; // REQUIRED 11 | let data = { 12 | text: 'text' // REQUIRED 13 | }; 14 | let response; 15 | try { 16 | response = await Trello.action.update(id, data); 17 | } catch (error) { 18 | if (error) { 19 | console.log('error ', error); 20 | } 21 | } 22 | console.log('response', response); 23 | }; 24 | 25 | actionRequest(); 26 | -------------------------------------------------------------------------------- /examples/typescript/src/boards/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | name: 'BOARD_NAME', // REQUIRED 12 | defaultLabels: false, 13 | defaultLists: false, 14 | desc: 'Board description.', 15 | idOrganization: 'ORGANIZATION_ID', 16 | idBoardSource: 'BOARD_ID', 17 | keepFromSource: 'none', 18 | powerUps: 'all', 19 | prefs_permissionLevel: 'private', 20 | prefs_voting: 'disabled', 21 | prefs_comments: 'members', 22 | prefs_invitations: 'members', 23 | prefs_selfJoin: true, 24 | prefs_cardCovers: true, 25 | prefs_background: 'blue', 26 | prefs_cardAging: 'regular' 27 | }; 28 | let response; 29 | try { 30 | response = await Trello.board.create(data); 31 | } catch (error) { 32 | if (error) { 33 | console.log('error ', error); 34 | } 35 | } 36 | console.log('response', response); 37 | }; 38 | 39 | boardRequest(); 40 | -------------------------------------------------------------------------------- /examples/typescript/src/boards/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.board.del('BOARD_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | boardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/boards/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.board.search('BOARD_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | boardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/boards/searchCards.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.board.searchCards('BOARD_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | boardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/boards/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.board.searchField('BOARD_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | boardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/boards/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'BOARD_ID'; // REQUIRED 11 | let data = { 12 | name: 'BOARD', 13 | desc: 'Board descriptions', 14 | closed: false, 15 | subscribed: false, 16 | idOrganization: 'ORGANIZATION_ID', 17 | prefs_permissionLevel: 'private', 18 | prefs_selfJoin: true, 19 | prefs_cardCovers: true, 20 | prefs_invitations: 'members', 21 | prefs_voting: 'disabled', 22 | prefs_comments: 'members', 23 | prefs_background: 'blue', 24 | prefs_cardAging: 'regular', 25 | prefs_calendarFeedEnabled: false, 26 | labelNames_green: 'Test Label 1', 27 | labelNames_yellow: 'Test Label 2', 28 | labelNames_orange: 'Test Label 3', 29 | labelNames_red: 'Test Label 4', 30 | labelNames_purple: 'Test Label 5', 31 | labelNames_blue: 'Test Label 6' 32 | }; 33 | let response; 34 | try { 35 | response = await Trello.board.update(id, data); 36 | } catch (error) { 37 | if (error) { 38 | console.log('error ', error); 39 | } 40 | } 41 | console.log('response', response); 42 | }; 43 | 44 | boardRequest(); 45 | -------------------------------------------------------------------------------- /examples/typescript/src/cards/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let cardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | name: 'CARD_NAME', 12 | desc: 'Card description', 13 | pos: 'top', 14 | idList: 'LIST_ID', //REQUIRED 15 | due: null, 16 | dueComplete: false, 17 | idMembers: ['MEMBER_ID', 'MEMBER_ID', 'MEMBER_ID'], 18 | idLabels: ['LABEL_ID', 'LABEL_ID', 'LABEL_ID'], 19 | urlSource: 'https://example.com', 20 | fileSource: 'file', 21 | idCardSource: 'CARD_ID', 22 | keepFromSource: 'attachments,checklists,comments,due,labels,members,stickers' 23 | }; 24 | let response; 25 | try { 26 | response = await Trello.card.create(data); 27 | } catch (error) { 28 | if (error) { 29 | console.log('error ', error); 30 | } 31 | } 32 | console.log('response', response); 33 | }; 34 | 35 | cardRequest(); 36 | -------------------------------------------------------------------------------- /examples/typescript/src/cards/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let cardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.card.del('CARD_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | cardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/cards/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let cardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.card.search('CARD_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | cardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/cards/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let cardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.card.searchField('CARD_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | cardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/cards/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let cardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'CARD_ID'; // REQUIRED 11 | let data = { 12 | name: 'CARD_NAME_TEST', 13 | desc: 'Card description', 14 | closed: false, 15 | idMembers: 'MEMBER_ID,MEMBER_ID,MEMBER_ID', 16 | idAttachmentCover: null, 17 | idList: 'LIST_ID', 18 | idLabels: 'LABEL_ID, LABEL_ID, LABEL_ID', 19 | idBoard: false, 20 | pos: 'top', 21 | due: null, 22 | dueComplete: false, 23 | subscribed: false, 24 | }; 25 | let response; 26 | try { 27 | response = await Trello.card.update(id, data); 28 | } catch (error) { 29 | if (error) { 30 | console.log('error ', error); 31 | } 32 | } 33 | console.log('response', response); 34 | }; 35 | 36 | cardRequest(); 37 | -------------------------------------------------------------------------------- /examples/typescript/src/checklists/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let checklistRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | idCard: 'CARD_ID', // REQUIRED 12 | name: 'CHECKLIST_NAME', 13 | pos: 1 14 | }; 15 | let response; 16 | try { 17 | response = await Trello.checklist.create(data); 18 | } catch (error) { 19 | if (error) { 20 | console.log('error ', error); 21 | } 22 | } 23 | console.log('response', response); 24 | }; 25 | 26 | checklistRequest(); 27 | -------------------------------------------------------------------------------- /examples/typescript/src/checklists/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let checklistRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.checklist.del('CHECKLIST_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | checklistRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/checklists/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let checklistRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.checklist.search('CHECKLIST_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | checklistRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/checklists/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let checklistRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.checklist.searchField('CHECKLIST_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | checklistRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/checklists/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let checklistRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'CHECKLIST_ID'; // REQUIRED 11 | let data = { 12 | name: 'CHECKLIST_NAME', 13 | pos: 'top' 14 | }; 15 | let response; 16 | try { 17 | response = await Trello.checklist.update(id, data); 18 | } catch (error) { 19 | if (error) { 20 | console.log('error ', error); 21 | } 22 | } 23 | console.log('response', response); 24 | }; 25 | 26 | checklistRequest(); 27 | -------------------------------------------------------------------------------- /examples/typescript/src/enterprises/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let boardRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.enterprise.search('ENTERPRISE_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | boardRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/labels/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let labelRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | name: 'LABEL_NAME', // REQUIRED 12 | color: 'orange', // REQUIRED 13 | idBoard: 'BOARD_ID' // REQUIRED 14 | }; 15 | let response; 16 | try { 17 | response = await Trello.label.create(data); 18 | } catch (error) { 19 | if (error) { 20 | console.log('error ', error); 21 | } 22 | } 23 | console.log('response', response); 24 | }; 25 | 26 | labelRequest(); 27 | -------------------------------------------------------------------------------- /examples/typescript/src/labels/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let labelRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.label.del('LABEL_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | labelRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/labels/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let labelRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.label.search('LABEL_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | labelRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/labels/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let labelRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'LABEL_ID'; // REQUIRED 11 | let data = { 12 | name: 'NAME', 13 | color: 'red' 14 | }; 15 | let response; 16 | try { 17 | response = await Trello.label.update(id, data); 18 | } catch (error) { 19 | if (error) { 20 | console.log('error ', error); 21 | } 22 | } 23 | console.log('response', response); 24 | }; 25 | 26 | labelRequest(); 27 | -------------------------------------------------------------------------------- /examples/typescript/src/lists/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let listRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | name: 'LIST_NAME', // REQUIRED 12 | idBoard: 'BOARD_ID', // REQUIRED 13 | idListSource: 'LIST_ID', 14 | pos: 'top' 15 | }; 16 | let response; 17 | try { 18 | response = await Trello.list.create(data); 19 | } catch (error) { 20 | if (error) { 21 | console.log('error ', error); 22 | } 23 | } 24 | 25 | console.log('response', response); 26 | }; 27 | 28 | listRequest(); 29 | -------------------------------------------------------------------------------- /examples/typescript/src/lists/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let listRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.list.search('LIST_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | listRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/lists/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let listRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.list.searchField('LIST_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | listRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/lists/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let listRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'LIST_ID'; // REQUIRED 11 | let data = { 12 | name: 'LIST_NAME', 13 | closed: false, 14 | pos: 'top', 15 | subscribed: false 16 | }; 17 | let response; 18 | try { 19 | response = await Trello.list.update(id, data); 20 | } catch (error) { 21 | if (error) { 22 | console.log('error ', error); 23 | } 24 | } 25 | console.log('response', response); 26 | }; 27 | 28 | listRequest(); 29 | -------------------------------------------------------------------------------- /examples/typescript/src/members/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let memberRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.member.search('MEMBER_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | memberRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/members/searchBoards.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let memberRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.member.searchBoards('MEMBER_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | memberRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/members/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let memberRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.member.searchField('MEMBER_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | memberRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/notifications/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let notificationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.notification.search('NOTIFICATION_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | notificationRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/notifications/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let notificationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.notification.searchField('NOTIFICATION_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | 19 | console.log('response', response); 20 | }; 21 | 22 | notificationRequest(); 23 | -------------------------------------------------------------------------------- /examples/typescript/src/notifications/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let notificationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'NOTIFICATION_ID'; // REQUIRED 11 | let data = { 12 | unread: false 13 | }; 14 | let response; 15 | try { 16 | response = await Trello.notification.update(id, data); 17 | } catch (error) { 18 | if (error) { 19 | console.log('error ', error); 20 | } 21 | } 22 | console.log('response', response); 23 | }; 24 | 25 | notificationRequest(); 26 | -------------------------------------------------------------------------------- /examples/typescript/src/organizations/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let organizationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | displayName: 'ORGANIZATION_NAME', // REQUIRED 12 | desc: 'Organization description', 13 | name: 'NAME', 14 | website: 'https://example.com' 15 | }; 16 | let response; 17 | try { 18 | response = await Trello.organization.create(data); 19 | } catch (error) { 20 | if (error) { 21 | console.log('error ', error); 22 | } 23 | } 24 | console.log('response', response); 25 | }; 26 | 27 | organizationRequest(); 28 | -------------------------------------------------------------------------------- /examples/typescript/src/organizations/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let organizationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.organization.del('ORGANIZATION_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | organizationRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/organizations/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let organizationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.organization.search('ORGANIZATION_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | organizationRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/organizations/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let organizationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.organization.searchField('ORGANIZATION_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | 19 | console.log('response', response); 20 | }; 21 | 22 | organizationRequest(); 23 | -------------------------------------------------------------------------------- /examples/typescript/src/organizations/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let organizationRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'ORGANIZATION_ID'; // REQUIRED 11 | let data = { 12 | name: 'or123', 13 | displayName: 'ORGANIZATION_DISPLAY_NAME', 14 | desc: 'Organization descriptions', 15 | website: 'https://example.com', 16 | prefs_associatedDomain: 'trello.com', 17 | prefs_externalMembersDisabled: false, 18 | prefs_googleAppsVersion: 1, 19 | prefs_boardVisibilityRestrict_org: 'none', 20 | prefs_boardVisibilityRestrict_private: 'none', 21 | prefs_boardVisibilityRestrict_public: 'none', 22 | prefs_orgInviteRestrict: '*.test.com', 23 | prefs_permissionLevel: 'public' 24 | }; 25 | let response; 26 | try { 27 | response = await Trello.organization.update(id, data); 28 | } catch (error) { 29 | if (error) { 30 | console.log('error ', error); 31 | } 32 | } 33 | console.log('response', response); 34 | }; 35 | 36 | organizationRequest(); 37 | -------------------------------------------------------------------------------- /examples/typescript/src/webhooks/create.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let webhookRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let data = { 11 | description: 'Webhook description', 12 | callbackURL: 'https://mycallbackurl.com/', // REQUIRED 13 | idModel: 'MODEL_ID', // REQUIRED 14 | active: false 15 | }; 16 | let response; 17 | try { 18 | response = await Trello.webhook.create(data); 19 | } catch (error) { 20 | if (error) { 21 | console.log('error ', error); 22 | } 23 | } 24 | console.log('response', response); 25 | }; 26 | 27 | webhookRequest(); 28 | -------------------------------------------------------------------------------- /examples/typescript/src/webhooks/delete.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let webhookRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.webhook.del('WEBHOOK_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | webhookRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/webhooks/search.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let webhookRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.webhook.search('WEBHOOK_ID'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | webhookRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/webhooks/searchField.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let webhookRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let response; 11 | try { 12 | response = await Trello.webhook.searchField('WEBHOOK_ID', 'FIELD_NAME'); 13 | } catch (error) { 14 | if (error) { 15 | console.log('error ', error); 16 | } 17 | } 18 | console.log('response', response); 19 | }; 20 | 21 | webhookRequest(); 22 | -------------------------------------------------------------------------------- /examples/typescript/src/webhooks/update.ts: -------------------------------------------------------------------------------- 1 | const apiKey = process.env.TRELLO_API_KEY || 'YOUR_API_KEY'; 2 | const oauthToken = process.env.TRELLO_OAUTH_TOKEN || 'OAUTH_TOKEN'; 3 | import * as TrelloNodeAPI from 'trello-node-api'; 4 | 5 | const Trello = new TrelloNodeAPI(); 6 | 7 | let webhookRequest = async function () { 8 | Trello.setApiKey(apiKey); 9 | Trello.setOauthToken(oauthToken); 10 | let id = 'WEBHOOK_ID'; // REQUIRED 11 | let data = { 12 | displayName: 'ORGANIZATION_DISPLAY_NAME', 13 | description: 'Webhook descriptions', 14 | callbackURL: 'https://mycallbackurl.com/', 15 | idModel: 'MODEL_ID', 16 | active: false 17 | }; 18 | let response; 19 | try { 20 | response = await Trello.webhook.update(id, data); 21 | } catch (error) { 22 | if (error) { 23 | console.log('error ', error); 24 | } 25 | } 26 | console.log('response', response); 27 | }; 28 | 29 | webhookRequest(); 30 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for trello-node-api 2 | 3 | declare class TrelloAction { 4 | 5 | search(actionId: string): Promise; 6 | 7 | searchField(actionId: string, fieldName: string): Promise; 8 | 9 | update(actionId: string, params: any): Promise; 10 | 11 | del(actionId: string): Promise; 12 | 13 | } 14 | 15 | declare class TrelloBoard { 16 | 17 | create(params: any): Promise; 18 | 19 | search(boardId: string): Promise; 20 | 21 | searchField(boardId: string, fieldName: string): Promise; 22 | 23 | update(boardId: string, params: any): Promise; 24 | 25 | del(boardId: string): Promise; 26 | 27 | searchCards(boardId: string): Promise; 28 | 29 | searchCardsFilter(boardId: string, filter: string): Promise; 30 | 31 | searchChecklists(boardId: string): Promise; 32 | 33 | searchCustomField(boardId: string): Promise; 34 | 35 | searchLabels(boardId: string): Promise; 36 | 37 | searchLists(boardId: string): Promise; 38 | 39 | searchListsFilter(boardId: string, filter: string): Promise; 40 | 41 | searchMembers(boardId: string): Promise; 42 | 43 | searchMemberships(boardId: string): Promise; 44 | 45 | searchPlugins(boardId: string): Promise; 46 | 47 | searchCardsByCardId(boardId: string, cardId: string): Promise; 48 | 49 | } 50 | 51 | declare class TrelloCard { 52 | 53 | create(params: any): Promise; 54 | 55 | search(cardId: string): Promise; 56 | 57 | searchField(cardId: string, fieldName: string): Promise; 58 | 59 | update(cardId: string, params: any): Promise; 60 | 61 | del(cardId: string): Promise; 62 | 63 | setCustomField(cardId: string, customFieldId: string): Promise; 64 | 65 | searchActions(cardId: string): Promise; 66 | 67 | searchAttachments(cardId: string): Promise; 68 | 69 | searchAttachmentByAttachmentId(cardId: string, attachmentId: string): Promise; 70 | 71 | searchBoard(cardId: string): Promise; 72 | 73 | searchCheckItemStates(cardId: string): Promise; 74 | 75 | searchChecklists(cardId: string): Promise; 76 | 77 | searchCheckItemByCheckItemId(cardId: string, checkItemId: string): Promise; 78 | 79 | searchCustomFieldItems(cardId: string): Promise; 80 | 81 | searchList(cardId: string): Promise; 82 | 83 | searchMembers(cardId: string): Promise; 84 | 85 | searchMembersVoted(cardId: string): Promise; 86 | 87 | searchPluginData(cardId: string): Promise; 88 | 89 | searchStickers(cardId: string): Promise; 90 | 91 | searchStickersByStickerId(cardId: string, stickerId: string): Promise; 92 | 93 | } 94 | 95 | declare class TrelloChecklist { 96 | 97 | create(params: any): Promise; 98 | 99 | search(checklistId: string): Promise; 100 | 101 | searchField(checklistId: string, fieldName: string): Promise; 102 | 103 | update(checklistId: string, params: any): Promise; 104 | 105 | del(checklistId: string): Promise; 106 | 107 | } 108 | 109 | declare class TrelloCustomField { 110 | 111 | create(params: any): Promise; 112 | 113 | search(customFieldId: string): Promise; 114 | 115 | searchField(customFieldId: string, fieldName: string): Promise; 116 | 117 | update(customFieldId: string, params: any): Promise; 118 | 119 | del(customFieldId: string): Promise; 120 | 121 | } 122 | 123 | 124 | declare class TrelloEnterprise { 125 | 126 | search(enterpriseID: string): Promise; 127 | 128 | } 129 | 130 | declare class TrelloLabel { 131 | 132 | create(params: any): Promise; 133 | 134 | search(labelId: string): Promise; 135 | 136 | update(labelId: string, params: any): Promise; 137 | 138 | del(labelId: string): Promise; 139 | 140 | } 141 | 142 | declare class TrelloList { 143 | 144 | create(params: any): Promise; 145 | 146 | search(listId: string): Promise; 147 | 148 | searchField(listId: string, fieldName: string): Promise; 149 | 150 | update(listId: string, params: any): Promise; 151 | 152 | } 153 | 154 | declare class TrelloMember { 155 | 156 | search(memberId: string): Promise; 157 | 158 | searchField(memberId: string, fieldName: string): Promise; 159 | 160 | searchBoards(memberId: string): Promise; 161 | 162 | } 163 | 164 | declare class TrelloNotification { 165 | 166 | search(notificationId: string): Promise; 167 | 168 | searchField(notificationId: string, fieldName: string): Promise; 169 | 170 | update(notificationId: string, params: any): Promise; 171 | 172 | } 173 | 174 | declare class TrelloOrganization { 175 | 176 | create(params: any): Promise; 177 | 178 | search(organizationId: string): Promise; 179 | 180 | searchField(organizationId: string, fieldName: string): Promise; 181 | 182 | update(organizationId: string, params: any): Promise; 183 | 184 | del(organizationId: string): Promise; 185 | 186 | } 187 | 188 | declare class TrelloWebhook { 189 | 190 | create(params: any): Promise; 191 | 192 | search(webhookId: string): Promise; 193 | 194 | searchField(webhookId: string, fieldName: string): Promise; 195 | 196 | update(webhookId: string, params: any): Promise; 197 | 198 | del(webhookId: string): Promise; 199 | 200 | } 201 | 202 | 203 | declare class TrelloNodeApi { 204 | 205 | constructor() 206 | 207 | constructor(key: string, token: string); 208 | 209 | setApiKey(key: string): void; 210 | 211 | setOauthToken(token: string): void; 212 | 213 | action: TrelloAction; 214 | board: TrelloBoard; 215 | card: TrelloCard; 216 | checklist: TrelloChecklist; 217 | customField: TrelloCustomField; 218 | enterprise: TrelloEnterprise; 219 | label: TrelloLabel; 220 | list: TrelloList; 221 | member: TrelloMember; 222 | notification: TrelloNotification; 223 | organization: TrelloOrganization; 224 | webhook: TrelloWebhook; 225 | 226 | } 227 | 228 | 229 | declare class TrelloError extends Error { 230 | constructor(message: string); 231 | 232 | static create(options: Object): TrelloError; 233 | 234 | code?: number; 235 | } 236 | 237 | declare namespace TrelloNodeApi { 238 | 239 | } 240 | export = TrelloNodeApi; -------------------------------------------------------------------------------- /lib/Error.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var utils = require('./utils'); 4 | 5 | module.exports = _Error; 6 | 7 | /** 8 | * Generic Error Class to wrap any errors returned by trello-node 9 | */ 10 | function _Error(raw) { 11 | this.populate.apply(this, arguments); 12 | //this.stack = (new Error(this.message)).stack; 13 | } 14 | 15 | // Extend Native Error 16 | _Error.prototype = Object.create(Error.prototype); 17 | 18 | _Error.prototype.type = 'GenericError'; 19 | _Error.prototype.populate = function (type, message) { 20 | this.type = type; 21 | this.message = message; 22 | }; 23 | 24 | _Error.extend = utils.protoExtend; 25 | 26 | /** 27 | * Create subclass of internal Error klass 28 | * (Specifically for errors returned from Trello's REST API) 29 | */ 30 | var TrelloError = _Error.TrelloError = _Error.extend({ 31 | type: 'TrelloError', 32 | populate: function (raw) { 33 | // Move from prototype def (so it appears in stringified obj) 34 | this.type = this.type; 35 | 36 | //this.stack = (new Error(raw.message)).stack; 37 | //this.rawType = raw.type; 38 | //this.code = raw.code; 39 | //this.param = raw.param; 40 | this.message = raw.message; 41 | //this.detail = raw.detail; 42 | //this.raw = raw; 43 | //this.headers = raw.headers; 44 | //this.requestId = raw.requestId; 45 | this.statusCode = raw.statusCode; 46 | } 47 | }); 48 | 49 | /** 50 | * Helper factory which takes raw trello errors and outputs wrapping instances 51 | */ 52 | TrelloError.generate = function (rawTrelloError) { 53 | switch (rawTrelloError.type) { 54 | case 'invalid_request_error': 55 | return new _Error.TrelloInvalidRequestError(rawTrelloError); 56 | case 'api_error': 57 | return new _Error.TrelloAPIError(rawTrelloError); 58 | } 59 | return new _Error('Generic', rawTrelloError.message || 'Unknown Error'); 60 | }; 61 | 62 | _Error.TrelloInvalidRequestError = TrelloError.extend({type: 'TrelloInvalidRequestError'}); 63 | _Error.TrelloAPIError = TrelloError.extend({type: 'TrelloAPIError'}); 64 | _Error.TrelloAuthenticationError = TrelloError.extend({type: 'TrelloAuthenticationError'}); 65 | _Error.TrelloPermissionError = TrelloError.extend({type: 'TrelloPermissionError'}); 66 | _Error.TrelloRateLimitError = TrelloError.extend({type: 'TrelloRateLimitError'}); 67 | _Error.TrelloConnectionError = TrelloError.extend({type: 'TrelloConnectionError'}); 68 | _Error.TrelloSignatureVerificationError = TrelloError.extend({type: 'TrelloSignatureVerificationError'}); 69 | -------------------------------------------------------------------------------- /lib/MultipartDataGenerator.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Buffer = require('safe-buffer').Buffer; 4 | 5 | // Method for formatting HTTP body for the multipart/form-data specification 6 | // Mostly taken from Fermata.js 7 | // https://github.com/natevw/fermata/blob/5d9732a33d776ce925013a265935facd1626cc88/fermata.js#L315-L343 8 | function multipartDataGenerator(method, data, headers) { 9 | var segno = (Math.round(Math.random() * 1e16) + Math.round(Math.random() * 1e16)).toString(); 10 | headers['Content-Type'] = ('multipart/form-data; boundary=' + segno); 11 | var buffer = new Buffer(0); 12 | 13 | function push(l) { 14 | var prevBuffer = buffer; 15 | var newBuffer = (l instanceof Buffer) ? l : new Buffer(l); 16 | buffer = new Buffer(prevBuffer.length + newBuffer.length + 2); 17 | prevBuffer.copy(buffer); 18 | newBuffer.copy(buffer, prevBuffer.length); 19 | buffer.write('\r\n', buffer.length - 2); 20 | } 21 | 22 | function q(s) { 23 | return '"' + s.replace(/"|"/g, '%22').replace(/\r\n|\r|\n/g, ' ') + '"'; 24 | } 25 | 26 | for (var k in data) { 27 | var v = data[k]; 28 | push('--' + segno); 29 | if (v.hasOwnProperty('data')) { 30 | push('Content-Disposition: form-data; name=' + q(k) + '; filename=' + q(v.name || 'blob')); 31 | push('Content-Type: ' + (v.type || 'application/octet-stream')); 32 | push(''); 33 | push(v.data); 34 | } else { 35 | push('Content-Disposition: form-data; name=' + q(k)); 36 | push(''); 37 | push(v); 38 | } 39 | } 40 | push('--' + segno + '--'); 41 | 42 | return buffer; 43 | } 44 | 45 | module.exports = multipartDataGenerator; 46 | -------------------------------------------------------------------------------- /lib/TrelloMethod.basic.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Promise = require('bluebird'); 4 | var isPlainObject = require('lodash.isplainobject'); 5 | var trelloMethod = require('./TrelloMethod'); 6 | 7 | module.exports = { 8 | 9 | create: trelloMethod({ 10 | method: 'POST' 11 | }), 12 | 13 | search: trelloMethod({ 14 | method: 'GET', 15 | path: '/{id}', 16 | urlParams: ['id'] 17 | }), 18 | 19 | searchField: trelloMethod({ 20 | method: 'GET', 21 | path: '/{id}/{field}', 22 | urlParams: ['id', 'field'] 23 | }), 24 | 25 | update: trelloMethod({ 26 | method: 'PUT', 27 | path: '{id}', 28 | urlParams: ['id'] 29 | }), 30 | 31 | // Avoid 'delete' keyword in JS 32 | del: trelloMethod({ 33 | method: 'DELETE', 34 | path: '{id}', 35 | urlParams: ['id'] 36 | }), 37 | 38 | setMetadata: function (id, key, value, auth, cb) { 39 | var self = this; 40 | var data = key; 41 | var isObject = isPlainObject(key); 42 | // We assume null for an empty object 43 | var isNull = data === null || (isObject && !Object.keys(data).length); 44 | 45 | // Allow optional passing of auth & cb: 46 | if ((isNull || isObject) && typeof value == 'string') { 47 | auth = value; 48 | } else if (typeof auth != 'string') { 49 | if (!cb && typeof auth == 'function') { 50 | cb = auth; 51 | } 52 | auth = null; 53 | } 54 | 55 | var urlData = this.createUrlData(); 56 | var path = this.createFullPath('/' + id, urlData); 57 | 58 | return this.wrapTimeout(new Promise((function (resolve, reject) { 59 | if (isNull) { 60 | // Reset metadata: 61 | sendMetadata(null, auth); 62 | } else if (!isObject) { 63 | // Set individual metadata property: 64 | var metadata = {}; 65 | metadata[key] = value; 66 | sendMetadata(metadata, auth); 67 | } else { 68 | // Set entire metadata object after resetting it: 69 | this._request('POST', path, { 70 | metadata: null 71 | }, auth, {}, function (err, response) { 72 | if (err) { 73 | return reject(err); 74 | } 75 | sendMetadata(data, auth); 76 | }); 77 | } 78 | 79 | function sendMetadata(metadata, auth) { 80 | self._request('POST', path, { 81 | metadata: metadata 82 | }, auth, {}, function (err, response) { 83 | if (err) { 84 | reject(err); 85 | } else { 86 | resolve(response.metadata); 87 | } 88 | }); 89 | } 90 | }).bind(this)), cb); 91 | }, 92 | 93 | getMetadata: function (id, auth, cb) { 94 | if (!cb && typeof auth == 'function') { 95 | cb = auth; 96 | auth = null; 97 | } 98 | 99 | var urlData = this.createUrlData(); 100 | var path = this.createFullPath('/' + id, urlData); 101 | 102 | return this.wrapTimeout(new Promise((function (resolve, reject) { 103 | this._request('GET', path, {}, auth, {}, function (err, response) { 104 | if (err) { 105 | reject(err); 106 | } else { 107 | resolve(response.metadata); 108 | } 109 | }); 110 | }).bind(this)), cb); 111 | } 112 | 113 | }; 114 | -------------------------------------------------------------------------------- /lib/TrelloMethod.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Promise = require('bluebird'); 4 | var utils = require('./utils'); 5 | var OPTIONAL_REGEX = /^optional!/; 6 | 7 | /** 8 | * Create an API method from the declared spec. 9 | * 10 | * @param [spec.method='GET'] Request Method (POST, GET, DELETE, PUT) 11 | * @param [spec.path=''] Path to be appended to the API BASE_PATH, joined with 12 | * the instance's path (e.g. 'charges' or 'customers') 13 | * @param [spec.required=[]] Array of required arguments in the order that they 14 | * must be passed by the consumer of the API. Subsequent optional arguments are 15 | * optionally passed through a hash (Object) as the penultimate argument 16 | * (preceding the also-optional callback argument 17 | * @param [spec.encode] Function for mutating input parameters to a method. 18 | * Usefully for applying transforms to data on a per-method basis. 19 | */ 20 | function trelloMethod(spec) { 21 | var commandPath = typeof spec.path == 'function' ? spec.path 22 | : utils.makeURLInterpolator(spec.path || ''); 23 | var requestMethod = (spec.method || 'GET').toUpperCase(); 24 | var urlParams = spec.urlParams || []; 25 | var encode = spec.encode || function (data) { 26 | return data; 27 | }; 28 | 29 | return function () { 30 | var self = this; 31 | var args = [].slice.call(arguments); 32 | 33 | var callback = typeof args[args.length - 1] == 'function' && args.pop(); 34 | var urlData = this.createUrlData(); 35 | 36 | return this.wrapTimeout(new Promise((function (resolve, reject) { 37 | for (var i = 0, l = urlParams.length; i < l; ++i) { 38 | // Note that we shift the args array after every iteration so this just 39 | // grabs the "next" argument for use as a URL parameter. 40 | var arg = args[0]; 41 | 42 | var param = urlParams[i]; 43 | 44 | var isOptional = OPTIONAL_REGEX.test(param); 45 | param = param.replace(OPTIONAL_REGEX, ''); 46 | 47 | if (param == 'id' && typeof arg !== 'string') { 48 | var path = this.createResourcePathWithSymbols(spec.path); 49 | var err = new Error( 50 | 'Trello: "id" must be a string, but got: ' + typeof arg + 51 | ' (on API request to `' + requestMethod + ' ' + path + '`)' 52 | ); 53 | reject(err); 54 | return; 55 | } 56 | 57 | if (!arg) { 58 | if (isOptional) { 59 | urlData[param] = ''; 60 | continue; 61 | } 62 | 63 | var path = this.createResourcePathWithSymbols(spec.path); 64 | var err = new Error( 65 | 'Trello: Argument "' + urlParams[i] + '" required, but got: ' + arg + 66 | ' (on API request to `' + requestMethod + ' ' + path + '`)' 67 | ); 68 | reject(err); 69 | return; 70 | } 71 | 72 | urlData[param] = args.shift(); 73 | } 74 | 75 | var data; 76 | try { 77 | data = encode(utils.getDataFromArgs(args)); 78 | } catch (e) { 79 | reject(e); 80 | } 81 | var opts = utils.getOptionsFromArgs(args); 82 | 83 | if (args.length) { 84 | var path = this.createResourcePathWithSymbols(spec.path); 85 | var err = new Error( 86 | 'Trello: Unknown arguments (' + args + ')' + 87 | ' (on API request to ' + requestMethod + ' `' + path + '`)' 88 | ); 89 | reject(err); 90 | return; 91 | } 92 | 93 | var requestPath = this.createFullPath(commandPath, urlData); 94 | var options = {headers: Object.assign(opts.headers, spec.headers)}; 95 | 96 | if (spec.validator) { 97 | try { 98 | spec.validator(data, options); 99 | } catch (err) { 100 | reject(err); 101 | return; 102 | } 103 | } 104 | 105 | function requestCallback(err, response) { 106 | if (err) { 107 | reject(err); 108 | } else { 109 | resolve( 110 | spec.transformResponseData ? 111 | spec.transformResponseData(response) : 112 | response 113 | ); 114 | } 115 | } 116 | 117 | self._request(requestMethod, requestPath, data, opts.auth, options, requestCallback); 118 | }).bind(this)), callback); 119 | }; 120 | } 121 | 122 | module.exports = trelloMethod; 123 | -------------------------------------------------------------------------------- /lib/TrelloResource.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var http = require('http'); 4 | var https = require('https'); 5 | var path = require('path'); 6 | var Debug = require('debug'); 7 | 8 | var utils = require('./utils'); 9 | var Error = require('./Error'); 10 | 11 | var hasOwn = {}.hasOwnProperty; 12 | var debug = Debug('TA:TrelloResource.js'); 13 | // Provide extension mechanism for Trello Resource Sub-Classes 14 | TrelloResource.extend = utils.protoExtend; 15 | 16 | // Expose method-creator & prepared (basic) methods 17 | TrelloResource.method = require('./TrelloMethod'); 18 | TrelloResource.BASIC_METHODS = require('./TrelloMethod.basic'); 19 | 20 | /** 21 | * Encapsulates request logic for a Trello Resource 22 | */ 23 | function TrelloResource(trello, urlData) { 24 | this._trello = trello; 25 | this._urlData = urlData || {}; 26 | 27 | this.basePath = utils.makeURLInterpolator(trello.getApiField('basePath')); 28 | this.resourcePath = this.path; 29 | this.path = utils.makeURLInterpolator(this.path); 30 | 31 | if (this.includeBasic) { 32 | this.includeBasic.forEach(function (methodName) { 33 | this[methodName] = TrelloResource.BASIC_METHODS[methodName]; 34 | }, this); 35 | } 36 | 37 | this.initialize.apply(this, arguments); 38 | } 39 | 40 | TrelloResource.prototype = { 41 | 42 | path: '', 43 | 44 | initialize: function () { 45 | }, 46 | 47 | // Function to override the default data processor. This allows full control 48 | // over how a TrelloResource's request data will get converted into an HTTP 49 | // body. This is useful for non-standard HTTP requests. The function should 50 | // take method name, data, and headers as arguments. 51 | requestDataProcessor: null, 52 | 53 | // String that overrides the base API endpoint. If `overrideHost` is not null 54 | // then all requests for a particular resource will be sent to a base API 55 | // endpoint as defined by `overrideHost`. 56 | overrideHost: null, 57 | 58 | // Function to add a validation checks before sending the request, errors should 59 | // be thrown, and they will be passed to the callback/promise. 60 | validateRequest: null, 61 | 62 | createFullPath: function (commandPath, urlData) { 63 | return path.join( 64 | this.basePath(urlData), 65 | this.path(urlData), 66 | typeof commandPath == 'function' ? 67 | commandPath(urlData) : commandPath 68 | ).replace(/\\/g, '/'); // ugly workaround for Windows 69 | }, 70 | 71 | // Creates a relative resource path with symbols left in (unlike 72 | // createFullPath which takes some data to replace them with). For example it 73 | // might produce: /invoices/{id} 74 | createResourcePathWithSymbols: function (pathWithSymbols) { 75 | return '/' + path.join( 76 | this.resourcePath, 77 | pathWithSymbols 78 | ).replace(/\\/g, '/'); // ugly workaround for Windows 79 | }, 80 | 81 | createUrlData: function () { 82 | var urlData = {}; 83 | // Merge in baseData 84 | for (var i in this._urlData) { 85 | if (hasOwn.call(this._urlData, i)) { 86 | urlData[i] = this._urlData[i]; 87 | } 88 | } 89 | return urlData; 90 | }, 91 | 92 | wrapTimeout: function (promise, callback) { 93 | if (callback) { 94 | // Ensure callback is called outside of promise stack. 95 | return promise.then(function (res) { 96 | setTimeout(function () { 97 | callback(null, res); 98 | }, 0); 99 | }, function (err) { 100 | setTimeout(function () { 101 | callback(err, null); 102 | }, 0); 103 | }); 104 | } 105 | 106 | return promise; 107 | }, 108 | 109 | _timeoutHandler: function (timeout, req, callback) { 110 | var self = this; 111 | return function () { 112 | var timeoutErr = new Error('ETIMEDOUT'); 113 | timeoutErr.code = 'ETIMEDOUT'; 114 | 115 | req._isAborted = true; 116 | req.abort(); 117 | 118 | callback.call( 119 | self, 120 | new Error.TrelloConnectionError({ 121 | message: 'Request aborted due to timeout being reached (' + timeout + 'ms)', 122 | detail: timeoutErr 123 | }), 124 | null 125 | ); 126 | }; 127 | }, 128 | 129 | _responseHandler: function (req, callback) { 130 | var self = this; 131 | return function (res) { 132 | var response = ''; 133 | 134 | res.setEncoding('utf8'); 135 | res.on('data', function (chunk) { 136 | response += chunk; 137 | }); 138 | res.on('end', function () { 139 | var headers = res.headers || {}; 140 | // NOTE: Trello responds with lowercase header names/keys. 141 | 142 | // For convenience, make Request-Id easily accessible on 143 | // lastResponse. 144 | //res.requestId = headers['request-id']; 145 | 146 | var responseEvent = utils.removeEmpty({ 147 | api_version: headers['trello-version'], 148 | account: headers['trello-account'], 149 | method: req._requestEvent.method, 150 | path: req._requestEvent.path, 151 | status: res.statusCode, 152 | //request_id: res.requestId, 153 | elapsed: Date.now() - req._requestStart 154 | }); 155 | 156 | //console.log('responseEvent ', responseEvent); 157 | self._trello._emitter.emit('response', responseEvent); 158 | try { 159 | 160 | if (responseEvent.status !== 200) { 161 | //console.log('Inside error'); 162 | var message = response; 163 | response = {}; 164 | response.error = {}; 165 | var err; 166 | 167 | response.error.message = message; 168 | //response.error.headers = headers; 169 | response.error.statusCode = res.statusCode; 170 | //response.error.requestId = res.requestId; 171 | 172 | if (res.statusCode === 401) { 173 | err = new Error.TrelloAuthenticationError(response.error); 174 | } else if (res.statusCode === 403) { 175 | err = new Error.TrelloPermissionError(response.error); 176 | } else if (res.statusCode === 429) { 177 | err = new Error.TrelloRateLimitError(response.error); 178 | } else { 179 | err = Error.TrelloError.generate(response.error); 180 | } 181 | return callback.call(self, err, null); 182 | } else { 183 | // Assuming it is success response. 184 | response = JSON.parse(response); 185 | } 186 | } catch (e) { 187 | return callback.call( 188 | self, 189 | new Error.TrelloAPIError({ 190 | message: 'Invalid JSON received from the Trello API', 191 | response: response, 192 | exception: e, 193 | requestId: headers['request-id'] 194 | }), 195 | null 196 | ); 197 | } 198 | // Expose res object 199 | Object.defineProperty(response, 'lastResponse', { 200 | enumerable: false, 201 | writable: false, 202 | value: res 203 | }); 204 | callback.call(self, null, response); 205 | }); 206 | }; 207 | }, 208 | 209 | _errorHandler: function (req, callback) { 210 | var self = this; 211 | return function (error) { 212 | if (req._isAborted) { 213 | // already handled 214 | return; 215 | } 216 | callback.call( 217 | self, 218 | new Error.TrelloConnectionError({ 219 | message: 'An error occurred with our connection to Trello', 220 | detail: error 221 | }), 222 | null 223 | ); 224 | }; 225 | }, 226 | 227 | _defaultHeaders: function (auth, contentLength, apiVersion) { 228 | var userAgentString = 'Trello/v1 NodeBindings/' + this._trello.getConstant('PACKAGE_VERSION'); 229 | 230 | if (this._trello._appInfo) { 231 | userAgentString += ' ' + this._trello.getAppInfoAsString(); 232 | } 233 | 234 | var headers = { 235 | // Use specified auth token or use default from this trello instance: 236 | 'Authorization': auth ? 237 | 'Bearer ' + auth : 238 | this._trello.getApiField('auth'), 239 | 'Accept': 'application/json', 240 | 'Content-Type': 'application/x-www-form-urlencoded', 241 | 'Content-Length': contentLength, 242 | 'User-Agent': userAgentString 243 | }; 244 | 245 | if (apiVersion) { 246 | headers['Trello-Version'] = apiVersion; 247 | } 248 | 249 | return headers; 250 | }, 251 | 252 | _request: function (method, path, data, auth, options, callback) { 253 | var self = this; 254 | var requestData; 255 | 256 | debug('data ', data); 257 | if (self.requestDataProcessor) { 258 | requestData = self.requestDataProcessor(method, data, options.headers); 259 | } else { 260 | requestData = utils.stringifyRequestData(data || {}); 261 | } 262 | 263 | var apiVersion = this._trello.getApiField('version'); 264 | var token = this._trello.getApiField('token'); 265 | var apiKey = this._trello.getApiField('api-key'); 266 | path += '?key=' + apiKey; 267 | path += '&token=' + token; 268 | var headers = self._defaultHeaders(auth, requestData.length, apiVersion); 269 | 270 | // Grab client-user-agent before making the request: 271 | this._trello.getClientUserAgent(function (cua) { 272 | headers['X-Trello-Client-User-Agent'] = cua; 273 | 274 | if (options.headers) { 275 | Object.assign(headers, options.headers); 276 | } 277 | 278 | makeRequest(); 279 | }); 280 | 281 | function makeRequest() { 282 | var timeout = self._trello.getApiField('timeout'); 283 | var isInsecureConnection = self._trello.getApiField('protocol') == 'http'; 284 | 285 | var host = self.overrideHost || self._trello.getApiField('host'); 286 | //console.log('path ', path); 287 | 288 | var options = { 289 | host: host, 290 | port: self._trello.getApiField('port'), 291 | path: path, 292 | method: method, 293 | agent: self._trello.getApiField('agent'), 294 | headers: headers, 295 | ciphers: 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2:!MD5' 296 | }; 297 | var req = ( 298 | isInsecureConnection ? http : https 299 | ).request(options); 300 | 301 | debug('options ', options); 302 | 303 | var requestEvent = utils.removeEmpty({ 304 | api_version: apiVersion, 305 | method: method, 306 | path: path 307 | }); 308 | 309 | req._requestEvent = requestEvent; 310 | 311 | req._requestStart = Date.now(); 312 | 313 | self._trello._emitter.emit('request', requestEvent); 314 | 315 | req.setTimeout(timeout, self._timeoutHandler(timeout, req, callback)); 316 | req.on('response', self._responseHandler(req, callback)); 317 | req.on('error', self._errorHandler(req, callback)); 318 | 319 | req.on('socket', function (socket) { 320 | socket.on((isInsecureConnection ? 'connect' : 'secureConnect'), function () { 321 | // Send payload; we're safe: 322 | req.write(requestData); 323 | 324 | req.end(); 325 | }); 326 | }); 327 | } 328 | } 329 | 330 | }; 331 | 332 | module.exports = TrelloResource; 333 | -------------------------------------------------------------------------------- /lib/Webhooks.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | 3 | var utils = require('./utils'); 4 | var Error = require('./Error'); 5 | 6 | var Webhook = { 7 | DEFAULT_TOLERANCE: 300, 8 | 9 | constructEvent: function (payload, header, secret, tolerance) { 10 | var jsonPayload = JSON.parse(payload); 11 | 12 | this.signature.verifyHeader(payload, header, secret, tolerance || Webhook.DEFAULT_TOLERANCE); 13 | 14 | return jsonPayload; 15 | } 16 | }; 17 | 18 | var signature = { 19 | EXPECTED_SCHEME: 'v1', 20 | 21 | _computeSignature: function (payload, secret) { 22 | return crypto.createHmac('sha256', secret) 23 | .update(payload, 'utf8') 24 | .digest('hex'); 25 | }, 26 | 27 | verifyHeader: function (payload, header, secret, tolerance) { 28 | var details = parseHeader(header, this.EXPECTED_SCHEME); 29 | 30 | if (!details || details.timestamp === -1) { 31 | throw new Error.TrelloSignatureVerificationError({ 32 | message: 'Unable to extract timestamp and signatures from header', 33 | detail: { 34 | header: header, 35 | payload: payload 36 | } 37 | }); 38 | } 39 | 40 | if (!details.signatures.length) { 41 | throw new Error.TrelloSignatureVerificationError({ 42 | message: 'No signatures found with expected scheme', 43 | detail: { 44 | header: header, 45 | payload: payload 46 | } 47 | }); 48 | } 49 | 50 | var expectedSignature = this._computeSignature(details.timestamp + '.' + payload, secret); 51 | 52 | var signatureFound = !!details.signatures 53 | .filter(utils.secureCompare.bind(utils, expectedSignature)) 54 | .length; 55 | 56 | if (!signatureFound) { 57 | throw new Error.TrelloSignatureVerificationError({ 58 | message: 'No signatures found matching the expected signature for payload.' + 59 | ' Are you passing the raw request body you received from Trello?', 60 | detail: { 61 | header: header, 62 | payload: payload 63 | } 64 | }); 65 | } 66 | 67 | var timestampAge = Math.floor(Date.now() / 1000) - details.timestamp; 68 | 69 | if (tolerance > 0 && timestampAge > tolerance) { 70 | throw new Error.TrelloSignatureVerificationError({ 71 | message: 'Timestamp outside the tolerance zone', 72 | detail: { 73 | header: header, 74 | payload: payload 75 | } 76 | }); 77 | } 78 | 79 | return true; 80 | } 81 | }; 82 | 83 | function parseHeader(header, scheme) { 84 | if (typeof header !== 'string') { 85 | return null; 86 | } 87 | 88 | return header.split(',').reduce(function (accum, item) { 89 | var kv = item.split('='); 90 | 91 | if (kv[0] === 't') { 92 | accum.timestamp = kv[1]; 93 | } 94 | 95 | if (kv[0] === scheme) { 96 | accum.signatures.push(kv[1]); 97 | } 98 | 99 | return accum; 100 | }, { 101 | timestamp: -1, 102 | signatures: [] 103 | }); 104 | } 105 | 106 | Webhook.signature = signature; 107 | 108 | module.exports = Webhook; 109 | -------------------------------------------------------------------------------- /lib/resources/Actions.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'actions', 9 | includeBasic: [ 10 | 'search', 'searchField', 'update', 'del' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/Boards.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'boards', 9 | includeBasic: [ 10 | 'create', 'search', 'searchField', 'update', 'del' 11 | ], 12 | 13 | searchCards: trelloMethod({ 14 | method: 'GET', 15 | path: '/{id}/cards', 16 | urlParams: [ 'id' ] 17 | }), 18 | 19 | searchCardsFilter: trelloMethod({ 20 | method: 'GET', 21 | path: '/{id}/cards/{filter}', 22 | urlParams: [ 'id', 'filter' ] 23 | }), 24 | 25 | searchChecklists: trelloMethod({ 26 | method: 'GET', 27 | path: '/{id}/checklists', 28 | urlParams: [ 'id' ] 29 | }), 30 | 31 | searchCustomField: trelloMethod({ 32 | method: 'GET', 33 | path: '/{id}/customFields', 34 | urlParams: [ 'id' ] 35 | }), 36 | 37 | searchLabels: trelloMethod({ 38 | method: 'GET', 39 | path: '/{id}/customLabels', 40 | urlParams: [ 'id' ] 41 | }), 42 | 43 | searchLists: trelloMethod({ 44 | method: 'GET', 45 | path: '/{id}/lists', 46 | urlParams: [ 'id' ] 47 | }), 48 | 49 | searchListsFilter: trelloMethod({ 50 | method: 'GET', 51 | path: '/{id}/lists/{filter}', 52 | urlParams: [ 'id', 'filter' ] 53 | }), 54 | 55 | searchMembers: trelloMethod({ 56 | method: 'GET', 57 | path: '/{id}/members', 58 | urlParams: [ 'id' ] 59 | }), 60 | 61 | searchMemberships: trelloMethod({ 62 | method: 'GET', 63 | path: '/{id}/memberships', 64 | urlParams: [ 'id' ] 65 | }), 66 | 67 | searchPlugins: trelloMethod({ 68 | method: 'GET', 69 | path: '/{id}/plugins', 70 | urlParams: [ 'id' ] 71 | }), 72 | 73 | searchCardsByCardId: trelloMethod({ 74 | method: 'GET', 75 | path: '/{id}/cards/{idCard}', 76 | urlParams: [ 'id', 'idCard' ] 77 | }) 78 | 79 | }); -------------------------------------------------------------------------------- /lib/resources/Cards.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'cards', 9 | includeBasic: [ 10 | 'create', 'search', 'searchField', 'update', 'del' 11 | ], 12 | 13 | setCustomField: trelloMethod({ 14 | method: 'PUT', 15 | path: '/{idCard}/customField/{idCustomField}/item', 16 | urlParams: [ 'idCard', 'idCustomField' ] 17 | }), 18 | 19 | searchActions: trelloMethod({ 20 | method: 'GET', 21 | path: '/{id}/actions', 22 | urlParams: [ 'id' ] 23 | }), 24 | 25 | searchAttachments: trelloMethod({ 26 | method: 'GET', 27 | path: '/{id}/attachments', 28 | urlParams: [ 'id' ] 29 | }), 30 | 31 | searchAttachmentByAttachmentId: trelloMethod({ 32 | method: 'GET', 33 | path: '/{id}/attachments/{idAttachment}', 34 | urlParams: [ 'id', 'idAttachment' ] 35 | }), 36 | 37 | searchBoard: trelloMethod({ 38 | method: 'GET', 39 | path: '/{id}/board', 40 | urlParams: [ 'id' ] 41 | }), 42 | 43 | searchCheckItemStates: trelloMethod({ 44 | method: 'GET', 45 | path: '/{id}/checkItemStates', 46 | urlParams: [ 'id' ] 47 | }), 48 | 49 | searchChecklists: trelloMethod({ 50 | method: 'GET', 51 | path: '/{id}/checklists', 52 | urlParams: [ 'id' ] 53 | }), 54 | 55 | searchCheckItemByCheckItemId: trelloMethod({ 56 | method: 'GET', 57 | path: '/{id}/checkItem/{idCheckItem}', 58 | urlParams: [ 'id', 'idCheckItem' ] 59 | }), 60 | 61 | searchCustomFieldItems: trelloMethod({ 62 | method: 'GET', 63 | path: '/{id}/customFieldItems', 64 | urlParams: [ 'id' ] 65 | }), 66 | 67 | searchList: trelloMethod({ 68 | method: 'GET', 69 | path: '/{id}/list', 70 | urlParams: [ 'id' ] 71 | }), 72 | 73 | searchMembers: trelloMethod({ 74 | method: 'GET', 75 | path: '/{id}/members', 76 | urlParams: [ 'id' ] 77 | }), 78 | 79 | searchMembersVoted: trelloMethod({ 80 | method: 'GET', 81 | path: '/{id}/membersVoted', 82 | urlParams: [ 'id' ] 83 | }), 84 | 85 | searchPluginData: trelloMethod({ 86 | method: 'GET', 87 | path: '/{id}/pluginData', 88 | urlParams: [ 'id' ] 89 | }), 90 | 91 | searchStickers: trelloMethod({ 92 | method: 'GET', 93 | path: '/{id}/stickers', 94 | urlParams: [ 'id' ] 95 | }), 96 | 97 | searchStickersByStickerId: trelloMethod({ 98 | method: 'GET', 99 | path: '/{id}/stickers/{idSticker}', 100 | urlParams: [ 'id' ] 101 | }) 102 | 103 | }); 104 | -------------------------------------------------------------------------------- /lib/resources/Checklists.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'checklists', 9 | includeBasic: [ 10 | 'create', 'search', 'searchField', 'update', 'del' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/CustomField.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | path: 'customfields', 8 | includeBasic: [ 9 | 'create', 'search', 'searchField', 'update', 'del' 10 | ] 11 | 12 | }); 13 | -------------------------------------------------------------------------------- /lib/resources/Enterprises.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'enterprises', 9 | includeBasic: [ 10 | 'search' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/Labels.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'labels', 9 | includeBasic: [ 10 | 'create', 'search', 'update', 'del' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/Lists.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'lists', 9 | includeBasic: [ 10 | 'create', 'search', 'searchField', 'update' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/Members.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'members', 9 | includeBasic: [ 10 | 'search', 'searchField' 11 | ], 12 | 13 | searchBoards: trelloMethod({ 14 | method: 'GET', 15 | path: '/{id}/boards', 16 | urlParams: ['id'] 17 | }) 18 | 19 | }); 20 | -------------------------------------------------------------------------------- /lib/resources/Notifications.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'notifications', 9 | includeBasic: [ 10 | 'search', 'searchField', 'update' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/Organizations.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'organizations', 9 | includeBasic: [ 10 | 'create', 'search', 'searchField', 'update', 'del' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/resources/Webhooks.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var TrelloResource = require('../TrelloResource'); 4 | var trelloMethod = TrelloResource.method; 5 | 6 | module.exports = TrelloResource.extend({ 7 | 8 | path: 'webhooks', 9 | includeBasic: [ 10 | 'create', 'search', 'searchField', 'update', 'del' 11 | ] 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /lib/trello-node-api.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | TrelloNodeApi.DEFAULT_HOST = 'api.trello.com'; 4 | TrelloNodeApi.DEFAULT_PORT = '443'; 5 | TrelloNodeApi.DEFAULT_BASE_PATH = '/1/'; 6 | TrelloNodeApi.DEFAULT_API_VERSION = null; 7 | 8 | // Use node's default timeout: 9 | TrelloNodeApi.DEFAULT_TIMEOUT = require('http').createServer().timeout; 10 | 11 | TrelloNodeApi.PACKAGE_VERSION = require('../package.json').version; 12 | 13 | TrelloNodeApi.USER_AGENT = { 14 | bindings_version: TrelloNodeApi.PACKAGE_VERSION, 15 | lang: 'node', 16 | lang_version: process.version, 17 | platform: process.platform, 18 | publisher: 'TrelloNodeApi', 19 | uname: null 20 | }; 21 | 22 | TrelloNodeApi.USER_AGENT_SERIALIZED = null; 23 | 24 | var APP_INFO_PROPERTIES = ['name', 'version', 'url']; 25 | 26 | var EventEmitter = require('events').EventEmitter; 27 | var exec = require('child_process').exec; 28 | 29 | var resources = { 30 | Action: require('./resources/Actions'), 31 | Board: require('./resources/Boards'), 32 | Card: require('./resources/Cards'), 33 | Checklist: require('./resources/Checklists'), 34 | CustomField: require('./resources/CustomField'), 35 | Enterprise: require('./resources/Enterprises'), 36 | Label: require('./resources/Labels'), 37 | List: require('./resources/Lists'), 38 | Member: require('./resources/Members'), 39 | Notification: require('./resources/Notifications'), 40 | Organization: require('./resources/Organizations'), 41 | Webhook: require('./resources/Webhooks') 42 | }; 43 | 44 | TrelloNodeApi.TrelloNodeApiResource = require('./TrelloResource'); 45 | TrelloNodeApi.resources = resources; 46 | 47 | function TrelloNodeApi(key, token) { 48 | if (!(this instanceof TrelloNodeApi)) { 49 | return new TrelloNodeApi(key, token); 50 | } 51 | 52 | Object.defineProperty(this, '_emitter', { 53 | value: new EventEmitter(), 54 | enumerable: false, 55 | configurable: false, 56 | writeable: false 57 | }); 58 | 59 | this.on = this._emitter.on.bind(this._emitter); 60 | this.off = this._emitter.removeListener.bind(this._emitter); 61 | 62 | this._api = { 63 | auth: null, 64 | host: TrelloNodeApi.DEFAULT_HOST, 65 | port: TrelloNodeApi.DEFAULT_PORT, 66 | basePath: TrelloNodeApi.DEFAULT_BASE_PATH, 67 | version: TrelloNodeApi.DEFAULT_API_VERSION, 68 | timeout: TrelloNodeApi.DEFAULT_TIMEOUT, 69 | agent: null, 70 | dev: false 71 | }; 72 | 73 | this._prepResources(); 74 | this.setApiKey(key); 75 | this.setApiVersion(1); 76 | this.setOauthToken(token); 77 | 78 | this.webhooks = require('./Webhooks'); 79 | } 80 | 81 | TrelloNodeApi.prototype = { 82 | 83 | setHost: function (host, port, protocol) { 84 | this._setApiField('host', host); 85 | if (port) { 86 | this.setPort(port); 87 | } 88 | if (protocol) { 89 | this.setProtocol(protocol); 90 | } 91 | }, 92 | 93 | setProtocol: function (protocol) { 94 | this._setApiField('protocol', protocol.toLowerCase()); 95 | }, 96 | 97 | setPort: function (port) { 98 | this._setApiField('port', port); 99 | }, 100 | 101 | setApiVersion: function (version) { 102 | if (version) { 103 | this._setApiField('version', version); 104 | } 105 | }, 106 | 107 | setOauthToken: function (token) { 108 | if (token) { 109 | this._setApiField( 110 | 'token', token 111 | ); 112 | } 113 | }, 114 | 115 | setApiKey: function (key) { 116 | if (key) { 117 | this._setApiField( 118 | 'api-key', key 119 | ); 120 | } 121 | }, 122 | 123 | setTimeout: function (timeout) { 124 | this._setApiField( 125 | 'timeout', 126 | timeout == null ? TrelloNodeApi.DEFAULT_TIMEOUT : timeout 127 | ); 128 | }, 129 | 130 | setAppInfo: function (info) { 131 | if (info && typeof info !== 'object') { 132 | throw new Error('AppInfo must be an object.'); 133 | } 134 | 135 | if (info && !info.name) { 136 | throw new Error('AppInfo.name is required'); 137 | } 138 | 139 | info = info || {}; 140 | 141 | var appInfo = APP_INFO_PROPERTIES.reduce(function (accum, prop) { 142 | if (typeof info[prop] == 'string') { 143 | accum = accum || {}; 144 | 145 | accum[prop] = info[prop]; 146 | } 147 | 148 | return accum; 149 | }, undefined); 150 | 151 | // Kill the cached UA string because it may no longer be valid 152 | TrelloNodeApi.USER_AGENT_SERIALIZED = undefined; 153 | 154 | this._appInfo = appInfo; 155 | }, 156 | 157 | setHttpAgent: function (agent) { 158 | this._setApiField('agent', agent); 159 | }, 160 | 161 | _setApiField: function (key, value) { 162 | this._api[key] = value; 163 | }, 164 | 165 | getApiField: function (key) { 166 | return this._api[key]; 167 | }, 168 | 169 | getConstant: function (c) { 170 | return TrelloNodeApi[c]; 171 | }, 172 | 173 | // Gets a JSON version of a User-Agent and uses a cached version for a slight 174 | // speed advantage. 175 | getClientUserAgent: function (cb) { 176 | if (TrelloNodeApi.USER_AGENT_SERIALIZED) { 177 | return cb(TrelloNodeApi.USER_AGENT_SERIALIZED); 178 | } 179 | this.getClientUserAgentSeeded(TrelloNodeApi.USER_AGENT, function (cua) { 180 | TrelloNodeApi.USER_AGENT_SERIALIZED = cua; 181 | cb(TrelloNodeApi.USER_AGENT_SERIALIZED); 182 | }); 183 | }, 184 | 185 | // Gets a JSON version of a User-Agent by encoding a seeded object and 186 | // fetching a uname from the system. 187 | getClientUserAgentSeeded: function (seed, cb) { 188 | var self = this; 189 | 190 | exec('uname -a', function (err, uname) { 191 | var userAgent = {}; 192 | for (var field in seed) { 193 | userAgent[field] = encodeURIComponent(seed[field]); 194 | } 195 | 196 | // URI-encode in case there are unusual characters in the system's uname. 197 | userAgent.uname = encodeURIComponent(uname) || 'UNKNOWN'; 198 | 199 | if (self._appInfo) { 200 | userAgent.application = self._appInfo; 201 | } 202 | 203 | cb(JSON.stringify(userAgent)); 204 | }); 205 | }, 206 | 207 | getAppInfoAsString: function () { 208 | if (!this._appInfo) { 209 | return ''; 210 | } 211 | 212 | var formatted = this._appInfo.name; 213 | 214 | if (this._appInfo.version) { 215 | formatted += '/' + this._appInfo.version; 216 | } 217 | 218 | if (this._appInfo.url) { 219 | formatted += ' (' + this._appInfo.url + ')'; 220 | } 221 | 222 | return formatted; 223 | }, 224 | 225 | _prepResources: function () { 226 | for (var name in resources) { 227 | this[ 228 | name[0].toLowerCase() + name.substring(1) 229 | ] = new resources[name](this); 230 | } 231 | } 232 | 233 | }; 234 | 235 | module.exports = TrelloNodeApi; 236 | // expose constructor as a named property to enable mocking with Sinon.JS 237 | module.exports.TrelloNodeApi = TrelloNodeApi; 238 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Buffer = require('safe-buffer').Buffer; 4 | var qs = require('qs'); 5 | var crypto = require('crypto'); 6 | 7 | var hasOwn = {}.hasOwnProperty; 8 | var isPlainObject = require('lodash.isplainobject'); 9 | 10 | var OPTIONS_KEYS = ['api_key']; 11 | 12 | var utils = module.exports = { 13 | 14 | isAuthKey: function (key) { 15 | return typeof key == 'string' && /^(?:[a-z]{2}_)?[A-z0-9]{32}$/.test(key); 16 | }, 17 | 18 | isOptionsHash: function (o) { 19 | return isPlainObject(o) && OPTIONS_KEYS.some(function (key) { 20 | return hasOwn.call(o, key); 21 | }); 22 | }, 23 | 24 | /** 25 | * Stringifies an Object, accommodating nested objects 26 | * (forming the conventional key 'parent[child]=value') 27 | */ 28 | stringifyRequestData: function (data) { 29 | return qs.stringify(data, {arrayFormat: 'brackets'}); 30 | }, 31 | 32 | /** 33 | * Outputs a new function with interpolated object property values. 34 | * Use like so: 35 | * var fn = makeURLInterpolator('some/url/{param1}/{param2}'); 36 | * fn({ param1: 123, param2: 456 }); // => 'some/url/123/456' 37 | */ 38 | makeURLInterpolator: (function () { 39 | var rc = { 40 | '\n': '\\n', '\"': '\\\"', 41 | '\u2028': '\\u2028', '\u2029': '\\u2029' 42 | }; 43 | return function makeURLInterpolator(str) { 44 | var cleanString = str.replace(/["\n\r\u2028\u2029]/g, function ($0) { 45 | return rc[$0]; 46 | }); 47 | return function (outputs) { 48 | return cleanString.replace(/\{([\s\S]+?)\}/g, function ($0, $1) { 49 | return encodeURIComponent(outputs[$1] || ''); 50 | }); 51 | }; 52 | }; 53 | }()), 54 | 55 | /** 56 | * Return the data argument from a list of arguments 57 | */ 58 | getDataFromArgs: function (args) { 59 | if (args.length < 1 || !isPlainObject(args[0])) { 60 | return {}; 61 | } 62 | 63 | if (!utils.isOptionsHash(args[0])) { 64 | return args.shift(); 65 | } 66 | 67 | var argKeys = Object.keys(args[0]); 68 | 69 | var optionKeysInArgs = argKeys.filter(function (key) { 70 | return OPTIONS_KEYS.indexOf(key) > -1; 71 | }); 72 | 73 | // In some cases options may be the provided as the first argument. 74 | // Here we're detecting a case where there are two distinct arguments 75 | // (the first being args and the second options) and with known 76 | // option keys in the first so that we can warn the user about it. 77 | if (optionKeysInArgs.length > 0 && optionKeysInArgs.length !== argKeys.length) { 78 | console.warn( 79 | 'Trello: Options found in arguments (' + optionKeysInArgs.join(', ') + '). Did you mean to pass an options ' + 80 | 'object?' 81 | ); 82 | } 83 | 84 | return {}; 85 | }, 86 | 87 | /** 88 | * Return the options hash from a list of arguments 89 | */ 90 | getOptionsFromArgs: function (args) { 91 | var opts = { 92 | auth: null, 93 | headers: {} 94 | }; 95 | if (args.length > 0) { 96 | var arg = args[args.length - 1]; 97 | if (utils.isAuthKey(arg)) { 98 | opts.auth = args.pop(); 99 | } else if (utils.isOptionsHash(arg)) { 100 | var params = args.pop(); 101 | if (params.api_key) { 102 | opts.auth = params.api_key; 103 | } 104 | if (params.trello_version) { 105 | opts.headers['Trello-Version'] = params.trello_version; 106 | } 107 | } 108 | } 109 | return opts; 110 | }, 111 | 112 | /** 113 | * Provide simple "Class" extension mechanism 114 | */ 115 | protoExtend: function (sub) { 116 | var Super = this; 117 | var Constructor = hasOwn.call(sub, 'constructor') ? sub.constructor : function () { 118 | Super.apply(this, arguments); 119 | }; 120 | 121 | // This initialization logic is somewhat sensitive to be compatible with 122 | // divergent JS implementations like the one found in Qt. See here for more 123 | // context: 124 | // 125 | Object.assign(Constructor, Super); 126 | Constructor.prototype = Object.create(Super.prototype); 127 | Object.assign(Constructor.prototype, sub); 128 | 129 | return Constructor; 130 | }, 131 | 132 | /** 133 | * Convert an array into an object with integer string attributes 134 | */ 135 | arrayToObject: function (arr) { 136 | if (Array.isArray(arr)) { 137 | var obj = {}; 138 | arr.map(function (item, i) { 139 | obj[i.toString()] = item; 140 | }); 141 | return obj; 142 | } 143 | return arr; 144 | }, 145 | 146 | /** 147 | * Secure compare, from https://github.com/freewil/scmp 148 | */ 149 | secureCompare: function (a, b) { 150 | var a = Buffer.from(a); 151 | var b = Buffer.from(b); 152 | 153 | // return early here if buffer lengths are not equal since timingSafeEqual 154 | // will throw if buffer lengths are not equal 155 | if (a.length !== b.length) { 156 | return false; 157 | } 158 | 159 | // use crypto.timingSafeEqual if available (since Node.js v6.6.0), 160 | // otherwise use our own scmp-internal function. 161 | if (crypto.timingSafeEqual) { 162 | return crypto.timingSafeEqual(a, b); 163 | } 164 | 165 | var len = a.length; 166 | var result = 0; 167 | 168 | for (var i = 0; i < len; ++i) { 169 | result |= a[i] ^ b[i]; 170 | } 171 | return result === 0; 172 | }, 173 | 174 | /** 175 | * Remove empty values from an object 176 | */ 177 | removeEmpty: function (obj) { 178 | if (typeof obj !== 'object') { 179 | throw new Error('Argument must be an object'); 180 | } 181 | 182 | Object.keys(obj).forEach(function (key) { 183 | if (obj[key] === null || obj[key] === undefined) { 184 | delete obj[key]; 185 | } 186 | }); 187 | 188 | return obj; 189 | } 190 | }; 191 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "trello-node-api", 3 | "version": "0.0.9", 4 | "description": "Trello Node API wrapper", 5 | "keywords": [ 6 | "node-trello", 7 | "node-trello-api", 8 | "trello-node-api", 9 | "trello-api", 10 | "trello-sdk", 11 | "trelloo-client", 12 | "trello-node", 13 | "trello", 14 | "trello-actions", 15 | "trello-boards", 16 | "trello-cards", 17 | "trello-checklists", 18 | "trello-enterprises", 19 | "trello-labels", 20 | "trello-lists", 21 | "trello-members", 22 | "trello-notifications", 23 | "trello-organizations", 24 | "trello-webhooks", 25 | "trello-typescript", 26 | "trello-es6" 27 | ], 28 | "homepage": "https://github.com/bhushankumarl/trello-node-api", 29 | "author": "Bhushankumar Lilapara", 30 | "contributors": [ 31 | "Bhushankumar Lilapara (bhushankumar.lilapara@gmail.com)" 32 | ], 33 | "repository": { 34 | "type": "git", 35 | "url": "https://github.com/bhushankumarl/trello-node-api" 36 | }, 37 | "bugs:": "https://github.com/bhushankumarl/trello-node-api/issues", 38 | "engines": { 39 | "node": ">=4" 40 | }, 41 | "main": "lib/trello-node-api", 42 | "dependencies": { 43 | "bluebird": "^3.7.2", 44 | "debug": "^4.1.1", 45 | "lodash.isplainobject": "^4.0.6", 46 | "qs": "~6.9.1", 47 | "safe-buffer": "^5.2.0" 48 | }, 49 | "devDependencies": { 50 | "@types/chai": "^4.2.8", 51 | "@types/mocha": "^7.0.1", 52 | "@types/node": "^13.7.0", 53 | "chai": "^4.2.0", 54 | "chai-as-promised": "~7.1.1", 55 | "mocha": "^7.0.1", 56 | "ts-node": "^8.6.2", 57 | "typescript": "^3.7.5" 58 | }, 59 | "license": "MIT", 60 | "scripts": { 61 | "lint": "tsc index.d.ts", 62 | "test.mocha": "npm run lint; mocha -r ts-node/register test/**/*.spec.ts" 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /test/initialize/index.ts: -------------------------------------------------------------------------------- 1 | export const CONFIG = { 2 | TRELLO_API_KEY: process.env.TRELLO_API_KEY || undefined, 3 | TRELLO_OAUTH_TOKEN: process.env.TRELLO_OAUTH_TOKEN || undefined 4 | }; -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --bail 2 | --recursive -------------------------------------------------------------------------------- /test/resources/Board.spec.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG } from '../initialize'; 2 | // @ts-ignore 3 | import * as TrelloNodeAPI from '../../lib/trello-node-api'; 4 | 5 | import * as chai from 'chai'; 6 | 7 | const expect = chai.expect; 8 | 9 | const apiKey = CONFIG.TRELLO_API_KEY; 10 | const oauthToken = CONFIG.TRELLO_OAUTH_TOKEN; 11 | 12 | const Trello = new TrelloNodeAPI(); 13 | Trello.setApiKey(apiKey); 14 | Trello.setOauthToken(oauthToken); 15 | 16 | let boardDocument: any = {}; 17 | describe('Board', function () { 18 | 19 | before(function () { 20 | expect(apiKey).to.be.a('string'); 21 | expect(oauthToken).to.be.a('string'); 22 | }); 23 | 24 | it('It should create the Board', async function () { 25 | const boardName = 'Auto generated board ' + new Date().getUTCMilliseconds(); 26 | let data = { 27 | name: boardName, // REQUIRED 28 | defaultLabels: false, 29 | defaultLists: false, 30 | desc: 'This is test board. Here is the Board description.', 31 | keepFromSource: 'none', 32 | powerUps: 'all', 33 | prefs_permissionLevel: 'private', 34 | prefs_voting: 'disabled', 35 | prefs_comments: 'members', 36 | prefs_invitations: 'members', 37 | prefs_selfJoin: true, 38 | prefs_cardCovers: true, 39 | prefs_background: 'blue', 40 | prefs_cardAging: 'regular' 41 | }; 42 | try { 43 | let response = await Trello.board.create(data); 44 | console.log('response', response); 45 | boardDocument = response; 46 | expect(response).to.be.a('object'); 47 | } catch (error) { 48 | console.log('error ', error); 49 | expect(error).to.be.undefined; 50 | } 51 | }); 52 | 53 | it('It should delete the Board', async function () { 54 | try { 55 | let response = await Trello.board.del(boardDocument.id); 56 | console.log('response', response); 57 | expect(response).to.be.a('object'); 58 | } catch (error) { 59 | console.log('error ', error); 60 | expect(error).to.be.undefined; 61 | } 62 | }); 63 | }); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "inlineSources": true, 5 | "noImplicitAny": true, 6 | "noImplicitReturns": true, 7 | "noImplicitThis": true, 8 | "noUnusedParameters": true, 9 | "noUnusedLocals": true, 10 | "removeComments": true, 11 | "strictNullChecks": true, 12 | "sourceMap": true, 13 | "module": "commonjs", 14 | "moduleResolution": "node", 15 | "outDir": "dist", 16 | "target": "es5", 17 | "lib": [ 18 | "es2015" 19 | ], 20 | "types": [ 21 | "mocha", 22 | "node" 23 | ] 24 | }, 25 | "rootDirs": [ 26 | "src", 27 | "test" 28 | ] 29 | } --------------------------------------------------------------------------------