From 60919b8e600893f2f8039ab30209d5e6504164e0 Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 27 Jun 2020 18:31:24 -0700 Subject: [PATCH 01/10] feat: Types for TypeScript included (partially) --- .eslintignore | 5 + .eslintrc.yaml | 6 + .gitignore | 5 + .prettierignore | 8 ++ .prettierrc | 1 + index.js | 113 ---------------- index.ts | 150 +++++++++++++++++++++ lib/types/client.d.ts | 40 ++++++ lib/types/defaults.d.ts | 38 ++++++ lib/types/share/share.d.ts | 9 ++ lib/types/sheets/attachments.d.ts | 13 ++ lib/types/sheets/automationRules.d.ts | 8 ++ lib/types/sheets/columns.d.ts | 14 ++ lib/types/sheets/comments.d.ts | 10 ++ lib/types/sheets/create.d.ts | 15 +++ lib/types/sheets/crossSheetReferences.d.ts | 7 + lib/types/sheets/discussions.d.ts | 10 ++ lib/types/sheets/get.d.ts | 11 ++ lib/types/sheets/rows.d.ts | 62 +++++++++ lib/types/sheets/sendUpdateRequests.d.ts | 7 + lib/types/sheets/sheetSummaries.d.ts | 10 ++ lib/types/sheets/sheets.d.ts | 34 +++++ lib/types/sheets/updateRequests.d.ts | 9 ++ lib/utils/apis.js | 20 --- lib/utils/apis.ts | 20 +++ package.json | 27 +++- smartsheet-2.86.0.tgz | Bin 0 -> 28543 bytes test/types/index.spec.ts | 45 +++++++ tsconfig.json | 9 ++ 29 files changed, 571 insertions(+), 135 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.yaml create mode 100644 .prettierignore create mode 100644 .prettierrc delete mode 100644 index.js create mode 100644 index.ts create mode 100644 lib/types/client.d.ts create mode 100644 lib/types/defaults.d.ts create mode 100644 lib/types/share/share.d.ts create mode 100644 lib/types/sheets/attachments.d.ts create mode 100644 lib/types/sheets/automationRules.d.ts create mode 100644 lib/types/sheets/columns.d.ts create mode 100644 lib/types/sheets/comments.d.ts create mode 100644 lib/types/sheets/create.d.ts create mode 100644 lib/types/sheets/crossSheetReferences.d.ts create mode 100644 lib/types/sheets/discussions.d.ts create mode 100644 lib/types/sheets/get.d.ts create mode 100644 lib/types/sheets/rows.d.ts create mode 100644 lib/types/sheets/sendUpdateRequests.d.ts create mode 100644 lib/types/sheets/sheetSummaries.d.ts create mode 100644 lib/types/sheets/sheets.d.ts create mode 100644 lib/types/sheets/updateRequests.d.ts delete mode 100644 lib/utils/apis.js create mode 100644 lib/utils/apis.ts create mode 100644 smartsheet-2.86.0.tgz create mode 100644 test/types/index.spec.ts create mode 100644 tsconfig.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..ed2a25f --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +node_modules/ +.nyc_output/ +coverage/ +/index.d.ts +/lib/utils/apis.d.ts \ No newline at end of file diff --git a/.eslintrc.yaml b/.eslintrc.yaml new file mode 100644 index 0000000..47fcf59 --- /dev/null +++ b/.eslintrc.yaml @@ -0,0 +1,6 @@ +extends: + - "@activescott/eslint-config" +rules: + semi: + - error + - always diff --git a/.gitignore b/.gitignore index 72ed89c..5fd6728 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,8 @@ config/default.json .DS_Store npm-debug.log .vscode/ +# generated via TypeScript with `npm run build` (and prepare script): +/index.d.ts +/index.js +/lib/utils/apis.d.ts +/lib/utils/apis.js diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..abeb00e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules/ +.nyc_output/ +coverage/ +# generated via TypeScript with `npm run build` (and prepare script): +/index.d.ts +/index.js +/lib/utils/apis.d.ts +/lib/utils/apis.js diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d89eb42 --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +semi: true diff --git a/index.js b/index.js deleted file mode 100644 index 9681697..0000000 --- a/index.js +++ /dev/null @@ -1,113 +0,0 @@ -var _ = require('underscore'); -var winston = require('winston'); -var apiUrls = require('./lib/utils/apis.js'); - -// Possible TODO: Namespace parameters for different subcomponents -// E.g. clientOptions.requestor.instance OR -// clientOptions.requestor.settings -// w/ sub-paths maxRetryDurationSeconds and calcRetryBackoff - -function buildRequestor(clientOptions) { - if(clientOptions.requestor) return clientOptions.requestor; - - var requestorConfig = - _.pick(clientOptions, 'maxRetryDurationSeconds', 'calcRetryBackoff'); - - if(requestorConfig.maxRetryDurationSeconds) - requestorConfig.maxRetryDurationMillis = requestorConfig.maxRetryDurationSeconds * 1000; - - requestorConfig.logger = buildLogger(clientOptions); - - return require('./lib/utils/httpRequestor.js') - .create(requestorConfig); -}; - -function buildLogger(clientOptions) { - if(hasMultipleLogOptions(clientOptions)) { - throw new Error( - "Smartsheet client options may specify at most one of " + - "'logger', 'loggerContainer', and 'logLevel'."); - } - - if(clientOptions.logger) return clientOptions.logger; - - if(clientOptions.logLevel) return buildLoggerFromLevel(clientOptions.logLevel); - - if(clientOptions.loggerContainer) return buildLoggerFromContainer(clientOptions.loggerContainer); - - return null; -} - -function hasMultipleLogOptions(clientOptions) { - return (clientOptions.logger && clientOptions.loggerContainer) - || (clientOptions.logger && clientOptions.logLevel) - || (clientOptions.loggerContainer && clientOptions.logLevel); -} - -function buildLoggerFromLevel(logLevel) { - if(winston.levels[logLevel] == null) { - throw new Error( - 'Smartsheet client received configuration with invalid log level ' + - `'${logLevel}'. Use one of the standard Winston log levels.`); - } - - return new (winston.Logger)({ - transports: [ - new winston.transports.Console({ - level: logLevel, - showLevel: false, - label: 'Smartsheet' - }) - ] - }); -} - -function buildLoggerFromContainer(container) { - if(container.has('smartsheet')) - return container.get('smartsheet'); - else - throw new Error( - "Smartsheet client received a logger container, but could not find a logger named " + - "'smartsheet' inside."); -} - -exports.createClient = function(clientOptions) { - var requestor = buildRequestor(clientOptions); - - var options = { - apiUrls: apiUrls, - requestor: requestor, - clientOptions: { - accessToken: clientOptions.accessToken || process.env.SMARTSHEET_ACCESS_TOKEN, - userAgent: clientOptions.userAgent, - baseUrl: clientOptions.baseUrl - } - }; - - return { - constants : require('./lib/utils/constants.js'), - contacts : require('./lib/contacts/').create(options), - events : require('./lib/events/').create(options), - favorites : require('./lib/favorites/').create(options), - folders : require('./lib/folders/').create(options), - groups : require('./lib/groups/').create(options), - home : require('./lib/home/').create(options), - images : require('./lib/images/').create(options), - reports : require('./lib/reports/').create(options), - request : require('./lib/request/').create(options), - search : require('./lib/search/').create(options), - server : require('./lib/server/').create(options), - sheets : require('./lib/sheets/').create(options), - sights : require('./lib/sights/').create(options), - templates : require('./lib/templates/').create(options), - tokens : require('./lib/tokens/').create(options), - users : require('./lib/users/').create(options), - webhooks : require('./lib/webhooks/').create(options), - workspaces : require('./lib/workspaces/').create(options) - }; -}; - -exports.smartSheetURIs = { - defaultBaseURI: 'https://api.smartsheet.com/2.0/', - govBaseURI: 'https://api.smartsheetgov.com/2.0/' -} diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..53a4fb7 --- /dev/null +++ b/index.ts @@ -0,0 +1,150 @@ +import { + SmartsheetClient, + ClientOptions, + ClientLoggerOptions, +} from "./lib/types/client"; +export { SmartsheetClient } from "./lib/types/client"; +import { NPMLoggingLevel } from "winston"; +import * as _ from "underscore"; +import * as winston from "winston"; +import apiUrls from "./lib/utils/apis"; + +// Possible TODO: Namespace parameters for different subcomponents +// E.g. clientOptions.requestor.instance OR +// clientOptions.requestor.settings +// w/ sub-paths maxRetryDurationSeconds and calcRetryBackoff + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function buildRequestor(clientOptions: any): any { + if (clientOptions.requestor) return clientOptions.requestor; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const requestorConfig: any = _.pick( + clientOptions, + "maxRetryDurationSeconds", + "calcRetryBackoff" + ); + + if (requestorConfig.maxRetryDurationSeconds) { + const SECONDS = 1000; + requestorConfig.maxRetryDurationMillis = + requestorConfig.maxRetryDurationSeconds * SECONDS; + } + + requestorConfig.logger = buildLogger(clientOptions); + + // eslint-disable-next-line @typescript-eslint/no-var-requires + return require("./lib/utils/httpRequestor.js").create(requestorConfig); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function buildLogger(clientOptions: ClientLoggerOptions): any { + if (hasMultipleLogOptions(clientOptions)) { + throw new Error( + "Smartsheet client options may specify at most one of " + + "'logger', 'loggerContainer', and 'logLevel'." + ); + } + + if (clientOptions.logger) return clientOptions.logger; + + if (clientOptions.logLevel) + return buildLoggerFromLevel(clientOptions.logLevel); + + if (clientOptions.loggerContainer) + return buildLoggerFromContainer(clientOptions.loggerContainer); + + return null; +} + +function hasMultipleLogOptions(clientOptions: ClientLoggerOptions): boolean { + return ( + (clientOptions.logger && clientOptions.loggerContainer) || + (clientOptions.logger && clientOptions.logLevel) || + (clientOptions.loggerContainer && clientOptions.logLevel) + ); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function buildLoggerFromLevel(logLevel: NPMLoggingLevel | string): any { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if ((winston as any).levels[logLevel] == null) { + throw new Error( + "Smartsheet client received configuration with invalid log level " + + `'${logLevel}'. Use one of the standard Winston log levels.` + ); + } + + return new winston.Logger({ + transports: [ + new winston.transports.Console({ + level: logLevel, + showLevel: false, + label: "Smartsheet", + }), + ], + }); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function buildLoggerFromContainer(container: any): any { + if (container.has("smartsheet")) return container.get("smartsheet"); + else + throw new Error( + "Smartsheet client received a logger container, but could not find a logger named " + + "'smartsheet' inside." + ); +} + +export const createClient = function ( + clientOptions: ClientOptions +): SmartsheetClient { + const requestor = buildRequestor(clientOptions); + + const options = { + apiUrls: apiUrls, + requestor: requestor, + clientOptions: { + accessToken: + clientOptions.accessToken || process.env.SMARTSHEET_ACCESS_TOKEN, + userAgent: clientOptions.userAgent, + baseUrl: clientOptions.baseUrl, + }, + }; + + return { + /* eslint-disable @typescript-eslint/no-var-requires */ + constants: require("./lib/utils/constants.js"), + contacts: require("./lib/contacts/").create(options), + events: require("./lib/events/").create(options), + favorites: require("./lib/favorites/").create(options), + folders: require("./lib/folders/").create(options), + groups: require("./lib/groups/").create(options), + home: require("./lib/home/").create(options), + images: require("./lib/images/").create(options), + reports: require("./lib/reports/").create(options), + request: require("./lib/request/").create(options), + search: require("./lib/search/").create(options), + server: require("./lib/server/").create(options), + sheets: require("./lib/sheets/").create(options), + sights: require("./lib/sights/").create(options), + templates: require("./lib/templates/").create(options), + tokens: require("./lib/tokens/").create(options), + users: require("./lib/users/").create(options), + webhooks: require("./lib/webhooks/").create(options), + workspaces: require("./lib/workspaces/").create(options), + /* eslint-enable @typescript-eslint/no-var-requires */ + }; +}; + +export const smartSheetURIs = { + defaultBaseURI: "https://api.smartsheet.com/2.0/", + govBaseURI: "https://api.smartsheetgov.com/2.0/", +}; + +// the default type that allows compatibility with imports like `import smartsheet from "smartsheet"` +const def = { + createClient, + smartSheetURIs, +}; +export default def; diff --git a/lib/types/client.d.ts b/lib/types/client.d.ts new file mode 100644 index 0000000..32ea0eb --- /dev/null +++ b/lib/types/client.d.ts @@ -0,0 +1,40 @@ +import { SheetsResource } from "./sheets/sheets"; +import { NPMLoggingLevel } from "winston"; + +export interface SmartsheetClient { + /* eslint-disable @typescript-eslint/no-explicit-any */ + constants: any; + contacts: any; + events: any; + favorites: any; + folders: any; + groups: any; + home: any; + images: any; + reports: any; + request: any; + search: any; + server: any; + sheets: SheetsResource; + sights: any; + templates: any; + tokens: any; + users: any; + webhooks: any; + workspaces: any; + /* eslint-enable @typescript-eslint/no-explicit-any */ +} + +export interface ClientOptions extends ClientLoggerOptions { + accessToken?: string; + baseUrl?: string; + userAgent?: string; +} + +export interface ClientLoggerOptions { + logLevel?: NPMLoggingLevel | string; + /* eslint-disable @typescript-eslint/no-explicit-any */ + logger?: any; + loggerContainer?: any; + /* eslint-enable @typescript-eslint/no-explicit-any */ +} diff --git a/lib/types/defaults.d.ts b/lib/types/defaults.d.ts new file mode 100644 index 0000000..6078f23 --- /dev/null +++ b/lib/types/defaults.d.ts @@ -0,0 +1,38 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type DefaultOptions = any; + +/** + * The default callback signature used throughout the SDK. + */ +export type DefaultSDKCallback = ( + error: any, + data?: TResponse +) => void; +/** + * Default essentially untyped function overload in the SDK when caller uses callbacks. + */ +export type DefaultSDKFunctionWithCallback< + TOptions = DefaultOptions, + TResponse = any[] +> = (options: TOptions, callback: DefaultSDKCallback) => void; +/** + * Default essentially untyped function overload in the SDK when caller uses promises (by not passing a callback). + */ +export type DefaultSDKFunctionWithPromise< + TOptions = DefaultOptions, + TResponse = any +> = (options: TOptions) => Promise; + +/** + * Default essentially untyped function overload used in the SDK. + * Each endpoint takes two arguments: a set of options, and an optional callback function. + * If the callback is not specified, the SDK will return a promise instead. + */ +export interface DefaultSDKFunction< + TOptions = DefaultOptions, + TResponse = any +> { + (options: TOptions, callback: DefaultSDKCallback): void; + (options: TOptions): Promise; +} +/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/lib/types/share/share.d.ts b/lib/types/share/share.d.ts new file mode 100644 index 0000000..e5c4e8e --- /dev/null +++ b/lib/types/share/share.d.ts @@ -0,0 +1,9 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface SharesResource { + getShare: DefaultSDKFunction; + listShares: DefaultSDKFunction; + share: DefaultSDKFunction; + deleteShare: DefaultSDKFunction; + updateShare: DefaultSDKFunction; +} diff --git a/lib/types/sheets/attachments.d.ts b/lib/types/sheets/attachments.d.ts new file mode 100644 index 0000000..e588678 --- /dev/null +++ b/lib/types/sheets/attachments.d.ts @@ -0,0 +1,13 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface AttachmentsResource { + getAttachment: DefaultSDKFunction; + listAttachments: DefaultSDKFunction; + listAttachmentVersions: DefaultSDKFunction; + addAttachment: DefaultSDKFunction; + addUrlAttachment: DefaultSDKFunction; + addFileAttachment: DefaultSDKFunction; + attachNewVersion: DefaultSDKFunction; + deleteAttachment: DefaultSDKFunction; + deleteAllAttachmentVersions: DefaultSDKFunction; +} diff --git a/lib/types/sheets/automationRules.d.ts b/lib/types/sheets/automationRules.d.ts new file mode 100644 index 0000000..8314373 --- /dev/null +++ b/lib/types/sheets/automationRules.d.ts @@ -0,0 +1,8 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface AutomationRulesResource { + deleteAutomationRule: DefaultSDKFunction; + getAutomationRule: DefaultSDKFunction; + listAutomationRules: DefaultSDKFunction; + updateAutomationRule: DefaultSDKFunction; +} diff --git a/lib/types/sheets/columns.d.ts b/lib/types/sheets/columns.d.ts new file mode 100644 index 0000000..c3e4b95 --- /dev/null +++ b/lib/types/sheets/columns.d.ts @@ -0,0 +1,14 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface ColumnsResource { + getColumns: DefaultSDKFunction; + getColumn: DefaultSDKFunction; + addColumn: DefaultSDKFunction; + deleteColumn: DefaultSDKFunction; + updateColumn: DefaultSDKFunction; +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type GetColumnsOptions = any; +export type GetColumnsResponse = any; +/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/lib/types/sheets/comments.d.ts b/lib/types/sheets/comments.d.ts new file mode 100644 index 0000000..f1d47b7 --- /dev/null +++ b/lib/types/sheets/comments.d.ts @@ -0,0 +1,10 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface CommentsResource { + getComment: DefaultSDKFunction; + deleteComment: DefaultSDKFunction; + addCommentUrlAttachment: DefaultSDKFunction; + addCommentAttachment: DefaultSDKFunction; + addCommentFileAttachment: DefaultSDKFunction; + editComment: DefaultSDKFunction; +} diff --git a/lib/types/sheets/create.d.ts b/lib/types/sheets/create.d.ts new file mode 100644 index 0000000..9c053f7 --- /dev/null +++ b/lib/types/sheets/create.d.ts @@ -0,0 +1,15 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface CreateSheetsResource { + createSheet: DefaultSDKFunction; + createSheetFromExisting: DefaultSDKFunction; + createSheetInFolder: DefaultSDKFunction; + createSheetInWorkspace: DefaultSDKFunction; + copySheet: DefaultSDKFunction; + importCsvSheet: DefaultSDKFunction; + importXlsxSheet: DefaultSDKFunction; + importCsvSheetIntoFolder: DefaultSDKFunction; + importXlsxSheetIntoFolder: DefaultSDKFunction; + importCsvSheetIntoWorkspace: DefaultSDKFunction; + importXlsxSheetIntoWorkspace: DefaultSDKFunction; +} diff --git a/lib/types/sheets/crossSheetReferences.d.ts b/lib/types/sheets/crossSheetReferences.d.ts new file mode 100644 index 0000000..2fcd450 --- /dev/null +++ b/lib/types/sheets/crossSheetReferences.d.ts @@ -0,0 +1,7 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface CrossSheetReferencesResource { + createCrossSheetReference: DefaultSDKFunction; + getCrossSheetReference: DefaultSDKFunction; + listCrossSheetReferences: DefaultSDKFunction; +} diff --git a/lib/types/sheets/discussions.d.ts b/lib/types/sheets/discussions.d.ts new file mode 100644 index 0000000..a7df007 --- /dev/null +++ b/lib/types/sheets/discussions.d.ts @@ -0,0 +1,10 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface DiscussionsResource { + getDiscussions: DefaultSDKFunction; + getDiscussion: DefaultSDKFunction; + listDiscussionAttachments: DefaultSDKFunction; + createDiscussion: DefaultSDKFunction; + addDiscussionComment: DefaultSDKFunction; + deleteDiscussion: DefaultSDKFunction; +} diff --git a/lib/types/sheets/get.d.ts b/lib/types/sheets/get.d.ts new file mode 100644 index 0000000..a5981dd --- /dev/null +++ b/lib/types/sheets/get.d.ts @@ -0,0 +1,11 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface SheetResource { + getSheet: DefaultSDKFunction; + listSheets: DefaultSDKFunction; + getSheetAsCSV: DefaultSDKFunction; + getSheetAsExcel: DefaultSDKFunction; + getSheetAsPDF: DefaultSDKFunction; + getSheetVersion: DefaultSDKFunction; + listOrganizationSheets: DefaultSDKFunction; +} diff --git a/lib/types/sheets/rows.d.ts b/lib/types/sheets/rows.d.ts new file mode 100644 index 0000000..b1968ea --- /dev/null +++ b/lib/types/sheets/rows.d.ts @@ -0,0 +1,62 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface RowsResource { + getRow: DefaultSDKFunction; + getRowAttachments: DefaultSDKFunction; + getRowDiscussions: DefaultSDKFunction; + getCellHistory: DefaultSDKFunction; + copyRowToAnotherSheet: DefaultSDKFunction; + moveRowToAnotherSheet: DefaultSDKFunction; + addRow: DefaultSDKFunction; + addRows: DefaultSDKFunction; + addRowUrlAttachment: DefaultSDKFunction; + addRowAttachment: DefaultSDKFunction; + addRowFileAttachment: DefaultSDKFunction; + createRowDiscussion: DefaultSDKFunction; + sendRows: DefaultSDKFunction; + deleteRow: DefaultSDKFunction; + deleteRows: DefaultSDKFunction; + updateRow: DefaultSDKFunction; + addImageToCell: DefaultSDKFunction< + AddImageToCellOptions, + AddImageToCellResult + >; +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type GetRowOptions = { sheetId: number; rowId: number } | any; +export type AddImageToCellOptions = any; +export type AddImageToCellResult = any; +export type UpdateRowOptions = any; +export type UpdateRowResponse = any; +/* eslint-enable @typescript-eslint/no-explicit-any */ + +export type GetRowResponse = { + id: number; + sheetId: number; + rowNumber: number; + expanded: boolean; + cells: CellObject[]; + createdAt: string; + modifiedAt: string; +}; + +export interface CellObject { + columnType: ColumnType; + value: string; + displayValue: string; + columnId: number; +} + +export type ColumnType = + | "ABSTRACT_DATETIME" + | "CHECKBOX" + | "CONTACT_LIST" + | "DATE" + | "DATETIME" + | "DURATION" + | "MULTI_CONTACT_LIST" + | "MULTI_PICKLIST" + | "PICKLIST" + | "PREDECESSOR" + | "TEXT_NUMBER"; diff --git a/lib/types/sheets/sendUpdateRequests.d.ts b/lib/types/sheets/sendUpdateRequests.d.ts new file mode 100644 index 0000000..87cbd33 --- /dev/null +++ b/lib/types/sheets/sendUpdateRequests.d.ts @@ -0,0 +1,7 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface SentUpdateRequestsResource { + deleteSentUpdateRequest: DefaultSDKFunction; + getSentUpdateRequest: DefaultSDKFunction; + getAllSentUpdateRequests: DefaultSDKFunction; +} diff --git a/lib/types/sheets/sheetSummaries.d.ts b/lib/types/sheets/sheetSummaries.d.ts new file mode 100644 index 0000000..8beb76b --- /dev/null +++ b/lib/types/sheets/sheetSummaries.d.ts @@ -0,0 +1,10 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface SummariesResource { + getSummary: DefaultSDKFunction; + getSummaryFields: DefaultSDKFunction; + addSummaryFields: DefaultSDKFunction; + deleteSummaryFields: DefaultSDKFunction; + updateSummaryFields: DefaultSDKFunction; + addSummaryFieldImage: DefaultSDKFunction; +} diff --git a/lib/types/sheets/sheets.d.ts b/lib/types/sheets/sheets.d.ts new file mode 100644 index 0000000..fc46498 --- /dev/null +++ b/lib/types/sheets/sheets.d.ts @@ -0,0 +1,34 @@ +import { DefaultSDKFunction } from "../defaults"; +import { AttachmentsResource } from "./attachments"; +import { AutomationRulesResource } from "./automationRules"; +import { ColumnsResource } from "./columns"; +import { CommentsResource } from "./comments"; +import { CreateSheetsResource } from "./create"; +import { CrossSheetReferencesResource } from "./crossSheetReferences"; +import { DiscussionsResource } from "./discussions"; +import { SheetResource } from "./get"; +import { SummariesResource } from "./sheetSummaries"; +import { RowsResource } from "./rows"; +import { SentUpdateRequestsResource } from "./sendUpdateRequests"; +import { SharesResource } from "../share/share"; +import { UpdateRequestsResource } from "./updateRequests"; + +export interface SheetsResource + extends AttachmentsResource, + AutomationRulesResource, + ColumnsResource, + CommentsResource, + CreateSheetsResource, + CrossSheetReferencesResource, + DiscussionsResource, + SheetResource, + SummariesResource, + RowsResource, + SentUpdateRequestsResource, + SharesResource, + UpdateRequestsResource { + sendSheetViaEmail: DefaultSDKFunction; + getPublishStatus: DefaultSDKFunction; + setPublishStatus: DefaultSDKFunction; + sortRowsInSheet: DefaultSDKFunction; +} diff --git a/lib/types/sheets/updateRequests.d.ts b/lib/types/sheets/updateRequests.d.ts new file mode 100644 index 0000000..a0de492 --- /dev/null +++ b/lib/types/sheets/updateRequests.d.ts @@ -0,0 +1,9 @@ +import { DefaultSDKFunction } from "../defaults"; + +export interface UpdateRequestsResource { + createUpdateRequest: DefaultSDKFunction; + deleteUpdateRequest: DefaultSDKFunction; + getUpdateRequest: DefaultSDKFunction; + getAllUpdateRequests: DefaultSDKFunction; + changeUpdateRequest: DefaultSDKFunction; +} diff --git a/lib/utils/apis.js b/lib/utils/apis.js deleted file mode 100644 index 88e9bdb..0000000 --- a/lib/utils/apis.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - contacts : 'contacts/', - events : 'events/', - favorites : 'favorites/', - folders : 'folders/', - groups : 'groups/', - home : 'home/', - imageUrls : 'imageurls/', - reports : 'reports/', - search : 'search/', - server : 'serverinfo/', - sheets : 'sheets/', - sights : 'sights/', - templates : 'templates/', - templatesPublic : 'templates/public', - token : 'token', - users : 'users/', - webhooks : 'webhooks/', - workspaces : 'workspaces/' -}; diff --git a/lib/utils/apis.ts b/lib/utils/apis.ts new file mode 100644 index 0000000..a3817a4 --- /dev/null +++ b/lib/utils/apis.ts @@ -0,0 +1,20 @@ +export default { + contacts: "contacts/", + events: "events/", + favorites: "favorites/", + folders: "folders/", + groups: "groups/", + home: "home/", + imageUrls: "imageurls/", + reports: "reports/", + search: "search/", + server: "serverinfo/", + sheets: "sheets/", + sights: "sights/", + templates: "templates/", + templatesPublic: "templates/public", + token: "token", + users: "users/", + webhooks: "webhooks/", + workspaces: "workspaces/", +}; diff --git a/package.json b/package.json index 608ded2..e27523b 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,22 @@ "version": "2.126.0", "description": "Smartsheet JavaScript client SDK", "main": "index.js", + "types": "index.d.ts", "scripts": { - "test": "mocha \"test/**/*_test.js\"", + "test": "npm run -s test-types && npm run -s test-functional && npm run -s test-mock-api", "test-functional": "mocha \"test/functional/**/*_test.js\"", "test-mock-api": "mocha \"test/mock-api/**/*_test.js\"", + "test-types": "mocha --require ts-node/register \"test/types/**/*.spec.ts\"", "coverage": "istanbul cover _mocha -- -u exports -R spec \"test/**/*_test.js\"", - "report-coverage": "cat ./coverage/lcov.info | coveralls" + "report-coverage": "cat ./coverage/lcov.info | coveralls", + "build": "tsc --declaration", + "prepare": "npm run --silent lint && npm run --silent build", + "eslint": "eslint --ext \".t\" \"**/*.ts\"", + "eslint-fix": "eslint --ext \".t\" \"**/*.ts\" --fix", + "plint": "prettier -l \"**/*.ts\"", + "plint-fix": "prettier -l \"**/*.ts\" --write", + "lint": "npm run --silent plint && npm run --silent eslint", + "lint-fix": "npm run --silent plint-fix && npm run --silent eslint-fix" }, "repository": { "type": "git", @@ -37,7 +47,17 @@ "winston": "^2.3.1" }, "devDependencies": { + "@activescott/eslint-config": "^2.0.0", + "@types/chai": "^4.2.11", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.14", + "@types/underscore": "^1.10.1", + "@typescript-eslint/eslint-plugin": "^2.34.0", + "@typescript-eslint/parser": "^2.34.0", + "chai": "^4.2.0", "coveralls": "^3.0.2", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.11.0", "gulp": "^4.0.0", "gulp-jshint": "^2.1.0", "gulp-mocha": "^6.0.0", @@ -45,8 +65,11 @@ "jshint-stylish": "^1.0.1", "mocha": "^5.2.0", "mock": "^0.1.1", + "prettier": "^2.0.5", "should": "^13.0.1", "sinon": "^1.14.1", + "ts-node": "^8.10.2", + "typescript": "^3.9.5", "yargs": "^14.0.0" }, "directories": { diff --git a/smartsheet-2.86.0.tgz b/smartsheet-2.86.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b007f85f3022fa1c5fcb8e0e1f7a9facb60888d3 GIT binary patch literal 28543 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 { + describe("Default Export", () => { + function assertDefaultProps(defaultExport: typeof smartsheetDefault) { + expect(defaultExport).to.have.property("createClient"); + expect(defaultExport) + .to.have.nested.property("smartSheetURIs.defaultBaseURI") + .to.be.a("string"); + expect(defaultExport) + .to.have.nested.property("smartSheetURIs.govBaseURI") + .to.be.a("string"); + } + + it("should allow default import", () => { + // testing `import smartsheet from "smartsheet"` + assertDefaultProps(smartsheetDefault); + }); + + it("should allow * import", () => { + // import smartsheet, { SmartsheetClient } from "smartsheet" + assertDefaultProps(smartsheetStar); + }); + }); + + describe("SmartsheetClient", () => { + let client: SmartsheetClient; + + before(function () { + // runs once before the first test in this block + client = smartsheetDefault.createClient({ + accessToken: "decafbad", + logLevel: "info", + }); + }); + + it("should have sheets", () => { + expect(client).to.have.property("sheets"); + expect(client).to.have.nested.property("sheets.listSheets"); + expect(client).to.have.nested.property("sheets.getSheet"); + }); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..92d0400 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "ES3", + "module": "CommonJS", + "noImplicitAny": true, + "strictNullChecks": true + }, + "files": ["index.ts"] +} From 443b52f8d03d5fe01808db356f0f0ad0210dea29 Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 27 Jun 2020 19:45:42 -0700 Subject: [PATCH 02/10] chore: update package-lock I had a weird local config that wasn't updating it --- package-lock.json | 1125 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1110 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62331f8..ca27840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,241 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@activescott/eslint-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@activescott/eslint-config/-/eslint-config-2.0.0.tgz", + "integrity": "sha512-l4W0nMBfLsKcqYicRNoIQCPNVq2Txysc+5EhY/pkdjDJxb67LJhVZwWsFyeRcLEowfFSgUcOie1LgoUFFMJ26g==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1" + } + }, + "@babel/code-frame": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.3", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@types/chai": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "14.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", + "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", + "dev": true + }, + "@types/underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-+++tVg7PrEZxO++8xUSJygAMqezp7CLD+Mp4bNSAZUdlFDyp4OcW24o4FLAAKpoKOGUPmWLWfpxaWi83uKeh4g==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, + "acorn": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -46,6 +275,23 @@ "ansi-wrap": "0.1.0" } }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -107,6 +353,12 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -237,12 +489,24 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", @@ -481,6 +745,12 @@ "unset-value": "^1.0.0" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -492,6 +762,20 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -505,6 +789,18 @@ "supports-color": "^2.0.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", @@ -549,6 +845,21 @@ } } }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -622,7 +933,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -745,7 +1056,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -831,6 +1142,19 @@ } } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -880,6 +1204,15 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -976,6 +1309,15 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "duplexify": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", @@ -996,7 +1338,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1149,11 +1491,265 @@ } } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + }, + "dependencies": { + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } }, "estraverse": { "version": "1.9.3", @@ -1237,6 +1833,17 @@ } } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -1339,6 +1946,24 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1413,6 +2038,23 @@ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", "dev": true }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", @@ -1431,7 +2073,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -2067,12 +2709,30 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -2154,7 +2814,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -2214,6 +2874,15 @@ "which": "^1.2.14" } }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "glogg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", @@ -2403,7 +3072,7 @@ }, "kind-of": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", "dev": true }, @@ -2679,6 +3348,37 @@ "sshpk": "^1.7.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2701,6 +3401,123 @@ "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true }, + "inquirer": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", + "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", @@ -2990,6 +3807,12 @@ } } }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -3044,6 +3867,12 @@ "jsonify": "~0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3105,7 +3934,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3259,6 +4088,12 @@ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", "dev": true }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -3329,6 +4164,12 @@ "mime-db": "1.40.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3468,6 +4309,12 @@ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -3494,6 +4341,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -3679,6 +4532,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -3710,7 +4572,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3734,6 +4596,12 @@ } } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -3764,6 +4632,15 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -3852,6 +4729,12 @@ "pinkie-promise": "^2.0.0" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -3902,6 +4785,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -3914,6 +4803,12 @@ "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "psl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", @@ -4032,7 +4927,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4075,6 +4970,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -4183,6 +5084,12 @@ "global-modules": "^1.0.0" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -4198,12 +5105,46 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", "dev": true }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4360,6 +5301,28 @@ "util": ">=0.10.3 <1" } }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -4486,6 +5449,24 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -4660,6 +5641,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -4676,12 +5663,30 @@ "es6-symbol": "^3.1.1" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", @@ -4740,6 +5745,15 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -4817,6 +5831,42 @@ } } }, + "ts-node": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4839,12 +5889,30 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", + "dev": true + }, "uglify-js": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", @@ -5028,6 +6096,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, "v8flags": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", @@ -5108,7 +6182,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5229,6 +6303,12 @@ "stack-trace": "0.0.x" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -5273,6 +6353,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -5333,6 +6422,12 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } From ab129a10d70d2e0bf3af9beed28ff118ec94e521 Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 27 Jun 2020 19:57:20 -0700 Subject: [PATCH 03/10] chore(build): running build on node v13 for prettier (dev tool) Will try this to see if it fixes and consider a fix to include running tests on old v8 node after this is confirmed --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 30f5290..f653121 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ dist: trusty node_js: - "lts/carbon" + - 13 before_install: - git clone https://github.com/smartsheet-platform/smartsheet-sdk-tests.git From 3418675c60d9f7ee12fb624c57ed50e93e5cb81c Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 27 Jun 2020 20:08:33 -0700 Subject: [PATCH 04/10] chore(build): removed lint from prepare to make builds more resiliant Should put this back using a githook instead --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e27523b..f8587be 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "coverage": "istanbul cover _mocha -- -u exports -R spec \"test/**/*_test.js\"", "report-coverage": "cat ./coverage/lcov.info | coveralls", "build": "tsc --declaration", - "prepare": "npm run --silent lint && npm run --silent build", + "prepare": "npm run --silent build", "eslint": "eslint --ext \".t\" \"**/*.ts\"", "eslint-fix": "eslint --ext \".t\" \"**/*.ts\" --fix", "plint": "prettier -l \"**/*.ts\"", From ae07a6ff481c8c0010935901a49b303cc4d38c8b Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 27 Jun 2020 22:28:18 -0700 Subject: [PATCH 05/10] chore: tgz not in repo --- smartsheet-2.86.0.tgz | Bin 28543 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 smartsheet-2.86.0.tgz diff --git a/smartsheet-2.86.0.tgz b/smartsheet-2.86.0.tgz deleted file mode 100644 index b007f85f3022fa1c5fcb8e0e1f7a9facb60888d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28543 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 Date: Sat, 27 Jun 2020 22:47:32 -0700 Subject: [PATCH 06/10] fix: add missing members in sheets --- lib/types/sheets/sheets.d.ts | 3 +++ test/types/index.spec.ts | 14 +++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/types/sheets/sheets.d.ts b/lib/types/sheets/sheets.d.ts index fc46498..938ddc6 100644 --- a/lib/types/sheets/sheets.d.ts +++ b/lib/types/sheets/sheets.d.ts @@ -30,5 +30,8 @@ export interface SheetsResource sendSheetViaEmail: DefaultSDKFunction; getPublishStatus: DefaultSDKFunction; setPublishStatus: DefaultSDKFunction; + updateSheet: DefaultSDKFunction; + deleteSheet: DefaultSDKFunction; + moveSheet: DefaultSDKFunction; sortRowsInSheet: DefaultSDKFunction; } diff --git a/test/types/index.spec.ts b/test/types/index.spec.ts index 89ec5a8..9d45613 100644 --- a/test/types/index.spec.ts +++ b/test/types/index.spec.ts @@ -37,9 +37,17 @@ describe("TypeScript", () => { }); it("should have sheets", () => { - expect(client).to.have.property("sheets"); - expect(client).to.have.nested.property("sheets.listSheets"); - expect(client).to.have.nested.property("sheets.getSheet"); + expect(client.sheets).to.be.instanceOf(Object); + expect(client.sheets.listSheets).to.be.instanceOf(Function); + expect(client.sheets.getSheet).to.be.instanceOf(Function); + expect(client.sheets.getSheet).to.be.instanceOf(Function); + expect(client.sheets.sendSheetViaEmail).to.be.instanceOf(Function); + expect(client.sheets.getPublishStatus).to.be.instanceOf(Function); + expect(client.sheets.setPublishStatus).to.be.instanceOf(Function); + expect(client.sheets.updateSheet).to.be.instanceOf(Function); + expect(client.sheets.deleteSheet).to.be.instanceOf(Function); + expect(client.sheets.moveSheet).to.be.instanceOf(Function); + expect(client.sheets.sortRowsInSheet).to.be.instanceOf(Function); }); }); }); From b993697b772faf988aa04cd6b743226d6943afe4 Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 27 Jun 2020 22:53:51 -0700 Subject: [PATCH 07/10] chore: levereage better type checking in tests --- test/types/index.spec.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/test/types/index.spec.ts b/test/types/index.spec.ts index 9d45613..f529fd7 100644 --- a/test/types/index.spec.ts +++ b/test/types/index.spec.ts @@ -5,13 +5,9 @@ import smartsheetDefault, { SmartsheetClient } from "../../"; describe("TypeScript", () => { describe("Default Export", () => { function assertDefaultProps(defaultExport: typeof smartsheetDefault) { - expect(defaultExport).to.have.property("createClient"); - expect(defaultExport) - .to.have.nested.property("smartSheetURIs.defaultBaseURI") - .to.be.a("string"); - expect(defaultExport) - .to.have.nested.property("smartSheetURIs.govBaseURI") - .to.be.a("string"); + expect(defaultExport.createClient).to.be.instanceOf(Object); + expect(defaultExport.smartSheetURIs.defaultBaseURI).to.be.a("string"); + expect(defaultExport.smartSheetURIs.govBaseURI).to.be.a("string"); } it("should allow default import", () => { From 9df272300e822d08c3abd97aaededf7a703041d3 Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Fri, 27 Aug 2021 19:40:28 -0700 Subject: [PATCH 08/10] feat: TypeScript types for Sheet, Column, Row, Cell and pagination options & responses --- index.ts | 7 +++ lib/types/date.d.ts | 4 ++ lib/types/pagination.d.ts | 23 ++++++++ lib/types/sheets/columns.d.ts | 52 +++++++++++++++++ lib/types/sheets/get.d.ts | 104 +++++++++++++++++++++++++++++++++- lib/types/sheets/rows.d.ts | 61 +++++++++++++++++--- 6 files changed, 241 insertions(+), 10 deletions(-) create mode 100644 lib/types/date.d.ts create mode 100644 lib/types/pagination.d.ts diff --git a/index.ts b/index.ts index 53a4fb7..ae0aaa7 100644 --- a/index.ts +++ b/index.ts @@ -4,6 +4,13 @@ import { ClientLoggerOptions, } from "./lib/types/client"; export { SmartsheetClient } from "./lib/types/client"; +export { SheetData } from "./lib/types/sheets/get"; +export { Column } from "./lib/types/sheets/columns"; +export { + RowData, + CellHistoryCellData, + GetCellHistoryResponse, +} from "./lib/types/sheets/rows"; import { NPMLoggingLevel } from "winston"; import * as _ from "underscore"; import * as winston from "winston"; diff --git a/lib/types/date.d.ts b/lib/types/date.d.ts new file mode 100644 index 0000000..dcf19a6 --- /dev/null +++ b/lib/types/date.d.ts @@ -0,0 +1,4 @@ +/** + * The Smartsheet API returns all dates and times in the UTC time zone in ISO-8601 format, that is, YYYY-MM-DDTHH:MM:SSZ. + */ +export type DateString = string; diff --git a/lib/types/pagination.d.ts b/lib/types/pagination.d.ts new file mode 100644 index 0000000..bbf675a --- /dev/null +++ b/lib/types/pagination.d.ts @@ -0,0 +1,23 @@ +/** + * Members included in a paged response. + */ +export interface PagedResponse { + pageNumber: number; + pageSize: number; + totalPages: number; + totalCount: number; +} + +/** + * Options that can be included in requests that return a paged result. + */ +export type PageOptions = PageOptionsIncludeAll | PageOptionsPaged; + +export interface PageOptionsIncludeAll { + includeAll: boolean; +} + +export interface PageOptionsPaged { + page?: number; + pageSize?: number; +} diff --git a/lib/types/sheets/columns.d.ts b/lib/types/sheets/columns.d.ts index c3e4b95..d4909ea 100644 --- a/lib/types/sheets/columns.d.ts +++ b/lib/types/sheets/columns.d.ts @@ -12,3 +12,55 @@ export interface ColumnsResource { export type GetColumnsOptions = any; export type GetColumnsResponse = any; /* eslint-enable @typescript-eslint/no-explicit-any */ + +/** + * Represents a column within a sheet or report. + */ +export interface Column { + id: number; + version: number; + index: number; + title: string; + type: + | "ABSTRACT_DATETIME" + | "CHECKBOX" + | "CONTACT_LIST" + | "DATE" + | "DATETIME" + | "DURATION" + | "MULTI_CONTACT_LIST" + | "MULTI_PICKLIST" + | "PICKLIST" + | "PREDECESSOR" + | "TEXT_NUMBER" + | string; + systemColumnType?: + | "AUTO_NUMBER" + | "CREATED_BY" + | "CREATED_DATE" + | "MODIFIED_BY" + | "MODIFIED_DATE" + | string; + primary: boolean; + validation: boolean; + width: number; + autoNumberFormat?: AutoNumberFormat; + contactOptions?: ContactOption[]; + format?: string; + formula?: string; + hidden?: boolean; + locked?: boolean; + lockedForUser?: boolean; + options?: string[]; + symbol?: string; + tags?: string[]; +} + +export interface ContactOption { + email: string; + name: string; +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type AutoNumberFormat = any; +/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/lib/types/sheets/get.d.ts b/lib/types/sheets/get.d.ts index a5981dd..febd3f4 100644 --- a/lib/types/sheets/get.d.ts +++ b/lib/types/sheets/get.d.ts @@ -1,7 +1,11 @@ import { DefaultSDKFunction } from "../defaults"; +import { DateString } from "../date"; +import { Column } from "./columns"; +import { RowData } from "./rows"; +import { PageOptions } from "../pagination"; export interface SheetResource { - getSheet: DefaultSDKFunction; + getSheet: DefaultSDKFunction; listSheets: DefaultSDKFunction; getSheetAsCSV: DefaultSDKFunction; getSheetAsExcel: DefaultSDKFunction; @@ -9,3 +13,101 @@ export interface SheetResource { getSheetVersion: DefaultSDKFunction; listOrganizationSheets: DefaultSDKFunction; } + +export type GetSheetOptions = PageOptions & { + id: number; + include?: string; + exclude?: string; + columnIds?: string; + filterId?: number; + ifVersionAfter?: number; + level?: number; +}; + +/** + * Represents the sheet data returned from `GET /sheets/{sheetId}` + * References: + * - https://smartsheet-platform.github.io/api-docs/#objects-23 + */ +export interface SheetData { + id: number; + name: string; + version: number; + totalRowCount: number; + accessLevel: + | "ADMIN" + | "EDITOR" + | "EDITOR_SHARE" + | "OWNER" + | "VIEWER" + | string; + effectiveAttachmentOptions: string[]; + ganttEnabled: boolean; + dependenciesEnabled: boolean; + resourceManagementEnabled: boolean; + cellImageUploadEnabled: boolean; + favorite: boolean; + userSettings: { + criticalPathEnabled: boolean; + displaySummaryTasks: boolean; + appliedSheetFilterId: number; + }; + userPermissions: { + summaryPermissions: "ADMIN" | "READ_DELETE" | "READ_ONLY" | "READ_WRITE"; + }; + workspace: { id: number; name: string }; + hasSummaryFields: boolean; + permalink: string; + createdAt: DateString; + modifiedAt: DateString; + isMultiPicklistEnabled: boolean; + columns: Column[]; + filters?: Filter[]; + rows: RowData[]; +} + +export interface Filter { + name: string; + id: number; + filterType: "PERSONAL" | "SHARED"; + excludeSelected?: boolean; + query: { + operator: FilterOperator; + criteria: FilterCriteria[]; + includeParent: boolean; + }; +} + +interface FilterCriteria { + operator: FilterOperator; + values: string[]; + columnId: number; +} + +type FilterOperator = + | "BETWEEN" + | "CONTAINS" + | "EQUAL" + | "NOT_EQUAL" + | "FUTURE" + | "GREATER_THAN" + | "LESS_THAN" + | "HAS_ANY_OF" + | "HAS_NONE_OF" + | "HAS_ALL_OF" + | "IS_BLANK" + | "IS_NOT_BLANK" + | "IS_CHECKED" + | "IS_NOT_CHECKED" + | "IS_DATE" + | "IS_NOT_DATE" + | "IS_NUMBER" + | "IS_NOT_NUMBER" + | "LAST_N_DAYS" + | "NEXT_N_DAYS" + | "MULTI_IS_EQUAL" + | "MULTI_IS_NOT_EQUAL" + | "NOT_ALL_OF" + | "PAST" + | "TODAY" + | "AND"; diff --git a/lib/types/sheets/rows.d.ts b/lib/types/sheets/rows.d.ts index b1968ea..156976b 100644 --- a/lib/types/sheets/rows.d.ts +++ b/lib/types/sheets/rows.d.ts @@ -1,10 +1,16 @@ +import { DateString } from "../date"; import { DefaultSDKFunction } from "../defaults"; +import { Column } from "./columns"; +import { PagedResponse, PageOptions } from "../pagination"; export interface RowsResource { getRow: DefaultSDKFunction; getRowAttachments: DefaultSDKFunction; getRowDiscussions: DefaultSDKFunction; - getCellHistory: DefaultSDKFunction; + getCellHistory: DefaultSDKFunction< + GetCellHistoryOptions, + GetCellHistoryResponse + >; copyRowToAnotherSheet: DefaultSDKFunction; moveRowToAnotherSheet: DefaultSDKFunction; addRow: DefaultSDKFunction; @@ -23,25 +29,62 @@ export interface RowsResource { >; } +export interface GetRowOptions { + sheetId: number; + rowId: number; + include?: string; + level?: number; +} + +export type GetCellHistoryOptions = GetRowOptions & + PageOptions & { + columnId: number; + }; + +export type GetCellHistoryResponse = PagedResponse & { + data: CellHistoryCellData[]; +}; + +export interface CellHistoryCellData extends CellData { + modifiedAt: DateString; + modifiedBy: RowUser; +} + /* eslint-disable @typescript-eslint/no-explicit-any */ -export type GetRowOptions = { sheetId: number; rowId: number } | any; export type AddImageToCellOptions = any; export type AddImageToCellResult = any; export type UpdateRowOptions = any; export type UpdateRowResponse = any; +export type RowAttachment = any; +export type RowDiscussion = any; +export type RowUser = any; /* eslint-enable @typescript-eslint/no-explicit-any */ -export type GetRowResponse = { +// GET /sheets/{sheetId}/rows/{rowId} returns sheetId too +export type GetRowResponse = RowData & { sheetId: number }; + +export interface RowData { id: number; - sheetId: number; + version: number; rowNumber: number; expanded: boolean; - cells: CellObject[]; - createdAt: string; - modifiedAt: string; -}; + cells: CellData[]; + createdAt: DateString; + modifiedAt: DateString; + attachments?: RowAttachment[]; + columns?: Column; + conditionalFormat?: string; + discussions?: RowDiscussion[]; + filteredOut?: boolean; + format?: string; + inCriticalPath?: boolean; + locked?: boolean; + lockedForUser?: boolean; + modifiedBy?: RowUser; + permalink?: string; +} -export interface CellObject { +export interface CellData { columnType: ColumnType; value: string; displayValue: string; From 626f2ab6af3a68651a36471d2fac9df621de4e86 Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sat, 4 Sep 2021 23:34:35 -0700 Subject: [PATCH 09/10] fix: add getSheet queryParameters option * tests for behavior and types of getSheet queryParameters option * adds a watch script to run tests * updates test and coverage scripts to be consistent w/ watch * adds requestor option to ClientOptions type --- index.ts | 3 +- lib/types/client.d.ts | 2 + lib/types/sheets/get.d.ts | 22 +- lib/types/utils/httpRequestor.d.ts | 36 ++ package-lock.json | 597 +++++++++++++++++++- package.json | 11 +- test/functional/sheets_test.js | 40 +- test/types/{index.spec.ts => index_test.ts} | 31 +- test/types/tools.ts | 29 + 9 files changed, 725 insertions(+), 46 deletions(-) create mode 100644 lib/types/utils/httpRequestor.d.ts rename test/types/{index.spec.ts => index_test.ts} (63%) create mode 100644 test/types/tools.ts diff --git a/index.ts b/index.ts index ae0aaa7..e905072 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,8 @@ import { ClientLoggerOptions, } from "./lib/types/client"; export { SmartsheetClient } from "./lib/types/client"; -export { SheetData } from "./lib/types/sheets/get"; +export { HttpRequestor } from "./lib/types/utils/httpRequestor" +export { GetSheetOptions, SheetData } from "./lib/types/sheets/get"; export { Column } from "./lib/types/sheets/columns"; export { RowData, diff --git a/lib/types/client.d.ts b/lib/types/client.d.ts index 32ea0eb..b6615b7 100644 --- a/lib/types/client.d.ts +++ b/lib/types/client.d.ts @@ -1,5 +1,6 @@ import { SheetsResource } from "./sheets/sheets"; import { NPMLoggingLevel } from "winston"; +import { HttpRequestor } from "./utils/httpRequestor"; export interface SmartsheetClient { /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -29,6 +30,7 @@ export interface ClientOptions extends ClientLoggerOptions { accessToken?: string; baseUrl?: string; userAgent?: string; + requestor?: HttpRequestor; } export interface ClientLoggerOptions { diff --git a/lib/types/sheets/get.d.ts b/lib/types/sheets/get.d.ts index febd3f4..f886213 100644 --- a/lib/types/sheets/get.d.ts +++ b/lib/types/sheets/get.d.ts @@ -14,14 +14,22 @@ export interface SheetResource { listOrganizationSheets: DefaultSDKFunction; } -export type GetSheetOptions = PageOptions & { +export type GetSheetOptions = { id: number; - include?: string; - exclude?: string; - columnIds?: string; - filterId?: number; - ifVersionAfter?: number; - level?: number; + queryParameters?: PageOptions & { + include?: string; + exclude?: string; + columnIds?: string; + filterId?: number; + ifVersionAfter?: number; + level?: number; + /** a comma-separated list of row Ids on which to filter the rows included in the result */ + rowIds?: string; + /** a comma-separated list of row numbers on which to filter the rows included in the result. Non-existent row numbers are ignored. */ + rowNumbers?: string; + /** filter to return only rows that have been modified since the date/time provided. Date should be in ISO-8601 format, for example, rowsModifiedSince=2020-01-30T13:25:32-07:00. */ + rowsModifiedSince?: string; + } }; /** diff --git a/lib/types/utils/httpRequestor.d.ts b/lib/types/utils/httpRequestor.d.ts new file mode 100644 index 0000000..23aac24 --- /dev/null +++ b/lib/types/utils/httpRequestor.d.ts @@ -0,0 +1,36 @@ +import { IncomingMessage } from "http"; +import { DefaultSDKFunction } from "../defaults"; + +export interface HttpRequestor { + get: DefaultSDKFunction; + put: DefaultSDKFunction; + post: DefaultSDKFunction; + postFile: DefaultSDKFunction; + delete: DefaultSDKFunction; +} + +export interface RequestorRequestOptions { + // buildUrl: + baseUrl?: string; + id?: number | string; + // buildHeaders: + accept?: string; + contentType?: string; + accessToken?: string; + assumeUser?: string; + fileName?: string; + contentDisposition?: string; + path?: string; + fileSize?: string; + changeAgent?: string; + customProperties?: string; + // makeRequest: + // note: queryParmeters could be tighter but this is how request defines qs which they are eventually mapped to anyway: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/request/ + queryParameters: any; + encoding?: string | null | undefined; + // retryOptions: + maxRetryDurationMillis?: number; + calcRetryBackoff?: (numRetries: number, errorReason: any) => number; +} + +export type RequestorResponse = IncomingMessage; diff --git a/package-lock.json b/package-lock.json index ca27840..bf848d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,6 +76,24 @@ } } }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@types/chai": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", @@ -112,6 +130,15 @@ "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", "dev": true }, + "@types/sinon": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz", + "integrity": "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, "@types/underscore": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.2.tgz", @@ -221,6 +248,12 @@ } } }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -1460,6 +1493,12 @@ "es6-symbol": "^3.1.1" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2038,6 +2077,12 @@ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", "dev": true }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -3682,6 +3727,12 @@ } } }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3720,6 +3771,12 @@ "unc-path-regex": "^0.1.2" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -4224,37 +4281,224 @@ } }, "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-0wE74YMgOkCgBUj8VyIDwmLUjTsS13WV1Pg7l0SHea2qzZzlq7MDnfbPsHKcELBRk3+izEVkRofjmClpycudCA==", "dev": true, "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", + "chokidar": "3.5.2", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", "growl": "1.10.5", - "he": "1.1.1", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ms": "2.1.3", + "nanoid": "3.1.23", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4265,29 +4509,220 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" } }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -4322,6 +4757,12 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -4740,6 +5181,12 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4845,6 +5292,15 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "rcfinder": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", @@ -5185,6 +5641,15 @@ "sver-compat": "^1.5.0" } }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6290,6 +6755,42 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "winston": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", @@ -6315,6 +6816,12 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -6423,11 +6930,43 @@ "decamelize": "^1.2.0" } }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index f8587be..9c44940 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,9 @@ "main": "index.js", "types": "index.d.ts", "scripts": { - "test": "npm run -s test-types && npm run -s test-functional && npm run -s test-mock-api", - "test-functional": "mocha \"test/functional/**/*_test.js\"", - "test-mock-api": "mocha \"test/mock-api/**/*_test.js\"", - "test-types": "mocha --require ts-node/register \"test/types/**/*.spec.ts\"", - "coverage": "istanbul cover _mocha -- -u exports -R spec \"test/**/*_test.js\"", + "test": "mocha --extension ts,js --require ts-node/register \"test/**/*_test.*\"", + "watch": "mocha -w --extension ts,js --require ts-node/register --exclude \"test/mock-api/**/*\" \"test/**/*_test.*\"", + "coverage": "istanbul cover _mocha -- --extension ts,js --require ts-node/register \"test/**/*_test.*\"", "report-coverage": "cat ./coverage/lcov.info | coveralls", "build": "tsc --declaration", "prepare": "npm run --silent build", @@ -51,6 +49,7 @@ "@types/chai": "^4.2.11", "@types/mocha": "^7.0.2", "@types/node": "^14.0.14", + "@types/sinon": "^10.0.2", "@types/underscore": "^1.10.1", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^2.34.0", @@ -63,7 +62,7 @@ "gulp-mocha": "^6.0.0", "istanbul": "^0.4.5", "jshint-stylish": "^1.0.1", - "mocha": "^5.2.0", + "mocha": "^9.1.1", "mock": "^0.1.1", "prettier": "^2.0.5", "should": "^13.0.1", diff --git a/test/functional/sheets_test.js b/test/functional/sheets_test.js index db7e72d..28f7d05 100644 --- a/test/functional/sheets_test.js +++ b/test/functional/sheets_test.js @@ -1,5 +1,5 @@ -var sinon = require('sinon'); -var should = require('should'); +var sinon = require("sinon"); +var should = require("should"); var requestor = null; var smartsheet = null; @@ -45,5 +45,41 @@ describe('Client Unit Tests', function() { smartsheet.sheets.getSheet({ id: 100 }); should(requestor.get.thirdCall.args[0]).have.property('url', 'sheets/'); }); + + describe('queryParameters', () => { + it('should send id without queryParameters', () => { + smartsheet.sheets.getSheet({ id: 42 }); + should(requestor.get.firstCall.args[0]).have.property('id', 42); + }); + + const knownParameters = [ + { name: 'include', value: 'a,b' }, + { name: 'exclude', value: 'c,d' }, + { name: 'columnIds', value: 'c1,c2' }, + { name: 'filterId', value: Date.now() }, + { name: 'ifVersionAfter', value: Date.now() }, + { name: 'level', value: Date.now() }, + { name: 'page', value: Date.now() }, + { name: 'pageSize', value: Date.now() }, + { name: 'rowIds', value: `${Date.now()},${Date.now()}` }, + { name: 'rowNumbers', value: `${Date.now()},${Date.now()}` }, + { name: 'rowsModifiedSince', value: new Date().toISOString() }, + ]; + + knownParameters.forEach((param) => { + it(`should send known param ${param.name}=${param.value}`, () => { + const qp = {}; + qp[param.name] = param.value; + smartsheet.sheets.getSheet({ + id: 42, + queryParameters: qp, + }); + should(requestor.get.firstCall.args[0].queryParameters).have.property( + param.name, + param.value + ); + }); + }); + }); }); }); diff --git a/test/types/index.spec.ts b/test/types/index_test.ts similarity index 63% rename from test/types/index.spec.ts rename to test/types/index_test.ts index f529fd7..7f70a77 100644 --- a/test/types/index.spec.ts +++ b/test/types/index_test.ts @@ -1,6 +1,8 @@ import { expect } from "chai"; import * as smartsheetStar from "../../"; import smartsheetDefault, { SmartsheetClient } from "../../"; +import { GetSheetOptions } from "../../lib/types/sheets/get"; +import { createClientStub } from "./tools"; describe("TypeScript", () => { describe("Default Export", () => { @@ -36,7 +38,6 @@ describe("TypeScript", () => { expect(client.sheets).to.be.instanceOf(Object); expect(client.sheets.listSheets).to.be.instanceOf(Function); expect(client.sheets.getSheet).to.be.instanceOf(Function); - expect(client.sheets.getSheet).to.be.instanceOf(Function); expect(client.sheets.sendSheetViaEmail).to.be.instanceOf(Function); expect(client.sheets.getPublishStatus).to.be.instanceOf(Function); expect(client.sheets.setPublishStatus).to.be.instanceOf(Function); @@ -45,5 +46,33 @@ describe("TypeScript", () => { expect(client.sheets.moveSheet).to.be.instanceOf(Function); expect(client.sheets.sortRowsInSheet).to.be.instanceOf(Function); }); + + describe("sheets", () => { + beforeEach(function () { + // runs before each test in this block + client = createClientStub(); + }); + describe("getSheet", async () => { + it("should accept known queryParameters", async () => { + const options: GetSheetOptions = { + id: 9876543, + queryParameters: { + include: "a,b", + exclude: "c,d", + columnIds: "c1,c2", + filterId: 1630822416621, + ifVersionAfter: 1630822416621, + level: 1630822416621, + page: 1630822416621, + pageSize: 1630822416621, + rowIds: "1630822416621,1630822416621", + rowNumbers: "1630822416621,1630822416621", + rowsModifiedSince: "2021-09-05T06:13:36.621Z", + }, + }; + await client.sheets.getSheet(options); + }); + }); + }); }); }); diff --git a/test/types/tools.ts b/test/types/tools.ts new file mode 100644 index 0000000..7e87611 --- /dev/null +++ b/test/types/tools.ts @@ -0,0 +1,29 @@ +import * as sinon from "sinon"; +import smartsheet, { SmartsheetClient, HttpRequestor } from "../.."; +const requestorFactory: any = require("../../lib/utils/httpRequestor.js"); + +/** + * Creates a `requestor` that is stubbed so methods can be provided to the client. + * Use the returned stub like so: + * ``` + * import smartsheet from "../.."; + const client = smartsheet.createClient({ + accessToken: "1234", + requestor: requestorStub, + }); + ``` + */ +export function createRequestorStub(): HttpRequestor { + const requestor = requestorFactory.create({}) as HttpRequestor; + return sinon.stub(requestor); +} + +/** + * Creates a smartsheetclient with its underlyign requestor stubbed + */ +export function createClientStub(): SmartsheetClient { + return smartsheet.createClient({ + accessToken: "1234", + requestor: createRequestorStub(), + }); +} From 6acc806e553f5512cf0698536eb2fd3cee008d7c Mon Sep 17 00:00:00 2001 From: Scott Willeke Date: Sun, 5 Sep 2021 00:30:18 -0700 Subject: [PATCH 10/10] fix: fixes requestor response type --- lib/types/utils/httpRequestor.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/types/utils/httpRequestor.d.ts b/lib/types/utils/httpRequestor.d.ts index 23aac24..3ecf12e 100644 --- a/lib/types/utils/httpRequestor.d.ts +++ b/lib/types/utils/httpRequestor.d.ts @@ -33,4 +33,4 @@ export interface RequestorRequestOptions { calcRetryBackoff?: (numRetries: number, errorReason: any) => number; } -export type RequestorResponse = IncomingMessage; +export type RequestorResponse = any;