From 322a2c07063c1a0e0ebc43c1d6c90c26e72b82f0 Mon Sep 17 00:00:00 2001 From: edmand46 Date: Wed, 19 Aug 2026 17:48:55 +0300 Subject: [PATCH] 0.4.0: battlepass levelNumber fix, UGC removed, regenerated API types, CI publish on tags --- .gitea/workflows/ci.yaml | 27 +++++++++++++++++ CHANGELOG.md | 10 +++++++ package.json | 2 +- src/generated/api.ts | 37 ----------------------- src/generated/index.ts | 1 - src/generated/ugc.ts | 47 ------------------------------ src/scenario/engine/sessions.ts | 2 +- test/ScenarioService.test.ts | 2 +- test/e2e-prod/purchase.e2e.test.ts | 4 +-- 9 files changed, 42 insertions(+), 90 deletions(-) delete mode 100644 src/generated/ugc.ts diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 4c1c999..540f98b 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -3,6 +3,7 @@ name: CI on: push: branches: [main, master] + tags: ['v*'] pull_request: jobs: @@ -29,3 +30,29 @@ jobs: - name: Build run: npm run build + + publish: + if: startsWith(github.ref, 'refs/tags/v') + needs: check + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + registry-url: https://hub.rudder.build/api/packages/rudder/npm/ + + - name: Install + run: npm ci + + - name: Build + run: npm run build + + - name: Publish + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.GITEA_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index b220c64..867c160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.4.0 + +- Fixed `BattlePassLevelSession.level` reading node data key `level` — the + admin editor writes `levelNumber`, so tiers always reported `0`. The session + now reads `levelNumber`, matching the editor and server validation. +- UGC support removed from the generated wire types (`src/generated/ugc.ts` + deleted by apigen); no UGC surface was ever exposed by this SDK. +- Generated API types regenerated from the gateway openapi spec, adding the + new platform operations. + ## 0.3.0 Breaking changes — the package was aligned with the Rudder SDK glossary and diff --git a/package.json b/package.json index a785598..7a39b03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rudder/js-sdk", - "version": "0.1.0", + "version": "0.4.0", "publishConfig": { "registry": "https://hub.rudder.build/api/packages/rudder/npm/" }, diff --git a/src/generated/api.ts b/src/generated/api.ts index ec439f3..3168755 100644 --- a/src/generated/api.ts +++ b/src/generated/api.ts @@ -12,7 +12,6 @@ import type { ListRemoteConfigsResponse, RemoteConfig } from './remote-config.js import type { GetScenarioRunRequest, GetScenarioRunResponse, HandleScenarioCallbackRequest, HandleScenarioCallbackResponse, TriggerScenarioRequest, TriggerScenarioResponse, UpdateScenarioCounterRequest, UpdateScenarioCounterResponse } from './scenarios.js'; import type { GetStorageResponse, UpdateStorageRequest } from './storage.js'; import type { ListStoresResponse, PurchaseOfferRequest, PurchaseOfferResponse, Store } from './stores.js'; -import type { DeleteUgcResponse, GetDownloadUrlResponse, GetUploadUrlResponse, ListUgcResponse, SubmitUgcRequest, UgcSubmission } from './ugc.js'; /** The minimal transport contract the generated API functions call through. */ export interface Transport { @@ -61,24 +60,12 @@ export const api = { ): Promise => t.request('DELETE', `/sdk/v1/storage${qs([['type', query?.type]])}`), - deleteUgc: ( - t: Transport, - path: { id: string }, - ): Promise => - t.request('DELETE', `/sdk/v1/ugc/${enc(path.id)}`), - getBattlePassProgress: ( t: Transport, body: GetBattlePassProgressRequest, ): Promise => t.request('POST', '/sdk/v1/battlepass/progress', body), - getDownloadUrl: ( - t: Transport, - path: { id: string }, - ): Promise => - t.request('GET', `/sdk/v1/ugc/${enc(path.id)}/download`), - getInventory: ( t: Transport, ): Promise => @@ -131,18 +118,6 @@ export const api = { ): Promise => t.request('GET', `/sdk/v1/stores/${enc(path.slug)}`), - getUgc: ( - t: Transport, - path: { id: string }, - ): Promise => - t.request('GET', `/sdk/v1/ugc/${enc(path.id)}`), - - getUploadUrl: ( - t: Transport, - query?: { filename?: string }, - ): Promise => - t.request('GET', `/sdk/v1/ugc/upload-url${qs([['filename', query?.filename]])}`), - handleScenarioCallback: ( t: Transport, body: HandleScenarioCallbackRequest, @@ -170,12 +145,6 @@ export const api = { ): Promise => t.request('GET', '/sdk/v1/stores'), - listUgc: ( - t: Transport, - query?: { status?: string; limit?: number; cursor?: string }, - ): Promise => - t.request('GET', `/sdk/v1/ugc${qs([['status', query?.status], ['limit', query?.limit], ['cursor', query?.cursor]])}`), - loginViaDevice: ( t: Transport, body: LoginViaDeviceRequest, @@ -214,12 +183,6 @@ export const api = { ): Promise => t.request('POST', `/sdk/v1/leaderboards/${enc(path.slug)}/submit-score`, body), - submitUgc: ( - t: Transport, - body: SubmitUgcRequest, - ): Promise => - t.request('POST', '/sdk/v1/ugc', body), - triggerScenario: ( t: Transport, body: TriggerScenarioRequest, diff --git a/src/generated/index.ts b/src/generated/index.ts index 3b5ff7a..34ff32f 100644 --- a/src/generated/index.ts +++ b/src/generated/index.ts @@ -13,6 +13,5 @@ export * from './remote-config.js'; export * from './scenarios.js'; export * from './storage.js'; export * from './stores.js'; -export * from './ugc.js'; export * from './api.js'; export * from './errors.js'; diff --git a/src/generated/ugc.ts b/src/generated/ugc.ts deleted file mode 100644 index a4ab08f..0000000 --- a/src/generated/ugc.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -export interface DeleteUgcResponse { - "success"?: boolean; -} - -export interface GetDownloadUrlResponse { - "downloadUrl"?: string; -} - -export interface GetUploadUrlResponse { - "fileKey"?: string; - "uploadUrl"?: string; -} - -export interface ListUgcResponse { - "items"?: UgcSubmission[]; - "nextCursor"?: string; -} - -export interface SubmitUgcRequest { - "description"?: string; - "fileKey"?: string; - "fileSize"?: number; - "metadata"?: { [key: string]: unknown }; - "name"?: string; -} - -export interface SubmittedBy { - "userId"?: string; - "username"?: string; -} - -export interface UgcSubmission { - "description"?: string; - "fileSize"?: number; - "fileUrl"?: string; - "id"?: string; - "metadata"?: { [key: string]: unknown }; - "name"?: string; - "reviewedAt"?: string; - "reviewedBy"?: string; - "status"?: string; - "submittedAt"?: string; - "submittedBy"?: SubmittedBy; -} - diff --git a/src/scenario/engine/sessions.ts b/src/scenario/engine/sessions.ts index d1cdfef..fcc1172 100644 --- a/src/scenario/engine/sessions.ts +++ b/src/scenario/engine/sessions.ts @@ -320,7 +320,7 @@ export class BattlePassLevelSession { constructor(private readonly context: ScenarioNodeContext) {} get level(): number { - return this.context.get('level', 0); + return this.context.get('levelNumber', 0); } get data(): Record { diff --git a/test/ScenarioService.test.ts b/test/ScenarioService.test.ts index 7ac0e4d..fb6f473 100644 --- a/test/ScenarioService.test.ts +++ b/test/ScenarioService.test.ts @@ -185,7 +185,7 @@ describe('ScenarioService', () => { client.effects.onBattlePassLevel(onLevel); const plan = makePlan({ - nodes: [makeNode('start', 'battlepass_level', { level: 3 })], + nodes: [makeNode('start', 'battlepass_level', { levelNumber: 3 })], }); vi.stubGlobal('fetch', vi.fn().mockResolvedValue( new Response(JSON.stringify({ plans: [plan] }), { status: 200 }), diff --git a/test/e2e-prod/purchase.e2e.test.ts b/test/e2e-prod/purchase.e2e.test.ts index 4953248..c630377 100644 --- a/test/e2e-prod/purchase.e2e.test.ts +++ b/test/e2e-prod/purchase.e2e.test.ts @@ -11,7 +11,7 @@ interface AdminWalletDetails { balance: number; } interface AdminInventoryItem { - itemId: string; + slug: string; amount: number; } interface AdminPlayerDetails { @@ -70,7 +70,7 @@ describe('e2e-prod: purchase (wallet/inventory/limits)', () => { const details = await api.get( `/game/v1/projects/${artifact.projectId}/players/${playerId}`, ); - const inv = details.inventory?.find((i) => i.itemId === artifact.item.id); + const inv = details.inventory?.find((i) => i.slug === artifact.item.id); expect(Number(inv?.amount)).toBe(artifact.store.paidGrantAmount); // 4. Idempotency: the same key twice charges once.