diff --git a/types/angular-clipboard/angular-clipboard-tests.ts b/types/angular-clipboard/angular-clipboard-tests.ts index b043a85d5a..00c5074ec5 100644 --- a/types/angular-clipboard/angular-clipboard-tests.ts +++ b/types/angular-clipboard/angular-clipboard-tests.ts @@ -1,8 +1,12 @@ import * as angular from "angular"; import {ClipboardService} from "angular-clipboard"; +interface TestScope extends ng.IScope { + [index: string]: any; +} + const app = angular.module('testModule', ['angular-clipboard']); -app.controller('TestController', ($scope: ng.IScope, clipboard: ClipboardService) => { +app.controller('TestController', ($scope: TestScope, clipboard: ClipboardService) => { $scope['testCopy'] = () => { if (clipboard.supported) { clipboard.copyText('hiiiiiii'); diff --git a/types/angular-locker/angular-locker-tests.ts b/types/angular-locker/angular-locker-tests.ts index a82f6a86cb..368dd1d308 100644 --- a/types/angular-locker/angular-locker-tests.ts +++ b/types/angular-locker/angular-locker-tests.ts @@ -1,5 +1,10 @@ import * as angular from 'angular'; + +interface TestScope extends angular.IScope { + [index: string]: any; +} + angular .module('angular-locker-tests', ['angular-locker']) .config(['lockerProvider', function config(lockerProvider: angular.locker.ILockerProvider) { @@ -13,7 +18,7 @@ angular lockerProvider.defaults(lockerSettings); }]) -.controller('LockerController', ['$scope', 'locker', function ($scope: angular.IScope, locker: angular.locker.ILockerService) { +.controller('LockerController', ['$scope', 'locker', function ($scope: TestScope, locker: angular.locker.ILockerService) { locker.put('someKey', 'someVal'); // put an item into session storage diff --git a/types/angular-material/angular-material-tests.ts b/types/angular-material/angular-material-tests.ts index d1af7c8159..5766a81975 100644 --- a/types/angular-material/angular-material-tests.ts +++ b/types/angular-material/angular-material-tests.ts @@ -1,5 +1,9 @@ const myApp = angular.module('testModule', ['ngMaterial']); +interface TestScope extends ng.IScope { + [index: string]: any; +} + myApp.config(( $mdThemingProvider: ng.material.IThemingProvider, $mdIconProvider: ng.material.IIconProvider, @@ -50,7 +54,7 @@ myApp.config(( }); }); -myApp.controller('BottomSheetController', ($scope: ng.IScope, $mdBottomSheet: ng.material.IBottomSheetService, $q: ng.IQService) => { +myApp.controller('BottomSheetController', ($scope: TestScope, $mdBottomSheet: ng.material.IBottomSheetService, $q: ng.IQService) => { $scope['openBottomSheet'] = () => { $mdBottomSheet.show({ template: 'Hello!', @@ -84,7 +88,7 @@ myApp.controller('BottomSheetController', ($scope: ng.IScope, $mdBottomSheet: ng $scope['cancelBottomSheet'] = $mdBottomSheet.cancel.bind($mdBottomSheet, 'cancel'); }); -myApp.controller('ColorController', ($scope: ng.IScope, $mdColor: ng.material.IColorService) => { +myApp.controller('ColorController', ($scope: TestScope, $mdColor: ng.material.IColorService) => { const colorExpression: ng.material.IColorExpression = { color: '#FFFFFF' }; const element: Element = new Element(); @@ -99,7 +103,7 @@ myApp.controller('ColorController', ($scope: ng.IScope, $mdColor: ng.material.IC }; }); -myApp.controller('DialogController', ($scope: ng.IScope, $mdDialog: ng.material.IDialogService, $q: ng.IQService) => { +myApp.controller('DialogController', ($scope: TestScope, $mdDialog: ng.material.IDialogService, $q: ng.IQService) => { $scope['openDialog'] = () => { $mdDialog.show({ template: 'Hello!' @@ -201,7 +205,7 @@ class IconDirective implements ng.IDirective { } myApp.directive('icon-directive', ($mdIcon: ng.material.IIcon) => new IconDirective($mdIcon)); -myApp.controller('MediaController', ($scope: ng.IScope, $mdMedia: ng.material.IMedia) => { +myApp.controller('MediaController', ($scope: TestScope, $mdMedia: ng.material.IMedia) => { $scope.$watch(() => $mdMedia('lg'), (big: boolean) => { $scope['bigScreen'] = big; }); @@ -210,7 +214,7 @@ myApp.controller('MediaController', ($scope: ng.IScope, $mdMedia: ng.material.IM $scope['anotherCustom'] = $mdMedia('max-width: 300px'); }); -myApp.controller('SidenavController', ($scope: ng.IScope, $mdSidenav: ng.material.ISidenavService) => { +myApp.controller('SidenavController', ($scope: TestScope, $mdSidenav: ng.material.ISidenavService) => { const componentId = 'left'; $scope['toggle'] = () => $mdSidenav(componentId).toggle(); $scope['open'] = () => $mdSidenav(componentId).open(); @@ -229,7 +233,7 @@ myApp.controller('SidenavController', ($scope: ng.IScope, $mdSidenav: ng.materia $scope['onClose'] = $mdSidenav(componentId).onClose(() => { }); }); -myApp.controller('ToastController', ($scope: ng.IScope, $mdToast: ng.material.IToastService, $q: ng.IQService) => { +myApp.controller('ToastController', ($scope: TestScope, $mdToast: ng.material.IToastService, $q: ng.IQService) => { $scope['openToast'] = () => { $mdToast.show($mdToast.simple().textContent('Hello!')); $mdToast.updateTextContent('New Content'); @@ -260,7 +264,7 @@ myApp.controller('ToastController', ($scope: ng.IScope, $mdToast: ng.material.IT }; }); -myApp.controller('PanelController', ($scope: ng.IScope, $mdPanel: ng.material.IPanelService, $q: ng.IQService) => { +myApp.controller('PanelController', ($scope: TestScope, $mdPanel: ng.material.IPanelService, $q: ng.IQService) => { $scope['createPanel'] = () => { const config: ng.material.IPanelConfig = { id: 'myPanel', diff --git a/types/angular-meteor/angular-meteor-tests.ts b/types/angular-meteor/angular-meteor-tests.ts index 6a379b8bac..21cbb4e3a3 100644 --- a/types/angular-meteor/angular-meteor-tests.ts +++ b/types/angular-meteor/angular-meteor-tests.ts @@ -27,6 +27,8 @@ interface CustomScope extends angular.meteor.IScope { removeAll: () => void; removeAuto: (todo: ITodo) => void; toSticky: (todo: ITodo) => void; + + picture: any; } var Todos = new Mongo.Collection('todos'); diff --git a/types/angular-resource/index.d.ts b/types/angular-resource/index.d.ts index b95911ae2c..4bdc8cc007 100644 --- a/types/angular-resource/index.d.ts +++ b/types/angular-resource/index.d.ts @@ -53,14 +53,14 @@ declare module 'angular' { interface IActionHash { [action: string]: IActionDescriptor; } - + interface IResourceResponse { config: any; data: any; headers: any; resource: any; status: number; - statusText: string + statusText: string; } interface IResourceInterceptor { diff --git a/types/angular-ui-scroll/angular-ui-scroll-tests.ts b/types/angular-ui-scroll/angular-ui-scroll-tests.ts index e226b664bc..9be5609d16 100644 --- a/types/angular-ui-scroll/angular-ui-scroll-tests.ts +++ b/types/angular-ui-scroll/angular-ui-scroll-tests.ts @@ -23,8 +23,12 @@ namespace application { myApp.factory('DatasourceTest', factory); + interface TestScope extends ng.IScope { + [index: string]: any; + } + // demo/examples/adapter - myApp.controller('mainController', ['$scope', 'DatasourceTest', function($scope: ng.IScope, datasource: DatasourceTest) { + myApp.controller('mainController', ['$scope', 'DatasourceTest', function($scope: TestScope, datasource: DatasourceTest) { var firstListAdapter: ng.ui.IScrollAdapter, secondListAdapter: ng.ui.IScrollAdapter; $scope['datasource'] = datasource; diff --git a/types/angular/index.d.ts b/types/angular/index.d.ts index b37e1ba421..fcfcf183e2 100644 --- a/types/angular/index.d.ts +++ b/types/angular/index.d.ts @@ -451,8 +451,6 @@ declare namespace angular { * see https://docs.angularjs.org/api/ng/type/$rootScope.Scope and https://docs.angularjs.org/api/ng/service/$rootScope */ interface IRootScopeService { - [index: string]: any; - $apply(): any; $apply(exp: string): any; $apply(exp: (scope: IScope) => any): any; diff --git a/types/aws-lambda/aws-lambda-tests.ts b/types/aws-lambda/aws-lambda-tests.ts index 7f8b8fabdd..10b4fa1073 100644 --- a/types/aws-lambda/aws-lambda-tests.ts +++ b/types/aws-lambda/aws-lambda-tests.ts @@ -22,43 +22,44 @@ var snsEvtRec: AWSLambda.SNSEventRecord; var snsMsg: AWSLambda.SNSMessage; var snsMsgAttr: AWSLambda.SNSMessageAttribute; var snsMsgAttrs: AWSLambda.SNSMessageAttributes; -var S3CreateEvent: AWSLambda.S3CreateEvent = { - Records: [{ - eventVersion: 'string', - eventSource: 'string', - awsRegion: 'string', - eventTime: 'string', - eventName: 'string', - userIdentity: { - principalId: 'string' - }, - requestParameters: { - sourceIPAddress: 'string' - }, - responseElements: { - 'x-amz-request-id': 'string', - 'x-amz-id-2': 'string' - }, - s3: { - s3SchemaVersion: 'string', - configurationId: 'string', - bucket: { - name: 'string', - ownerIdentity: { - principalId: 'string' - }, - arn: 'string' +var S3EvtRec: AWSLambda.S3EventRecord = { + eventVersion: '2.0', + eventSource: 'aws:s3', + awsRegion: 'us-east-1', + eventTime: '1970-01-01T00:00:00.000Z', + eventName: 'ObjectCreated:Put', + userIdentity: { + principalId: 'AIDAJDPLRKLG7UEXAMPLE' + }, + requestParameters:{ + sourceIPAddress: '127.0.0.1' + }, + responseElements: { + 'x-amz-request-id': 'C3D13FE58DE4C810', + 'x-amz-id-2': 'FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD' + }, + s3: { + s3SchemaVersion: '1.0', + configurationId: 'testConfigRule', + bucket: { + name: 'mybucket', + ownerIdentity: { + principalId: 'A3NL1KOZZKExample' }, - object: { - key: 'string', - size: 1, - eTag: 'string', - versionId: 'string', - sequencer: 'string' - } + arn: 'arn:aws:s3:::mybucket' + }, + object: { + key: 'HappyFace.jpg', + size: 1024, + eTag: 'd41d8cd98f00b204e9800998ecf8427e', + versionId: '096fKKXTRTtl3on89fVO.nfljtsv6qko', + sequencer: '0055AED6DCD90281E5' } } - ] +}; + +var S3CreateEvent: AWSLambda.S3CreateEvent = { + Records: [S3EvtRec] }; var cognitoUserPoolEvent: AWSLambda.CognitoUserPoolEvent; var cloudformationCustomResourceEvent: AWSLambda.CloudFormationCustomResourceEvent; diff --git a/types/aws-lambda/index.d.ts b/types/aws-lambda/index.d.ts index df8effb82b..1da094ac46 100644 --- a/types/aws-lambda/index.d.ts +++ b/types/aws-lambda/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for AWS Lambda // Project: http://docs.aws.amazon.com/lambda -// Definitions by: James Darbyshire , Michael Skarum , Stef Heyenrath , Toby Hede , Rich Buggy , Yoriki Yamaguchi +// Definitions by: James Darbyshire , Michael Skarum , Stef Heyenrath , Toby Hede , Rich Buggy , Yoriki Yamaguchi , wwwy3y3 // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // API Gateway "event" @@ -85,43 +85,44 @@ interface SNSEvent { * S3Create event * https://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html */ -interface S3CreateEvent { - Records: [{ - eventVersion: string; - eventSource: string; - awsRegion: string - eventTime: string; - eventName: string; - userIdentity: { - principalId: string; - }, - requestParameters: { - sourceIPAddress: string; - }, - responseElements: { - 'x-amz-request-id': string; - 'x-amz-id-2': string; - }, - s3: { - s3SchemaVersion: string; - configurationId: string; - bucket: { - name: string; - ownerIdentity: { - principalId: string; - }, - arn: string; +interface S3EventRecord { + eventVersion: string; + eventSource: string; + awsRegion: string + eventTime: string; + eventName: string; + userIdentity: { + principalId: string; + }, + requestParameters: { + sourceIPAddress: string; + }, + responseElements: { + 'x-amz-request-id': string; + 'x-amz-id-2': string; + }, + s3: { + s3SchemaVersion: string; + configurationId: string; + bucket: { + name: string; + ownerIdentity: { + principalId: string; }, - object: { - key: string; - size: number; - eTag: string; - versionId: string; - sequencer: string; - } + arn: string; + }, + object: { + key: string; + size: number; + eTag: string; + versionId: string; + sequencer: string; } } - ]; +} + +interface S3CreateEvent { + Records: Array; } /** diff --git a/types/babel-types/babel-types-tests.ts b/types/babel-types/babel-types-tests.ts index 5974a64885..394603ab31 100644 --- a/types/babel-types/babel-types-tests.ts +++ b/types/babel-types/babel-types-tests.ts @@ -29,3 +29,30 @@ t.assertBinaryExpression(ast); t.assertBinaryExpression(ast, { operator: "*" }); var exp: t.Expression = t.nullLiteral(); + +// React examples: + +// https://github.com/babel/babel/blob/4e50b2d9d9c376cee7a2cbf56553fe5b982ea53c/packages/babel-plugin-transform-react-inline-elements/src/index.js#L61 +traverse(ast, { + JSXElement(path, file) { + const { node } = path; + const open = node.openingElement; + + // init + const type = open.name; + + let newType: t.StringLiteral; + if (t.isJSXIdentifier(type) && t.react.isCompatTag(type.name)) { + newType = t.stringLiteral(type.name); + } + + const args: any[] = []; + if (node.children.length) { + const children = t.react.buildChildren(node); + args.push( + t.unaryExpression("void", t.numericLiteral(0), true), + ...children, + ); + } + } +}); diff --git a/types/babel-types/index.d.ts b/types/babel-types/index.d.ts index 77ea8b54de..c3f77b559f 100644 --- a/types/babel-types/index.d.ts +++ b/types/babel-types/index.d.ts @@ -1,6 +1,8 @@ -// Type definitions for babel-types v6.7 +// Type definitions for babel-types v6.25 // Project: https://github.com/babel/babel/tree/master/packages/babel-types -// Definitions by: Troy Gerwien , Sam Baxter +// Definitions by: Troy Gerwien +// Sam Baxter +// Marvin Hagemeister // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped export interface Comment { @@ -1226,6 +1228,13 @@ export function isUser(node: Object, opts?: Object): boolean; export function isGenerated(node: Object, opts?: Object): boolean; export function isPure(node: Object, opts?: Object): boolean; +// React specific +interface ReactHelpers { + isCompatTag(tagName?: string): boolean; + buildChildren(node: Object): Object[]; +} +export const react: ReactHelpers; + export function assertArrayExpression(node: Object, opts?: Object): void; export function assertAssignmentExpression(node: Object, opts?: Object): void; export function assertBinaryExpression(node: Object, opts?: Object): void; diff --git a/types/geodesy/geodesy-tests.ts b/types/geodesy/geodesy-tests.ts index e3ce4f627a..984b8e80c2 100644 --- a/types/geodesy/geodesy-tests.ts +++ b/types/geodesy/geodesy-tests.ts @@ -4,7 +4,7 @@ import { Dms, Vector3d, OsGridRef, - LatLonEllipsoidal as LatLon } from 'geodesy'; + LatLonEllipsoidal as LatLon, LatLonSpherical } from 'geodesy'; /** * Mgrs @@ -115,3 +115,53 @@ OsGridRef.latLonToOsGrid(latlon); OsGridRef.osGridToLatLon(gridref); OsGridRef.osGridToLatLon(gridref, LatLon.datum.OSGB36); OsGridRef.parse('TG 51409 13177'); + +/** + * LatLonSpherical + */ +const point1 = new LatLonSpherical(52.205, 0.119); +const point2 = new LatLonSpherical(48.857, 2.351); + +point1.distanceTo(point2); // 404.3 km +point1.distanceTo(point2, 6371e3); // 404.3 km +point1.bearingTo(point2); // 156.2° +point1.finalBearingTo(point2); // 157.9° +point1.midpointTo(point2); // 50.5363°N, 001.2746°E +point1.intermediatePointTo(point2, 0.25); // 51.3721°N, 000.7073°E +point1.destinationPoint(7794, 300.7); // 51.5135°N, 000.0983°W +point1.destinationPoint(7794, 300.7, 6371e3); // 51.5135°N, 000.0983°W + +const ctCurrent = new LatLonSpherical(53.2611, -0.7972); +const ct1 = new LatLonSpherical(53.3206, -1.7297); +const ct2 = new LatLonSpherical(53.1887, 0.1334); +ctCurrent.crossTrackDistanceTo(ct1, ct2); // -307.5 m +ctCurrent.crossTrackDistanceTo(ct1, ct2, 6371e3); // -307.5 m + +point1.maxLatitude(156); + +const rhumb1 = new LatLonSpherical(51.127, 1.338); +const rhumb2 = new LatLonSpherical(50.964, 1.853); +rhumb1.rhumbDistanceTo(rhumb2); // 40.31 km +rhumb1.rhumbDistanceTo(rhumb2, 6371e3); // 40.31 km +rhumb1.rhumbBearingTo(rhumb2); // 116.7° +rhumb1.rhumbDestinationPoint(40300, 116.7); // 50.9642°N, 001.8530°E +rhumb1.rhumbDestinationPoint(40300, 116.7, 6371e3); // 50.9642°N, 001.8530°E +rhumb1.rhumbMidpointTo(rhumb2); // 51.0455°N, 001.5957°E + +const eq1 = new LatLonSpherical(52.205, 0.119); +const eq2 = new LatLonSpherical(52.205, 0.119); +eq1.equals(eq2); // true + +eq1.toString(); +eq1.toString('dm'); +eq1.toString('d', 0); + +// Static functions +const brng1 = 108.547; +const brng2 = 32.435; +LatLonSpherical.intersection(point1, brng1, point2, brng2); // 50.9078°N, 004.5084°E +LatLonSpherical.crossingParallels(point1, point2, 30); + +const polygon = [new LatLonSpherical(0, 0), new LatLonSpherical(1, 0), new LatLonSpherical(0, 1)]; +LatLonSpherical.areaOf(polygon); // 6.18e9 m² +LatLonSpherical.areaOf(polygon, 6371e3); // 6.18e9 m² diff --git a/types/geodesy/index.d.ts b/types/geodesy/index.d.ts index 12adb4d7c1..1d8ef3e110 100644 --- a/types/geodesy/index.d.ts +++ b/types/geodesy/index.d.ts @@ -1,6 +1,7 @@ // Type definitions for geodesy 1.1 // Project: https://github.com/chrisveness/geodesy // Definitions by: Denis Carriere +// Gilbert Handy // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped export type format = 'd' | 'dm' | 'dms'; @@ -147,3 +148,26 @@ export class LatLonEllipsoidal { static datum: Datums; static ellipsoid: Ellipsoids; } + +export class LatLonSpherical { + lat: number; + lon: number; + constructor(lat: number, lon: number) + distanceTo(point: LatLonSpherical, radius?: number): number; + bearingTo(point: LatLonSpherical): number; + finalBearingTo(point: LatLonSpherical): number; + midpointTo(point: LatLonSpherical): number; + intermediatePointTo(point: LatLonSpherical, fraction: number): LatLonSpherical; + destinationPoint(distance: number, bearing: number, radius?: number): LatLonSpherical; + static intersection(point1: LatLonSpherical, bearing1: number, point2: LatLonSpherical, bearing2: number): LatLonSpherical; + crossTrackDistanceTo(pathStart: LatLonSpherical, pathEnd: LatLonSpherical, radius?: number): number; + maxLatitude(bearing: number): number; + static crossingParallels(point1: LatLonSpherical, point2: LatLonSpherical, latitude: number): any; + rhumbDistanceTo(point: LatLonSpherical, radius?: number): number; + rhumbBearingTo(point: LatLonSpherical): number; + rhumbDestinationPoint(distance: number, bearing: number, radius?: number): LatLonSpherical; + rhumbMidpointTo(point: LatLonSpherical): LatLonSpherical; + equals(point: LatLonSpherical): boolean; + static areaOf(polygon: LatLonSpherical[], radius?: number): number; + toString(format?: string, dp?: number): string; +} diff --git a/types/iframe-resizer/iframe-resizer-tests.ts b/types/iframe-resizer/iframe-resizer-tests.ts index d127f8bf36..186dc2ba47 100644 --- a/types/iframe-resizer/iframe-resizer-tests.ts +++ b/types/iframe-resizer/iframe-resizer-tests.ts @@ -1,32 +1,37 @@ -import {IFrameComponent, IFrameOptions, iframeResizer} from "iframe-resizer"; +import { IFrameComponent, IFrameOptions, iframeResizer } from "iframe-resizer"; function testOne(): void { - let iframe: HTMLIFrameElement = document.createElement('iframe'); - let options: IFrameOptions = {log: true}; - let components: IFrameComponent[] = iframeResizer(options, iframe); - if (components) { - components.forEach(component => console.log(component.iFrameResizer)); - } else { - console.log("No components"); - } + let iframe: HTMLIFrameElement = document.createElement('iframe'); + let options: IFrameOptions = {log: true}; + let components: IFrameComponent[] = iframeResizer(options, iframe); + if (components) { + components.forEach(component => console.log(component.iFrameResizer)); + } else { + console.log("No components"); + } } function testTwo(): void { - let iframe: HTMLIFrameElement = document.createElement('iframe'); - let components: IFrameComponent[] = iframeResizer({ - initCallback: () => { - console.log('Init'); - }, - closedCallback: () => { - console.log('Closed'); - } - }, iframe); - if (components) { - components.forEach(component => console.log(component.iFrameResizer)); - } else { - console.log("No components"); + let iframe: HTMLIFrameElement = document.createElement('iframe'); + let components: IFrameComponent[] = iframeResizer({ + initCallback: () => { + console.log('Init'); + }, + closedCallback: () => { + console.log('Closed'); } + }, iframe); + if (components) { + components.forEach(component => console.log(component.iFrameResizer)); + } else { + console.log("No components"); + } +} + +function testThree(): void { + iframeResizer({}, '.my-iframe'); } testOne(); testTwo(); +testThree(); diff --git a/types/iframe-resizer/index.d.ts b/types/iframe-resizer/index.d.ts index 1a05833692..3dd26dd391 100644 --- a/types/iframe-resizer/index.d.ts +++ b/types/iframe-resizer/index.d.ts @@ -6,191 +6,272 @@ // tslint:disable:prefer-method-signature // tslint:disable-next-line:no-single-declare-module declare module 'iframe-resizer' { - // tslint:disable-next-line:interface-name - interface IFrameObject { - close(): void; - moveToAnchor(anchor: string): void; - resize(): void; - sendMessage(message: any): void; - } + // tslint:disable-next-line:interface-name + interface IFrameObject { + close(): void; + moveToAnchor(anchor: string): void; + resize(): void; + sendMessage(message: any, targetOrigin?: string): void; + } - // tslint:disable-next-line:interface-name - interface IFrameComponent extends HTMLIFrameElement { - iFrameResizer: IFrameObject; - } + // tslint:disable-next-line:interface-name + interface IFrameComponent extends HTMLIFrameElement { + iFrameResizer: IFrameObject; + } - // tslint:disable-next-line:interface-name - interface IFrameOptions { - /** - * When enabled changes to the Window size or the DOM will cause the iFrame to resize to the new content size. - * Disable if using size method with custom dimensions. - */ - autoResize?: boolean; - /** - * Override the body background style in the iFrame. - */ - bodyBackground?: string; - /** - * Override the default body margin style in the iFrame. A string can be any valid value for the - * CSS margin attribute, for example '8px 3em'. A number value is converted into px. - */ - bodyMargin?: number; - /** - * When set to true, only allow incoming messages from the domain listed in the src property of the iFrame tag. - * If your iFrame navigates between different domains, ports or protocols; then you will need to - * provide an array of URLs or disable this option. - */ - checkOrigin?: boolean; - /** - * When enabled in page linking inside the iFrame and from the iFrame to the parent page will be enabled. - */ - inPageLinks?: boolean; - /** - * Height calculation method. - */ - heightCalculationMethod?: string; - /** - * Set iFrame Id - */ - id?: string; - /** - * In browsers that don't support mutationObserver, such as IE10, the library falls back to using - * setInterval, to check for changes to the page size. - */ - interval?: number; - /** - * Setting the log option to true will make the scripts in both the host page and the iFrame output - * everything they do to the JavaScript console so you can see the communication between the two scripts. - */ - log?: boolean; - /** - * Set maximum height of iFrame. - */ - maxHeight?: number; - /** - * Set maximum width of iFrame. - */ - maxWidth?: number; - /** - * Set minimum height of iFrame. - */ - minHeight?: number; - /** - * Set minimum width of iFrame. - */ - minWidth?: number; - /** - * Listen for resize events from the parent page, or the iFrame. Select the 'child' value if the iFrame - * can be resized independently of the browser window. Selecting this value can cause issues with some - * height calculation methods on mobile devices. - */ - resizeFrom?: string; - /** - * Enable scroll bars in iFrame. - */ - scrolling?: boolean; - /** - * Resize iFrame to content height. - */ - sizeHeight?: boolean; - /** - * Resize iFrame to content width. - */ - sizeWidth?: boolean; - /** - * Set the number of pixels the iFrame content size has to change by, before triggering a resize of the iFrame. - */ - tolerance?: number; - /** - * Width calculation method. - */ - widthCalculationMethod?: string; - /** - * Called when iFrame is closed via parentIFrame.close() or iframe.iframeResizer.close() methods. - */ - closedCallback?: (iframeId?: string) => void; - /** - * Initial setup callback function. - */ - initCallback?: (iframe?: IFrameComponent) => void; - /** - * Receive message posted from iFrame with the parentIFrame.sendMessage() method. - */ - messageCallback?: (data: IFrameMessageData) => void; - /** - * Function called after iFrame resized. Passes in messageData object containing the iFrame, height, width - * and the type of event that triggered the iFrame to resize. - */ - resizedCallback?: (data: IFrameResizedData) => void; - /** - * Called before the page is repositioned after a request from the iFrame, due to either an in page link, - * or a direct request from either parentIFrame.scrollTo() or parentIFrame.scrollToOffset(). - * If this callback function returns false, it will stop the library from repositioning the page, so that - * you can implement your own animated page scrolling instead. - */ - scrollCallback?: (data: IFrameScrollData) => boolean; - } + // tslint:disable-next-line:interface-name + interface IFrameOptions { + /** + * When enabled changes to the Window size or the DOM will cause the iFrame to resize to the new content size. + * Disable if using size method with custom dimensions. + */ + autoResize?: boolean; + /** + * Override the body background style in the iFrame. + */ + bodyBackground?: string; + /** + * Override the default body margin style in the iFrame. A string can be any valid value for the + * CSS margin attribute, for example '8px 3em'. A number value is converted into px. + */ + bodyMargin?: number; + /** + * When set to true, only allow incoming messages from the domain listed in the src property of the iFrame tag. + * If your iFrame navigates between different domains, ports or protocols; then you will need to + * provide an array of URLs or disable this option. + */ + checkOrigin?: boolean; + /** + * When enabled in page linking inside the iFrame and from the iFrame to the parent page will be enabled. + */ + inPageLinks?: boolean; + /** + * Height calculation method. + */ + heightCalculationMethod?: HeightCalculationMethod; + /** + * Set iFrame Id + */ + id?: string; + /** + * In browsers that don't support mutationObserver, such as IE10, the library falls back to using + * setInterval, to check for changes to the page size. + */ + interval?: number; + /** + * Setting the log option to true will make the scripts in both the host page and the iFrame output + * everything they do to the JavaScript console so you can see the communication between the two scripts. + */ + log?: boolean; + /** + * Set maximum height of iFrame. + */ + maxHeight?: number; + /** + * Set maximum width of iFrame. + */ + maxWidth?: number; + /** + * Set minimum height of iFrame. + */ + minHeight?: number; + /** + * Set minimum width of iFrame. + */ + minWidth?: number; + /** + * Listen for resize events from the parent page, or the iFrame. Select the 'child' value if the iFrame + * can be resized independently of the browser window. Selecting this value can cause issues with some + * height calculation methods on mobile devices. + */ + resizeFrom?: 'parent' | 'child'; + /** + * Enable scroll bars in iFrame. + */ + scrolling?: boolean | 'auto'; + /** + * Resize iFrame to content height. + */ + sizeHeight?: boolean; + /** + * Resize iFrame to content width. + */ + sizeWidth?: boolean; + /** + * Set the number of pixels the iFrame content size has to change by, before triggering a resize of the iFrame. + */ + tolerance?: number; + /** + * Width calculation method. + */ + widthCalculationMethod?: WidthCalculationMethod; + /** + * Called when iFrame is closed via parentIFrame.close() or iframe.iframeResizer.close() methods. + */ + closedCallback?: (iframeId: string) => void; + /** + * Initial setup callback function. + */ + initCallback?: (iframe: IFrameComponent) => void; + /** + * Receive message posted from iFrame with the parentIFrame.sendMessage() method. + */ + messageCallback?: (data: IFrameMessageData) => void; + /** + * Function called after iFrame resized. Passes in messageData object containing the iFrame, height, width + * and the type of event that triggered the iFrame to resize. + */ + resizedCallback?: (data: IFrameResizedData) => void; + /** + * Called before the page is repositioned after a request from the iFrame, due to either an in page link, + * or a direct request from either parentIFrame.scrollTo() or parentIFrame.scrollToOffset(). + * If this callback function returns false, it will stop the library from repositioning the page, so that + * you can implement your own animated page scrolling instead. + */ + scrollCallback?: (data: IFrameScrollData) => boolean; + } - // tslint:disable-next-line:interface-name - interface IFramePageOptions { - /** - * This option allows you to restrict the domain of the parent page, - * to prevent other sites mimicking your parent page. - */ - targetOrigin?: string; - /** - * Receive message posted from the parent page with the iframe.iFrameResizer.sendMessage() method. - */ - messageCallback?: (message: any) => void; - /** - * This function is called once iFrame-Resizer has been initialized after receiving a call from the parent page. - */ - readyCallback?: () => void; - /** - * These option can be used to override the option set in the parent page - */ - heightCalculationMethod?: string; - /** - * These option can be used to override the option set in the parent page - */ - widthCalculationMethod?: string; - } + // tslint:disable-next-line:interface-name + interface IFramePageOptions { + /** + * This option allows you to restrict the domain of the parent page, + * to prevent other sites mimicking your parent page. + */ + targetOrigin?: string; + /** + * Receive message posted from the parent page with the iframe.iFrameResizer.sendMessage() method. + */ + messageCallback?: (message: any) => void; + /** + * This function is called once iFrame-Resizer has been initialized after receiving a call from the parent page. + */ + readyCallback?: () => void; + /** + * These option can be used to override the option set in the parent page + */ + heightCalculationMethod?: HeightCalculationMethod | (() => number); + /** + * These option can be used to override the option set in the parent page + */ + widthCalculationMethod?: WidthCalculationMethod | (() => number); + } - // tslint:disable-next-line:interface-name - interface IFramePage { - autoResize(resize?: boolean): boolean; - close(): void; - getId(): string; - getPageInfo(callback: (data: any) => void | false): void; - scrollTo(x: number, y: number): void; - scrollToOffset(x: number, y: number): void; - sendMessage(message: any, targetOrigin: string): void; - setHeightCalculationMethod(method: string): void; - setWidthCalculationMethod(method: string): void; - setTargetOrigin(targetOrigin: string): void; - size(customHeight: string, customWidth: string): void; - } + type HeightCalculationMethod = 'bodyOffset' | 'bodyScroll' | 'documentElementOffset' | 'documentElementScroll' | + 'max' | 'min' | 'grow' | 'lowestElement' | 'taggedElement'; - // tslint:disable-next-line:interface-name - interface IFrameResizedData { - iframe: IFrameComponent; - height: number; - width: number; - type: string; - } + type WidthCalculationMethod = 'bodyOffset' | 'bodyScroll' | 'documentElementOffset' | 'documentElementScroll' | + 'max' | 'min' | 'scroll' | 'rightMostElement' | 'taggedElement'; - // tslint:disable-next-line:interface-name - interface IFrameMessageData { - iframe: IFrameComponent; - message: string; - } + // tslint:disable-next-line:interface-name + interface IFramePage { + /** + * Turn autoResizing of the iFrame on and off. Returns bool of current state. + */ + autoResize(resize?: boolean): boolean; + /** + * Remove the iFrame from the parent page. + */ + close(): void; + /** + * Returns the ID of the iFrame that the page is contained in. + */ + getId(): string; + /** + * Ask the containing page for its positioning coordinates. + * + * Your callback function will be recalled when the parent page is scrolled or resized. + * + * Pass false to disable the callback. + */ + getPageInfo(callback: ((data: PageInfo) => void) | false): void; + /** + * Scroll the parent page to the coordinates x and y + */ + scrollTo(x: number, y: number): void; + /** + * Scroll the parent page to the coordinates x and y relative to the position of the iFrame. + */ + scrollToOffset(x: number, y: number): void; + /** + * Send data to the containing page, message can be any data type that can be serialized into JSON. The `targetOrigin` + * option is used to restrict where the message is sent to; to stop an attacker mimicking your parent page. + * See the MDN documentation on postMessage for more details. + */ + sendMessage(message: any, targetOrigin?: string): void; + /** + * Change the method use to workout the height of the iFrame. + */ + setHeightCalculationMethod(method: HeightCalculationMethod): void; + /** + * Change the method use to workout the width of the iFrame. + */ + setWidthCalculationMethod(method: WidthCalculationMethod): void; + /** + * Set default target origin. + */ + setTargetOrigin(targetOrigin: string): void; + /** + * Manually force iFrame to resize. To use passed arguments you need first to disable the `autoResize` option to + * prevent auto resizing and enable the `sizeWidth` option if you wish to set the width. + */ + size(customHeight?: string, customWidth?: string): void; + } - // tslint:disable-next-line:interface-name - interface IFrameScrollData { - x: number; - y: number; - } + interface PageInfo { + /** + * The height of the iframe in pixels + */ + iframeHeight: number; + /** + * The width of the iframe in pixels + */ + iframeWidth: number; + /** + * The height of the viewport in pixels + */ + clientHeight: number; + /** + * The width of the viewport in pixels + */ + clientWidth: number; + /** + * The number of pixels between the left edge of the containing page and the left edge of the iframe + */ + offsetLeft: number; + /** + * The number of pixels between the top edge of the containing page and the top edge of the iframe + */ + offsetTop: number; + /** + * The number of pixels between the left edge of the iframe and the left edge of the iframe viewport + */ + scrollLeft: number; + /** + * The number of pixels between the top edge of the iframe and the top edge of the iframe viewport + */ + scrollTop: number; + } - function iframeResizer(options: IFrameOptions, target: HTMLElement): IFrameComponent[]; + // tslint:disable-next-line:interface-name + interface IFrameResizedData { + iframe: IFrameComponent; + height: number; + width: number; + type: string; + } + + // tslint:disable-next-line:interface-name + interface IFrameMessageData { + iframe: IFrameComponent; + message: string; + } + + // tslint:disable-next-line:interface-name + interface IFrameScrollData { + x: number; + y: number; + } + + function iframeResizer(options: IFrameOptions, target: string | HTMLElement): IFrameComponent[]; } // tslint:enable:prefer-method-signature diff --git a/types/jquery/index.d.ts b/types/jquery/index.d.ts index 4ebb4692f5..2fd196fd41 100644 --- a/types/jquery/index.d.ts +++ b/types/jquery/index.d.ts @@ -587,7 +587,7 @@ interface JQueryStatic { * @see {@link https://api.jquery.com/jQuery.isEmptyObject/} * @since 1.4 */ - isEmptyObject(obj: any): obj is {}; + isEmptyObject(obj: any): boolean; /** * Determine if the argument passed is a JavaScript function object. * diff --git a/types/jquery/jquery-tests.ts b/types/jquery/jquery-tests.ts index 01cc4a345e..4bbe9c553e 100644 --- a/types/jquery/jquery-tests.ts +++ b/types/jquery/jquery-tests.ts @@ -622,17 +622,16 @@ function JQueryStatic() { if ($.isArray(obj)) { // $ExpectType any[] obj; + } else { + // $ExpectType object + obj; } } } function isEmptyObject() { - function type_guard(obj: object) { - if ($.isEmptyObject(obj)) { - // $ExpectType {} - obj; - } - } + // $ExpectType boolean + $.isEmptyObject({}); } function isFunction() { @@ -640,6 +639,9 @@ function JQueryStatic() { if ($.isFunction(obj)) { // $ExpectType Function obj; + } else { + // $ExpectType object + obj; } } } @@ -649,6 +651,9 @@ function JQueryStatic() { if ($.isNumeric(obj)) { // $ExpectType (true & number) | (false & number) obj; + } else { + // $ExpectType boolean + obj; } } } @@ -667,6 +672,9 @@ function JQueryStatic() { if ($.isWindow(obj)) { // $ExpectType Window obj; + } else { + // $ExpectType object + obj; } } } diff --git a/types/mongoose/index.d.ts b/types/mongoose/index.d.ts index 12da9c180b..3c48f309f6 100644 --- a/types/mongoose/index.d.ts +++ b/types/mongoose/index.d.ts @@ -1,6 +1,6 @@ -// Type definitions for Mongoose 4.7.0 +// Type definitions for Mongoose 4.7.1 // Project: http://mongoosejs.com/ -// Definitions by: simonxca , horiuchi , sindrenm +// Definitions by: simonxca , horiuchi , sindrenm , lukasz-zak // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.3 @@ -388,6 +388,9 @@ declare module "mongoose" { /** sets the underlying driver's promise library (see http://mongodb.github.io/node-mongodb-native/2.1/api/MongoClient.html) */ promiseLibrary?: any; + + /** See http://mongoosejs.com/docs/connections.html#use-mongo-client **/ + useMongoClient?: boolean; } interface ConnectionOptions extends diff --git a/types/react-transition-group/CSSTransition.d.ts b/types/react-transition-group/CSSTransition.d.ts index 763ea80a0f..67b869edf6 100644 --- a/types/react-transition-group/CSSTransition.d.ts +++ b/types/react-transition-group/CSSTransition.d.ts @@ -33,6 +33,6 @@ export interface CSSTransitionProps extends TransitionProps { classNames: string | CSSTransitionClassNames; } -declare class CSSTransition extends Component {} +declare class CSSTransition extends Component {} export default CSSTransition; diff --git a/types/react-transition-group/Transition.d.ts b/types/react-transition-group/Transition.d.ts index 844561333c..24f0265ee2 100644 --- a/types/react-transition-group/Transition.d.ts +++ b/types/react-transition-group/Transition.d.ts @@ -66,6 +66,6 @@ export interface TransitionProps extends TransitionActions { * ``` * */ -declare class Transition extends Component {} +declare class Transition extends Component {} export default Transition; diff --git a/types/react-transition-group/TransitionGroup.d.ts b/types/react-transition-group/TransitionGroup.d.ts index e746d3ca77..3f04332bc8 100644 --- a/types/react-transition-group/TransitionGroup.d.ts +++ b/types/react-transition-group/TransitionGroup.d.ts @@ -1,4 +1,4 @@ -import { Component, HTMLProps, ReactElement, ReactType } from "react"; +import { Component, ReactType, HTMLProps, ReactElement } from "react"; import { TransitionActions, TransitionProps } from "react-transition-group/Transition"; export interface IntrinsicTransitionGroupProps extends TransitionActions { @@ -71,6 +71,6 @@ export type TransitionGroupProps {} +declare class TransitionGroup extends Component {} export default TransitionGroup; diff --git a/types/sinon/index.d.ts b/types/sinon/index.d.ts index 75e87baae1..30a64b9d81 100644 --- a/types/sinon/index.d.ts +++ b/types/sinon/index.d.ts @@ -96,8 +96,8 @@ declare namespace Sinon { interface SinonSpyStatic { (): SinonSpy; - (func: any): SinonSpy; - (obj: any, method: string): SinonSpy; + (func: Function): SinonSpy; + (obj: T, method: keyof T): SinonSpy; } interface SinonStatic { @@ -153,8 +153,8 @@ declare namespace Sinon { interface SinonStubStatic { (): SinonStub; (obj: any): SinonStub; - (obj: any, method: string): SinonStub; - (obj: any, method: string, func: any): SinonStub; + (obj: T, method: keyof T): SinonStub; + (obj: T, method: keyof T, func: Function): SinonStub; } interface SinonStatic { diff --git a/types/sinon/sinon-tests.ts b/types/sinon/sinon-tests.ts index 406c790a2b..cd48901dd0 100644 --- a/types/sinon/sinon-tests.ts +++ b/types/sinon/sinon-tests.ts @@ -30,7 +30,7 @@ function testTwo() { function testThree() { let obj = { thisObj: true }; - let callback = sinon.spy({}, "method"); + let callback = sinon.spy({}, "method"); let proxy = once(callback); proxy.call(obj, callback, 1, 2, 3); if (callback.calledOn(obj)) { console.log("test3 calledOn success"); } else { console.log("test3 calledOn failure"); } @@ -168,7 +168,7 @@ function testSetMatcher() { } function testGetterStub() { - const myObj: any = { + const myObj = { prop: 'foo' }; @@ -177,7 +177,7 @@ function testGetterStub() { } function testSetterStub() { - const myObj: any = { + const myObj = { prop: 'foo', prop2: 'bar' }; @@ -187,7 +187,7 @@ function testSetterStub() { } function testValueStub() { - const myObj: any = { + const myObj = { prop: 'foo' }; diff --git a/types/stripe-v2/index.d.ts b/types/stripe-v2/index.d.ts new file mode 100644 index 0000000000..563fb89780 --- /dev/null +++ b/types/stripe-v2/index.d.ts @@ -0,0 +1,173 @@ +// Type definitions for stripe-v2 2.x +// Project: https://stripe.com/ +// Definitions by: Andy Hawkins +// Eric J. Smith +// Amrit Kahlon +// Adam Cmiel +// Justin Leider +// Kamil Gałuszka +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare var Stripe: stripe.StripeStatic; + +declare namespace stripe { + interface StripeStatic { + applePay: StripeApplePay; + setPublishableKey(key: string): void; + validateCardNumber(cardNumber: string): boolean; + validateExpiry(month: string, year: string): boolean; + validateCVC(cardCVC: string): boolean; + cardType(cardNumber: string): StripeCardDataBrand; + getToken(token: string, responseHandler: (status: number, response: StripeCardTokenResponse) => void): void; + card: StripeCard; + createToken(data: StripeCardTokenData, responseHandler: (status: number, response: StripeCardTokenResponse) => void): void; + bankAccount: StripeBankAccount; + } + + interface StripeCardTokenData { + number: string; + exp_month?: number; + exp_year?: number; + exp?: string; + cvc?: string; + name?: string; + address_line1?: string; + address_line2?: string; + address_city?: string; + address_state?: string; + address_zip?: string; + address_country?: string; + } + + interface StripeTokenResponse { + id: string; + client_ip: string; + created: number; + livemode: boolean; + object: string; + type: string; + used: boolean; + error?: StripeError; + } + + interface StripeCardTokenResponse extends StripeTokenResponse { + card: StripeCard; + } + + interface StripeError { + type: string; + code: string; + message: string; + param?: string; + } + + type StripeCardDataBrand = 'Visa' | 'American Express' | 'MasterCard' | 'Discover' | 'JCB' | 'Diners Club' | 'Unknown'; + + type StripeCardDataFunding = 'credit' | 'debit' | 'prepaid' | 'unknown'; + + interface StripeCard { + object: string; + last4: string; + exp_month: number; + exp_year: number; + country?: string; + name?: string; + address_line1?: string; + address_line2?: string; + address_city?: string; + address_state?: string; + address_zip?: string; + address_country?: string; + brand?: StripeCardDataBrand; + funding?: StripeCardDataFunding; + createToken(data: StripeCardTokenData, responseHandler: (status: number, response: StripeCardTokenResponse) => void): void; + validateCardNumber(cardNumber: string): boolean; + validateExpiry(month: string, year: string): boolean; + validateCVC(cardCVC: string): boolean; + } + + interface StripeBankAccount { + createToken(params: StripeBankTokenParams, stripeResponseHandler: (status: number, response: StripeBankTokenResponse) => void): void; + validateRoutingNumber(routingNumber: number | string, countryCode: string): boolean; + validateAccountNumber(accountNumber: number | string, countryCode: string): boolean; + } + + interface StripeBankTokenParams { + country: string; + currency: string; + account_number: number | string; + routing_number?: number | string; + account_holder_name: string; + account_holder_type: string; + } + + interface StripeBankTokenResponse extends StripeTokenResponse { + bank_account: { + country: string; + bank_name: string; + last4: number; + validated: boolean; + object: string; + }; + } + + interface StripeApplePay { + checkAvailability(resopnseHandler: (result: boolean) => void): void; + buildSession(data: StripeApplePayPaymentRequest, + onSuccessHandler: (result: StripeApplePaySessionResult, completion: ((value: any) => void)) => void, + onErrorHanlder: (error: { message: string }) => void): any; + } + + type StripeApplePayBillingContactField = 'postalAddress' | 'name'; + type StripeApplePayShippingContactField = StripeApplePayBillingContactField | 'phone' | 'email'; + type StripeApplePayShipping = 'shipping' | 'delivery' | 'storePickup' | 'servicePickup'; + + interface StripeApplePayPaymentRequest { + billingContact: StripeApplePayPaymentContact; + countryCode: string; + currencyCode: string; + total: StripeApplePayLineItem; + lineItems?: StripeApplePayLineItem[]; + requiredBillingContactFields?: StripeApplePayBillingContactField[]; + requiredShippingContactFields?: StripeApplePayShippingContactField[]; + shippingContact?: StripeApplePayPaymentContact; + shippingMethods?: StripeApplePayShippingMethod[]; + shippingType?: StripeApplePayShipping[]; + } + + // https://developer.apple.com/reference/applepayjs/1916082-applepay_js_data_types + interface StripeApplePayLineItem { + type: 'pending' | 'final'; + label: string; + amount: number; + } + + interface StripeApplePaySessionResult { + token: StripeCardTokenResponse; + shippingContact?: StripeApplePayPaymentContact; + shippingMethod?: StripeApplePayShippingMethod; + } + + interface StripeApplePayShippingMethod { + label: string; + detail: string; + amount: number; + identifier: string; + } + + interface StripeApplePayPaymentContact { + emailAddress: string; + phoneNumber: string; + givenName: string; + familyName: string; + addressLines: string[]; + locality: string; + administrativeArea: string; + postalCode: string; + countryCode: string; + } +} + +// The Stripe client side APIs are not made available to package managers for direct installation. +// As explained compliance reasons. Source: https://github.com/stripe/stripe-node/blob/master/README.md#these-are-serverside-bindings-only +// A release date versioning schema is used to version these APIs. diff --git a/types/stripe-v2/stripe-v2-tests.ts b/types/stripe-v2/stripe-v2-tests.ts new file mode 100644 index 0000000000..936d311f53 --- /dev/null +++ b/types/stripe-v2/stripe-v2-tests.ts @@ -0,0 +1,32 @@ +declare function describe(desc: string, fn: () => void): void; +declare function it(desc: string, fn: () => void): void; + +describe("Stripe", () => { + it("should excercise Stripe API", () => { + function success(card: stripe.StripeCard) { + console.log(card.brand && card.brand.toString()); + } + + const cardNumber = '4242424242424242'; + + const isValid = Stripe.validateCardNumber(cardNumber); + if (isValid) { + const tokenData: stripe.StripeCardTokenData = { + number: cardNumber, + exp_month: 1, + exp_year: 2100, + cvc: '111' + }; + Stripe.card.createToken(tokenData, (status, response) => { + if (response.error) { + console.error(response.error.message); + if (response.error.param) { + console.error(response.error.param); + } + } else { + success(response.card); + } + }); + } + }); +}); diff --git a/types/stripe/tsconfig.json b/types/stripe-v2/tsconfig.json similarity index 93% rename from types/stripe/tsconfig.json rename to types/stripe-v2/tsconfig.json index c15aeceae9..a40e816e5a 100644 --- a/types/stripe/tsconfig.json +++ b/types/stripe-v2/tsconfig.json @@ -18,6 +18,6 @@ }, "files": [ "index.d.ts", - "stripe-tests.ts" + "stripe-v2-tests.ts" ] } diff --git a/types/stripe/tslint.json b/types/stripe-v2/tslint.json similarity index 100% rename from types/stripe/tslint.json rename to types/stripe-v2/tslint.json diff --git a/types/stripe/index.d.ts b/types/stripe-v3/index.d.ts similarity index 93% rename from types/stripe/index.d.ts rename to types/stripe-v3/index.d.ts index f58d5e602f..2337e6adc2 100644 --- a/types/stripe/index.d.ts +++ b/types/stripe-v3/index.d.ts @@ -1,20 +1,30 @@ -// Type definitions for stripe 3.0 +// Type definitions for stripe-v3 3.0 // Project: https://stripe.com/ // Definitions by: Andy Hawkins // Eric J. Smith // Amrit Kahlon // Adam Cmiel // Justin Leider +// Kamil Gałuszka // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -export function Stripe(stripePublicKey: string): stripe.StripeStatic; +declare var Stripe: stripe.StripeStatic; -export namespace stripe { +declare namespace stripe { interface StripeStatic { + (publicKey: string): Stripe; + version: number; + } + + interface Stripe { elements(options?: elements.ElementsCreateOptions): elements.Elements; createToken(element: elements.Element, options?: TokenOptions): Promise; } + interface StripeOptions { + stripeAccount: string; + } + interface TokenOptions { name?: string; address_line1?: string; @@ -153,7 +163,7 @@ export namespace stripe { empty?: Style; invalid?: Style; }; - value?: string | {[objectKey: string]: string; }; + value?: string | { [objectKey: string]: string; }; } interface Style extends StyleOptions { diff --git a/types/stripe-v3/stripe-v3-tests.ts b/types/stripe-v3/stripe-v3-tests.ts new file mode 100644 index 0000000000..acf878d945 --- /dev/null +++ b/types/stripe-v3/stripe-v3-tests.ts @@ -0,0 +1,113 @@ +/// + +declare function describe(desc: string, fn: () => void): void; +declare function it(desc: string, fn: () => void): void; + +describe("Stripe", () => { + it("should excercise all Stripe API", () => { + const stripe = Stripe('public-key'); + const elements = stripe.elements(); + const style = { + base: { + color: '#32325d', + lineHeight: '24px', + fontFamily: 'Roboto, "Helvetica Neue", sans-serif', + fontSmoothing: 'antialiased', + fontSize: '16px', + '::placeholder': { + color: '#aab7c4' + } + }, + invalid: { + color: '#B71C1C', + iconColor: '#B71C1C' + } + }; + const card = elements.create('card', { hidePostalCode: true, style }); + card.mount(document.createElement('div')); + card.on('ready', () => { + console.log('ready'); + }); + card.on('change', (resp: stripe.elements.ElementChangeResponse) => { + console.log(resp.brand); + }); + stripe.createToken(card, { + name: 'Jimmy', + address_city: 'Toronto', + address_country: 'Canada' + }) + .then((result: stripe.TokenResponse) => { + console.log(result.token); + }, + (error: stripe.Error) => { + console.error(error); + }); + }); +}); + +describe("Stripe v2 & v3", () => { + it("should excercise all Stripe API", () => { + function success(card: stripe.StripeCard) { + console.log(card.brand && card.brand.toString()); + } + + const cardNumber = '4242424242424242'; + + const isValid = Stripe.validateCardNumber(cardNumber); + if (isValid) { + const tokenData: stripe.StripeCardTokenData = { + number: cardNumber, + exp_month: 1, + exp_year: 2100, + cvc: '111' + }; + Stripe.card.createToken(tokenData, (status, response) => { + if (response.error) { + console.error(response.error.message); + if (response.error.param) { + console.error(response.error.param); + } + } else { + success(response.card); + } + }); + } + const stripe = Stripe('public-key'); + const elements = stripe.elements(); + const style = { + base: { + color: '#32325d', + lineHeight: '24px', + fontFamily: 'Roboto, "Helvetica Neue", sans-serif', + fontSmoothing: 'antialiased', + fontSize: '16px', + '::placeholder': { + color: '#aab7c4' + } + }, + invalid: { + color: '#B71C1C', + iconColor: '#B71C1C' + } + }; + const card = elements.create('card', { hidePostalCode: true, style }); + card.mount(document.createElement('div')); + card.on('ready', () => { + console.log('ready'); + }); + card.on('change', (resp: stripe.elements.ElementChangeResponse) => { + console.log(resp.brand); + }); + stripe.createToken(card, { + name: 'Jimmy', + address_city: 'Toronto', + address_country: 'Canada' + }) + .then((result: stripe.TokenResponse) => { + console.log(result.token); + }, + (error: stripe.Error) => { + console.error(error); + }); + }); +}); diff --git a/types/stripe/v2/tsconfig.json b/types/stripe-v3/tsconfig.json similarity index 73% rename from types/stripe/v2/tsconfig.json rename to types/stripe-v3/tsconfig.json index 5917b8206d..4740cec2c1 100644 --- a/types/stripe/v2/tsconfig.json +++ b/types/stripe-v3/tsconfig.json @@ -8,19 +8,16 @@ "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, - "baseUrl": "../../", + "baseUrl": "../", "typeRoots": [ - "../../" + "../" ], "types": [], - "paths": { - "stripe": ["stripe/v2"] - }, "noEmit": true, "forceConsistentCasingInFileNames": true }, "files": [ "index.d.ts", - "stripe-tests.ts" + "stripe-v3-tests.ts" ] } diff --git a/types/stripe/v2/tslint.json b/types/stripe-v3/tslint.json similarity index 100% rename from types/stripe/v2/tslint.json rename to types/stripe-v3/tslint.json diff --git a/types/stripe/stripe-tests.ts b/types/stripe/stripe-tests.ts deleted file mode 100644 index f777c0eb34..0000000000 --- a/types/stripe/stripe-tests.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {stripe, Stripe} from 'stripe'; - -const stripe = Stripe('public-key'); -const elements = stripe.elements(); -const style = { - base: { - color: '#32325d', - lineHeight: '24px', - fontFamily: 'Roboto, "Helvetica Neue", sans-serif', - fontSmoothing: 'antialiased', - fontSize: '16px', - '::placeholder': { - color: '#aab7c4' - } - }, - invalid: { - color: '#B71C1C', - iconColor: '#B71C1C' - } -}; -const card = elements.create('card', {hidePostalCode: true, style}); -card.mount(document.createElement('div')); -card.on('ready', () => { - console.log('ready'); -}); -card.on('change', (resp: stripe.elements.ElementChangeResponse) => { - console.log(resp.brand); -}); -stripe.createToken(card, { - name: 'Jimmy', - address_city: 'Toronto', - address_country: 'Canada' -}) -.then((result: stripe.TokenResponse) => { - console.log(result.token); -}, -(error: stripe.Error) => { - console.error(error); -}); diff --git a/types/stripe/v2/index.d.ts b/types/stripe/v2/index.d.ts deleted file mode 100644 index cc486b5d5b..0000000000 --- a/types/stripe/v2/index.d.ts +++ /dev/null @@ -1,170 +0,0 @@ -// Type definitions for stripe 2.x -// Project: https://stripe.com/ -// Definitions by: Andy Hawkins -// Eric J. Smith -// Amrit Kahlon -// Adam Cmiel -// Justin Leider -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -declare const Stripe: StripeStatic; - -interface StripeStatic { - applePay: StripeApplePay; - setPublishableKey(key: string): void; - validateCardNumber(cardNumber: string): boolean; - validateExpiry(month: string, year: string): boolean; - validateCVC(cardCVC: string): boolean; - cardType(cardNumber: string): StripeCardDataBrand; - getToken(token: string, responseHandler: (status: number, response: StripeCardTokenResponse) => void): void; - card: StripeCard; - createToken(data: StripeCardTokenData, responseHandler: (status: number, response: StripeCardTokenResponse) => void): void; - bankAccount: StripeBankAccount; -} - -interface StripeCardTokenData { - number: string; - exp_month?: number; - exp_year?: number; - exp?: string; - cvc?: string; - name?: string; - address_line1?: string; - address_line2?: string; - address_city?: string; - address_state?: string; - address_zip?: string; - address_country?: string; -} - -interface StripeTokenResponse { - id: string; - client_ip: string; - created: number; - livemode: boolean; - object: string; - type: string; - used: boolean; - error?: StripeError; -} - -interface StripeCardTokenResponse extends StripeTokenResponse { - card: StripeCard; -} - -interface StripeError { - type: string; - code: string; - message: string; - param?: string; -} - -type StripeCardDataBrand = 'Visa' | 'American Express' | 'MasterCard' | 'Discover' | 'JCB' | 'Diners Club' | 'Unknown'; - -type StripeCardDataFunding = 'credit' | 'debit' | 'prepaid' | 'unknown'; - -interface StripeCard { - object: string; - last4: string; - exp_month: number; - exp_year: number; - country?: string; - name?: string; - address_line1?: string; - address_line2?: string; - address_city?: string; - address_state?: string; - address_zip?: string; - address_country?: string; - brand?: StripeCardDataBrand; - funding?: StripeCardDataFunding; - createToken(data: StripeCardTokenData, responseHandler: (status: number, response: StripeCardTokenResponse) => void): void; - validateCardNumber(cardNumber: string): boolean; - validateExpiry(month: string, year: string): boolean; - validateCVC(cardCVC: string): boolean; -} - -interface StripeBankAccount { - createToken(params: StripeBankTokenParams, stripeResponseHandler: (status: number, response: StripeBankTokenResponse) => void): void; - validateRoutingNumber(routingNumber: number | string, countryCode: string): boolean; - validateAccountNumber(accountNumber: number | string, countryCode: string): boolean; -} - -interface StripeBankTokenParams { - country: string; - currency: string; - account_number: number | string; - routing_number?: number | string; - account_holder_name: string; - account_holder_type: string; -} - -interface StripeBankTokenResponse extends StripeTokenResponse { - bank_account: { - country: string; - bank_name: string; - last4: number; - validated: boolean; - object: string; - }; -} - -interface StripeApplePay { - checkAvailability(resopnseHandler: (result: boolean) => void): void; - buildSession(data: StripeApplePayPaymentRequest, - onSuccessHandler: (result: StripeApplePaySessionResult, completion: ((value: any) => void)) => void, - onErrorHanlder: (error: { message: string }) => void): any; -} - -type StripeApplePayBillingContactField = 'postalAddress' | 'name'; -type StripeApplePayShippingContactField = StripeApplePayBillingContactField | 'phone' | 'email'; -type StripeApplePayShipping = 'shipping' | 'delivery' | 'storePickup' | 'servicePickup'; - -interface StripeApplePayPaymentRequest { - billingContact: StripeApplePayPaymentContact; - countryCode: string; - currencyCode: string; - total: StripeApplePayLineItem; - lineItems?: StripeApplePayLineItem[]; - requiredBillingContactFields?: StripeApplePayBillingContactField[]; - requiredShippingContactFields?: StripeApplePayShippingContactField[]; - shippingContact?: StripeApplePayPaymentContact; - shippingMethods?: StripeApplePayShippingMethod[]; - shippingType?: StripeApplePayShipping[]; -} - -// https://developer.apple.com/reference/applepayjs/1916082-applepay_js_data_types -interface StripeApplePayLineItem { - type: 'pending' | 'final'; - label: string; - amount: number; -} - -interface StripeApplePaySessionResult { - token: StripeCardTokenResponse; - shippingContact?: StripeApplePayPaymentContact; - shippingMethod?: StripeApplePayShippingMethod; -} - -interface StripeApplePayShippingMethod { - label: string; - detail: string; - amount: number; - identifier: string; -} - -interface StripeApplePayPaymentContact { - emailAddress: string; - phoneNumber: string; - givenName: string; - familyName: string; - addressLines: string[]; - locality: string; - administrativeArea: string; - postalCode: string; - countryCode: string; -} - -// The Stripe client side APIs are not made available to package managers for direct installation. -// As explained compliance reasons. Source: https://github.com/stripe/stripe-node/blob/master/README.md#these-are-serverside-bindings-only -// A release date versioning schema is used to version these APIs. diff --git a/types/stripe/v2/stripe-tests.ts b/types/stripe/v2/stripe-tests.ts deleted file mode 100644 index 56e6343f5c..0000000000 --- a/types/stripe/v2/stripe-tests.ts +++ /dev/null @@ -1,25 +0,0 @@ -function success(card: StripeCard) { - console.log(card.brand && card.brand.toString()); -} - -const cardNumber = '4242424242424242'; - -const isValid = Stripe.validateCardNumber(cardNumber); -if (isValid) { - const tokenData: StripeCardTokenData = { - number: cardNumber, - exp_month: 1, - exp_year: 2100, - cvc: '111' - }; - Stripe.card.createToken(tokenData, (status, response) => { - if (response.error) { - console.error(response.error.message); - if (response.error.param) { - console.error(response.error.param); - } - } else { - success(response.card); - } - }); -}