From 6552c282d5e8045bbb11fa980f39ede55db4017f Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 30 May 2023 18:37:24 +0100 Subject: [PATCH] feat: use native fetch --- .changeset/small-papayas-live.md | 5 +++ package.json | 5 +-- pnpm-lock.yaml | 76 -------------------------------- src/core/baseClient.ts | 12 +++-- src/core/parentClient.ts | 3 +- src/core/studentClient.ts | 4 +- 6 files changed, 13 insertions(+), 92 deletions(-) create mode 100644 .changeset/small-papayas-live.md diff --git a/.changeset/small-papayas-live.md b/.changeset/small-papayas-live.md new file mode 100644 index 0000000..69114d3 --- /dev/null +++ b/.changeset/small-papayas-live.md @@ -0,0 +1,5 @@ +--- +"classcharts-api": minor +--- + +Migrate to native fetch diff --git a/package.json b/package.json index b813e2f..70bed7e 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,6 @@ "test": "jest", "release": "pnpm run build && changeset publish" }, - "dependencies": { - "ky-universal": "^0.11.0" - }, "devDependencies": { "@changesets/cli": "^2.26.1", "@types/jest": "^29.5.1", @@ -62,6 +59,6 @@ "dist/**" ], "engines": { - "node": ">=16" + "node": ">=18" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3d9f67..577c3d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,10 +1,5 @@ lockfileVersion: '6.0' -dependencies: - ky-universal: - specifier: ^0.11.0 - version: 0.11.0(ky@0.33.3) - devDependencies: '@changesets/cli': specifier: ^2.26.1 @@ -1200,13 +1195,6 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1630,11 +1618,6 @@ packages: stream-transform: 2.1.3 dev: true - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1949,11 +1932,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2033,14 +2011,6 @@ packages: bser: 2.1.1 dev: true - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2096,13 +2066,6 @@ packages: is-callable: 1.2.7 dev: true - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: false - /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -3089,26 +3052,6 @@ packages: engines: {node: '>=6'} dev: true - /ky-universal@0.11.0(ky@0.33.3): - resolution: {integrity: sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==} - engines: {node: '>=14.16'} - peerDependencies: - ky: '>=0.31.4' - web-streams-polyfill: '>=3.2.1' - peerDependenciesMeta: - web-streams-polyfill: - optional: true - dependencies: - abort-controller: 3.0.0 - ky: 0.33.3 - node-fetch: 3.3.1 - dev: false - - /ky@0.33.3: - resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} - engines: {node: '>=14.16'} - dev: false - /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -3302,20 +3245,6 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - - /node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true @@ -4191,11 +4120,6 @@ packages: defaults: 1.0.4 dev: true - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false - /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: diff --git a/src/core/baseClient.ts b/src/core/baseClient.ts index d2531d7..f89ccd3 100644 --- a/src/core/baseClient.ts +++ b/src/core/baseClient.ts @@ -1,4 +1,3 @@ -import ky, { type Options as KyOptions } from "ky-universal"; import type { ActivityResponse, AnnouncementsResponse, @@ -87,7 +86,7 @@ export class BaseClient { */ public async makeAuthedRequest( path: string, - kyOptions: KyOptions, + fetchOptions: RequestInit, options?: { revalidateToken?: boolean } ) { if (!this.sessionId) throw new Error("No session ID"); @@ -98,20 +97,19 @@ export class BaseClient { options.revalidateToken = true; } const requestOptions = { - ...kyOptions, + ...fetchOptions, headers: { Cookie: this?.authCookies?.join(";") ?? [], Authorization: "Basic " + this.sessionId, - ...kyOptions.headers, + ...fetchOptions.headers, }, - credentials: undefined, - } satisfies KyOptions; + } satisfies RequestInit; if (options?.revalidateToken === true && this.lastPing) { if (Date.now() - this.lastPing + 5000 > PING_INTERVAL) { await this.getNewSessionId(); } } - const request = await ky(path, requestOptions); + const request = await fetch(path, requestOptions); let responseJSON: ClassChartsResponse; try { responseJSON = await request.json(); diff --git a/src/core/parentClient.ts b/src/core/parentClient.ts index 93f9c17..dad9fa5 100644 --- a/src/core/parentClient.ts +++ b/src/core/parentClient.ts @@ -1,4 +1,3 @@ -import ky from "ky-universal"; import type { GetPupilsResponse } from "../types.js"; import { BaseClient } from "./baseClient.js"; @@ -37,7 +36,7 @@ export class ParentClient extends BaseClient { const headers = new Headers({ "Content-Type": "application/x-www-form-urlencoded", }); - const response = await ky(BASE_URL + "/parent/login", { + const response = await fetch(BASE_URL + "/parent/login", { method: "POST", body: formData, headers: headers, diff --git a/src/core/studentClient.ts b/src/core/studentClient.ts index 0ab9fc9..d8d6747 100644 --- a/src/core/studentClient.ts +++ b/src/core/studentClient.ts @@ -1,7 +1,6 @@ import { API_BASE_STUDENT, BASE_URL } from "../utils/consts.js"; import { BaseClient } from "./baseClient.js"; import { parseCookies } from "../utils/utils.js"; -import ky from "ky-universal"; /** * Student Client @@ -40,11 +39,10 @@ export class StudentClient extends BaseClient { formData.append("dob", this.dateOfBirth); formData.append("remember_me", "1"); formData.append("recaptcha-token", "no-token-available"); - const request = await ky(BASE_URL + "/student/login", { + const request = await fetch(BASE_URL + "/student/login", { method: "POST", body: formData, redirect: "manual", - throwHttpErrors: false, credentials: undefined, }); if (request.status != 302 || !request.headers.get("set-cookie")) {