Skip to content

Commit b772de3

Browse files
committed
chore!: Build as ECMAScript module
Jest's support for ESM is lacking, so for simplicity this also changes the test suite to use Node's built-in test runner and typescript support, and jest's `expect` package. This change is breaking because any non-ESM consuming packages must now have minumum Node version of 20.19.0.
1 parent aa4a8f4 commit b772de3

File tree

7 files changed

+263
-2907
lines changed

7 files changed

+263
-2907
lines changed

.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
NODE_OPTIONS=--test-coverage-branches=100 --test-coverage-functions=100 --test-coverage-lines=100 --test-coverage-exclude src/**/*test.ts
2+
NODE_V8_COVERAGE=./coverage

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
runs-on: ubuntu-latest
3030
strategy:
3131
matrix:
32-
node-version: [20, 22, 24]
32+
node-version: [22, 24]
3333
steps:
3434
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
3535
- run: corepack enable

package.json

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
"name": "expo-server-sdk",
33
"version": "4.0.0",
44
"description": "Server-side library for working with Expo using Node.js",
5-
"main": "build/ExpoClient.js",
6-
"types": "build/ExpoClient.d.ts",
5+
"type": "module",
6+
"main": "./build/ExpoClient.js",
7+
"exports": "./build/ExpoClient.js",
8+
"types": "./build/ExpoClient.d.ts",
79
"files": [
810
"build"
911
],
@@ -14,24 +16,10 @@
1416
"build": "yarn prepack",
1517
"lint": "eslint",
1618
"prepack": "tsc --project tsconfig.build.json",
17-
"test": "jest",
19+
"test": "node --test --experimental-test-coverage --env-file .env",
1820
"tsc": "tsc",
1921
"watch": "tsc --watch"
2022
},
21-
"jest": {
22-
"coverageDirectory": "<rootDir>/../coverage",
23-
"coverageThreshold": {
24-
"global": {
25-
"branches": 100,
26-
"functions": 100,
27-
"lines": 100,
28-
"statements": 0
29-
}
30-
},
31-
"preset": "ts-jest",
32-
"rootDir": "src",
33-
"testEnvironment": "node"
34-
},
3523
"repository": {
3624
"type": "git",
3725
"url": "git+https://github.com/expo/expo-server-sdk-node.git"
@@ -52,18 +40,18 @@
5240
"promise-retry": "^2.0.1"
5341
},
5442
"devDependencies": {
43+
"@tsconfig/node-ts": "23.6.2",
5544
"@tsconfig/node20": "20.1.6",
5645
"@tsconfig/strictest": "2.0.5",
5746
"@types/node": "22.17.2",
5847
"@types/node-fetch": "2.6.12",
5948
"@types/promise-retry": "1.1.6",
6049
"eslint": "9.33.0",
6150
"eslint-config-universe": "15.0.3",
62-
"jest": "29.7.0",
51+
"expect": "30.2.0",
6352
"jiti": "2.4.2",
6453
"msw": "2.10.5",
6554
"prettier": "3.6.2",
66-
"ts-jest": "29.4.1",
6755
"typescript": "5.9.2"
6856
},
6957
"packageManager": "[email protected]"

src/ExpoClient.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
pushNotificationReceiptChunkLimit,
2020
requestRetryMinTimeout,
2121
sendApiUrl,
22-
} from './ExpoClientValues';
22+
} from './ExpoClientValues.ts';
2323

2424
export class Expo {
2525
static pushNotificationChunkSizeLimit = pushNotificationChunkLimit;
@@ -204,7 +204,7 @@ export class Expo {
204204
private async requestAsync(url: string, options: RequestOptions): Promise<any> {
205205
let requestBody: string | Buffer | undefined;
206206

207-
const sdkVersion = require('../package.json').version;
207+
const sdkVersion = (await import('../package.json')).default.version;
208208
const requestHeaders = new Headers({
209209
Accept: 'application/json',
210210
'Accept-Encoding': 'gzip, deflate',

src/__tests__/ExpoClient-test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test } from '@jest/globals';
1+
import { expect } from 'expect';
2+
import ExpoClient, { type ExpoPushMessage } from 'expo-server-sdk';
23
import { http, HttpResponse } from 'msw';
34
import { setupServer } from 'msw/node';
45
import assert from 'node:assert';
56
import { randomUUID } from 'node:crypto';
7+
import { after, afterEach, before, beforeEach, describe, test } from 'node:test';
68
import { gunzipSync } from 'node:zlib';
79

8-
import ExpoClient, { ExpoPushMessage } from '../ExpoClient';
9-
import { getReceiptsApiUrl, sendApiUrl } from '../ExpoClientValues';
10+
import { getReceiptsApiUrl, sendApiUrl } from '../ExpoClientValues.ts';
1011

1112
const accessToken = 'foobar';
1213
const mockTickets = [{ status: 'ok', id: randomUUID() }];
@@ -69,11 +70,11 @@ const server = setupServer(
6970
}),
7071
);
7172

72-
beforeAll(() => {
73+
before(() => {
7374
server.listen({ onUnhandledRequest: 'error' });
7475
});
7576

76-
afterAll(() => {
77+
after(() => {
7778
server.close();
7879
});
7980

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"extends": ["@tsconfig/strictest/tsconfig", "@tsconfig/node20/tsconfig"],
2+
"extends": ["@tsconfig/strictest/tsconfig", "@tsconfig/node20/tsconfig", "@tsconfig/node-ts/tsconfig"],
33
"compilerOptions": {
44
"declaration": true,
55
"noEmit": true,

0 commit comments

Comments
 (0)