From a1852d14b81ffe03c8ddc3bdcbdf7c1389ad2c33 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sun, 3 Nov 2024 12:54:04 +0100 Subject: [PATCH 1/3] Initial update --- .github/workflows/coverage.yml | 53 ------------- .github/workflows/security.yml | 85 -------------------- .github/workflows/test.yml | 54 +++++++++++++ bun.lockb | Bin 71784 -> 63600 bytes package.json | 10 +-- src/HTTP.ts | 14 +++- src/JSP.spec.ts | 138 ++++++++++++++++++--------------- src/JSP.ts | 26 +++---- src/endpoints/v2/access.ts | 6 +- src/endpoints/v2/edit.ts | 6 +- src/endpoints/v2/publish.ts | 6 +- src/endpoints/v2/remove.ts | 4 +- src/types/endpoints/access.ts | 7 +- src/types/endpoints/edit.ts | 6 +- src/types/endpoints/publish.ts | 7 +- src/types/endpoints/remove.ts | 4 +- 16 files changed, 177 insertions(+), 249 deletions(-) delete mode 100644 .github/workflows/coverage.yml delete mode 100644 .github/workflows/security.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml deleted file mode 100644 index 780ee61..0000000 --- a/.github/workflows/coverage.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: "CI -> Test" -on: - workflow_dispatch: - push: - branches: - - dev - paths-ignore: - - "*.md" - - ".*ignore" - - pull_request: - branches: - - dev - paths-ignore: - - "*.md" - - ".*ignore" - -concurrency: - group: "${{ github.workflow }}-${{ github.ref }}" - cancel-in-progress: true - -permissions: - contents: read - -jobs: - lint: - name: "Lint" - runs-on: ubuntu-latest - steps: - - name: "Harden Runner" - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 - with: - egress-policy: audit - - - name: "Checkout" - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - with: - persist-credentials: false - - - name: "Setup Bun" - uses: oven-sh/setup-bun@4bc047ad259df6fc24a6c9b0f9a0cb08cf17fbe5 # v2.0.1 - - - name: "Setup dependencies" - run: bun install --frozen-lockfile - - - name: "Run test" - run: bun run test - - - name: "Upload coverage" - uses: codacy/codacy-coverage-reporter-action@89d6c85cfafaec52c72b6c5e8b2878d33104c699 # v1.3.0 - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage/lcov.* diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml deleted file mode 100644 index aa46f27..0000000 --- a/.github/workflows/security.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: "CI -> Security" -on: - branch_protection_rule: - schedule: - - cron: "33 3 * * 1" - - push: - branches: - - dev - paths-ignore: - - "*.md" - - ".*ignore" - - pull_request: - branches: - - dev - paths-ignore: - - "*.md" - - ".*ignore" - -permissions: read-all - -jobs: - codeql: - name: "CodeQL" - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - language: - - javascript-typescript - - permissions: - security-events: write - - steps: - - name: "Harden Runner" - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 - with: - egress-policy: audit - - - name: "Checkout" - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - with: - persist-credentials: false - - - name: "Setup CodeQL" - uses: github/codeql-action/init@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 - with: - languages: ${{ matrix.language }} - - - name: "Run analysis" - uses: github/codeql-action/analyze@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 - with: - category: "/language:${{ matrix.language }}" - - scoreboard: - name: "Scorecard" - runs-on: ubuntu-latest - permissions: - security-events: write - id-token: write - - steps: - - name: "Harden Runner" - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 - with: - egress-policy: audit - - - name: "Checkout" - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - with: - persist-credentials: false - - - name: "Run analysis" - uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 - with: - results_file: scoreboard.sarif - results_format: sarif - publish_results: true - - - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 - with: - sarif_file: scoreboard.sarif diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..c8caeb5 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,54 @@ +name: CI -> Test +on: + workflow_dispatch: + push: + branches: + - dev + paths-ignore: + - '*.md' + - '.*ignore' + + pull_request: + branches: + - dev + paths-ignore: + - '*.md' + - '.*ignore' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + with: + egress-policy: audit + + - name: Setup Bun + uses: oven-sh/setup-bun@4bc047ad259df6fc24a6c9b0f9a0cb08cf17fbe5 # v2.0.1 + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: Setup development dependencies + run: bun install --frozen-lockfile + + - name: Run test + run: bun run test + +# TODO: Track IINFRA-501 +# - name: Upload coverage +# uses: codacy/codacy-coverage-reporter-action@89d6c85cfafaec52c72b6c5e8b2878d33104c699 # v1.3.0 +# with: +# project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} +# coverage-reports: coverage/lcov.* diff --git a/bun.lockb b/bun.lockb index 0035d41d06c42305ae65004e88e54dc9f8782744..332d36927c0625a68bb98ff0530b917361c0567b 100755 GIT binary patch delta 19177 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 UzB!fR-M1^Q9DiSgHl-K*FMomyEdT%j diff --git a/package.json b/package.json index a585e5c..aba8276 100644 --- a/package.json +++ b/package.json @@ -28,13 +28,13 @@ "test": "bun run lint && bun test" }, "devDependencies": { - "@biomejs/biome": "~1.9.2", - "@types/bun": "~1.1.10", - "bunchee": "~5.4.0", - "lefthook": "~1.7.16", + "@biomejs/biome": "~1.9.4", + "@types/bun": "~1.1.13", + "bunchee": "~5.6.1", + "lefthook": "~1.8.2", "sort-package-json": "~2.10.1", "ts-deepmerge": "~7.0.1", - "typescript": "~5.6.2" + "typescript": "~5.6.3" }, "engines": { "node": ">=18.17.0" diff --git a/src/HTTP.ts b/src/HTTP.ts index 88ff43f..793ba01 100644 --- a/src/HTTP.ts +++ b/src/HTTP.ts @@ -16,13 +16,19 @@ export class HTTP { return this.parseResponse(response); } - private parseResponse(response: Response) { + private async parseResponse(response: Response) { const contentType = response.headers.get('Content-Type'); - if (contentType?.startsWith('application/json')) { - return response.json() as Promise; + if (!contentType?.startsWith('application/json')) { + throw new Error('Unknown response type'); } - throw new Error('Unknown response type'); + if (!response.ok) { + const error = (await response.json()) as { code: number; type: string; message: string }; + + throw new Error(`${error.type}: ${error.code}: ${error.message}`); + } + + return (await response.json()) as Promise; } } diff --git a/src/JSP.spec.ts b/src/JSP.spec.ts index 88f25a5..e7abfea 100644 --- a/src/JSP.spec.ts +++ b/src/JSP.spec.ts @@ -1,83 +1,93 @@ -import { describe, expect, test } from 'bun:test'; +import { afterAll, describe, expect, test } from 'bun:test'; import { JSP } from './JSP.ts'; -describe('V2', () => { - const jsp = new JSP(); - - const commonData = { - hello: 'Hello, World!', - bye: 'Bye, World!', - object: { - sample: 'Hello, World!' - }, - binary: new Uint8Array([72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 10]) - }; - - /** - * An unique key/secret/password for tests. - */ - const commonPrivate: string = Date.now().toString(); - const commonPrivateInvalid: string = '_:_:wrongdingdong:_:_'; - - const testCleanup = (key: string, secret: string) => { - jsp.remove(key, secret); - }; - - describe('publish', () => { - test('data only', async () => { - const response = await jsp.publish(commonData.hello); - const result = await jsp.access(response.key); - - expect(result.data).toBeDefined(); - expect(result.data).toBe(commonData.hello); - - testCleanup(response.key, response.secret); +const jsp = new JSP(); + +const commonData = { + hello: 'Hello, World!', + bye: 'Bye, World!', + object: { + sample: 'Hello, World!' + }, + binary: new Uint8Array([72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 10]) +}; + +/** + * An unique key/secret/password for tests. + */ +const commonPrivate: string = Date.now().toString(); +const commonPrivateInvalid: string = '_:_:wrongdingdong:_:_'; + +const testCleanup = (key: string, secret: string) => { + jsp.remove(key, secret).catch(() => console.error(`Failed to cleanup "${key}" with secret "${secret}"`)); +}; + +describe('publish', async () => { + test('should response parameters be defined and valid', async () => { + // Server should prefer key over keyLength + const response = await jsp.publish(commonData.hello, { + password: commonPrivate, + key: commonPrivate, + //keyLength: 20, + secret: commonPrivate }); - test('key', async () => { - const response = await jsp.publish(commonData.hello, { - key: commonPrivate - }); + expect(response.key).toBeDefined(); + expect(response.key).toBe(commonPrivate); + expect(response.secret).toBeDefined(); + expect(response.secret).toBe(commonPrivate); + expect(response.url).toBeDefined(); - expect(response.key).toBeDefined(); - expect(response.key).toBe(commonPrivate); + testCleanup(response.key, response.secret); + }); - testCleanup(response.key, response.secret); + test('should response "key" length be the same as "keyLength"', async () => { + const keyLength = 20; + const response = await jsp.publish(commonData.hello, { + keyLength }); - test.todo('keyLength', async () => { - const response = await jsp.publish(commonData.hello, { - keyLength: 20 - }); + expect(response.key).toBeDefined(); + expect(response.key.length).toBe(keyLength); + expect(response.secret).toBeDefined(); + expect(response.url).toBeDefined(); - expect(response.key).toBeDefined(); - expect(response.key).toHaveLength(20); + testCleanup(response.key, response.secret); + }); +}); - testCleanup(response.key, response.secret); - }); +describe('access', async () => { + const document = await jsp.publish(commonData.hello, { + secret: commonPrivate + }); - test('password/secret', async () => { - const response = await jsp.publish(commonData.hello, { - password: commonPrivate, - secret: commonPrivate - }); + const documentProtected = await jsp.publish(commonData.hello, { + password: commonPrivate, + secret: commonPrivate + }); - expect(response.secret).toBe(commonPrivate); + afterAll(() => { + testCleanup(document.key, commonPrivate); + testCleanup(documentProtected.key, commonPrivate); + }); - const fail = await jsp.access(response.key, { - password: commonPrivateInvalid - }); + test('should response parameters be defined and valid', async () => { + const response = await jsp.access(document.key); - expect(fail.data).toBeUndefined(); + expect(response.key).toBeDefined(); + expect(response.key).toBe(document.key); + expect(response.data).toBeDefined(); + expect(response.data).toBe(commonData.hello); + expect(response.url).toBeDefined(); - const result = await jsp.access(response.key, { - password: commonPrivate - }); + testCleanup(response.key, commonPrivate); + }); - expect(result.data).toBeDefined(); - expect(result.data).toBe(commonData.hello); + test('should fail on protected document', async () => { + expect(jsp.access(documentProtected.key)).rejects.toThrowError(); + }); - testCleanup(response.key, response.secret); - }); + test('should fail on bad password protected document', async () => { + expect(jsp.access(documentProtected.key, { password: commonPrivateInvalid })).rejects.toThrowError(); }); }); diff --git a/src/JSP.ts b/src/JSP.ts index 334d168..48ee550 100644 --- a/src/JSP.ts +++ b/src/JSP.ts @@ -6,20 +6,18 @@ import { edit } from './endpoints/v2/edit.ts'; import { publish } from './endpoints/v2/publish.ts'; import { remove } from './endpoints/v2/remove.ts'; import type { ClientOptions } from './types/JSP.ts'; -import type { AccessOptionsV2 } from './types/endpoints/access.ts'; -import type { EditOptionsV2 } from './types/endpoints/edit.ts'; -import type { PublishOptionsV2 } from './types/endpoints/publish.ts'; +import type { AccessOptions } from './types/endpoints/access.ts'; +import type { EditOptions } from './types/endpoints/edit.ts'; +import type { PublishOptions } from './types/endpoints/publish.ts'; export class JSP { - private static readonly defaultRequestOptions: RequestInit = { - headers: { - 'User-Agent': `JSPasteHeadless/${libraryVersion} (https://github.com/jspaste/library)` - } - }; - private static readonly defaultOptions: ClientOptions = { - api: 'https://api.inetol.net/jspaste', - request: JSP.defaultRequestOptions + api: 'https://paste.inetol.net/api', + request: { + headers: { + 'User-Agent': `JSPasteHeadless/${libraryVersion} (https://github.com/jspaste/library)` + } + } }; private readonly http: HTTP; @@ -35,21 +33,21 @@ export class JSP { /** * @version API V2 */ - public async access(key: string, options?: AccessOptionsV2) { + public async access(key: string, options?: AccessOptions) { return access(this.http, key, options); } /** * @version API V2 */ - public async publish(data: string, options?: PublishOptionsV2) { + public async publish(data: string, options?: PublishOptions) { return publish(this.http, data, options); } /** * @version API V2 */ - public async edit(data: string, name: string, secret: string, options?: EditOptionsV2) { + public async edit(data: string, name: string, secret: string, options?: EditOptions) { return edit(this.http, data, name, secret, options); } diff --git a/src/endpoints/v2/access.ts b/src/endpoints/v2/access.ts index 2e32902..f8088bd 100644 --- a/src/endpoints/v2/access.ts +++ b/src/endpoints/v2/access.ts @@ -1,8 +1,8 @@ import type { HTTP } from '../../HTTP.ts'; -import type { AccessOptionsV2, AccessResponseV2 } from '../../types/endpoints/access.ts'; +import type { AccessOptions, AccessResponse } from '../../types/endpoints/access.ts'; -export const access = async (http: HTTP, name: string, options?: AccessOptionsV2) => { - return http.fetch(`/v2/documents/${name}`, { +export const access = async (http: HTTP, name: string, options?: AccessOptions) => { + return http.fetch(`/v2/documents/${name}`, { method: 'GET', headers: { ...(options?.password && { password: options.password }) diff --git a/src/endpoints/v2/edit.ts b/src/endpoints/v2/edit.ts index e44951a..944cd18 100644 --- a/src/endpoints/v2/edit.ts +++ b/src/endpoints/v2/edit.ts @@ -1,8 +1,8 @@ import type { HTTP } from '../../HTTP.ts'; -import type { EditOptionsV2, EditResponseV2 } from '../../types/endpoints/edit.ts'; +import type { EditOptions, EditResponse } from '../../types/endpoints/edit.ts'; -export const edit = async (http: HTTP, data: string, name: string, secret: string, options?: EditOptionsV2) => { - return http.fetch(`/v2/documents/${name}`, { +export const edit = async (http: HTTP, data: string, name: string, secret: string, options?: EditOptions) => { + return http.fetch(`/v2/documents/${name}`, { method: 'PATCH', body: data, headers: { diff --git a/src/endpoints/v2/publish.ts b/src/endpoints/v2/publish.ts index 365a67d..6a8e4f0 100644 --- a/src/endpoints/v2/publish.ts +++ b/src/endpoints/v2/publish.ts @@ -1,8 +1,8 @@ import type { HTTP } from '../../HTTP.ts'; -import type { PublishOptionsV2, PublishResponseV2 } from '../../types/endpoints/publish.ts'; +import type { PublishOptions, PublishResponse } from '../../types/endpoints/publish.ts'; -export const publish = async (http: HTTP, data: string, options?: PublishOptionsV2) => { - return http.fetch('/v2/documents', { +export const publish = async (http: HTTP, data: string, options?: PublishOptions) => { + return http.fetch('/v2/documents', { method: 'POST', body: data, headers: { diff --git a/src/endpoints/v2/remove.ts b/src/endpoints/v2/remove.ts index b2ceb52..813c9f3 100644 --- a/src/endpoints/v2/remove.ts +++ b/src/endpoints/v2/remove.ts @@ -1,8 +1,8 @@ import type { HTTP } from '../../HTTP.ts'; -import type { RemoveResponseV2 } from '../../types/endpoints/remove.ts'; +import type { RemoveResponse } from '../../types/endpoints/remove.ts'; export const remove = async (http: HTTP, name: string, secret: string) => { - return http.fetch(`/v2/documents/${name}`, { + return http.fetch(`/v2/documents/${name}`, { method: 'DELETE', headers: { secret: secret diff --git a/src/types/endpoints/access.ts b/src/types/endpoints/access.ts index 425cf30..795f8ee 100644 --- a/src/types/endpoints/access.ts +++ b/src/types/endpoints/access.ts @@ -1,12 +1,11 @@ -type AccessOptionsV2 = { +type AccessOptions = { password?: string; }; -type AccessResponseV2 = { +type AccessResponse = { key: string; data: string; url: string; - expirationTimestamp: number; }; -export type { AccessOptionsV2, AccessResponseV2 }; +export type { AccessOptions, AccessResponse }; diff --git a/src/types/endpoints/edit.ts b/src/types/endpoints/edit.ts index 1f8eca7..8a3c3c3 100644 --- a/src/types/endpoints/edit.ts +++ b/src/types/endpoints/edit.ts @@ -1,9 +1,9 @@ -type EditOptionsV2 = { +type EditOptions = { password?: string; }; -type EditResponseV2 = { +type EditResponse = { edited: boolean; }; -export type { EditOptionsV2, EditResponseV2 }; +export type { EditOptions, EditResponse }; diff --git a/src/types/endpoints/publish.ts b/src/types/endpoints/publish.ts index a976fda..0097bc5 100644 --- a/src/types/endpoints/publish.ts +++ b/src/types/endpoints/publish.ts @@ -1,15 +1,14 @@ -type PublishOptionsV2 = { +type PublishOptions = { password?: string; key?: string; keyLength?: number; secret?: string; }; -type PublishResponseV2 = { +type PublishResponse = { key: string; secret: string; url: string; - expirationTimestamp: number; }; -export type { PublishOptionsV2, PublishResponseV2 }; +export type { PublishOptions, PublishResponse }; diff --git a/src/types/endpoints/remove.ts b/src/types/endpoints/remove.ts index c899e2c..c31f390 100644 --- a/src/types/endpoints/remove.ts +++ b/src/types/endpoints/remove.ts @@ -1,5 +1,5 @@ -type RemoveResponseV2 = { +type RemoveResponse = { removed: boolean; }; -export type { RemoveResponseV2 }; +export type { RemoveResponse }; From a1d0a0afd18caaedf132f1fd4aabc032712301b4 Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sun, 3 Nov 2024 13:36:04 +0100 Subject: [PATCH 2/3] fixed upstream keyLength --- src/JSP.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JSP.spec.ts b/src/JSP.spec.ts index e7abfea..5bf1268 100644 --- a/src/JSP.spec.ts +++ b/src/JSP.spec.ts @@ -28,7 +28,7 @@ describe('publish', async () => { const response = await jsp.publish(commonData.hello, { password: commonPrivate, key: commonPrivate, - //keyLength: 20, + keyLength: 20, secret: commonPrivate }); From 4cb83f1aa2ec245454b45c9aa2821defad37693c Mon Sep 17 00:00:00 2001 From: Ivan Gabaldon Date: Sat, 9 Nov 2024 00:24:39 +0100 Subject: [PATCH 3/3] update --- bun.lockb | Bin 63600 -> 63584 bytes package.json | 7 +++---- src/HTTP.ts | 4 ++-- src/JSP.spec.ts | 10 +++++++--- src/JSP.ts | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/bun.lockb b/bun.lockb index 332d36927c0625a68bb98ff0530b917361c0567b..f1c2c633432185c29eeae8928c828f75739ae2fb 100755 GIT binary patch delta 7994 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 X9#}V_>a(fJ{`}|?`sWU8U6uR)U3B0z delta 8046 zcmZ`;2|QHm`#)z4=FnJ^IhL&1_rZ{ukgdrLHw`M;BP6L?`X$pQ3a{u@K_{@3U@AG}%_k7>=ob$ZhujO99mMgR~8p}(@ zl(iqG_dQtL=Sz~)xEq2>MsLcy>G4qWQG*~ptGj5jcdk2zVIwe1WC2zkYz&TJYGAVx z(|<{vhhb9yQ~a#7jJUXL44cEiFaq!cuu5Q!+6UTl0~7KW7oruINFU7`S*?`j$ljbL9WTcvaqLF~vU`K)d1eqz^3zovoQhZ8^_k+~{ zKa%=IU@29pV70);EtnIZoR}zng-7DKiwrPK2b|GT>j#zuY!8;ITm!5=*iWM+{vNO# zz}LWPgFPn2JHb+-egjMOU_Mx?=QW^()Xil*z0E|@I3DmI(n(}3&3MUF(nr&v05z1! zV36PV?4C+(3s~yLr@>NV zU5?7+wONr{Z~keivUosTD<6W3)f6W&<;Mf5hpqMO3WG6!bAzA1uC>55UHz5 zr`42MC_-0F;@9O2`R+-56wlF<@F99X_+qKAWtfknFUd#ODNPsZ|0r{B7|$6kt#kAb zzF6vOk@^Z9K&OF3XCX_4ka1=}O zh&({!0l_lT;SqNL1xh%W(xYKJod`&QUQ`=V`xri<3|lR=&~VDf2rxrY>R$LVRANT2 zG&4S7ZjNEF$%$B024X)TDm$!ySTVg)q(CDB3(2h&QLGw|$O1$U1SJca-^MLO~c8+ZUvT3E=)hKHx1 zc1ON^GB_epr=y4bIY@=msZlN%7D}gPL25G6cN)i}6I3>N=*?i741<(_O5r!uV=j`nF{$O_cP0F*F^={8tzb@UnlNp*YR#-L&+Xs$)Q~d^34v~Bzy259p9KHaT zM^^zY8qY?y;{~`P${sI77T#>s35YQ_&^m7cu8i6N<@>Oar;h+bwToaW{5TZaoHu?%k3kCTJ(Ey-Begf#_Pk;{i zv(XHH0ZyU{e<6wpU?X;b0M|v40YbzIWTP{H^brv#M74m@0|mGNIt3^>h>i4v1h^4O z2@>MQ=p0;45IIqZo1#p(jzL%9YKDviLfjl>!_@+{!qpO4P7>l)Xc=6sQ9E31kYlh= z+#S40Ay-eU{$o|>5AO3PMHeuT7w7f6*q@aYe?DFSFN{-VXo3@yI)L60nE|2*ir!A`yJDiid zHB)7E{>q*S8#B-Tbo^Scc1iE&(zo08Om`i1Q~lk-v7MF|_3Sm4hJ^b)sD0t!b#x8AN1@@>I>r7M>oN3ZFev+;O)O|j-|1#||~=_SQX2#u(^ z*4*ioSXpWwFn!)z$7@ENry9t8PweB>9Szvuj$Rf2b+q#LNt>&4UW!FM#iqKZIuQf! zY-}}pVk4#Mn4rsVNE?PREnZskwl5s)OKRKn(CGEEb4^cu+nAg#V&=Beyky14^#iBf z+8v0$NM8#Q58YWDzW>u^pOz^W`|375irU9%GTMXEr*d*fuQeg(pTB3pn0IJYS#xLU zj3eGb2|V-5E$hZJtJwv2w69Fjd0UonGQoN00p*<9gsbny-U@#7u-x>+#-6WMg`C_?aqGN4>+buyD8YKtmuwTly|ygjTJV?2 zTN@sE4lcyzAH25m?PHem;w00EdKLLuUNhCE9hw}bw1(vS?UhHKztQSgumfXQ&~SC{ zE$;1~rrM;D=9yaNHfB&e|F&c1ws2u~+3}RJP~+E@kq6iRGSw`aJgc%(oA2IqSzO!g zRf|*~t7PrjBkr+F4M*2O-Rkmjj{Kdswl_c4n_%r}UogJsghppotNF1lf*TX%52TqF zzvw9RzPV{(+Z7c>^PCett@B>i{)UH6t`}WoE1W(|t7Fi8Cm62Ia^xxlBfj5*klUs^ z-9+JrBf@Gz8uRAHgkRdNG(l&I{mK}RpZ~M!Gugb&yKs8ZF3w1umc`L3hdy+cpN_oy zoH6|mloP?pJ@w%OD`)Kztqo>tJf93+Oe}S^YkAV5QfTQ~@3g`zGfgh(z5kZdUYCZi z<@urY3VXv|)!FbDgs+@m%JhBJ6;MR0W76t^hpUSd&PW_%`a0e6a@RNEt+ut{zRFcQ zxL$V-zDT}4*5bNl*U0K4sTB{&+sxbR1ifo>JlF3S*nh)p?exU>;__3^MwcSnNKWpO zvN3`&J=2%x>^o5Gf1qlq)s;O-*?XN|{byrs*YE1NlMTdH!m1#x5{rbOx8pcFqJFmS zoju{((wxmNY@Y1xdZ#5-N3B_Sat-}4mCiOK-ZV}yo5tL*)jzx<25CgSPdoB?^T8u; zzPp`?{nSyjd!tRrPO^XCX=;S^=x6*LQ&;Qu8!wLvU2PZ=JMvmL>I8Ki5iYFYcTY7l zw&&cuW_-kRn&y-vyL#N$v1Vkwc(;0HYDs+Jw6HA+A|i3>at+mEKfUs3h_~#IxV@Hf zt8(UC<65aYc)VbtL)u`?=HvZKyB_*X&M1o0>gzlqZ0P(rzNlgJwL5N;kG2IhM!n5u?j}~UR$h7J@vvojzt3DNom6gt#iynnOKx{pz8lr; zcXjopd!e4)I_j|X$)wj-&d<2GeB*5e^6cIlzE2mwNO`zst8t}w$1z2Hr+7=!KEe+L&*0=9Y&&Us ztFB=BYK@8RAN8^ZU3qVxM-&?@Hcjj8U-CwD>E4(;-`LYP_RhDr6e~EV-^+IBC_S3e z;qdO4u+kUz(Pq5FpI%BG^osvLAR?be;!LB>(c>P%1bvC}`lJocAy zYWc~pUZj5HiIp!D11m*`R2iLDI#$YYIvZc~gnqbyzJj`(;U% zhyLSHf2ow!@5*LQT+n?j<#2_IIP#BEf&InU%H3L* zZ?OM92kW|Uo-CNZ^_Mj%gZs+I^nL3i-At?kAMBsKVl(RkxvjvehE^weTF)G=?&S)7 z_kBt>7sr{-dRn6PdQFF5RP$ib;rd&=@GUVr#vZ35%s1f-!R2xPov=09^YM{ca~R7bYF;0oD^(`~WwFE6X=Ud)-u-R2f`G$Q zK3vZ7YiZk9RP&4PA_uYCLZ*AsS<_DouX)uNlj%!;?FcZ)J9~7{!~5XPx>f3-*;>sJ zoBh)eJBE{+xHmvG>CyUA3Cf0_oyRqm7}xjSjL9-M&AvHsSr|6&*Z0T5mXIDzHG&$` zCpszSYG+lqPmM^bPDv`bZ?mpOK+@_Y@09Vw)tNRtTx2=+dd#*pD-G|D)R=#~#cZZp zS#xT1?1{NPhxK2cx0X{pn^{3F>HD&@{<>Y#o4L=%n(UZ;Y2MS)R*l@{uC3xTF)K!) zxfUalnlcmK+58sTv#5OrKJP{1o@KLe)RKLb;?R+77R#KFgm%!m>?@R0ylb(WB1;>- zCX|Qrt18Q*Nh?^a7>|k9BDPssYmy7!keD3&V2M*(7-j@NL-@frG)6^}6yc`; zKM1VA4nPNsFg>uU@Y8`GwJSrwh>A|p&kxEEccAV~MWU#n6Q!F9Hc_!UDv(D7kf?|o z6=Bq%3qxdyiWE{2D9i?B9xxYgKX8bVi!XJwbGL&}3Rzg|nu6sSfy1(QEQ*1DE+!37 zV%okTuiV+|p8(@x=V}L^GP01U>c-Ez(?8X(qRY71!Pg;tVbWp4rYj+X9|G4}0OMrm z=m3S>fdRoHNnFcf@c>XfJBp#-$Dlo;(lH_%>s5(y(i=g48sq47CC5b;lJz4xz8(m? z!(`ym&QKISw}yhYc^Qg4K3M{cyM*yao>g3Y3d)3Q4BA_@Ojj0lcI20jS+YW12l8_5 zxKu4ik@q1IKZmBlwG}Nm#Kj+=ibGt6u^f7Mh@&eDM|-|Kd-R%`OEMJXQC);#T}Zu} zWH>UBO|=t4PaefobMP{hT^+0|i!~P{{C2dy<7yWJcLH7Tm4?Nko@x@WMxU!m-Ni5k zs5w*ppzeiHmJKCI+OSk)f0%R;0STioGBvt;uIc3ATqf>lNB1)(iz?4p_N1*du5#-S zW&GOMqS-3CO=0`5J(#9hkhKZ6` z=SUV4=c4sBqzep4Fw8BOzM{~rfBrdsSL-(>?ri7eYzIslFfe&Vcbw|JuX`iJWej>y zL+S#*Pg+tuhB?FGk5!sOyxMWP=EuOpf)N#L_`3b1iTX1c4@(5*vI#H)(Ircrw_p1% zV^FlDWB~An!1K%xxjB7q@t5%!HVYV2U^Xt(i(LB4dkYzZs*cl|Du9OtCgLlGCe6#g znlQw7OKR={9u}f#xu7)ld48INI~fT3Ee`l!{>=1bET8H4OjkkDI!Cu;G0gr6jH zWr6sIE}_{obasq`5r#QWEiYN9zQTRe+%WP@Db@EpJ7-u#vS9vSK|jqnID)_82O|sj zw?E6@VzTkT^&gDvKw#&ghiQW`;d`Zw8&oGdGYB8izbY|ualns4vQq``n_U;SPurLM zgRw`gCp9x9a%5)_`Z}fkm34-rf8>&#R;2&rI%0WNaQ+WQcAinQt?}-IzCHBxl+)n{pRiEGe_bOC!+u84nt|RI`}r!e1@b}pId_!aRA1insS#=TP+t)M#L#= z&uj>rQ9CyEB{zKMP{Z?pp{l;$_b^quUWqOzbYZ#ny80?p7nPc~woCUs>89gM~76Kjpt z769)m*?)?W_vvN$OmyLNFrJOn>qwk~tn0Y=Y&5fu)Ri4*topTXbVlRT0x0JqDYpQj zx|tAw_pUcWBkOG>DP7rN1^0x}rX!5KpBXS&oE#{Hf1;dv690&{)ccuGQ99XBjrcWMXh{Q0S9YWn9`oY+U}5Zsk+7{AE?Ht2?Hr6s8%P(~vB;jL z;_TAdH&Yn+Qa3vncqm}f6BJRAebhR$SpS*0Ulp~`?5}F*G~Rd<{ezbs$egJP445a{Q`8i@hD!5)|{QJpOrChzU|!D_|({0iMF$|GUm+BvQ0=#oJ$``qW5Rh4Td}H zZS99cTX@i+&`U<*xO3?v#Hu&;D&So4@!KmH$mg6Pa_Ce=hV2Td;f^A5X;-7Hye+k@ zBJXoXG<){0*-%ccdp6SaD75gN{*a%lA>F5UVtWmS uVR^K_R}&rs-jB@0J-zjs#J!J_Ev_5w`)EwPvSHZn?P&+7_a}H=Ec`#(MaVAz diff --git a/package.json b/package.json index aba8276..3aa3a00 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,8 @@ "./dist" ], "scripts": { - "build": "bun run build:library && bun run build:library:minified", - "build:library": "bun bunchee --runtime=browser --target=es2021", - "build:library:minified": "bun bunchee --runtime=browser --target=es2021 --minify --no-clean --no-dts --output=./dist/index.min.js", + "build": "bun run build:library", + "build:library": "bun bunchee --runtime=browser --target=es2021 --minify --output=./dist/index.mjs", "fix": "bun run fix:biome && bun run fix:package", "fix:biome": "bun biome check --write", "fix:package": "bun sort-package-json --quiet", @@ -31,9 +30,9 @@ "@biomejs/biome": "~1.9.4", "@types/bun": "~1.1.13", "bunchee": "~5.6.1", + "deepmerge-ts": "~7.1.3", "lefthook": "~1.8.2", "sort-package-json": "~2.10.1", - "ts-deepmerge": "~7.0.1", "typescript": "~5.6.3" }, "engines": { diff --git a/src/HTTP.ts b/src/HTTP.ts index 793ba01..0206e0a 100644 --- a/src/HTTP.ts +++ b/src/HTTP.ts @@ -1,4 +1,4 @@ -import { merge } from 'ts-deepmerge'; +import { deepmerge } from 'deepmerge-ts'; import type { ClientOptions } from './types/JSP.ts'; export class HTTP { @@ -9,7 +9,7 @@ export class HTTP { } public async fetch(endpoint: string, options: RequestInit): Promise { - const requestOptions = merge(this.options.request, options) as RequestInit; + const requestOptions = deepmerge(this.options.request, options) as RequestInit; const response = await fetch(this.options.api + endpoint, requestOptions); diff --git a/src/JSP.spec.ts b/src/JSP.spec.ts index 5bf1268..4a7b10a 100644 --- a/src/JSP.spec.ts +++ b/src/JSP.spec.ts @@ -24,7 +24,7 @@ const testCleanup = (key: string, secret: string) => { describe('publish', async () => { test('should response parameters be defined and valid', async () => { - // Server should prefer key over keyLength + // Server should prefer "key" over "keyLength" const response = await jsp.publish(commonData.hello, { password: commonPrivate, key: commonPrivate, @@ -84,10 +84,14 @@ describe('access', async () => { }); test('should fail on protected document', async () => { - expect(jsp.access(documentProtected.key)).rejects.toThrowError(); + const responsePromise = jsp.access(documentProtected.key); + + expect(responsePromise).rejects.toThrowError(); }); test('should fail on bad password protected document', async () => { - expect(jsp.access(documentProtected.key, { password: commonPrivateInvalid })).rejects.toThrowError(); + const responsePromise = jsp.access(documentProtected.key, { password: commonPrivateInvalid }); + + expect(responsePromise).rejects.toThrowError(); }); }); diff --git a/src/JSP.ts b/src/JSP.ts index 48ee550..7c53c4b 100644 --- a/src/JSP.ts +++ b/src/JSP.ts @@ -1,4 +1,4 @@ -import { merge } from 'ts-deepmerge'; +import { deepmerge } from 'deepmerge-ts'; import { version as libraryVersion } from '../package.json'; import { HTTP } from './HTTP.ts'; import { access } from './endpoints/v2/access.ts'; @@ -24,7 +24,7 @@ export class JSP { public constructor(clientOptions?: Partial) { const options = clientOptions - ? (merge(JSP.defaultOptions, clientOptions) as ClientOptions) + ? (deepmerge(JSP.defaultOptions, clientOptions) as ClientOptions) : JSP.defaultOptions; this.http = new HTTP(options);