From d3c64e00a015b149490ff7debfb7366a6b7a95cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:51:28 +0000 Subject: [PATCH 1/4] Initial plan From 91cb4ad5a7fdcff7ec7a968efdd5361130227b2f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:28:06 +0000 Subject: [PATCH 2/4] feat: add keyMap property and mapFields() to BiDataTable for field name mapping --- src/module/BITable/index.ts | 24 +++++++++++++++++++++--- test/index.spec.ts | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/module/BITable/index.ts b/src/module/BITable/index.ts index 0b00ec9..9e1305e 100644 --- a/src/module/BITable/index.ts +++ b/src/module/BITable/index.ts @@ -50,6 +50,8 @@ export function BiDataTable = Filter>; + extractFields({ fields, ...meta }: TableRecord): T { return { ...meta, ...fields }; } @@ -59,6 +61,22 @@ export function BiDataTable = Filter): T { + const data = this.normalize(record); + + if (!this.keyMap) return data; + + const result = { ...data } as Record; + + for (const [typeKey, headerName] of Object.entries(this.keyMap)) + if (headerName !== undefined && headerName in result) { + result[typeKey] = result[headerName]; + delete result[headerName]; + } + + return result as T; + } + wrapFields(fields: F) { return fields as unknown as T; } @@ -71,7 +89,7 @@ export function BiDataTable = Filter>( `${this.baseURI}/${id}?${buildURLData(this.queryOptions)}` ); - return (this.currentOne = this.normalize(body!.data!.record)); + return (this.currentOne = this.mapFields(body!.data!.record)); } /** @@ -89,7 +107,7 @@ export function BiDataTable = Filter>(this.baseURI, { fields })); - return (this.currentOne = this.normalize(body!.data!.record)); + return (this.currentOne = this.mapFields(body!.data!.record)); } makeFilter(filter: F) { @@ -124,7 +142,7 @@ export function BiDataTable = Filter (this.totalCount = total), { ...searchParams, ...this.queryOptions } ); - for await (const item of stream) yield this.normalize(item); + for await (const item of stream) yield this.mapFields(item); } async getViewList( diff --git a/test/index.spec.ts b/test/index.spec.ts index 34dd612..4523b75 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -214,6 +214,30 @@ describe('MobX Lark SDK', async () => { queryOptions: BiDataQueryOptions = { text_field_as_array: false }; } + it('should map field names using keyMap in BiDataTable', expect => { + class MappedDataTableModel extends BiDataTable< + Record<'id' | 'name' | 'type', TableCellValue> + >() { + client = app.client; + + keyMap = { name: '商品名称', type: '类型' }; + } + const table = new MappedDataTableModel('appId', 'tableId'); + + const record = table.mapFields({ + id: 'rec1', + record_id: 'rec1', + created_by: {} as any, + created_time: 0, + fields: { 商品名称: 'Widget', 类型: 'product' } as any + }); + + expect(record.name === 'Widget'); + expect(record.type === 'product'); + expect(!('商品名称' in record)); + expect(!('类型' in record)); + }); + await it('should get a page of records in a BITable table', async expect => { const table = new ExampleDataTableModel(BITABLE_ID!, BITABLE_TABLE_ID!); From e0f6f394ea35a26564320eef9871583a018c2816 Mon Sep 17 00:00:00 2001 From: TechQuery Date: Sat, 4 Apr 2026 01:09:59 +0800 Subject: [PATCH 3/4] [refactor] map Getting, Updating & Filter objects with Key Map [optimize] update Upstream packages --- ReadMe.md | 2 + package.json | 10 +- pnpm-lock.yaml | 393 +++++++++++++++++----------------- src/module/BITable/index.ts | 86 ++++---- src/module/BITable/utility.ts | 22 +- test/index.spec.ts | 28 +-- 6 files changed, 264 insertions(+), 277 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index f2b04cd..6db8448 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -86,6 +86,8 @@ export class ClientModel extends BiDataTable() { queryOptions: BiDataQueryOptions = { text_field_as_array: false }; + keyMap = { name: '名称', type: '类型' } as const; + constructor(appId = LarkBaseId, tableId = CLIENT_TABLE) { super(appId, tableId); } diff --git a/package.json b/package.json index 5f97ae8..39c39dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx-lark", - "version": "2.8.0", + "version": "2.8.1", "license": "LGPL-3.0", "author": "shiy2008@gmail.com", "description": "Unofficial TypeScript SDK for FeiShu/Lark API, which is based on MobX-RESTful.", @@ -25,7 +25,7 @@ "url": "https://github.com/idea2app/MobX-Lark/issues" }, "dependencies": { - "@swc/helpers": "^0.5.20", + "@swc/helpers": "^0.5.21", "@types/react": "^19.2.14", "koajax": "^3.3.0", "lodash.memoize": "^4.1.2", @@ -42,10 +42,10 @@ "@parcel/transformer-typescript-tsc": "~2.16.4", "@types/fs-extra": "^11.0.4", "@types/lodash.memoize": "^4.1.9", - "@types/node": "^24.12.0", + "@types/node": "^24.12.2", "@types/react-dom": "^19.2.3", "@types/turndown": "^5.0.6", - "dotenv": "^17.3.1", + "dotenv": "^17.4.0", "fs-extra": "^11.3.4", "husky": "^9.1.7", "lint-staged": "^16.4.0", @@ -54,7 +54,7 @@ "react": "^19.2.4", "react-dom": "^19.2.4", "ts-node": "^10.9.2", - "turndown": "^7.2.2", + "turndown": "^7.2.3", "typedoc": "^0.28.18", "typedoc-plugin-mdn-links": "^5.1.1", "typescript": "~5.8.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9601562..b0537bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@swc/helpers': - specifier: ^0.5.20 - version: 0.5.20 + specifier: ^0.5.21 + version: 0.5.21 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -35,10 +35,10 @@ importers: devDependencies: '@parcel/config-default': specifier: ~2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) '@parcel/transformer-typescript-tsc': specifier: ~2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(typescript@5.8.3) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(typescript@5.8.3) '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -46,8 +46,8 @@ importers: specifier: ^4.1.9 version: 4.1.9 '@types/node': - specifier: ^24.12.0 - version: 24.12.0 + specifier: ^24.12.2 + version: 24.12.2 '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.14) @@ -55,8 +55,8 @@ importers: specifier: ^5.0.6 version: 5.0.6 dotenv: - specifier: ^17.3.1 - version: 17.3.1 + specifier: ^17.4.0 + version: 17.4.0 fs-extra: specifier: ^11.3.4 version: 11.3.4 @@ -68,7 +68,7 @@ importers: version: 16.4.0 parcel: specifier: ~2.16.4 - version: 2.16.4(@swc/helpers@0.5.20) + version: 2.16.4(@swc/helpers@0.5.21) prettier: specifier: ^3.8.1 version: 3.8.1 @@ -80,10 +80,10 @@ importers: version: 19.2.4(react@19.2.4) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.21))(@types/node@24.12.2)(typescript@5.8.3) turndown: - specifier: ^7.2.2 - version: 7.2.2 + specifier: ^7.2.3 + version: 7.2.3 typedoc: specifier: ^0.28.18 version: 0.28.18(typescript@5.8.3) @@ -685,8 +685,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.20': - resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} @@ -718,8 +718,8 @@ packages: '@types/lodash@4.17.24': resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} - '@types/node@24.12.0': - resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} @@ -855,12 +855,12 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.3.1: - resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + dotenv@17.4.0: + resolution: {integrity: sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ==} engines: {node: '>=12'} - electron-to-chromium@1.5.330: - resolution: {integrity: sha512-jFNydB5kFtYUobh4IkWUnXeyDbjf/r9gcUEXe1xcrcUxIGfTdzPXA+ld6zBRbwvgIGVzDll/LTIiDztEtckSnA==} + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1084,8 +1084,8 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} @@ -1212,8 +1212,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turndown@7.2.2: - resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} + turndown@7.2.3: + resolution: {integrity: sha512-7pk5AH3rIT3rXShFfsIAb5m9q+OhWbMfRovA6UI8Mi2Oy4qjQMZCGVIPuelkirVSmnRyAOxMh/Wxj6qjYe2wRw==} + engines: {node: '>=18', npm: '>=9'} type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -1358,11 +1359,11 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 '@parcel/graph': 3.6.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1370,10 +1371,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/logger': 2.16.4 '@parcel/utils': 2.16.4 lmdb: 2.8.5 @@ -1384,70 +1385,70 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': - dependencies: - '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) - '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21)': + dependencies: + '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) + '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/core@2.16.4(@swc/helpers@0.5.20)': + '@parcel/core@2.16.4(@swc/helpers@0.5.21)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/graph': 3.6.4 '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/profiler': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) base-x: 3.0.11 browserslist: 4.28.2 clone: 2.1.2 @@ -1472,15 +1473,15 @@ snapshots: '@parcel/feature-flags@2.16.4': {} - '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/feature-flags': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/types-internal': 2.16.4 '@parcel/utils': 2.16.4 '@parcel/watcher': 2.5.6 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - napi-wasm @@ -1498,20 +1499,20 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@mischnic/json-sourcemap': 0.1.1 '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1520,10 +1521,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.2 @@ -1533,68 +1534,68 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - napi-wasm - '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': + '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21)': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@swc/core': 1.15.21(@swc/helpers@0.5.20) + '@swc/core': 1.15.21(@swc/helpers@0.5.21) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' - napi-wasm - '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': + '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21)': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/logger': 2.16.4 - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@swc/core': 1.15.21(@swc/helpers@0.5.20) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@swc/core': 1.15.21(@swc/helpers@0.5.21) semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 lightningcss: 1.32.0 @@ -1603,23 +1604,23 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 globals: 13.24.0 nullthrows: 1.1.1 @@ -1627,33 +1628,33 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -1665,10 +1666,10 @@ snapshots: '@parcel/types-internal': 2.16.4 chrome-trace-event: 1.0.4 - '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 chalk: 4.1.2 term-size: 2.2.1 @@ -1676,19 +1677,19 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/codeframe': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 chrome-trace-event: 1.0.4 nullthrows: 1.1.1 @@ -1696,35 +1697,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1732,9 +1733,9 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: @@ -1780,10 +1781,10 @@ snapshots: dependencies: detect-libc: 1.0.3 - '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.2 @@ -1794,10 +1795,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.2 @@ -1807,35 +1808,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@swc/helpers': 0.5.20 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@swc/helpers': 0.5.21 browserslist: 4.28.2 nullthrows: 1.1.1 regenerator-runtime: 0.14.1 @@ -1843,25 +1844,25 @@ snapshots: transitivePeerDependencies: - napi-wasm - '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 clone: 2.1.2 @@ -1872,43 +1873,43 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/error-overlay': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 react-refresh: 0.16.0 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-typescript-tsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(typescript@5.8.3)': + '@parcel/transformer-typescript-tsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(typescript@5.8.3)': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/ts-utils': 2.16.4(typescript@5.8.3) typescript: 5.8.3 @@ -1928,10 +1929,10 @@ snapshots: '@parcel/source-map': 2.1.1 utility-types: 3.11.0 - '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/types-internal': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -2009,9 +2010,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 '@parcel/logger': 2.16.4 '@parcel/profiler': 2.16.4 @@ -2077,7 +2078,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.15.21': optional: true - '@swc/core@1.15.21(@swc/helpers@0.5.20)': + '@swc/core@1.15.21(@swc/helpers@0.5.21)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.26 @@ -2094,11 +2095,11 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.15.21 '@swc/core-win32-ia32-msvc': 1.15.21 '@swc/core-win32-x64-msvc': 1.15.21 - '@swc/helpers': 0.5.20 + '@swc/helpers': 0.5.21 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.20': + '@swc/helpers@0.5.21': dependencies: tslib: 2.8.1 @@ -2117,7 +2118,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/hast@3.0.4': dependencies: @@ -2125,7 +2126,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/lodash.memoize@4.1.9': dependencies: @@ -2133,7 +2134,7 @@ snapshots: '@types/lodash@4.17.24': {} - '@types/node@24.12.0': + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 @@ -2187,8 +2188,8 @@ snapshots: dependencies: baseline-browser-mapping: 2.10.13 caniuse-lite: 1.0.30001784 - electron-to-chromium: 1.5.330 - node-releases: 2.0.36 + electron-to-chromium: 1.5.331 + node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) caniuse-lite@1.0.30001784: {} @@ -2239,9 +2240,9 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.3.1: {} + dotenv@17.4.0: {} - electron-to-chromium@1.5.330: {} + electron-to-chromium@1.5.331: {} emoji-regex@10.6.0: {} @@ -2295,7 +2296,7 @@ snapshots: koajax@3.3.0(typescript@5.8.3): dependencies: - '@swc/helpers': 0.5.20 + '@swc/helpers': 0.5.21 regenerator-runtime: 0.14.1 web-streams-polyfill: 4.2.0 web-utility: 4.6.4(typescript@5.8.3) @@ -2422,7 +2423,7 @@ snapshots: mobx-restful@2.1.4(mobx@6.15.0)(typescript@5.8.3): dependencies: - '@swc/helpers': 0.5.20 + '@swc/helpers': 0.5.21 idb-keyval: 6.2.2 koajax: 3.3.0(typescript@5.8.3) mobx: 6.15.0 @@ -2465,7 +2466,7 @@ snapshots: detect-libc: 2.1.2 optional: true - node-releases@2.0.36: {} + node-releases@2.0.37: {} nullthrows@1.1.1: {} @@ -2475,19 +2476,19 @@ snapshots: ordered-binary@1.6.1: {} - parcel@2.16.4(@swc/helpers@0.5.20): + parcel@2.16.4(@swc/helpers@0.5.21): dependencies: - '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 chalk: 4.1.2 commander: 12.1.0 @@ -2567,14 +2568,14 @@ snapshots: tinyexec@1.0.4: {} - ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.21(@swc/helpers@0.5.21))(@types/node@24.12.2)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.12.0 + '@types/node': 24.12.2 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -2585,11 +2586,11 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.21(@swc/helpers@0.5.20) + '@swc/core': 1.15.21(@swc/helpers@0.5.21) tslib@2.8.1: {} - turndown@7.2.2: + turndown@7.2.3: dependencies: '@mixmark-io/domino': 2.2.0 @@ -2632,7 +2633,7 @@ snapshots: web-utility@4.6.4(typescript@5.8.3): dependencies: - '@swc/helpers': 0.5.20 + '@swc/helpers': 0.5.21 regenerator-runtime: 0.14.1 typescript: 5.8.3 diff --git a/src/module/BITable/index.ts b/src/module/BITable/index.ts index 9e1305e..f2ad72c 100644 --- a/src/module/BITable/index.ts +++ b/src/module/BITable/index.ts @@ -13,7 +13,7 @@ import { TableRecordFields, TableView } from './type'; -import { makeSimpleFilter } from './utility'; +import { makeSimpleFilter, mapKeys } from './utility'; export * from './type'; export * from './utility'; @@ -31,13 +31,13 @@ export interface BiDataQueryOptions { /** * @see {@link https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/bitable-overview} */ -export function BiDataTable = Filter>( +export function BiDataTable = Filter>( Base = ListModel ) { - abstract class BiDataTableModel extends Stream(Base) { - requiredKeys: readonly (keyof T)[] = []; + abstract class BiDataTableModel extends Stream(Base) { + requiredKeys: readonly (keyof D)[] = []; - sort: Partial> = {}; + sort: Partial> = {}; queryOptions: BiDataQueryOptions = { text_field_as_array: true, @@ -50,9 +50,15 @@ export function BiDataTable = Filter>; + keyMap?: Partial>; - extractFields({ fields, ...meta }: TableRecord): T { + get nameMap() { + return this.keyMap + ? Object.fromEntries(Object.entries(this.keyMap).map(([key, name]) => [name, key])) + : {}; + } + + extractFields({ fields, ...meta }: TableRecord): D { return { ...meta, ...fields }; } @@ -61,24 +67,19 @@ export function BiDataTable = Filter): T { - const data = this.normalize(record); - - if (!this.keyMap) return data; - - const result = { ...data } as Record; + /** + * @protected + */ + mapFields({ fields, ...meta }: TableRecord) { + const { nameMap } = this; - for (const [typeKey, headerName] of Object.entries(this.keyMap)) - if (headerName !== undefined && headerName in result) { - result[typeKey] = result[headerName]; - delete result[headerName]; - } + const mappedData = isEmpty(nameMap) ? (fields as D) : (mapKeys(fields, nameMap) as D); - return result as T; + return this.normalize({ fields: mappedData, ...meta }); } wrapFields(fields: F) { - return fields as unknown as T; + return fields as unknown as D; } /** @@ -86,7 +87,7 @@ export function BiDataTable = Filter>( + const { body } = await this.client.get>( `${this.baseURI}/${id}?${buildURLData(this.queryOptions)}` ); return (this.currentOne = this.mapFields(body!.data!.record)); @@ -98,29 +99,31 @@ export function BiDataTable = Filter>(`${this.baseURI}/${id}`, { - fields - }) - : this.client.post>(this.baseURI, { - fields - })); + ? this.client.put>(`${this.baseURI}/${id}`, { fields }) + : this.client.post>(this.baseURI, { fields })); + return (this.currentOne = this.mapFields(body!.data!.record)); } + mapFilter(filter: DataObject) { + return isEmpty(this.keyMap) ? (filter as F) : (mapKeys(filter, this.keyMap) as F); + } + makeFilter(filter: F) { - return [ + const requiredFilter = this.requiredKeys[0] && - makeSimpleFilter( - Object.fromEntries(this.requiredKeys.map(key => [key, ''])), - '!=' - ), - !isEmpty(filter) && makeSimpleFilter(filter) - ] - .filter(Boolean) - .join('&&'); + makeSimpleFilter( + this.mapFilter(Object.fromEntries(this.requiredKeys.map(key => [key, '']))), + '!=' + ); + const customFilter = !isEmpty(filter) && makeSimpleFilter(this.mapFilter(filter)); + + return [requiredFilter, customFilter].filter(Boolean).join('&&'); } /** @@ -136,7 +139,7 @@ export function BiDataTable = Filter `${key} ${order}`) ) }; - const stream = createPageStream>( + const stream = createPageStream>( this.client, this.baseURI, total => (this.totalCount = total), @@ -175,12 +178,11 @@ export type BiSearchFilter = Filter & { }; export function BiSearch = BiSearchFilter>( - Model: Constructor> + Model: ReturnType> ) { abstract class BiSearchModel extends Model { declare baseURI: string; declare client: RESTClient; - declare loadPage: (pageIndex: number, pageSize: number, filter: F) => Promise>; abstract searchKeys: readonly (keyof TableRecordFields)[]; @@ -188,7 +190,9 @@ export function BiSearch = BiS accessor keywords = ''; makeFilter(filter: F) { - return isEmpty(filter) ? '' : makeSimpleFilter(filter, 'contains', 'OR'); + return isEmpty(filter) + ? '' + : makeSimpleFilter(this.mapFilter(filter), 'contains', 'OR'); } async getList( diff --git a/src/module/BITable/utility.ts b/src/module/BITable/utility.ts index d3b2c3e..010020d 100644 --- a/src/module/BITable/utility.ts +++ b/src/module/BITable/utility.ts @@ -1,10 +1,13 @@ import { DataObject } from 'mobx-restful'; -import { - TableCellLink, - TableCellLocation, - TableCellRelation, - TableCellText -} from './type'; +import { TableCellLink, TableCellLocation, TableCellRelation, TableCellText } from './type'; + +export const mapKeys = ( + data: I, + map: Partial> +) => + Object.fromEntries( + Object.entries(data).map(([key, value]) => [map[key as keyof I] || key, value]) + ) as O; export type FilterOperator = '<' | '<=' | '=' | '!=' | '=>' | '>' | 'contains'; @@ -34,9 +37,7 @@ export function makeSimpleFilter( return list[1] ? `${relation}(${list})` : list[0]; } -export const normalizeText = ( - value: TableCellText | TableCellLink | TableCellRelation -) => +export const normalizeText = (value: TableCellText | TableCellLink | TableCellRelation) => (value && typeof value === 'object' && 'text' in value && value.text) || ''; export const normalizeTextArray = (list: TableCellText[]) => @@ -50,8 +51,7 @@ export const normalizeTextArray = (list: TableCellText[]) => [''] ); export function coordinateOf(location: TableCellLocation): [number, number] { - const [longitude, latitude] = - (location as TableCellLocation)?.location.split(',') || []; + const [longitude, latitude] = (location as TableCellLocation)?.location.split(',') || []; return [+latitude, +longitude]; } diff --git a/test/index.spec.ts b/test/index.spec.ts index 4523b75..fe2dedc 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -212,31 +212,9 @@ describe('MobX Lark SDK', async () => { client = app.client; queryOptions: BiDataQueryOptions = { text_field_as_array: false }; - } - - it('should map field names using keyMap in BiDataTable', expect => { - class MappedDataTableModel extends BiDataTable< - Record<'id' | 'name' | 'type', TableCellValue> - >() { - client = app.client; - keyMap = { name: '商品名称', type: '类型' }; - } - const table = new MappedDataTableModel('appId', 'tableId'); - - const record = table.mapFields({ - id: 'rec1', - record_id: 'rec1', - created_by: {} as any, - created_time: 0, - fields: { 商品名称: 'Widget', 类型: 'product' } as any - }); - - expect(record.name === 'Widget'); - expect(record.type === 'product'); - expect(!('商品名称' in record)); - expect(!('类型' in record)); - }); + keyMap = { name: '名称', type: '类型' }; + } await it('should get a page of records in a BITable table', async expect => { const table = new ExampleDataTableModel(BITABLE_ID!, BITABLE_TABLE_ID!); @@ -252,6 +230,8 @@ describe('MobX Lark SDK', async () => { ) { client = app.client; + keyMap = { name: '名称', type: '类型' }; + searchKeys = ['name']; } const table = new SearchDataTableModel(BITABLE_ID!, BITABLE_TABLE_ID!); From d0429dacd66a75ec87fd59da85561625273f3713 Mon Sep 17 00:00:00 2001 From: TechQuery Date: Sat, 4 Apr 2026 01:20:23 +0800 Subject: [PATCH 4/4] [optimize] update GitHub-reward scripts --- .github/scripts/count-reward.ts | 9 ++++++++- .github/scripts/share-reward.ts | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/scripts/count-reward.ts b/.github/scripts/count-reward.ts index 154d3f3..cf2d419 100644 --- a/.github/scripts/count-reward.ts +++ b/.github/scripts/count-reward.ts @@ -19,7 +19,11 @@ let rawYAML = ''; for (const tag of rewardTags) rawYAML += (await $`git tag -l --format="%(contents)" ${tag}`) + '\n'; -if (!rawYAML.trim()) throw new ReferenceError('No reward data is found for the last month.'); +if (!rawYAML.trim()) { + console.warn('No reward data is found for the last month.'); + + process.exit(0); +} const rewards = YAML.parse(rawYAML) as Reward[]; @@ -54,4 +58,7 @@ await $`git config user.email "github-actions[bot]@users.noreply.github.com"`; await $`git tag -a ${tagName} $(git rev-parse HEAD) -m ${summaryText}`; await $`git push origin --tags --no-verify`; +await $`git config unset user.name`; +await $`git config unset user.email`; + await $`gh release create ${tagName} --notes ${summaryText}`; diff --git a/.github/scripts/share-reward.ts b/.github/scripts/share-reward.ts index 2e6b7d1..a2d919d 100644 --- a/.github/scripts/share-reward.ts +++ b/.github/scripts/share-reward.ts @@ -1,3 +1,5 @@ +import 'npm:array-unique-proposal'; + import { components } from 'npm:@octokit/openapi-types'; import { $, argv, YAML } from 'npm:zx'; @@ -68,7 +70,8 @@ function isBotUser(login: string) { } // Filter out Bot users from the list -const allUsers = [author.login, ...assignees.map(({ login }) => login)]; +const allUsers = [author.login, ...assignees.map(({ login }) => login)].uniqueBy(); + const users = allUsers.filter(login => !isBotUser(login)); console.log(`All users: ${allUsers.join(', ')}`); @@ -101,9 +104,13 @@ console.log(listText); await $`git config user.name "github-actions[bot]"`; await $`git config user.email "github-actions[bot]@users.noreply.github.com"`; + await $`git tag -a "reward-${issueNumber}" ${mergeCommitSha} -m ${listText}`; await $`git push origin --tags --no-verify`; +await $`git config unset user.name`; +await $`git config unset user.email`; + const commentBody = `## Reward data \`\`\`yml