Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit d02086d

Browse files
committed
fix: tests for type information
1 parent c178c5e commit d02086d

File tree

13 files changed

+789
-207
lines changed

13 files changed

+789
-207
lines changed

.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ tmp/
77

88
# TypeScript Declarations
99
types/
10+
type-tests/

.travis.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ language: node_js
33
node_js:
44
# we recommend testing addons with the same minimum supported node version as Ember CLI
55
# so that your addon works for all apps
6-
- "6"
6+
- '6'
77

88
sudo: false
99
dist: trusty
@@ -15,6 +15,7 @@ cache:
1515
yarn: true
1616
directories:
1717
- $HOME/.npm
18+
- $HOME/.dts
1819

1920
env:
2021
global:
@@ -46,6 +47,10 @@ jobs:
4647
include:
4748
- stage: lint
4849
script: yarn lint:js
50+
- stage: lint
51+
name: 'type information tests'
52+
node_js: 10
53+
script: ./node_modules/.bin/dtslint type-tests
4954
- stage: lint
5055
script: yarn commitlint-travis
5156
- stage: lint

addon/-private/promise.ts

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export default class AJAXPromise<T> extends Promise<T> {
2121
) => void,
2222
label?: string
2323
) {
24-
// @ts-ignore
2524
super(executor, label);
2625
}
2726

addon/mixins/ajax-request.ts

+73-61
Original file line numberDiff line numberDiff line change
@@ -285,75 +285,87 @@ export default Mixin.create({
285285

286286
const promise = new AJAXPromise<RawResponse>((resolve, reject) => {
287287
jqXHR
288-
.done((payload, textStatus, jqXHR) => {
289-
const response = this.handleResponse(
290-
jqXHR.status,
291-
parseResponseHeaders(jqXHR.getAllResponseHeaders()),
292-
payload,
293-
requestData
294-
);
295-
296-
if (isAjaxError(response)) {
297-
const rejectionParam: RawErrorResponse = {
298-
payload,
299-
textStatus,
300-
jqXHR,
301-
response
302-
};
303-
run.join(null, reject, rejectionParam);
304-
} else {
305-
const resolutionParam: RawResponse = {
306-
payload,
307-
textStatus,
308-
jqXHR,
309-
response
310-
};
311-
run.join(null, resolve, resolutionParam);
312-
}
313-
})
314-
.fail((jqXHR, textStatus, errorThrown) => {
315-
runInDebug(function() {
316-
const message = `The server returned an empty string for ${
317-
requestData.type
318-
} ${
319-
requestData.url
320-
}, which cannot be parsed into a valid JSON. Return either null or {}.`;
321-
const validJSONString = !(
322-
textStatus === 'parsererror' && jqXHR.responseText === ''
323-
);
324-
325-
warn(message, validJSONString, {
326-
id: 'ds.adapter.returned-empty-string-as-JSON'
327-
});
328-
});
329-
330-
const payload =
331-
this.parseErrorResponse(jqXHR.responseText) || errorThrown;
332-
let response;
333-
334-
if (textStatus === 'timeout') {
335-
response = new TimeoutError();
336-
} else if (textStatus === 'abort') {
337-
response = new AbortError();
338-
} else {
339-
response = this.handleResponse<typeof payload>(
288+
.done(
289+
(
290+
payload: any,
291+
textStatus: JQuery.Ajax.SuccessTextStatus,
292+
jqXHR: JQuery.jqXHR
293+
) => {
294+
const response = this.handleResponse(
340295
jqXHR.status,
341296
parseResponseHeaders(jqXHR.getAllResponseHeaders()),
342297
payload,
343298
requestData
344299
);
300+
301+
if (isAjaxError(response)) {
302+
const rejectionParam: RawErrorResponse = {
303+
payload,
304+
textStatus,
305+
jqXHR,
306+
response
307+
};
308+
run.join(null, reject, rejectionParam);
309+
} else {
310+
const resolutionParam: RawResponse = {
311+
payload,
312+
textStatus,
313+
jqXHR,
314+
response
315+
};
316+
run.join(null, resolve, resolutionParam);
317+
}
345318
}
319+
)
320+
.fail(
321+
(
322+
jqXHR: JQuery.jqXHR,
323+
textStatus: JQuery.Ajax.TextStatus,
324+
errorThrown: string
325+
) => {
326+
runInDebug(function() {
327+
const message = `The server returned an empty string for ${
328+
requestData.type
329+
} ${
330+
requestData.url
331+
}, which cannot be parsed into a valid JSON. Return either null or {}.`;
332+
const validJSONString = !(
333+
textStatus === 'parsererror' && jqXHR.responseText === ''
334+
);
335+
336+
warn(message, validJSONString, {
337+
id: 'ds.adapter.returned-empty-string-as-JSON'
338+
});
339+
});
346340

347-
const rejectionParam: RawErrorResponse = {
348-
payload,
349-
textStatus,
350-
jqXHR,
351-
errorThrown,
352-
response
353-
};
341+
const payload =
342+
this.parseErrorResponse(jqXHR.responseText) || errorThrown;
343+
let response;
344+
345+
if (textStatus === 'timeout') {
346+
response = new TimeoutError();
347+
} else if (textStatus === 'abort') {
348+
response = new AbortError();
349+
} else {
350+
response = this.handleResponse<typeof payload>(
351+
jqXHR.status,
352+
parseResponseHeaders(jqXHR.getAllResponseHeaders()),
353+
payload,
354+
requestData
355+
);
356+
}
354357

355-
run.join(null, reject, rejectionParam);
356-
})
358+
const rejectionParam: RawErrorResponse = {
359+
payload,
360+
textStatus,
361+
jqXHR,
362+
errorThrown,
363+
response
364+
};
365+
366+
run.join(null, reject, rejectionParam);
367+
}
368+
)
357369
.always(() => {
358370
pendingRequestCount = pendingRequestCount - 1;
359371
});

addon/utils/ajax.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import jQuery from 'jquery';
22

3-
const ajax =
3+
const ajax: (
4+
url: string,
5+
settings?: JQueryAjaxSettings | undefined
6+
) => JQueryXHR =
47
typeof FastBoot === 'undefined' ? jQuery.ajax : FastBoot.require('najax');
58

69
export default ajax;

package.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,14 @@
4949
"@types/ember": "^3.0.24",
5050
"@types/ember-data": "^3.1.1",
5151
"@types/ember-mocha": "^0.14.4",
52-
"@types/ember-test-helpers": "^1.0.3",
53-
"@types/ember-testing-helpers": "^0.0.3",
5452
"@types/ember__test-helpers": "^0.7.5",
5553
"@types/mocha": "^5.2.5",
5654
"@types/node": "^10.3.3",
5755
"@types/rsvp": "^4.0.2",
5856
"broccoli-asset-rev": "^2.7.0",
5957
"chai": "^4.1.2",
6058
"debug": "^3.1.0",
59+
"dtslint": "~0.4.0",
6160
"ember-cli": "~3.1.4",
6261
"ember-cli-chai": "^0.5.0",
6362
"ember-cli-dependency-checker": "^2.1.1",
@@ -93,6 +92,7 @@
9392
"husky": "^1.0.0-rc.9",
9493
"lint-staged": "^7.2.0",
9594
"loader.js": "^4.7.0",
95+
"natives": "^1.1.6",
9696
"prettier": "^1.13.5",
9797
"standard-version": "^4.4.0",
9898
"testdouble": "^3.8.1",
@@ -138,5 +138,8 @@
138138
"ember-source",
139139
"loader.js"
140140
]
141+
},
142+
"toolchain": {
143+
"node": "8.15.1"
141144
}
142145
}

type-tests/index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// TypeScript Version: 2.8

type-tests/tests.ts

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import Ember from 'ember';
2+
import AjaxService from 'ember-ajax/services/ajax';
3+
4+
// eslint-ignore-next-line
5+
declare global {
6+
const FastBoot: any;
7+
}
8+
9+
Ember.Route.extend({
10+
ajax: Ember.inject.service('ajax'),
11+
model() {
12+
return this.get('ajax').request('/posts');
13+
}
14+
});
15+
16+
Ember.Controller.extend({
17+
ajax: Ember.inject.service('ajax'),
18+
actions: {
19+
sendRequest() {
20+
this.get('ajax').headers; // $ExpectType Headers | undefined
21+
22+
return this.get('ajax').request('/posts', {
23+
method: 'POST',
24+
data: {
25+
foo: 'bar'
26+
}
27+
});
28+
}
29+
}
30+
});
31+
32+
AjaxService.extend({
33+
session: Ember.inject.service(),
34+
headers: Ember.computed('session.authToken', {
35+
get() {
36+
const headers: { [k: string]: string | undefined } = {};
37+
const authToken = this.get('session.authToken');
38+
if (authToken) {
39+
headers['auth-token'] = authToken;
40+
}
41+
return headers;
42+
}
43+
})
44+
});

type-tests/tsconfig.json

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"compilerOptions": {
3+
"module": "commonjs",
4+
"lib": ["es6", "dom"],
5+
"noImplicitAny": true,
6+
"noImplicitThis": true,
7+
"strictNullChecks": true,
8+
"strictFunctionTypes": true,
9+
"noEmit": true,
10+
"allowSyntheticDefaultImports": true,
11+
"downlevelIteration": true,
12+
"types": [],
13+
14+
// If the library is an external module (uses `export`), this allows your test file to import "mylib" instead of "./index".
15+
// If the library is global (cannot be imported via `import` or `require`), leave this out.
16+
"baseUrl": ".",
17+
"paths": {
18+
"ember-ajax": ["../addon"],
19+
"ember-ajax/*": ["../addon/*"]
20+
}
21+
},
22+
"files": ["tests.ts"]
23+
}

type-tests/tslint.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"extends": "dtslint/dtslint.json", // Or "dtslint/dt.json" if on DefinitelyTyped
3+
"rules": {
4+
"semicolon": false,
5+
"indent": false
6+
}
7+
}

types/ember-data.d.ts

-6
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// see https://github.com/typed-ember/ember-cli-typescript#fixing-the-ember-data-error-ts2344-problem
2+
export default interface ModelRegistry {
3+
[key: string]: any;
4+
}

0 commit comments

Comments
 (0)