Skip to content

Commit

Permalink
v7.0.0 (#533)
Browse files Browse the repository at this point in the history
# Description
This PR is a culmination of all the PRs that contained v7-related development, with formal support for the Nylas API v3. This release is essentially the same as the v7.0.0-beta.5 release found on npm. Please refer to the readme for a quick start guide on using the new SDK, as well as links to the upgrade doc as well as the SDK reference docs.

# Changelog
* **BREAKING CHANGE**: Node SDK v7 supports the Nylas API v3 exclusively, dropping support for any endpoints that are not available in v3.
* **BREAKING CHANGE**: Convert `Nylas` class from a static to a non-static class
* **BREAKING CHANGE**: Officially support minimum Node 16
* **BREAKING CHANGE**: Dropped the use of 'Collections' in favor of 'Resources'
* **BREAKING CHANGE**: Removed all REST calls from models and moved them directly into resources
* **REMOVED**: Local Webhook development support is removed due to incompatibility
* Rewrote the majority of SDK to be more modular and efficient
* Removed the use of custom strings for serialization and deserialization, now automatically converting to camelCase and from the API's snake_case
* Added support for both ES6 and CommonJS module systems
* Created models for all API resources and endpoints, for all HTTP methods to reduce confusion on which fields are available for each endpoint
* Created error classes for the different API errors as well as SDK-specific errors

==================================================================

* Convert `Nylas` class from a static to a non-static class (#365)

This PR converts the SDK's entry point, the Nylas class, from being static to non-static. The reason behind this change is to enable multiple configurations and more reuse of the Nylas object. Note that this also changes all the class's variables and functions to non-static.

* Rename `confirmationEmailToHost` to `confirmationEmailsToHost` in `SchedulerBooking` (#384)

"Emails" should be pluralized to align with the API.

* [v7] Add defaults for Content-Type and Aceept headers for outgoing API requests (#415)

This PR adds a default values for both the Content-Type and Accept headers for all outgoing connections to the Nylas API.

* Officially support Node >= 16 (#428)

This PR adds an engine entry for Node >= 16 as moving forward we are only supporting frameworks and languages that are currently supported. This PR also removes some code that was backwards compatible with Node < 10 and updates the github actions to only run on the supported LTS versions.

This PR also sets up actions for changes incoming to the v7-staging branch, and removes webhook tunnel support as it will not be available on launch.

* refactor(config): update config for v3

* build(npm): update jest

* feat!: v7 skeleton

* apiclient refactor

* TW-2089 Create response models

* TW-2089 Deserialize and validate response from API

* camelCase stuff

* util schema

* overrides refactor

* WIP calendars

* build(npm): upgrade ts and jest

* progress

* calendars

* instantiate calendars

* calendar fix

* apiclient changes

* IT WORKS!!!

* delete consolellog

* replace grantId with identifier

because you can get by grantId or email

* add generalized casing function & add snake_case

* fix query params support

* remove calendar request schemas

* change naming to identifier

* fix queryparams

* change metadatapair to record type

* create grant resource

* fix server url

* nit

* nit

* update events schema

* events resource

* availabliity

* next pagination helper

* v7 refactoring and pagination

* fix apiclient list validation

* request types file

* refactor response types

* refactor resource schemas

* refactor api client

* implement next, pagination, and limit guarantee

* refactor event types

* refactor calendar types

* refactor generator typing

* Hosted auth (#440)

* Hosted auth

* Updated comments

* Prettier fix

* Updated providers query param for url creation

* Updated struct

* Updated url generation

* fix request error handling

* remove request validation from auth

* fix error schema

---------

Co-authored-by: Albert T <[email protected]>

* Support authentication grant models and CRUD operations (#439)

- Added grant models
- Added grant CRUD operations
- Abstracted resource methods and moved them into baseResource
- Added update PATCH operation
- Fixed method being discarded before outgoing calls

* feat(auth): add scopes (#447)

* Hosted auth

* Updated comments

* Prettier fix

* Updated providers query param for url creation

* Updated struct

* Updated url generation

* fix request error handling

* remove request validation from auth

* fix error schema

* fix validation schemas

* feat(auth): scopes

* Add Webhook support (#450)

This PR adds support for the Webhook schemas and models, enums for Webhook triggers, and all the Webhook API endpoints.

* Delete returns 200 instead of 204 now (#454)

The API was returning 204 for DELETE calls, now it returns 200 with a body.

* Added token validation (#444)

* PKCE auth (#453)

* Added hosted auth (#451)

* Added hosted auth

* Hosted response fix

* Update Event schema and subschemas (#452)

This PR just provides updates to the fields for the Event schema and its subschemas, and also fixing the types and addressing todos.

* Create initial unit tests (#458)

This PR adds in unit tests for nylas.ts and apiClient.

* Added hosted imap support (#464)

* List & detect providers (#463)

* Create test suite for calendars and auth (#459)

* Prevent tests from being compiled by TS

* Extend query params support to remaining CRUD func

* Fix events

- Calendar ID param required for all CRUD operations
- Only when is required for creating an event
- Update request body should make everything optional

* AV-819 Create events test suite

also used to test baseResource

* Minor tweaks to the auth resource

- prettier
- documentation fixes
- typos

* Delete index.js

* cleanup auth schema

* simplify validating tokens

* switch from str building to url building

* url build for pcke and admin consent url

* nit: remove async for non asnyc funcs

* nit: add missing slash

* AV-822 Created auth spec

---------

Co-authored-by: Albert T <[email protected]>

* fix(auth): errors (#465)

* Auth test suite and refactor (#467)

* Prevent tests from being compiled by TS

* Extend query params support to remaining CRUD func

* Fix events

- Calendar ID param required for all CRUD operations
- Only when is required for creating an event
- Update request body should make everything optional

* AV-819 Create events test suite

also used to test baseResource

* Minor tweaks to the auth resource

- prettier
- documentation fixes
- typos

* Delete index.js

* cleanup auth schema

* simplify validating tokens

* switch from str building to url building

* url build for pcke and admin consent url

* nit: remove async for non asnyc funcs

* nit: add missing slash

* AV-822 Created auth spec

* small refactor

* Replace urlForAuthenticationIMAP

Replaced with using urlForAuthentication and adding IMAPAuthConfig (with provider = imap enforced) to AuthConfig.

* [v7] Node SDK v7 Pre-Beta Polish (#471)

This PR brings the final major changes to the v7 SDK pre-beta, lots of cleanup for consistency and fixing some issues with the SDK. The list of things that were completed includes:
- Implemented timeout
- Implemented application + redirect URI support
- Updating availability support to the newly redesigned endpoint
- Removed Zod, replaced fully with TypeScript interfaces (easier to maintain)
- Removed Provider Scopes (third party scopes can change thus hard to maintain)
- Renamed "BaseResource" -> "Resource"
- Renamed "ItemResponse", "ListResponse", "DeleteResponse" to "NylasResponse", "NylasListResponse", and "NylasDeleteResponse"
- Renamed "schemas" -> "models" (no more zod, schemas may be re-introduced in the future if we have them)
- Added missing create/update models
- Fixed failing tests
- Cleaned up repo, unused dependencies, and upgraded dependencies where possible

* Added github action to generate SDK references (#475)

* Generate SDK refernece GHA

* Added docs command

* Resource documentation for SDK reference (#476)

This PR has documentation adds for all the resources. Also changes the following:
- Refactor Auth to reflect the recent changes to the endpoints
- Refactor Errors to support API + OAuth errors as well as timeout errors
- Move availability into the calendar resource

* Support ES Modules by making Nylas SDK a dual package (#477)

This PR makes the Nylas SDK a dual package supporting both CommonJS and ES Module syntax. Now, the SDK's distribution package will include 3 directories:

- lib/cjs: for CommonJS
- lib/esm: for ES Modules
- lib/types: for the TypeScript declaration files

Furthermore we've also upgraded the tsconfig to target es2021 as it's the newest ECMAScript version that is fully supported by the minimum Node version supported by the SDK (v16).

* Add SDK documentation for models and top-level files (#478)

This PR adds documentation for the models and top-level files, completing the SDK reference.

* v7.0.0-beta.1 Release (#479)

This PR is for releasing the first beta of v7 on npm.

* Get SDK version reliably (#480)

Because of how we are building our SDK now with the ES Module addition in #477 it has caused importing the `package.json` file to be a bit more tricky given that it no longer exists one directory up. Instead we just generate a version file post-build and during the npm version call and we pull the version from that file. The file is written, and sources the version from, the package.json file.

* [v7.0.0-beta.1] Fix ESM and CJS issues (#481)

This PR addresses a couple of issues found with the nylas package since we've introduced both ESM and CJS support:
- Add build step (script) that dynamically creates package.json files for each of the ESM and CJS modules. This prevents the `To load an ES module, set "type": "module" in the package.json or use the .mjs extension` error
- Add ".js" file extension to all relative imports. This prevents the `ERR_MODULE_NOT_FOUND` error when using the SDK in an esmodule project.

* v7.0.0-beta.2 Release  (#482)

* Changelog updates

* 7.0.0-beta.2

* Add UPGRADE file (#483)

This PR adds an upgrade doc for the Node SDK.

Co-authored-by: Lrubin <[email protected]>

* Create a webhook should return secret (#485)

Creating a webhook should return a WebhookWithSecret response.

* Add Free-Busy Support (#493)

This PR adds support for the free busy endpoint.

* Add Unit Tests for Node SDK v7 beta (#488)

This PR fixes the current testing framework and adds many more. Our testing coverage is around 90% now.

We now also have 2 new fixes that have been identified by the tests:
* Fix path for destroying a redirect URI
* Fix model for updating an Event

* Add Messages, Drafts, and Smart Compose APIs support (#494)

This PR adds support for messages, drafts, and smart compose APIs.

* Add support for custom authentication, connectors, and credentials APIs (#497)

Adds support for custom authentication, the connectors API and the credentials API.

* v7.0.0 beta.3 Release (#500)

* Update CHANGELOG.md

* 7.0.0-beta.3

* Update CHANGELOG.md

* Add Node SDK Folders API (#501)

* Add support for attachments api (#505)

* Attachments api

* Added download method for returning stream

* lint

* PR Review request updates

* Fix issue with form-data not importing correctly for ESM projects (#523)

The npm package `form-data` has an issue with importing compatibility between CJS and ESM. Using `import * as FormData` or `import FormData` works only on cjs while `import { default as FormData }` works only on esm. We work around this now by checking if `default` exists on the importing object, and using it if it does, otherwise just use `FormData`.

* Added Contacts API Support (#513)

Contact group endpoint

Co-authored-by: Mostafa Rashed <[email protected]>

* Send RSVP support for Events API (#514)

* Send RSVP support for Events API

* Move `Grants` to `NylasClient` and custom authentication to `Auth` (#522)

⚠️ This is a breaking change ⚠️ 

This PR moves the following:
* `Auth.grants()` to `NylasClient.grants()`
* `Grants.create()` to `Auth.customAuthentication()`

Functionality remains the same.

* Fix typing errors in TrackingOptions and Connector (#525)

Fix typing errors present in Connector and TrackingOptions.

* Include email value for CodeExchange response (#526)

The code exchange response should include an email value as well.

Additionally, the provider detect endpoint was referencing the wrong path. Changed it to reflect the path mentioned here -> https://developer.nylas.com/docs/api/v3-beta/admin/#post-/v3/providers/detect

* v7.0.0 beta.4 Release (#528)

* Update CHANGELOG.md

* 7.0.0-beta.4

* Update CHANGELOG.md

* Fix missing `type` field in `Event` model (#530)

Missing type field for Event responses made it hard to deal with this polymorphic field.

* Changed `clientSecret` to optional for token exchange methods; defaults to API Key now (#531)

clientSecret is not required if the API Key used for the SDK and the clientId belong to the same application.

* Pre-GA Minor Fixes (#495)

These minor fixes:
- Export interfaces in resources
- Fix Event models
- Wrap `detectProvider` response around a `NylasResponse`
- Added `default` event visibility value
- Updated reminders field to match updated API schema
- Updated all references to `File` to `Attachment` to match API schema
- Fixes to drafts and sending messages
- Removed `ContactType` enum as the API accepts any string

* v7.0.0 beta.5 Release (#532)

# Changelog
* Added `default` event visibility value
* Changed `clientSecret` to optional for token exchange methods; defaults to API Key now
* Updated reminders field to match updated API schema
* Updated all references to `File` to `Attachment` to match API schema
* Fixes to the `Event` models
* Fixes to drafts and sending messages
* Removed `ContactType` enum as the API accepts any string

Note, this is the final beta.

* Update CHANGELOG.md

* Delete LoggingInterface.ts

* scrub references to the beta

* 7.0.0

---------

Co-authored-by: Albert T <[email protected]>
Co-authored-by: Albert T <[email protected]>
Co-authored-by: Luka Bulatovic <[email protected]>
Co-authored-by: Aaron de Mello <[email protected]>
Co-authored-by: Lrubin <[email protected]>
Co-authored-by: YIFAN WU <[email protected]>
Co-authored-by: kraju3 <[email protected]>
  • Loading branch information
8 people authored Feb 5, 2024
1 parent a272086 commit 19678d9
Show file tree
Hide file tree
Showing 205 changed files with 17,423 additions and 28,626 deletions.
3 changes: 0 additions & 3 deletions .arcconfig

This file was deleted.

4 changes: 0 additions & 4 deletions .babelrc

This file was deleted.

3 changes: 2 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
node_modules
lib
example
example
docs
14 changes: 13 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module.exports = {
ecmaVersion: 2016,
sourceType: 'module',
},
plugins: ['@typescript-eslint'],
plugins: ['@typescript-eslint', 'eslint-plugin-import'],
extends: [
'eslint:recommended',
'prettier',
Expand All @@ -30,5 +30,17 @@ module.exports = {
{ properties: 'never', ignoreDestructuring: true },
],
'no-undef': 'error',
'import/extensions': ['error', 'ignorePackages'],
},
settings: {
'import/extensions': ['.js'],
},
overrides: [
{
files: ['*.spec.ts'],
rules: {
'import/extensions': 'off',
},
},
],
};
2 changes: 1 addition & 1 deletion .github/workflows/pull-reqeust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 8.x, 14.x ]
node-version: [ 16.x, 18.x, 20.x ]
name: Nodejs ${{ matrix.node-version }}
steps:
- uses: actions/checkout@v2
Expand Down
43 changes: 43 additions & 0 deletions .github/workflows/sdk-reference.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: sdk-reference

on:
push:
branches:
- main
pull_request:

jobs:
docs:
runs-on: ubuntu-latest
environment:
name: sdk-reference
url: ${{ steps.deploy.outputs.url }}
steps:
- uses: actions/checkout@v2
- name: Setup Nodejs
uses: actions/setup-node@v1
with:
node-version: 18.x
- name: Install dependencies and build
run: npm install
- name: Build docs
run: npm run build:docs
- name: Set env BRANCH
run: echo "BRANCH=$(echo $GITHUB_REF | cut -d'/' -f 3)" >> $GITHUB_ENV
- name: Set env CLOUDFLARE_BRANCH
run: |
if [[ $BRANCH == 'main' && $GITHUB_EVENT_NAME == 'push' ]]; then
echo "CLOUDFLARE_BRANCH=main" >> "$GITHUB_ENV"
else
echo "CLOUDFLARE_BRANCH=$BRANCH" >> "$GITHUB_ENV"
fi
- name: Publish to Cloudflare Pages
uses: cloudflare/pages-action@v1
id: deploy
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: nylas-nodejs-sdk-reference
directory: docs
wranglerVersion: "3"
branch: ${{ env.CLOUDFLARE_BRANCH }}
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ _SpecRunner.html
tags
CTAGS
.idea
coverage
docs
cjs
esm
3 changes: 2 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
node_modules
lib
example
example
docs
20 changes: 0 additions & 20 deletions .travis.yml

This file was deleted.

34 changes: 12 additions & 22 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
# Changelog

### Unreleased
* Fix issue where Graph events were returning 400 on update

### 6.11.0 / 2023-11-28
* Add support for logging
* Nullify replyToMessageId is an empty string
* Nullify visibility if visibility is an empty string
* Fix numbers defaulting to 0 instead of null
* Fix parsing of Number arrays
* Fix configured timeout not being used
* Bump `node-fetch` dependency from 2.6.1 to 2.6.12

### 6.10.0 / 2023-04-04
* Add support for verifying webhook signatures

### 6.9.0 / 2023-03-14
* Add missing generic type in `RestfulModelCollection` for better type safety
* Add 409 to error mapping
* Add `startTimezone`, `endTimezone` and `timezone` fields to `When`
* Allow configurable timeout for API calls
* Bump `minimist` sub-dependency from 1.2.0 to 1.2.6
* Bump `mkdirp` sub-dependency from 0.5.1 to 0.5.6
### 7.0.0 / 2024-02-05
* **BREAKING CHANGE**: Node SDK v7 supports the Nylas API v3 exclusively, dropping support for any endpoints that are not available in v3.
* **BREAKING CHANGE**: Convert `Nylas` class from a static to a non-static class
* **BREAKING CHANGE**: Officially support minimum Node 16
* **BREAKING CHANGE**: Dropped the use of 'Collections' in favor of 'Resources'
* **BREAKING CHANGE**: Removed all REST calls from models and moved them directly into resources
* **REMOVED**: Local Webhook development support is removed due to incompatibility
* Rewrote the majority of SDK to be more modular and efficient
* Removed the use of custom strings for serialization and deserialization, now automatically converting to camelCase and from the API's snake_case
* Added support for both ES6 and CommonJS module systems
* Created models for all API resources and endpoints, for all HTTP methods to reduce confusion on which fields are available for each endpoint
* Created error classes for the different API errors as well as SDK-specific errors

### 6.8.0 / 2023-02-03
* Local webhook testing support
Expand Down
67 changes: 44 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,37 @@

# Nylas Node.js SDK

[![Travis build status](https://travis-ci.org/nylas/nylas-nodejs.svg?branch=master)](https://travis-ci.org/nylas/nylas-nodejs)
[![npm](https://img.shields.io/npm/v/nylas)
](https://www.npmjs.com/package/nylas)
[![codecov](https://codecov.io/gh/nylas/nylas-nodejs/branch/main/graph/badge.svg?token=94IMGU4F09)](https://codecov.io/gh/nylas/nylas-nodejs)

This is the GitHub repository for the Nylas Node SDK and this repo is primarily for anyone who wants to make contributions to the SDK or install it from source. If you are looking to use Node to access the Nylas Email, Calendar, or Contacts API you should refer to our official [Node SDK Quickstart Guide](https://developer.nylas.com/docs/developer-tools/sdk/node-sdk/).
This is the GitHub repository for the Nylas Node SDK. This repo is primarily for anyone who wants to make contributions to the SDK, or install it from source. If you are looking to use Node to access the Nylas Email, Calendar, or Contacts API you should refer to our official [Node SDK Quickstart Guide](https://developer.nylas.com/docs/developer-tools/sdk/node-sdk/).

The Nylas Communications Platform provides REST APIs for [Email](https://developer.nylas.com/docs/connectivity/email/), [Calendar](https://developer.nylas.com/docs/connectivity/calendar/), and [Contacts](https://developer.nylas.com/docs/connectivity/contacts/), and the Node SDK is the quickest way to build your integration using JavaScript.

Here are some resources to help you get started:

- [Nylas SDK Tutorials](https://developer.nylas.com/docs/the-basics/tutorials/nodejs/)
- [Quickstart](https://developer.nylas.com/docs/the-basics/quickstart/)
- [Sign up for your free Nylas account](https://dashboard.nylas.com/register)
- [Sign up for the Nylas v3 Beta program to access the v3 Dashboard](https://info.nylas.com/apiv3betasignup.html?utm_source=github&utm_medium=devrel-surfaces&utm_campaign=&utm_content=node-sdk-upgrade)
- [Nylas API v3 Quickstart Guide](https://developer.nylas.com/docs/v3-beta/v3-quickstart/)
- [Nylas SDK Reference](https://nylas-nodejs-sdk-reference.pages.dev/)
- [Nylas API Reference](https://developer.nylas.com/docs/api/)

- [Nylas Samples repo for code samples and example applications](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=javascript)

## ⚙️ Install

To run the Nylas Node SDK, you will first need to have [Node](https://nodejs.org/en/download/) and [npm](https://www.npmjs.com/get-npm) installed on your machine.
**Note:** The Nylas Node SDK requires Node.js v16 or later.

### Set up using npm

To run the Nylas Node SDK, first install [Node](https://nodejs.org/en/download/) and [npm](https://www.npmjs.com/get-npm) on your machine.

Then, head to the nearest command line and run the following:
`npm install nylas`

Alternatively, if you prefer to use [Yarn](https://yarnpkg.com/en/), you can install the Nylas Node SDK with `yarn add nylas`
Alternatively, you can use [Yarn](https://yarnpkg.com/en/) to install the Nylas Node SDK by running the `yarn add nylas` command.

### Build from source

To install this package from source, clone this repo and run `npm install` from inside the project directory.

Expand All @@ -37,34 +46,46 @@ npm install

## ⚡️ Usage

Every resource (i.e., messages, events, contacts) is accessed via an instance of `Nylas`. Before making any requests, be sure to call `config` and initialize the `Nylas` instance with your `clientId` and `clientSecret`. Then, call `with` and pass it your `accessToken`. The `accessToken` allows `Nylas` to make requests for a given account's resources.
To use this SDK, you must first [get a free Nylas account](https://dashboard.nylas.com/register).

```javascript
const Nylas = require('nylas');
Then, follow the Quickstart guide to [set up your first app and get your API keys](https://developer.nylas.com/docs/v3-beta/v3-quickstart/).

Nylas.config({
clientId: CLIENT_ID,
clientSecret: CLIENT_SECRET,
});
For code examples that demonstrate how to use this SDK, take a look at our [Node repos in the Nylas Samples collection](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=javascript&sort=).

### 🚀 Making Your First Request

You access Nylas resources (messages, calendars, events, contacts) through an instance of `Nylas`. The `Nylas` object must be initialized with your Nylas API key, and you can provide other additional configurations such as the Nylas API url and the timeout.

```typescript
import Nylas from "nylas";

const nylas = Nylas.with(ACCESS_TOKEN);
const nylas = new Nylas({
apiKey: "NYLAS_API_KEY",
});
```

Then, you can use Nylas to access information about a user's account:
```javascript
nylas.threads.list({}).then(threads => {
console.log(threads.length);
Once initialized you can use the object to make requests for a given account's resources, for example to list all the calendars for a given account:

```typescript
nylas.calendars.list({ identifier: "GRANT_ID" }).then(calendars => {
console.log(calendars);
});
```

For more information about how to use the Nylas Node SDK, [take a look at our quickstart guide](https://developer.nylas.com/docs/developer-tools/sdk/node-sdk/).
## 📚 Documentation

Nylas maintains a [reference guide for the Node SDK](https://nylas-nodejs-sdk-reference.pages.dev/) to help you get familiar with the available methods and classes.

## ✨ Upgrading from 6.x

See [UPGRADE.md](UPGRADE.md) for instructions on upgrading from 6.x to 7.x.

**Note**: The Node SDK v7.x is not compatible with the Nylas API earlier than v3-beta.

## 💙 Contributing

Please refer to [Contributing](Contributing.md) for information about how to make contributions to this project. We welcome questions, bug reports, and pull requests.

## 📝 License

This project is licensed under the terms of the MIT license. Please refer to [LICENSE](LICENSE.txt) for the full terms.


This project is licensed under the terms of the MIT license. Please refer to [LICENSE](LICENSE.txt) for the full terms.
Loading

0 comments on commit 19678d9

Please sign in to comment.