diff --git a/types/pkgcloud/README.md b/types/pkgcloud/README.md new file mode 100644 index 0000000000..20815adfb4 --- /dev/null +++ b/types/pkgcloud/README.md @@ -0,0 +1,7 @@ +This file exists for reminding contributors that this definition is **WIP**. + +### Note + +pkgcloud has a large number of client types and providers. Only some clients and providers have types defined. + +You are welcome to contribute definitions for other clients and providers and add provider specific properties. diff --git a/types/pkgcloud/index.d.ts b/types/pkgcloud/index.d.ts new file mode 100644 index 0000000000..7a0a55a773 --- /dev/null +++ b/types/pkgcloud/index.d.ts @@ -0,0 +1,131 @@ +// Type definitions for pkgcloud 1.7 +// Project: https://github.com/pkgcloud/pkgcloud#readme +// Definitions by: Daniel Friesen +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.1 + +/// + +export const version: string; + +export interface ClientError extends Error { + provider?: Providers; + method?: string; + failCode?: string; + statusCode?: number; + href?: string; + headers?: { [headerName: string]: string }; + result?: any; +} + +export type Providers = + | 'amazon' + | 'azure' + | 'digitalocean' + | 'google' + | 'hp' + | 'iriscouch' + | 'joyent' + | 'mongohq' + | 'mongolab' + | 'oneandone' + | 'openstack' + | 'rackspace' + | 'redistogo' + | 'telefonic'; + +export interface BaseProviderOptions { + provider: Providers; +} + +export interface AmazonProviderOptions { + provider: 'amazon'; + keyId: string; + key: string; + region?: string; +} + +export interface AzureProviderOptions { + provider: 'azure'; + storageAccount: string; + storageAccessKey: string; + location?: string; +} + +export type ProviderOptions = BaseProviderOptions & Partial< + | AmazonProviderOptions + | AzureProviderOptions +>; + +/** + * Storage + */ + +export namespace storage { + interface StorageUploadOptions { + container: string; + remote: string; + } + + interface StorageDownloadOptions { + container: string; + remote: string; + } + + interface Client { + provider: string; + config: ProviderOptions; + protocol: string; + + getContainers( + callback: (err: ClientError, containers: Container[]) => any, + ): void; + createContainer( + options: any, + callback: (err: ClientError, container: Container) => any, + ): void; + destroyContainer( + containerName: string, + callback: (err: ClientError) => any, + ): void; + getContainer( + containerName: string, + callback: (err: ClientError, container: Container) => any, + ): void; + upload(options: StorageUploadOptions): NodeJS.WriteStream; + download(options: StorageDownloadOptions): NodeJS.ReadStream; + getFiles( + containerName: string, + callback: (err: ClientError, files: File[]) => any, + ): void; + getFile( + containerName: string, + file: string, + callback: (err: ClientError, file: File) => any, + ): void; + removeFile( + containerName: string, + file: string, + callback: (err: ClientError) => any, + ): void; + // Logs + on( + eventName: string, + callback: (message: string, object?: any) => any, + ): void; + } + + interface Container { + // files: ? + client: Client; + } + + interface File { + container: string; + name: string; + size: number; + client: Client; + } + + function createClient(options: ProviderOptions): Client; +} diff --git a/types/pkgcloud/pkgcloud-tests.ts b/types/pkgcloud/pkgcloud-tests.ts new file mode 100644 index 0000000000..62846b6b55 --- /dev/null +++ b/types/pkgcloud/pkgcloud-tests.ts @@ -0,0 +1,64 @@ +import { createReadStream, createWriteStream } from "fs"; +import * as pkgcloud from "pkgcloud"; + +/** + * Storage + */ + +// Amazon +pkgcloud.storage.createClient({ + provider: 'amazon', + keyId: 'ABDEFGHI', + key: 'AABDEF==', +}); + +// Azure +pkgcloud.storage.createClient({ + provider: 'azure', + storageAccount: 'abcdefg', + storageAccessKey: 'AABDEF==', +}); + +// Upload a File +{ + const client = pkgcloud.storage.createClient({ + provider: 'amazon' + }); + + const readStream = createReadStream('a-file.txt'); + const writeStream = client.upload({ + container: 'a-container', + remote: 'remote-file-name.txt' + }); + + writeStream.on('error', (err: pkgcloud.ClientError) => {}); + writeStream.on('success', (file: pkgcloud.storage.File) => {}); + readStream.pipe(writeStream); +} + +// Download a File +{ + const client = pkgcloud.storage.createClient({ + provider: 'amazon' + }); + + const readStream = client.download({ + container: 'a-container', + remote: 'remote-file-name.txt' + }); + readStream.pipe(createWriteStream('a-file.txt')); +} + +// Logs +{ + const client = pkgcloud.storage.createClient({ + provider: 'amazon' + }); + + client.on('log::*', (message, object) => { + console.log(message); + if (object) { + console.dir(object); + } + }); +} diff --git a/types/pkgcloud/tsconfig.json b/types/pkgcloud/tsconfig.json new file mode 100644 index 0000000000..f36ed5e952 --- /dev/null +++ b/types/pkgcloud/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "pkgcloud-tests.ts" + ] +} diff --git a/types/pkgcloud/tslint.json b/types/pkgcloud/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pkgcloud/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }