Skip to content

Commit e7d12ae

Browse files
authored
refactor: Add more types to pass all type definition tests (#2486)
1 parent 539ba2a commit e7d12ae

35 files changed

+1110
-629
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
- name: Type Definition Check
3131
run: npm run ci:typecheck
3232
- name: Test Types
33-
run: npm run test:types 2>&1 | tee silent.txt;
33+
run: npm run test:types
3434
check-docs:
3535
name: Check Docs
3636
timeout-minutes: 10

eslint.config.test.mjs

-4
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ export default tseslint.config({
1616
rules: {
1717
'@typescript-eslint/no-unused-vars': 'off',
1818
'@typescript-eslint/no-unused-expressions': 'off',
19-
'@typescript-eslint/no-empty-object-type': 'off',
2019
'@typescript-eslint/no-unsafe-call': 'off',
21-
'@typescript-eslint/no-unsafe-member-access': 'off',
22-
'@typescript-eslint/no-unsafe-argument': 'off',
23-
'@typescript-eslint/no-unsafe-assignment': 'off',
2420
"@typescript-eslint/no-explicit-any": "off",
2521
"@typescript-eslint/no-unsafe-return": "off",
2622
},

src/Cloud.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,15 @@ import type { RequestOptions } from './RESTController';
3737
* @returns {Promise} A promise that will be resolved with the result
3838
* of the function.
3939
*/
40-
export function run(name: string, data: any, options: RequestOptions): Promise<any> {
40+
export function run<T extends () => any>(
41+
name: string,
42+
data?: null,
43+
options?: RequestOptions
44+
): Promise<ReturnType<T>>;
45+
export function run<
46+
T extends (param: { [P in keyof Parameters<T>[0]]: Parameters<T>[0][P] }) => any,
47+
>(name: string, data: Parameters<T>[0], options?: RequestOptions): Promise<ReturnType<T>>;
48+
export function run(name: string, data?: any, options?: RequestOptions): Promise<any> {
4149
if (typeof name !== 'string' || name.length === 0) {
4250
throw new TypeError('Cloud function name must be a string.');
4351
}
@@ -88,7 +96,7 @@ export function getJobStatus(jobStatusId: string): Promise<ParseObject> {
8896
}
8997

9098
const DefaultController = {
91-
run(name: string, data: any, options: RequestOptions) {
99+
run(name: string, data: any, options?: RequestOptions): Promise<any> {
92100
const RESTController = CoreManager.getRESTController();
93101
const payload = encode(data, true);
94102

@@ -105,12 +113,12 @@ const DefaultController = {
105113
});
106114
},
107115

108-
getJobsData(options: RequestOptions) {
116+
getJobsData(options?: RequestOptions): Promise<any> {
109117
const RESTController = CoreManager.getRESTController();
110118
return RESTController.request('GET', 'cloud_code/jobs/data', null, options);
111119
},
112120

113-
async startJob(name: string, data: any, options: RequestOptions) {
121+
async startJob(name: string, data: any, options?: RequestOptions): Promise<string> {
114122
const RESTController = CoreManager.getRESTController();
115123

116124
const payload = encode(data, true);

src/CoreManager.ts

+57-23
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ type AnalyticsController = {
1919
track: (name: string, dimensions: { [key: string]: string }) => Promise<any>;
2020
};
2121
type CloudController = {
22-
run: (name: string, data: any, options: RequestOptions) => Promise<any>;
23-
getJobsData: (options: RequestOptions) => Promise<any>;
22+
run: (name: string, data: any, options?: RequestOptions) => Promise<any>;
23+
getJobsData: (options?: RequestOptions) => Promise<any>;
2424
/** Returns promise which resolves with JobStatusId of the job */
25-
startJob: (name: string, data: any, options: RequestOptions) => Promise<string>;
25+
startJob: (name: string, data: any, options?: RequestOptions) => Promise<string>;
2626
};
2727
type ConfigController = {
2828
current: () => Promise<ParseConfig> | ParseConfig;
@@ -55,15 +55,15 @@ type ObjectController = {
5555
fetch: (
5656
object: ParseObject | Array<ParseObject>,
5757
forceFetch: boolean,
58-
options: RequestOptions
58+
options?: RequestOptions
5959
) => Promise<Array<ParseObject | undefined> | ParseObject | undefined>;
6060
save: (
6161
object: ParseObject | Array<ParseObject | ParseFile> | null,
62-
options: RequestOptions
62+
options?: RequestOptions
6363
) => Promise<ParseObject | Array<ParseObject> | ParseFile | undefined>;
6464
destroy: (
6565
object: ParseObject | Array<ParseObject>,
66-
options: RequestOptions
66+
options?: RequestOptions
6767
) => Promise<ParseObject | Array<ParseObject>>;
6868
};
6969
type ObjectStateController = {
@@ -92,18 +92,52 @@ type QueryController = {
9292
find(
9393
className: string,
9494
params: QueryJSON,
95-
options: RequestOptions
95+
options?: RequestOptions
9696
): Promise<{ results?: Array<ParseObject>; className?: string; count?: number }>;
9797
aggregate(
9898
className: string,
9999
params: any,
100-
options: RequestOptions
100+
options?: RequestOptions
101101
): Promise<{ results?: Array<any> }>;
102102
};
103-
type EventuallyQueue = {
104-
save: (object: ParseObject, serverOptions: SaveOptions) => Promise<any>;
105-
destroy: (object: ParseObject, serverOptions: RequestOptions) => Promise<any>;
106-
poll: (ms?: number) => void;
103+
export type QueueObject = {
104+
queueId: string;
105+
action: string;
106+
object: ParseObject;
107+
serverOptions: SaveOptions | RequestOptions;
108+
id: string;
109+
className: string;
110+
hash: string;
111+
createdAt: Date;
112+
};
113+
export type Queue = Array<QueueObject>;
114+
export type EventuallyQueue = {
115+
save: (object: ParseObject, serverOptions?: SaveOptions) => Promise<void>;
116+
destroy: (object: ParseObject, serverOptions?: RequestOptions) => Promise<void>;
117+
generateQueueId: (action: string, object: ParseObject) => string;
118+
enqueue(
119+
action: string,
120+
object: ParseObject,
121+
serverOptions?: SaveOptions | RequestOptions
122+
): Promise<void>;
123+
store(data: Queue): Promise<void>;
124+
load(): Promise<string | null>;
125+
getQueue(): Promise<Queue>;
126+
setQueue(queue: Queue): Promise<void>;
127+
remove(queueId: string): Promise<void>;
128+
clear(): Promise<void>;
129+
queueItemExists(queue: Queue, queueId: string): number;
130+
length(): Promise<number>;
131+
sendQueue(): Promise<boolean>;
132+
sendQueueCallback(object: ParseObject, queueObject: QueueObject): Promise<void>;
133+
poll(ms?: number): void;
134+
stopPoll(): void;
135+
isPolling(): boolean;
136+
process: {
137+
create(ObjectType: any, queueObject: any): Promise<void>;
138+
byId(ObjectType: any, queueObject: any): Promise<void>;
139+
byHash(ObjectType: any, queueObject: any): Promise<void>;
140+
};
107141
};
108142
type RESTController = {
109143
request: (method: string, path: string, data?: any, options?: RequestOptions) => Promise<any>;
@@ -122,10 +156,10 @@ type SchemaController = {
122156
delete: (className: string, options?: RequestOptions) => Promise<void>;
123157
create: (className: string, params: any, options?: RequestOptions) => Promise<any>;
124158
update: (className: string, params: any, options?: RequestOptions) => Promise<any>;
125-
send(className: string, method: string, params: any, options: RequestOptions): Promise<any>;
159+
send(className: string, method: string, params: any, options?: RequestOptions): Promise<any>;
126160
};
127161
type SessionController = {
128-
getSession: (token: RequestOptions) => Promise<ParseSession>;
162+
getSession: (options?: RequestOptions) => Promise<ParseSession>;
129163
};
130164
type StorageController =
131165
| {
@@ -165,24 +199,24 @@ type UserController = {
165199
setCurrentUser: (user: ParseUser) => Promise<void>;
166200
currentUser: () => ParseUser | null;
167201
currentUserAsync: () => Promise<ParseUser | null>;
168-
signUp: (user: ParseUser, attrs: AttributeMap, options: RequestOptions) => Promise<ParseUser>;
169-
logIn: (user: ParseUser, options: RequestOptions) => Promise<ParseUser>;
202+
signUp: (user: ParseUser, attrs: AttributeMap, options?: RequestOptions) => Promise<ParseUser>;
203+
logIn: (user: ParseUser, options?: RequestOptions) => Promise<ParseUser>;
170204
loginAs: (user: ParseUser, userId: string) => Promise<ParseUser>;
171-
become: (user: ParseUser, options: RequestOptions) => Promise<ParseUser>;
205+
become: (user: ParseUser, options?: RequestOptions) => Promise<ParseUser>;
172206
hydrate: (user: ParseUser, userJSON: AttributeMap) => Promise<ParseUser>;
173-
logOut: (options: RequestOptions) => Promise<void>;
174-
me: (user: ParseUser, options: RequestOptions) => Promise<ParseUser>;
175-
requestPasswordReset: (email: string, options: RequestOptions) => Promise<void>;
207+
logOut: (options?: RequestOptions) => Promise<void>;
208+
me: (user: ParseUser, options?: RequestOptions) => Promise<ParseUser>;
209+
requestPasswordReset: (email: string, options?: RequestOptions) => Promise<void>;
176210
updateUserOnDisk: (user: ParseUser) => Promise<ParseUser>;
177-
upgradeToRevocableSession: (user: ParseUser, options: RequestOptions) => Promise<void>;
211+
upgradeToRevocableSession: (user: ParseUser, options?: RequestOptions) => Promise<void>;
178212
linkWith: (user: ParseUser, authData: AuthData, options?: FullOptions) => Promise<ParseUser>;
179213
removeUserFromDisk: () => Promise<ParseUser | void>;
180214
verifyPassword: (
181215
username: string,
182216
password: string,
183-
options: RequestOptions
217+
options?: RequestOptions
184218
) => Promise<ParseUser>;
185-
requestEmailVerification: (email: string, options: RequestOptions) => Promise<void>;
219+
requestEmailVerification: (email: string, options?: RequestOptions) => Promise<void>;
186220
};
187221
type HooksController = {
188222
get: (type: string, functionName?: string, triggerName?: string) => Promise<any>;

src/EventuallyQueue.ts

+13-25
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,12 @@ import ParseObject from './ParseObject';
44
import ParseQuery from './ParseQuery';
55
import Storage from './Storage';
66

7+
import type { Queue, QueueObject } from './CoreManager';
78
import type { SaveOptions } from './ParseObject';
89
import type { RequestOptions } from './RESTController';
910

10-
type QueueObject = {
11-
queueId: string;
12-
action: string;
13-
object: ParseObject;
14-
serverOptions: SaveOptions | RequestOptions;
15-
id: string;
16-
className: string;
17-
hash: string;
18-
createdAt: Date;
19-
};
20-
21-
type Queue = Array<QueueObject>;
22-
2311
const QUEUE_KEY = 'Parse/Eventually/Queue';
24-
let queueCache: QueueObject[] = [];
12+
let queueCache: Queue = [];
2513
let dirtyCache = true;
2614
let polling: ReturnType<typeof setInterval> | undefined = undefined;
2715

@@ -44,7 +32,7 @@ const EventuallyQueue = {
4432
* @static
4533
* @see Parse.Object#saveEventually
4634
*/
47-
save(object: ParseObject, serverOptions: SaveOptions = {}): Promise<void> {
35+
save(object: ParseObject, serverOptions?: SaveOptions): Promise<void> {
4836
return this.enqueue('save', object, serverOptions);
4937
},
5038

@@ -59,7 +47,7 @@ const EventuallyQueue = {
5947
* @static
6048
* @see Parse.Object#destroyEventually
6149
*/
62-
destroy(object: ParseObject, serverOptions: RequestOptions = {}): Promise<void> {
50+
destroy(object: ParseObject, serverOptions?: RequestOptions): Promise<void> {
6351
return this.enqueue('destroy', object, serverOptions);
6452
},
6553

@@ -92,7 +80,7 @@ const EventuallyQueue = {
9280
async enqueue(
9381
action: string,
9482
object: ParseObject,
95-
serverOptions: SaveOptions | RequestOptions
83+
serverOptions?: SaveOptions | RequestOptions
9684
): Promise<void> {
9785
const queueData = await this.getQueue();
9886
const queueId = this.generateQueueId(action, object);
@@ -112,7 +100,7 @@ const EventuallyQueue = {
112100
queueId,
113101
action,
114102
object: object.toJSON(),
115-
serverOptions,
103+
serverOptions: serverOptions || {},
116104
id: object.id,
117105
className: object.className,
118106
hash: object.get('hash'),
@@ -121,11 +109,11 @@ const EventuallyQueue = {
121109
return this.setQueue(queueData);
122110
},
123111

124-
store(data: QueueObject[]) {
112+
store(data: Queue): Promise<void> {
125113
return Storage.setItemAsync(QUEUE_KEY, JSON.stringify(data));
126114
},
127115

128-
load() {
116+
load(): Promise<string | null> {
129117
return Storage.getItemAsync(QUEUE_KEY);
130118
},
131119

@@ -134,10 +122,10 @@ const EventuallyQueue = {
134122
*
135123
* @function getQueue
136124
* @name Parse.EventuallyQueue.getQueue
137-
* @returns {Promise<QueueObject[]>}
125+
* @returns {Promise<Queue>}
138126
* @static
139127
*/
140-
async getQueue(): Promise<QueueObject[]> {
128+
async getQueue(): Promise<Queue> {
141129
if (dirtyCache) {
142130
queueCache = JSON.parse((await this.load()) || '[]');
143131
dirtyCache = false;
@@ -297,7 +285,7 @@ const EventuallyQueue = {
297285
* @param [ms] Milliseconds to ping the server. Default 2000ms
298286
* @static
299287
*/
300-
poll(ms = 2000) {
288+
poll(ms?: number): void {
301289
if (polling) {
302290
return;
303291
}
@@ -311,7 +299,7 @@ const EventuallyQueue = {
311299
}
312300
})
313301
.catch(e => e);
314-
}, ms);
302+
}, ms || 2000);
315303
},
316304

317305
/**
@@ -321,7 +309,7 @@ const EventuallyQueue = {
321309
* @name Parse.EventuallyQueue.stopPoll
322310
* @static
323311
*/
324-
stopPoll() {
312+
stopPoll(): void {
325313
clearInterval(polling);
326314
polling = undefined;
327315
},

src/LiveQuerySubscription.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import CoreManager from './CoreManager';
22
import { resolvingPromise } from './promiseUtils';
33
import type ParseQuery from './ParseQuery';
4+
import type { EventEmitter } from 'events';
45

56
/**
67
* Creates a new LiveQuery Subscription.
@@ -91,9 +92,9 @@ class LiveQuerySubscription {
9192
subscribePromise: any;
9293
unsubscribePromise: any;
9394
subscribed: boolean;
94-
emitter: any;
95-
on: any;
96-
emit: any;
95+
emitter: EventEmitter;
96+
on: EventEmitter['on'];
97+
emit: EventEmitter['emit'];
9798
/*
9899
* @param {string | number} id - subscription id
99100
* @param {string} query - query to subscribe to
@@ -106,8 +107,8 @@ class LiveQuerySubscription {
106107
this.subscribePromise = resolvingPromise();
107108
this.unsubscribePromise = resolvingPromise();
108109
this.subscribed = false;
109-
const EventEmitter = CoreManager.getEventEmitter();
110-
this.emitter = new EventEmitter();
110+
const Emitter = CoreManager.getEventEmitter();
111+
this.emitter = new Emitter();
111112

112113
this.on = (eventName, listener) => this.emitter.on(eventName, listener);
113114
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);

src/Parse.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import decode from './decode';
22
import encode from './encode';
33
import CryptoController from './CryptoController';
4-
import EventuallyQueue from './EventuallyQueue';
4+
import EQ from './EventuallyQueue';
55
import IndexedDBStorageController from './IndexedDBStorageController';
66
import InstallationController from './InstallationController';
77
import * as ParseOp from './ParseOp';
@@ -36,6 +36,7 @@ import LiveQueryClient from './LiveQueryClient';
3636
import LocalDatastoreController from './LocalDatastoreController';
3737
import StorageController from './StorageController';
3838
import WebSocketController from './WebSocketController';
39+
import type { EventuallyQueue } from './CoreManager';
3940

4041
const Parse = {
4142
ACL,
@@ -79,11 +80,11 @@ const Parse = {
7980
* @member {EventuallyQueue} Parse.EventuallyQueue
8081
* @static
8182
*/
82-
set EventuallyQueue(queue: typeof EventuallyQueue) {
83+
set EventuallyQueue(queue: EventuallyQueue) {
8384
CoreManager.setEventuallyQueue(queue);
8485
},
8586

86-
get EventuallyQueue(): any {
87+
get EventuallyQueue(): EventuallyQueue {
8788
return CoreManager.getEventuallyQueue();
8889
},
8990

@@ -117,7 +118,7 @@ const Parse = {
117118
CoreManager.setIfNeeded('EventEmitter', EventEmitter);
118119
CoreManager.setIfNeeded('LiveQuery', new ParseLiveQuery());
119120
CoreManager.setIfNeeded('CryptoController', CryptoController);
120-
CoreManager.setIfNeeded('EventuallyQueue', EventuallyQueue);
121+
CoreManager.setIfNeeded('EventuallyQueue', EQ);
121122
CoreManager.setIfNeeded('InstallationController', InstallationController);
122123
CoreManager.setIfNeeded('LocalDatastoreController', LocalDatastoreController);
123124
CoreManager.setIfNeeded('StorageController', StorageController);
@@ -342,7 +343,7 @@ const Parse = {
342343
* @static
343344
* @returns {boolean}
344345
*/
345-
isLocalDatastoreEnabled() {
346+
isLocalDatastoreEnabled(): boolean {
346347
return this.LocalDatastore.isEnabled;
347348
},
348349
/**

0 commit comments

Comments
 (0)