Skip to content
This repository was archived by the owner on Jan 9, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules/
.nyc_output/
coverage/
/index.d.ts
/lib/utils/apis.d.ts
6 changes: 6 additions & 0 deletions .eslintrc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
extends:
- "@activescott/eslint-config"
rules:
semi:
- error
- always
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 8 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
semi: true
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ dist: trusty

node_js:
- "lts/carbon"
- 13

before_install:
- git clone https://github.com/smartsheet-platform/smartsheet-sdk-tests.git
Expand Down
113 changes: 0 additions & 113 deletions index.js

This file was deleted.

158 changes: 158 additions & 0 deletions index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import {
SmartsheetClient,
ClientOptions,
ClientLoggerOptions,
} from "./lib/types/client";
export { SmartsheetClient } from "./lib/types/client";
export { HttpRequestor } from "./lib/types/utils/httpRequestor"
export { GetSheetOptions, 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";
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;
42 changes: 42 additions & 0 deletions lib/types/client.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { SheetsResource } from "./sheets/sheets";
import { NPMLoggingLevel } from "winston";
import { HttpRequestor } from "./utils/httpRequestor";

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;
requestor?: HttpRequestor;
}

export interface ClientLoggerOptions {
logLevel?: NPMLoggingLevel | string;
/* eslint-disable @typescript-eslint/no-explicit-any */
logger?: any;
loggerContainer?: any;
/* eslint-enable @typescript-eslint/no-explicit-any */
}
4 changes: 4 additions & 0 deletions lib/types/date.d.ts
Original file line number Diff line number Diff line change
@@ -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;
Loading