From 72229df93af6ccc217baeaf65e5bacb8bc5111e5 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Thu, 30 Oct 2025 10:28:36 +0800 Subject: [PATCH 01/27] fix(apps): lint --- apps/cli/src/command/helper.ts | 2 +- apps/cli/src/command/utils.ts | 45 ++++++++++++++++------ apps/cli/src/linter/specs/consumer.spec.ts | 1 - apps/cli/src/linter/specs/upstream.spec.ts | 4 +- apps/cli/src/tasks/lint.ts | 1 - libs/sdk/src/backend/index.ts | 2 +- libs/sdk/src/core/schema.ts | 2 + 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/apps/cli/src/command/helper.ts b/apps/cli/src/command/helper.ts index 4f098c67..71926a4e 100644 --- a/apps/cli/src/command/helper.ts +++ b/apps/cli/src/command/helper.ts @@ -8,7 +8,7 @@ import parseDuration from 'parse-duration'; import qs from 'qs'; export interface BaseOptions { - verbose: boolean; + verbose: number; } export class BaseCommand< OPTS extends BaseOptions = BaseOptions, diff --git a/apps/cli/src/command/utils.ts b/apps/cli/src/command/utils.ts index 18481e7a..d602c86e 100644 --- a/apps/cli/src/command/utils.ts +++ b/apps/cli/src/command/utils.ts @@ -62,7 +62,12 @@ export const toKVConfiguration = ( ) { return [ resourceType, - Object.fromEntries(resources.map((item) => [item.name, item])), + Object.fromEntries( + (Array.isArray(resources) ? resources : []).map((item) => [ + item.name, + item, + ]), + ), ]; } else { throw new Error( @@ -138,29 +143,45 @@ export const mergeConfigurations = ( }; fileContents.forEach((config) => { - config.services && result.services.push(...config.services); - config.ssls && result.ssls.push(...config.ssls); - config.consumers && result.consumers.push(...config.consumers); - config.global_rules && + if (config.services) { + result.services.push(...config.services); + } + if (config.ssls) { + result.ssls.push(...config.ssls); + } + if (config.consumers) { + result.consumers.push(...config.consumers); + } + if (config.global_rules) { Object.keys(config.global_rules).forEach((globalRuleName: string) => { result.global_rules[globalRuleName] = config.global_rules[globalRuleName]; }); - config.plugin_metadata && + } + if (config.plugin_metadata) { Object.keys(config.plugin_metadata).forEach( (pluginMetadataName: string) => { result.plugin_metadata[pluginMetadataName] = config.plugin_metadata[pluginMetadataName]; }, ); + } - config.routes && result.routes.push(...config.routes); - config.stream_routes && result.stream_routes.push(...config.stream_routes); - /* config.consumer_groups && + if (config.routes) { + result.routes.push(...config.routes); + } + if (config.stream_routes) { + result.stream_routes.push(...config.stream_routes); + } + /* if (config.consumer_groups) { result.consumer_groups.push(...config.consumer_groups); - config.plugin_configs && + } + if (config.plugin_configs) { result.plugin_configs.push(...config.plugin_configs); - config.upstreams && result.upstreams.push(...config.upstreams); */ + } + if (config.upstreams) { + result.upstreams.push(...config.upstreams); + } */ }); return result; @@ -332,7 +353,7 @@ export const resortConfiguration = ( ]; return [ key, - value.sort((a, b) => { + (Array.isArray(value) ? value : []).sort((a, b) => { // sort nested resources if (key === 'services') { if (a.routes) a.routes.sort((x, y) => x.name.localeCompare(y.name)); diff --git a/apps/cli/src/linter/specs/consumer.spec.ts b/apps/cli/src/linter/specs/consumer.spec.ts index 62a8da6d..6364fd54 100644 --- a/apps/cli/src/linter/specs/consumer.spec.ts +++ b/apps/cli/src/linter/specs/consumer.spec.ts @@ -52,7 +52,6 @@ describe('Consumer Linter', () => { }, { name: 'should check consumer credentials (unsupported type)', - //@ts-expect-error for test input: { consumers: [ { diff --git a/apps/cli/src/linter/specs/upstream.spec.ts b/apps/cli/src/linter/specs/upstream.spec.ts index 1dd840c2..304d076e 100644 --- a/apps/cli/src/linter/specs/upstream.spec.ts +++ b/apps/cli/src/linter/specs/upstream.spec.ts @@ -125,7 +125,7 @@ describe('Upstream Linter', () => { name: 'test', upstreams: [ { - id: 'my-upstream', + name: 'my-upstream', nodes: [ { host: '1.1.1.1', @@ -141,7 +141,7 @@ describe('Upstream Linter', () => { ], }, ], - } as ADCSDK.Configuration, + } as unknown as ADCSDK.Configuration, expect: false, errors: [ { diff --git a/apps/cli/src/tasks/lint.ts b/apps/cli/src/tasks/lint.ts index dc50cf63..d2b79f79 100644 --- a/apps/cli/src/tasks/lint.ts +++ b/apps/cli/src/tasks/lint.ts @@ -1,6 +1,5 @@ import * as ADCSDK from '@api7/adc-sdk'; import { ListrTask } from 'listr2'; -import pluralize from 'pluralize'; import { z } from 'zod'; import { check } from '../linter'; diff --git a/libs/sdk/src/backend/index.ts b/libs/sdk/src/backend/index.ts index b28e31e4..762c1b64 100644 --- a/libs/sdk/src/backend/index.ts +++ b/libs/sdk/src/backend/index.ts @@ -20,7 +20,7 @@ export interface BackendOptions { includeResourceType?: Array; excludeResourceType?: Array; - cacheKey: string; + cacheKey?: string; } export const BackendEventType = { diff --git a/libs/sdk/src/core/schema.ts b/libs/sdk/src/core/schema.ts index 3512aa23..ae866b5f 100644 --- a/libs/sdk/src/core/schema.ts +++ b/libs/sdk/src/core/schema.ts @@ -373,6 +373,8 @@ export const ConfigurationSchema = z.strictObject({ consumer_groups: z.array(consumerGroupSchema).optional(), global_rules: globalRuleSchema.optional(), plugin_metadata: pluginMetadataSchema.optional(), + routes: z.array(routeSchema).optional(), + stream_routes: z.array(streamRouteSchema).optional(), }); export type Configuration = z.infer; From c3fa05e06e8c721ce9de048e031249cae70d2c56 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Thu, 30 Oct 2025 12:06:34 +0800 Subject: [PATCH 02/27] f --- apps/cli/src/linter/specs/upstream.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cli/src/linter/specs/upstream.spec.ts b/apps/cli/src/linter/specs/upstream.spec.ts index 304d076e..363daf36 100644 --- a/apps/cli/src/linter/specs/upstream.spec.ts +++ b/apps/cli/src/linter/specs/upstream.spec.ts @@ -125,7 +125,7 @@ describe('Upstream Linter', () => { name: 'test', upstreams: [ { - name: 'my-upstream', + id: 'my-upstream', nodes: [ { host: '1.1.1.1', From 9011884bf96dda28b577c3636df3207e83a2b622 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Mon, 3 Nov 2025 11:31:24 +0800 Subject: [PATCH 03/27] fix api7 typing --- libs/backend-api7/package.json | 5 +- libs/backend-api7/src/fetcher.ts | 14 ++++-- libs/backend-api7/src/index.ts | 74 +++++++++++++++------------- libs/backend-api7/src/transformer.ts | 71 +++++++++++++------------- libs/backend-api7/src/typing.ts | 13 ++++- libs/backend-api7/tsconfig.json | 7 ++- libs/sdk/src/core/index.ts | 1 + libs/sdk/src/core/schema.ts | 3 ++ pnpm-lock.yaml | 17 +++++-- 9 files changed, 123 insertions(+), 82 deletions(-) diff --git a/libs/backend-api7/package.json b/libs/backend-api7/package.json index 35ef51e6..14291e88 100644 --- a/libs/backend-api7/package.json +++ b/libs/backend-api7/package.json @@ -9,8 +9,9 @@ } }, "devDependencies": { + "@api7/adc-differ": "workspace:*", "@api7/adc-sdk": "workspace:*", - "@api7/adc-differ": "workspace:*" + "@types/jest": "^30.0.0" }, "nx": { "name": "backend-api7", @@ -30,4 +31,4 @@ } } } -} +} \ No newline at end of file diff --git a/libs/backend-api7/src/fetcher.ts b/libs/backend-api7/src/fetcher.ts index 2bbf351c..fe5d2f00 100644 --- a/libs/backend-api7/src/fetcher.ts +++ b/libs/backend-api7/src/fetcher.ts @@ -248,7 +248,11 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { }), ).pipe( tap((resp) => logger(this.debugLogEvent(resp))), - map((resp) => this.toADC.transformPluginMetadatas(resp?.data?.value)), + map((resp) => + this.toADC.transformPluginMetadatas( + resp?.data?.value as typing.PluginMetadata, + ), + ), tap(() => logger(taskStateEvent('TASK_DONE'))), ); } @@ -278,18 +282,18 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { private isSkip(type: ADCSDK.ResourceType): boolean { const { includeResourceType, excludeResourceType } = this.opts.backendOpts || {}; - if (!isEmpty(includeResourceType) && !includeResourceType.includes(type)) { + if (!isEmpty(includeResourceType) && !includeResourceType?.includes(type)) { return true; } - if (!isEmpty(excludeResourceType) && excludeResourceType.includes(type)) { + if (!isEmpty(excludeResourceType) && excludeResourceType?.includes(type)) { return true; } return false; } private attachLabelSelector( - params: Record = {}, - ): Record { + params: Record = {}, + ): Record { const { labelSelector } = this.opts.backendOpts || {}; if (labelSelector) Object.entries(labelSelector).forEach(([key, value]) => { diff --git a/libs/backend-api7/src/index.ts b/libs/backend-api7/src/index.ts index a687da6c..cde1d1d1 100644 --- a/libs/backend-api7/src/index.ts +++ b/libs/backend-api7/src/index.ts @@ -17,16 +17,17 @@ import semver, { SemVer } from 'semver'; import { Fetcher } from './fetcher'; import { Operator } from './operator'; import { ToADC } from './transformer'; +import * as typing from './typing'; export class BackendAPI7 implements ADCSDK.Backend { private readonly client: AxiosInstance; - private readonly gatewayGroupName: string; + private readonly gatewayGroupName?: string; private static logScope = ['API7']; private readonly subject = new Subject(); private _version?: SemVer; private gatewayGroupId?: string; - private innerDefaultValue: ADCSDK.DefaultValue; + private innerDefaultValue?: ADCSDK.DefaultValue; constructor(private readonly opts: ADCSDK.BackendOptions) { const keepAlive: httpAgentOptions = { @@ -54,7 +55,9 @@ export class BackendAPI7 implements ADCSDK.Backend { } if (opts?.tlsClientCertFile) { agentConfig.cert = readFileSync(opts.tlsClientCertFile); - agentConfig.key = readFileSync(opts.tlsClientKeyFile); + if (opts?.tlsClientKeyFile) { + agentConfig.key = readFileSync(opts.tlsClientKeyFile); + } } config.httpsAgent = new httpsAgent(agentConfig); @@ -87,8 +90,8 @@ export class BackendAPI7 implements ADCSDK.Backend { return (this._version = resp?.data?.value === 'dev' - ? semver.coerce('999.999.999') - : semver.coerce(resp?.data?.value) || semver.coerce('0.0.0')); + ? semver.coerce('999.999.999')! + : semver.coerce(resp?.data?.value) || semver.coerce('0.0.0')!); } public async defaultValue() { @@ -97,16 +100,19 @@ export class BackendAPI7 implements ADCSDK.Backend { if (items.length < 2) return items[0]; if (!items.some((item) => item.type === 'object')) return {}; - const first = items.shift(); - if (!first.properties) first.properties = {}; - return items.reduce((pv, cv) => { + const first = items.shift() || {}; + if (!first?.properties) first.properties = {}; + return items.reduce((pv = {}, cv) => { Object.entries(cv?.properties ?? {}).forEach(([key, val]) => { + if (!pv.properties) pv.properties = {}; pv.properties[key] = val; }); return pv; }, first); }; - const extractObjectDefault = (obj: JSONSchema4) => { + const extractObjectDefault = ( + obj: JSONSchema4, + ): Record | null => { if (obj.type !== 'object') return null; if (!obj.properties) return null; @@ -118,7 +124,7 @@ export class BackendAPI7 implements ADCSDK.Backend { // For array nested object (e.g. service.upstream.nodes) if (field.type === 'array' && !Array.isArray(field.items)) { - if (field.items.type === 'object') + if (field?.items?.type === 'object') return [key, [extractObjectDefault(field.items)]]; } @@ -150,29 +156,31 @@ export class BackendAPI7 implements ADCSDK.Backend { const toADC = new ToADC(); return (this.innerDefaultValue = { core: Object.fromEntries( - Object.entries(resp.data.value).map( - ([type, schema]: [ADCSDK.ResourceType, JSONSchema4]) => { - const data = - extractObjectDefault( - schema.allOf ? mergeAllOf(schema.allOf) : schema, - ) ?? {}; - switch (type) { - case ADCSDK.ResourceType.ROUTE: - return [type, toADC.transformRoute(data)]; - case ADCSDK.ResourceType.INTERNAL_STREAM_SERVICE: - case ADCSDK.ResourceType.SERVICE: - return [type, toADC.transformService(data)]; - case ADCSDK.ResourceType.SSL: - return [type, toADC.transformSSL(data)]; - case ADCSDK.ResourceType.CONSUMER: - return [type, toADC.transformConsumer(data)]; - case ADCSDK.ResourceType.UPSTREAM: - return [type, toADC.transformUpstream(data)]; - default: - return [type, data]; - } - }, - ), + ( + Object.entries(resp.data.value || {}) as Array< + [ADCSDK.ResourceType, JSONSchema4] + > + ).map(([type, schema]) => { + const data = + extractObjectDefault( + schema.allOf ? mergeAllOf(schema.allOf) : schema, + ) ?? {}; + switch (type) { + case ADCSDK.ResourceType.ROUTE: + return [type, toADC.transformRoute(data as typing.Route)]; + case ADCSDK.ResourceType.INTERNAL_STREAM_SERVICE: + case ADCSDK.ResourceType.SERVICE: + return [type, toADC.transformService(data as typing.Service)]; + case ADCSDK.ResourceType.SSL: + return [type, toADC.transformSSL(data as typing.SSL)]; + case ADCSDK.ResourceType.CONSUMER: + return [type, toADC.transformConsumer(data as typing.Consumer)]; + case ADCSDK.ResourceType.UPSTREAM: + return [type, toADC.transformUpstream(data as typing.Upstream)]; + default: + return [type, data]; + } + }), ), } as ADCSDK.DefaultValue); } diff --git a/libs/backend-api7/src/transformer.ts b/libs/backend-api7/src/transformer.ts index 048057d2..8019d03f 100644 --- a/libs/backend-api7/src/transformer.ts +++ b/libs/backend-api7/src/transformer.ts @@ -4,11 +4,9 @@ import { attempt, isError } from 'lodash'; import * as typing from './typing'; export class ToADC { - private static transformLabels( - labels?: ADCSDK.Labels, - ): Record { - if (!labels) return undefined; - return Object.entries(labels).reduce((pv, [key, value]) => { + private static transformLabels(labels?: ADCSDK.Labels): ADCSDK.Labels { + if (!labels) return {} as ADCSDK.Labels; + return Object.entries(labels).reduce((pv, [key, value]) => { const res = attempt(JSON.parse, value as string); pv[key] = !isError(res) && Array.isArray(res) ? res : value; return pv; @@ -68,7 +66,6 @@ export class ToADC { public transformUpstream(upstream: typing.Upstream): ADCSDK.Upstream { return ADCSDK.utils.recursiveOmitUndefined({ - id: upstream.id, name: upstream.name, description: upstream.desc, labels: ToADC.transformLabels(upstream.labels), @@ -122,10 +119,8 @@ export class ToADC { id: ssl.id, labels: ToADC.transformLabels(ssl.labels), type: ssl.type, - snis: ssl.snis, - certificates: ssl?.cert - ? [{ certificate: ssl.cert, key: '' }] - : undefined, + snis: ssl.snis || [], + certificates: ssl?.cert ? [{ certificate: ssl.cert, key: '' }] : [], client: ssl.client ? { ca: ssl.client.ca, @@ -139,13 +134,16 @@ export class ToADC { public transformGlobalRule( globalRules: Array, ): Record { - return Object.fromEntries( - globalRules.map((globalRule) => { - const pluginName = Object.keys(globalRule.plugins)[0]; - const pluginConfig = Object.values(globalRule.plugins)[0]; - return [pluginName, pluginConfig]; - }), + const entries: Array<[string, ADCSDK.GlobalRule]> = globalRules.map( + (globalRule) => { + const [name, config] = Object.entries(globalRule.plugins)[0] as [ + string, + ADCSDK.GlobalRule, + ]; + return [name, config]; + }, ); + return Object.fromEntries(entries); } public transformPluginMetadatas( @@ -159,16 +157,19 @@ export class FromADC { private static transformLabels( labels?: ADCSDK.Labels, ): Record { - if (!labels) return undefined; - return Object.entries(labels).reduce((pv, [key, value]) => { - pv[key] = typeof value === 'string' ? value : JSON.stringify(value); - return pv; - }, {}); + if (!labels) return {}; + return Object.entries(labels).reduce>( + (pv, [key, value]) => { + pv[key] = typeof value === 'string' ? value : JSON.stringify(value); + return pv; + }, + {}, + ); } public transformRoute(route: ADCSDK.Route, serviceId: string): typing.Route { return ADCSDK.utils.recursiveOmitUndefined({ - route_id: route.id, + route_id: route.id || '', name: route.name, desc: route.description, labels: FromADC.transformLabels(route.labels), @@ -179,7 +180,7 @@ export class FromADC { paths: route.uris, priority: route.priority, timeout: route.timeout, - vars: route.vars, + vars: route.vars || [], }); } @@ -188,30 +189,30 @@ export class FromADC { serviceId: string, ): typing.StreamRoute { return ADCSDK.utils.recursiveOmitUndefined({ - stream_route_id: route.id, + stream_route_id: route.id || '', name: route.name, - desc: route.description, + desc: route.description || '', labels: FromADC.transformLabels(route.labels), service_id: serviceId, plugins: route.plugins, - server_addr: route.server_addr, - server_port: route.server_port, - remote_addr: route.remote_addr, + server_addr: route.server_addr || '', + server_port: route.server_port || 0, + remote_addr: route.remote_addr || '', }); } public transformService(service: ADCSDK.Service): typing.Service { return ADCSDK.utils.recursiveOmitUndefined({ - service_id: service.id, + service_id: service.id!, name: service.name, desc: service.description, labels: FromADC.transformLabels(service.labels), - upstream: service.upstream, + upstream: service.upstream as typing.Upstream, plugins: service.plugins, path_prefix: service.path_prefix, strip_path_prefix: service.strip_path_prefix, hosts: service.hosts, - type: ['tcp', 'udp', 'tls'].includes(service?.upstream?.scheme) + type: ['tcp', 'udp', 'tls'].includes(service?.upstream?.scheme || '') ? 'stream' : 'http', }); @@ -219,8 +220,7 @@ export class FromADC { public transformUpstream(upstream: ADCSDK.Upstream): typing.Upstream { return ADCSDK.utils.recursiveOmitUndefined({ - id: upstream.id, - name: upstream.name, + name: upstream.name || '', desc: upstream.description, labels: FromADC.transformLabels(upstream.labels), type: upstream.type, @@ -266,11 +266,10 @@ export class FromADC { } public transformSSL(ssl: ADCSDK.SSL): typing.SSL { - return ADCSDK.utils.recursiveOmitUndefined({ + return ADCSDK.utils.recursiveOmitUndefined({ id: ssl.id, labels: FromADC.transformLabels(ssl.labels), - status: 1, - type: ssl.type, + type: ssl.type ?? 'server', snis: ssl.snis, cert: ssl.certificates[0].certificate, diff --git a/libs/backend-api7/src/typing.ts b/libs/backend-api7/src/typing.ts index 51e97e29..a2751c33 100644 --- a/libs/backend-api7/src/typing.ts +++ b/libs/backend-api7/src/typing.ts @@ -24,7 +24,18 @@ export interface Route { // matcher paths: Array; - methods?: Array; + methods?: Array< + | 'GET' + | 'POST' + | 'PUT' + | 'DELETE' + | 'PATCH' + | 'HEAD' + | 'OPTIONS' + | 'TRACE' + | 'CONNECT' + | 'PURGE' + >; vars: Expr; // misc diff --git a/libs/backend-api7/tsconfig.json b/libs/backend-api7/tsconfig.json index 030598f9..39ab5381 100644 --- a/libs/backend-api7/tsconfig.json +++ b/libs/backend-api7/tsconfig.json @@ -1,7 +1,10 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": [], + "include": [ + "src", + "test" + ], "references": [ { "path": "../sdk" @@ -13,4 +16,4 @@ "path": "./tsconfig.spec.json" } ] -} +} \ No newline at end of file diff --git a/libs/sdk/src/core/index.ts b/libs/sdk/src/core/index.ts index 1d11bd4a..4c977370 100644 --- a/libs/sdk/src/core/index.ts +++ b/libs/sdk/src/core/index.ts @@ -29,6 +29,7 @@ export type { UpstreamNode, UpstreamTimeout, Upstream, + UpstreamHealthCheck, SSLCertificate, SSL, GlobalRule, diff --git a/libs/sdk/src/core/schema.ts b/libs/sdk/src/core/schema.ts index ae866b5f..83937257 100644 --- a/libs/sdk/src/core/schema.ts +++ b/libs/sdk/src/core/schema.ts @@ -30,6 +30,9 @@ const timeoutSchema = z.strictObject({ send: z.coerce.number().gt(0), read: z.coerce.number().gt(0), }); +export type UpstreamHealthCheck = NonNullable< + z.infer>['checks'] +>; export type UpstreamTimeout = z.infer; const hostSchema = z.string().min(1); const portSchema = z.coerce.number().int().min(1).max(65535); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8aea3fb3..06c473df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.16.5)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.33.0(jiti@2.4.2))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.16.5)(typescript@5.9.3))(typescript@5.9.3) '@nx/vite': specifier: 21.6.4 - version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.2.4) + version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) '@nx/web': specifier: 21.6.4 version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))) @@ -244,6 +244,9 @@ importers: '@api7/adc-sdk': specifier: workspace:* version: link:../sdk + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 libs/backend-apisix: devDependencies: @@ -2110,6 +2113,9 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -8374,7 +8380,7 @@ snapshots: '@nx/nx-win32-x64-msvc@21.6.4': optional: true - '@nx/vite@21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.2.4)': + '@nx/vite@21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': dependencies: '@nx/devkit': 21.6.4(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@nx/js': 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))) @@ -8978,6 +8984,11 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/jest@30.0.0': + dependencies: + expect: 30.0.5 + pretty-format: 30.0.5 + '@types/js-yaml@4.0.9': {} '@types/json-schema@7.0.15': {} @@ -11332,7 +11343,7 @@ snapshots: chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 - picomatch: 4.0.2 + picomatch: 4.0.3 jest-validate@30.0.5: dependencies: From 7f2a4bb95dbe66ea69a40e15f4655be104ff51f9 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Mon, 3 Nov 2025 16:43:33 +0800 Subject: [PATCH 04/27] fix apisix backend typing --- .../resources/service-upstream.e2e-spec.ts | 2 + .../e2e/sync-and-dump-1.e2e-spec.ts | 8 +- libs/backend-apisix/package.json | 3 +- libs/backend-apisix/src/fetcher.ts | 41 +- libs/backend-apisix/src/index.ts | 11 +- libs/backend-apisix/src/operator.ts | 4 +- libs/backend-apisix/src/typing.ts | 4 +- libs/backend-apisix/tsconfig.json | 7 +- pnpm-lock.yaml | 476 +++++++++++------- 9 files changed, 336 insertions(+), 220 deletions(-) diff --git a/libs/backend-apisix/e2e/resources/service-upstream.e2e-spec.ts b/libs/backend-apisix/e2e/resources/service-upstream.e2e-spec.ts index 361550a2..76177670 100644 --- a/libs/backend-apisix/e2e/resources/service-upstream.e2e-spec.ts +++ b/libs/backend-apisix/e2e/resources/service-upstream.e2e-spec.ts @@ -57,6 +57,7 @@ describe('Service-Upstreams E2E', () => { ], }); // Verify that inline upstream has no id and name + // @ts-expect-error ignore expect(testService?.upstream?.id).toBeUndefined(); expect(testService?.upstream?.name).toBeUndefined(); }); @@ -95,6 +96,7 @@ describe('Service-Upstreams E2E', () => { expect(testService?.upstream?.nodes).toHaveLength(2); expect(testService?.upstream).toMatchObject(updatedService.upstream); // Verify that inline upstream still has no id and name + // @ts-expect-error ignore expect(testService?.upstream?.id).toBeUndefined(); expect(testService?.upstream?.name).toBeUndefined(); }); diff --git a/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts b/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts index 3e6df678..6988de99 100644 --- a/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts +++ b/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts @@ -424,11 +424,11 @@ describe('Sync and Dump - 1', () => { const plugin1Name = 'prometheus'; const plugin1 = { prefer_name: true, - } as ADCSDK.GlobalRule; + } as unknown as ADCSDK.GlobalRule; const plugin2Name = 'file-logger'; const plugin2 = { path: 'logs/file.log', - } as ADCSDK.GlobalRule; + } as unknown as ADCSDK.GlobalRule; it('Create global rules', async () => syncEvents(backend, [ @@ -444,7 +444,7 @@ describe('Sync and Dump - 1', () => { }); it('Update plugin1', async () => { - plugin1.test = 'test'; + plugin1.test = { value: 'test' }; await syncEvents(backend, [ updateEvent(ADCSDK.ResourceType.GLOBAL_RULE, plugin1Name, plugin1), ]); @@ -502,7 +502,7 @@ describe('Sync and Dump - 1', () => { }); it('Update plugin1', async () => { - plugin1.test = 'test'; + plugin1.test = { value: 'test' }; await syncEvents(backend, [ updateEvent(ADCSDK.ResourceType.PLUGIN_METADATA, plugin1Name, plugin1), ]); diff --git a/libs/backend-apisix/package.json b/libs/backend-apisix/package.json index 3e8960b1..0085571c 100644 --- a/libs/backend-apisix/package.json +++ b/libs/backend-apisix/package.json @@ -9,8 +9,9 @@ } }, "devDependencies": { + "@api7/adc-differ": "workspace:*", "@api7/adc-sdk": "workspace:*", - "@api7/adc-differ": "workspace:*" + "@types/jest": "^30.0.0" }, "nx": { "name": "backend-apisix", diff --git a/libs/backend-apisix/src/fetcher.ts b/libs/backend-apisix/src/fetcher.ts index 1c88f05e..fc94a0b4 100644 --- a/libs/backend-apisix/src/fetcher.ts +++ b/libs/backend-apisix/src/fetcher.ts @@ -133,27 +133,35 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { } private listGlobalRules() { - return this._list>( + return this._list>>( ADCSDK.ResourceType.GLOBAL_RULE, ).pipe( map(({ list }) => // [{ 'key-auth': {}, 'basic-auth': {} }, { 'real-ip': {} }] => // { 'key-auth': {}, 'basic-auth': {}, 'real-ip': {} } - Object.fromEntries( - list.flatMap((item) => Object.entries(item.value?.plugins ?? [])), - ), + { + console.log('list', list); + + const returnData = Object.fromEntries( + list.flatMap((item) => Object.entries(item.value?.plugins ?? [])), + ); + + console.log('listGlobalRules returnData', returnData); + + return returnData; + }, ), ); } private listPluginMetadata() { - return this._list>( - ADCSDK.ResourceType.PLUGIN_METADATA, - ).pipe( + return this._list< + typing.ListResponse> + >(ADCSDK.ResourceType.PLUGIN_METADATA).pipe( map(({ list }) => Object.fromEntries( list.map((item) => [ - item.key.split('/').pop(), + item.key.split('/').pop() || item.key, ADCSDK.utils.recursiveOmitUndefined(item.value), ]), ), @@ -221,7 +229,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { // Move plugin templates to route map((resources) => { const pluginConfigIdMap = Object.fromEntries( - resources?.[ADCSDK.ResourceType.PLUGIN_CONFIG]?.map((item) => [ + (resources?.[ADCSDK.ResourceType.PLUGIN_CONFIG] ?? []).map((item) => [ item.id, item, ]), @@ -241,7 +249,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { // Move upstreams to service or route map((resources) => { const upstreamIdMap = Object.fromEntries( - resources?.upstream?.map((item) => [ + (resources?.upstream ?? []).map((item) => [ item.id, this.toADC.transformUpstream(item), ]), @@ -274,7 +282,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { serviceDraft.upstream = upstreamIdMap[service.upstream_id]; unset(serviceDraft, 'upstream.id'); unset(serviceDraft, 'upstream.name'); - if (upstreamServiceIdMap[service.id]) + if (upstreamServiceIdMap?.[service.id]) serviceDraft.upstreams = upstreamServiceIdMap[service.id]; }), ); @@ -294,7 +302,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { // Move routes and stream_routes to service map((config) => { const serviceIdMap = Object.fromEntries( - resources?.service?.map((item) => [ + (resources?.service ?? []).map((item) => [ item.id, this.toADC.transformService(item), ]), @@ -305,7 +313,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { if (!serviceIdMap[item.service_id]) return; //TODO error report if (!serviceIdMap[item.service_id].routes) serviceIdMap[item.service_id].routes = []; - serviceIdMap[item.service_id].routes.push(route); + serviceIdMap[item.service_id].routes?.push(route); } }); resources?.stream_route?.forEach((item) => { @@ -314,16 +322,17 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { if (!serviceIdMap[item.service_id]) return; //TODO error report if (!serviceIdMap[item.service_id].stream_routes) serviceIdMap[item.service_id].stream_routes = []; - serviceIdMap[item.service_id].stream_routes.push(route); + serviceIdMap[item.service_id].stream_routes?.push(route); } }); return produce(config, (draft) => { draft.services = Object.values(serviceIdMap).map((item) => ADCSDK.utils.recursiveOmitUndefined({ ...item, - routes: item?.routes?.length > 0 ? item.routes : undefined, + routes: + item?.routes?.length || 0 > 0 ? item?.routes : undefined, stream_routes: - item?.stream_routes?.length > 0 + item?.stream_routes?.length || 0 > 0 ? item.stream_routes : undefined, }), diff --git a/libs/backend-apisix/src/index.ts b/libs/backend-apisix/src/index.ts index 42101444..b606bc63 100644 --- a/libs/backend-apisix/src/index.ts +++ b/libs/backend-apisix/src/index.ts @@ -48,7 +48,9 @@ export class BackendAPISIX implements ADCSDK.Backend { } if (opts?.tlsClientCertFile) { agentConfig.cert = readFileSync(opts.tlsClientCertFile); - agentConfig.key = readFileSync(opts.tlsClientKeyFile); + if (opts?.tlsClientKeyFile) { + agentConfig.key = readFileSync(opts.tlsClientKeyFile); + } } config.httpsAgent = new httpsAgent(agentConfig); @@ -73,7 +75,7 @@ export class BackendAPISIX implements ADCSDK.Backend { await this.client.get(`/apisix/admin/routes`); } - public async version() { + public async version(): Promise { if (this._version) return this._version; const resp = await this.client.get<{ value: string }>( @@ -84,10 +86,11 @@ export class BackendAPISIX implements ADCSDK.Backend { event: { response: resp, description: `Get APISIX version` }, }); - this._version = semver.coerce('999.999.999'); + const fallback = new semver.SemVer('999.999.999'); + this._version = fallback; if (resp.headers.server) { const version = (resp.headers.server as string).match(/APISIX\/(.*)/); - if (version) this._version = semver.coerce(version[1]); + if (version) this._version = semver.coerce(version[1]) ?? fallback; } return this._version; diff --git a/libs/backend-apisix/src/operator.ts b/libs/backend-apisix/src/operator.ts index 7eaa374a..07719492 100644 --- a/libs/backend-apisix/src/operator.ts +++ b/libs/backend-apisix/src/operator.ts @@ -168,7 +168,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { // The sequence of events should not be broken in this process, // and the correct behavior of the API will depend on the order // of execution. - reduce((groups, event) => { + reduce((groups: Record>, event) => { const key = `${event.resourceType}.${event.type}`; (groups[key] = groups[key] || []).push(event); return groups; @@ -237,7 +237,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { (event.newValue as ADCSDK.StreamRoute).id = event.resourceId; const route = fromADC.transformStreamRoute( event.newValue as ADCSDK.StreamRoute, - event.parentId, + event.parentId!, semVerGTE(version, '3.8.0'), ); if (event.parentId) route.service_id = event.parentId; diff --git a/libs/backend-apisix/src/typing.ts b/libs/backend-apisix/src/typing.ts index 007c5927..a53b3898 100644 --- a/libs/backend-apisix/src/typing.ts +++ b/libs/backend-apisix/src/typing.ts @@ -194,10 +194,10 @@ export interface Resources { [ResourceType.SERVICE]?: Array; [ResourceType.CONSUMER]?: Array; [ResourceType.SSL]?: Array; - [ResourceType.GLOBAL_RULE]?: Record; + [ResourceType.GLOBAL_RULE]?: GlobalRule; [ResourceType.PLUGIN_CONFIG]?: Array; [ResourceType.CONSUMER_GROUP]?: Array; - [ResourceType.PLUGIN_METADATA]?: Record; + [ResourceType.PLUGIN_METADATA]?: PluginMetadata; [ResourceType.STREAM_ROUTE]?: Array; [ResourceType.UPSTREAM]?: Array; } diff --git a/libs/backend-apisix/tsconfig.json b/libs/backend-apisix/tsconfig.json index 4193b3cb..a366c0dc 100644 --- a/libs/backend-apisix/tsconfig.json +++ b/libs/backend-apisix/tsconfig.json @@ -2,7 +2,10 @@ "extends": "../../tsconfig.base.json", "compilerOptions": {}, "files": [], - "include": [], + "include": [ + "src", + "e2e" + ], "references": [ { "path": "../sdk" @@ -14,4 +17,4 @@ "path": "./tsconfig.spec.json" } ] -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06c473df..b06e9cc4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.16.5)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.33.0(jiti@2.4.2))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.16.5)(typescript@5.9.3))(typescript@5.9.3) '@nx/vite': specifier: 21.6.4 - version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) + version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) '@nx/web': specifier: 21.6.4 version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))) @@ -146,10 +146,10 @@ importers: version: 8.41.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^3.0.5 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) + version: 3.2.4(vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) '@vitest/ui': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4) + version: 3.2.4(vitest@3.0.0) esbuild: specifier: ^0.25.9 version: 0.25.9 @@ -194,7 +194,7 @@ importers: version: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) webpack: specifier: 5.101.3 version: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9) @@ -256,6 +256,9 @@ importers: '@api7/adc-sdk': specifier: workspace:* version: link:../sdk + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 libs/backend-apisix-standalone: devDependencies: @@ -1419,6 +1422,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -1711,103 +1717,113 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@rollup/rollup-android-arm-eabi@4.46.2': - resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.46.2': - resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.46.2': - resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.46.2': - resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.46.2': - resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.46.2': - resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': - resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.46.2': - resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.46.2': - resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.46.2': - resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': - resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.46.2': - resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.46.2': - resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.46.2': - resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.46.2': - resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.46.2': - resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.46.2': - resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.46.2': - resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.46.2': - resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.46.2': - resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] @@ -2059,9 +2075,6 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -2074,9 +2087,6 @@ packages: '@types/deep-diff@1.0.5': resolution: {integrity: sha512-PQyNSy1YMZU1hgZA5tTYfHPpUAo9Dorn1PZho2/budQLfqLu3JIP37JAavnwYpR1S2yFZTXa3hxaE4ifGW5jaA==} - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -2357,37 +2367,43 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@3.0.0': + resolution: {integrity: sha512-Qx+cHyB59mWrQywT3/dZIIpSKwIpWbYFdBX2zixMYpOGZmbaP2jbbd4i/TAKJq/jBgSfww++d6YnrlGMFb2XBg==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@3.0.0': + resolution: {integrity: sha512-8ytqYjIRzAM90O7n8A0TCbziTnouIG+UGuMHmoRJpKh4vvah4uENw5UAMMNjdKCtzgMiTrZ9XU+xzwCwcxuxGQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true + '@vitest/pretty-format@3.0.0': + resolution: {integrity: sha512-24y+MS04ZHZbbbfAvfpi9hM2oULePbiL6Dir8r1nFMN97hxuL0gEXKWRGmlLPwzKDtaOKNjtyTx0+GiZcWCxDA==} + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@3.0.0': + resolution: {integrity: sha512-6MCYobtatsgG3DlM+dk6njP+R+28iSUqWbJzXp/nuOy6SkAKzJ1wby3fDgimmy50TeK8g6y+E6rP12REyinYPw==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@3.0.0': + resolution: {integrity: sha512-W0X6fJFJ3RbSThncSYUNSnXkMJFyXX9sOvxP1HSQRsWCLB1U3JnZc0SrLpLzcyByMUDXHsiXQ+x+xsr/G5fXNw==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@3.0.0': + resolution: {integrity: sha512-pfK5O3lRqeCG8mbV+Lr8lLUBicFRm5TlggF7bLZpzpo111LKhMN/tZRXvyOGOgbktxAR9bTf4x8U6RtHuFBTVA==} '@vitest/ui@3.2.4': resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} peerDependencies: vitest: 3.2.4 + '@vitest/utils@3.0.0': + resolution: {integrity: sha512-l300v2/4diHyv5ZiQOj6y/H6VbaTWM6i1c2lC3lUZ5nn9rv9C+WneS/wqyaGLwM37reoh/QkrrYMSMKdfnDZpw==} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} @@ -2810,8 +2826,8 @@ packages: caniuse-lite@1.0.30001718: resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} chalk@2.4.2: @@ -3153,6 +3169,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dedent@1.6.0: resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: @@ -4356,8 +4381,8 @@ packages: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -4376,6 +4401,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -5198,8 +5226,8 @@ packages: rfdc@1.3.1: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - rollup@4.46.2: - resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5588,6 +5616,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -5633,9 +5664,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - style-loader@3.3.4: resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} @@ -5766,8 +5794,8 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tmp@0.2.3: @@ -5978,11 +6006,51 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + vite-node@3.0.0: + resolution: {integrity: sha512-V5p05fpAzkHM3aYChsHWV1RTeLAhPejbKX6MqiWWyuIfNcDgXq5p0GnYV6Wa4OAU588XC70XCJB9chRZsOh4yg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@7.1.9: resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6023,23 +6091,20 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + vitest@3.0.0: + resolution: {integrity: sha512-fwfPif+EV0jyms9h1Crb6rwJttH/KBzKrcUesjxHgldmc6R0FaMNLsd+Rgc17NoxzLcb/sYE2Xs9NQ/vnTBf6Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@vitest/browser': 3.0.0 + '@vitest/ui': 3.0.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': - optional: true '@types/node': optional: true '@vitest/browser': @@ -6367,7 +6432,7 @@ snapshots: '@babel/core': 7.24.6 '@babel/helper-compilation-targets': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.4.1 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -6378,7 +6443,7 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.4.1 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -7704,7 +7769,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.6 '@babel/parser': 7.24.6 '@babel/types': 7.24.6 - debug: 4.4.1 + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -8108,6 +8173,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -8380,7 +8447,7 @@ snapshots: '@nx/nx-win32-x64-msvc@21.6.4': optional: true - '@nx/vite@21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': + '@nx/vite@21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3)(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))(vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': dependencies: '@nx/devkit': 21.6.4(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@nx/js': 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))) @@ -8392,7 +8459,7 @@ snapshots: tsconfig-paths: 4.2.0 tslib: 2.8.1 vite: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) - vitest: 3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -8589,64 +8656,70 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@rollup/rollup-android-arm-eabi@4.46.2': + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-android-arm64@4.46.2': + '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.46.2': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.46.2': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true - '@rollup/rollup-freebsd-arm64@4.46.2': + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true - '@rollup/rollup-freebsd-x64@4.46.2': + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.46.2': + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.46.2': + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.46.2': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.46.2': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.46.2': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.46.2': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.46.2': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.46.2': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.46.2': + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.46.2': + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.46.2': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true '@scalar/openapi-parser@0.19.0': @@ -8910,10 +8983,6 @@ snapshots: dependencies: '@types/node': 22.16.5 - '@types/chai@5.2.2': - dependencies: - '@types/deep-eql': 4.0.2 - '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.7 @@ -8927,8 +8996,6 @@ snapshots: '@types/deep-diff@1.0.5': {} - '@types/deep-eql@4.0.2': {} - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 @@ -9091,7 +9158,7 @@ snapshots: '@typescript-eslint/types': 8.41.0 '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1 + debug: 4.4.3 eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.3 transitivePeerDependencies: @@ -9222,7 +9289,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -9237,47 +9304,49 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/expect@3.0.0': dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 + '@vitest/spy': 3.0.0 + '@vitest/utils': 3.0.0 + chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': + '@vitest/mocker@3.0.0(vite@6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 3.0.0 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + + '@vitest/pretty-format@3.0.0': + dependencies: + tinyrainbow: 2.0.0 '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.4': + '@vitest/runner@3.0.0': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 3.0.0 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@3.0.0': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + '@vitest/pretty-format': 3.0.0 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': + '@vitest/spy@3.0.0': dependencies: - tinyspy: 4.0.3 + tinyspy: 3.0.2 - '@vitest/ui@3.2.4(vitest@3.2.4)': + '@vitest/ui@3.2.4(vitest@3.0.0)': dependencies: '@vitest/utils': 3.2.4 fflate: 0.8.2 @@ -9286,12 +9355,18 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + + '@vitest/utils@3.0.0': + dependencies: + '@vitest/pretty-format': 3.0.0 + loupe: 3.2.1 + tinyrainbow: 2.0.0 '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.2.0 + loupe: 3.2.1 tinyrainbow: 2.0.0 '@webassemblyjs/ast@1.14.1': @@ -9810,12 +9885,12 @@ snapshots: caniuse-lite@1.0.30001718: {} - chai@5.2.1: + chai@5.3.3: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.2.0 + loupe: 3.2.1 pathval: 2.0.1 chalk@2.4.2: @@ -10144,6 +10219,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + dedent@1.6.0(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -11572,7 +11651,7 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - loupe@3.2.0: {} + loupe@3.2.1: {} lower-case@2.0.2: dependencies: @@ -11590,6 +11669,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: dependencies: '@babel/parser': 7.28.0 @@ -12017,7 +12100,7 @@ snapshots: portfinder@1.0.37: dependencies: async: 3.2.6 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -12364,30 +12447,32 @@ snapshots: rfdc@1.3.1: {} - rollup@4.46.2: + rollup@4.52.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.46.2 - '@rollup/rollup-android-arm64': 4.46.2 - '@rollup/rollup-darwin-arm64': 4.46.2 - '@rollup/rollup-darwin-x64': 4.46.2 - '@rollup/rollup-freebsd-arm64': 4.46.2 - '@rollup/rollup-freebsd-x64': 4.46.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 - '@rollup/rollup-linux-arm-musleabihf': 4.46.2 - '@rollup/rollup-linux-arm64-gnu': 4.46.2 - '@rollup/rollup-linux-arm64-musl': 4.46.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 - '@rollup/rollup-linux-ppc64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-musl': 4.46.2 - '@rollup/rollup-linux-s390x-gnu': 4.46.2 - '@rollup/rollup-linux-x64-gnu': 4.46.2 - '@rollup/rollup-linux-x64-musl': 4.46.2 - '@rollup/rollup-win32-arm64-msvc': 4.46.2 - '@rollup/rollup-win32-ia32-msvc': 4.46.2 - '@rollup/rollup-win32-x64-msvc': 4.46.2 + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 router@2.2.0: @@ -12750,7 +12835,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -12761,7 +12846,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -12785,6 +12870,8 @@ snapshots: statuses@2.0.1: {} + std-env@3.10.0: {} + std-env@3.9.0: {} string-length@4.0.2: @@ -12832,10 +12919,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - style-loader@3.3.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)): dependencies: webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9) @@ -12850,7 +12933,7 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.1 + debug: 4.4.3 fast-safe-stringify: 2.1.1 form-data: 4.0.4 formidable: 3.5.4 @@ -12977,7 +13060,7 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.3: {} + tinyspy@3.0.2: {} tmp@0.2.3: {} @@ -13179,13 +13262,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): + vite-node@3.0.0(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -13200,13 +13283,31 @@ snapshots: - tsx - yaml + vite@6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.16.5 + fsevents: 2.3.3 + jiti: 2.4.2 + less: 4.1.3 + sass: 1.86.0 + sass-embedded: 1.86.0 + terser: 5.39.1 + yaml: 2.8.0 + vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.46.2 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.16.5 @@ -13218,34 +13319,31 @@ snapshots: terser: 5.39.1 yaml: 2.8.0 - vitest@3.2.4(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): + vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) + '@vitest/expect': 3.0.0 + '@vitest/mocker': 3.0.0(vite@6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1 + '@vitest/runner': 3.0.0 + '@vitest/snapshot': 3.0.0 + '@vitest/spy': 3.0.0 + '@vitest/utils': 3.0.0 + chai: 5.3.3 + debug: 4.4.3 expect-type: 1.2.2 - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 2.0.3 - picomatch: 4.0.2 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vite-node: 3.0.0(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.16.5 - '@vitest/ui': 3.2.4(vitest@3.2.4) + '@vitest/ui': 3.2.4(vitest@3.0.0) transitivePeerDependencies: - jiti - less From 48d9e99f0f308718d76501b1c0b86da1cc5002ff Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 07:37:33 +0800 Subject: [PATCH 05/27] f --- libs/backend-apisix/src/transformer.ts | 101 ++++++++++++++----------- libs/sdk/src/backend/index.ts | 4 +- libs/sdk/src/core/schema.ts | 2 +- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index f82f1879..f1321c4e 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -5,14 +5,12 @@ import * as typing from './typing'; export class ToADC { private static transformLabels(labels?: ADCSDK.Labels): ADCSDK.Labels { - if (!labels) return undefined; + if (!labels) return {}; const filteredLabels = filter( labels, (val, key) => key !== '__ADC_NAME', ) as unknown as ADCSDK.Labels; - return Object.values(filteredLabels).length > 0 - ? filteredLabels - : undefined; + return Object.values(filteredLabels).length > 0 ? filteredLabels : {}; } public transformRoute(route: typing.Route): ADCSDK.Route { @@ -75,7 +73,7 @@ export class ToADC { public transformConsumerCredential( credential: typing.ConsumerCredential, - ): ADCSDK.ConsumerCredential { + ): ADCSDK.ConsumerCredential | undefined { if (!credential.plugins || Object.keys(credential.plugins).length <= 0) return; @@ -90,19 +88,19 @@ export class ToADC { description: credential.desc, labels: credential.labels, type: pluginName as ADCSDK.ConsumerCredential['type'], - config, + config: config as ADCSDK.ConsumerCredential['config'], }); } public transformSSL(ssl: typing.SSL): ADCSDK.SSL { const certificates: Array = [ { - certificate: ssl.cert, - key: ssl.key, + certificate: ssl.cert!, + key: ssl.key!, }, ...(ssl.certs?.map((cert, idx) => ({ certificate: cert, - key: ssl.keys[idx], + key: ssl.keys![idx]!, })) ?? []), ]; @@ -111,7 +109,7 @@ export class ToADC { labels: ssl.labels, type: ssl.type, - snis: ssl.sni ? [ssl.sni] : ssl.snis, + snis: ssl.sni ? [ssl.sni] : ssl.snis ?? [], certificates: certificates, client: ssl.client ? { @@ -120,7 +118,7 @@ export class ToADC { skip_mtls_uri_regex: ssl.client.skip_mtls_uri_regex, } : undefined, - ssl_protocols: ssl.ssl_protocols, + ssl_protocols: ssl.ssl_protocols as ('TLSv1.1' | 'TLSv1.2' | 'TLSv1.3')[], }); } @@ -137,11 +135,13 @@ export class ToADC { plugins: consumerGroup.plugins, consumers: consumers - .filter( - (consumer) => - consumer.group_id && consumer.group_id === consumerGroup.id, - ) - .map((consumer) => this.transformConsumer(consumer, true)), + ? consumers + .filter( + (consumer) => + consumer.group_id && consumer.group_id === consumerGroup.id, + ) + .map((consumer) => this.transformConsumer(consumer, true)) + : undefined, }); unset(adcConsumerGroup, 'labels.ADC_NAME'); @@ -187,24 +187,28 @@ export class ToADC { const nodes = upstream.nodes ? Array.isArray(upstream.nodes) ? upstream.nodes - : Object.keys(upstream.nodes).map((node) => { + : Object.entries( + upstream.nodes as Record, + ).map(([node, weight]) => { const hostport = node.split(':'); return { host: hostport[0], port: hostport.length === 2 ? parseInt(hostport[1]) - : defaultPortMap[upstream.scheme] - ? defaultPortMap[upstream.scheme] + : defaultPortMap[upstream.scheme!] + ? defaultPortMap[upstream.scheme!] : 80, - weight: upstream.nodes[node], + weight: weight, }; }) : undefined; - const labels = ADCSDK.utils.recursiveOmitUndefined({ - ...upstream.labels, - [typing.ADC_UPSTREAM_SERVICE_ID_LABEL]: undefined, - }); + const labels: Record = { + ...(upstream.labels ?? {}), + }; + delete (labels as Record)[ + typing.ADC_UPSTREAM_SERVICE_ID_LABEL + ]; return ADCSDK.utils.recursiveOmitUndefined({ ...{ id: 'id' in upstream ? upstream.id : undefined }, name: upstream.name, @@ -249,16 +253,19 @@ export class FromADC { private static transformLabels( labels?: ADCSDK.Labels, ): Record { - if (!labels) return undefined; - return Object.entries(labels).reduce((pv, [key, value]) => { - pv[key] = typeof value === 'string' ? value : JSON.stringify(value); - return pv; - }, {}); + if (!labels) return {}; + return Object.entries(labels).reduce>( + (pv, [key, value]) => { + pv[key] = typeof value === 'string' ? value : JSON.stringify(value); + return pv; + }, + {} as Record, + ); } public transformRoute(route: ADCSDK.Route, parentId: string): typing.Route { return ADCSDK.utils.recursiveOmitUndefined({ - id: route.id, + id: route.id!, name: route.name, desc: route.description, labels: FromADC.transformLabels(route.labels), @@ -283,7 +290,7 @@ export class FromADC { ): [typing.Service, typing.Upstream | undefined] { return [ ADCSDK.utils.recursiveOmitUndefined({ - id: service.id, + id: service.id!, name: service.name, desc: service.description, labels: FromADC.transformLabels(service.labels), @@ -326,7 +333,7 @@ export class FromADC { public transformSSL(ssl: ADCSDK.SSL): typing.SSL { return ADCSDK.utils.recursiveOmitUndefined({ - id: ssl.id, + id: ssl.id!, labels: FromADC.transformLabels(ssl.labels), status: 1, type: ssl.type, @@ -352,20 +359,18 @@ export class FromADC { consumerGroup: ADCSDK.ConsumerGroup, ): [typing.ConsumerGroup, Array] { const consumerGroupId = ADCSDK.utils.generateId(consumerGroup.name); - const consumers: Array = consumerGroup.consumers - ?.map(this.transformConsumer) + const consumers: Array = (consumerGroup.consumers ?? []) + .map((c) => this.transformConsumer(c)) .map((consumer) => ({ ...consumer, group_id: consumerGroupId })); return [ - ADCSDK.utils.recursiveOmitUndefined({ + ADCSDK.utils.recursiveOmitUndefined({ ...consumerGroup, - id: undefined, + id: consumerGroupId, labels: { ...FromADC.transformLabels(consumerGroup.labels), ADC_NAME: consumerGroup.name, }, - name: undefined, - consumers: undefined, }), consumers, ]; @@ -377,8 +382,7 @@ export class FromADC { return Object.entries(globalRules).reduce>( (pv, [key, value]) => { pv.push( - ADCSDK.utils.recursiveOmitUndefined({ - id: undefined, + ADCSDK.utils.recursiveOmitUndefined({ plugins: { [key]: value as ADCSDK.Plugin, }, @@ -396,7 +400,7 @@ export class FromADC { return Object.entries(pluginMetadatas).reduce>( (pv, [key, value]) => { pv.push( - ADCSDK.utils.recursiveOmitUndefined({ + ADCSDK.utils.recursiveOmitUndefined({ id: undefined, ...value, __plugin_name: key, @@ -429,13 +433,18 @@ export class FromADC { server_port: streamRoute.server_port, sni: streamRoute.sni, service_id: parentId, - } as typing.StreamRoute); + } as unknown as typing.StreamRoute); } - public transformUpstream(upstream: ADCSDK.Upstream): typing.Upstream { - return ADCSDK.utils.recursiveOmitUndefined({ - ...upstream, - id: undefined, + public transformUpstream( + upstream: ADCSDK.Upstream, + ): Omit { + const { id: _omit, ...rest } = upstream as { id?: string } & Omit< + ADCSDK.Upstream, + 'id' + >; + return ADCSDK.utils.recursiveOmitUndefined>({ + ...rest, labels: FromADC.transformLabels(upstream.labels), }); } diff --git a/libs/sdk/src/backend/index.ts b/libs/sdk/src/backend/index.ts index 1dc69272..c169cc3b 100644 --- a/libs/sdk/src/backend/index.ts +++ b/libs/sdk/src/backend/index.ts @@ -23,8 +23,8 @@ export interface BackendOptions { excludeResourceType?: Array; cacheKey?: string; - httpAgent: httpAgent; - httpsAgent: httpsAgent; + httpAgent?: httpAgent; + httpsAgent?: httpsAgent; } export const BackendEventType = { diff --git a/libs/sdk/src/core/schema.ts b/libs/sdk/src/core/schema.ts index 83937257..95fbc3fe 100644 --- a/libs/sdk/src/core/schema.ts +++ b/libs/sdk/src/core/schema.ts @@ -21,7 +21,7 @@ const labelsSchema = z.record( export type Labels = z.infer; const pluginSchema = z.looseObject({}); export type Plugin = z.infer; -const pluginsSchema = z.record(z.string(), pluginSchema); +const pluginsSchema = pluginSchema; export type Plugins = z.infer; const exprSchema = z.array(z.any()); export type Expr = z.infer; From 41c1806938d0456691c3e9810b0e6f618239d42b Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 08:42:58 +0800 Subject: [PATCH 06/27] f --- libs/backend-apisix/src/transformer.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index f1321c4e..381648b6 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -4,13 +4,17 @@ import { filter, isEmpty, unset } from 'lodash'; import * as typing from './typing'; export class ToADC { - private static transformLabels(labels?: ADCSDK.Labels): ADCSDK.Labels { - if (!labels) return {}; + private static transformLabels( + labels?: ADCSDK.Labels, + ): ADCSDK.Labels | undefined { + if (!labels) return undefined; const filteredLabels = filter( labels, (val, key) => key !== '__ADC_NAME', ) as unknown as ADCSDK.Labels; - return Object.values(filteredLabels).length > 0 ? filteredLabels : {}; + return Object.values(filteredLabels).length > 0 + ? filteredLabels + : undefined; } public transformRoute(route: typing.Route): ADCSDK.Route { @@ -252,9 +256,9 @@ export class ToADC { export class FromADC { private static transformLabels( labels?: ADCSDK.Labels, - ): Record { - if (!labels) return {}; - return Object.entries(labels).reduce>( + ): Record | undefined { + if (!labels) return undefined; + return Object.entries(labels).reduce( (pv, [key, value]) => { pv[key] = typeof value === 'string' ? value : JSON.stringify(value); return pv; From c31dfb970baefb691be3e6003c599a5debc906eb Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 09:01:45 +0800 Subject: [PATCH 07/27] f --- libs/backend-api7/src/transformer.ts | 2 +- .../e2e/resources/service-upstream.e2e-spec.ts | 11 ++--------- libs/backend-apisix-standalone/src/operator.ts | 8 ++++---- libs/sdk/src/backend/index.ts | 2 +- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/libs/backend-api7/src/transformer.ts b/libs/backend-api7/src/transformer.ts index 8019d03f..036b1735 100644 --- a/libs/backend-api7/src/transformer.ts +++ b/libs/backend-api7/src/transformer.ts @@ -110,7 +110,7 @@ export class ToADC { description: credential.desc, labels: credential.labels, type: pluginName as ADCSDK.ConsumerCredential['type'], - config, + config: config as ADCSDK.ConsumerCredential['config'], }); } diff --git a/libs/backend-apisix-standalone/e2e/resources/service-upstream.e2e-spec.ts b/libs/backend-apisix-standalone/e2e/resources/service-upstream.e2e-spec.ts index 1ce7c96a..19820a73 100644 --- a/libs/backend-apisix-standalone/e2e/resources/service-upstream.e2e-spec.ts +++ b/libs/backend-apisix-standalone/e2e/resources/service-upstream.e2e-spec.ts @@ -8,14 +8,7 @@ import { } from '../../src/cache'; import * as typing from '../../src/typing'; import { server1, token1 } from '../support/constants'; -import { - createEvent, - deleteEvent, - dumpConfiguration, - restartAPISIX, - syncEvents, - updateEvent, -} from '../support/utils'; +import { dumpConfiguration, restartAPISIX, syncEvents } from '../support/utils'; const cacheKey = 'default'; describe('Service-Upstreams E2E', () => { @@ -168,7 +161,7 @@ describe('Service-Upstreams E2E', () => { typing.ADC_UPSTREAM_SERVICE_ID_LABEL ], ).toEqual(ADCSDK.utils.generateId(serviceName)); - expect(rawConfig?.upstreams?.[1].nodes[0].host).toEqual('8.8.8.8'); + expect(rawConfig?.upstreams?.[1].nodes?.[0].host).toEqual('8.8.8.8'); const config = configCache.get(cacheKey); expect(config?.services).not.toBeUndefined(); diff --git a/libs/backend-apisix-standalone/src/operator.ts b/libs/backend-apisix-standalone/src/operator.ts index 5f0325a9..195d6632 100644 --- a/libs/backend-apisix-standalone/src/operator.ts +++ b/libs/backend-apisix-standalone/src/operator.ts @@ -308,7 +308,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { filter_func: res.filter_func, service_id: event.parentId!, enable_websocket: res.enable_websocket, - plugins: res.plugins, + plugins: res.plugins as typing.Route['plugins'], priority: res.priority, timeout: res.timeout, status: 1, @@ -325,7 +325,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { labels: this.fromADCLabels(res.labels), hosts: res.hosts, upstream_id: id, - plugins: res.plugins, + plugins: res.plugins as typing.Service['plugins'], } satisfies typing.Service as typing.Service; } case ADCSDK.ResourceType.CONSUMER: { @@ -335,7 +335,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { username: this.generateIdFromEvent(event), desc: res.description, labels: this.fromADCLabels(res.labels), - plugins: res.plugins, + plugins: res.plugins as typing.Consumer['plugins'], } satisfies typing.Consumer as typing.Consumer; } case ADCSDK.ResourceType.CONSUMER_CREDENTIAL: { @@ -408,7 +408,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { name: res.name, desc: res.description, labels: this.fromADCLabels(res.labels), - plugins: res.plugins, + plugins: res.plugins as typing.StreamRoute['plugins'], remote_addr: res.remote_addr, server_addr: res.server_addr, server_port: res.server_port, diff --git a/libs/sdk/src/backend/index.ts b/libs/sdk/src/backend/index.ts index c169cc3b..36664d82 100644 --- a/libs/sdk/src/backend/index.ts +++ b/libs/sdk/src/backend/index.ts @@ -22,7 +22,7 @@ export interface BackendOptions { includeResourceType?: Array; excludeResourceType?: Array; - cacheKey?: string; + cacheKey: string; httpAgent?: httpAgent; httpsAgent?: httpsAgent; } From df7e18e4bcd9392b4733df41e329a6b1efd05ed7 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 12:26:46 +0800 Subject: [PATCH 08/27] f --- libs/differ/src/differv3.ts | 21 ++++++++++++++------- libs/sdk/src/core/schema.ts | 2 ++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/libs/differ/src/differv3.ts b/libs/differ/src/differv3.ts index 66546031..30052af0 100644 --- a/libs/differ/src/differv3.ts +++ b/libs/differ/src/differv3.ts @@ -134,14 +134,14 @@ export class DifferV3 { ([pluginName, pluginConfig]) => [ pluginName, pluginName, - pluginConfig, + pluginConfig as Record, ], ) ?? [], Object.entries(remote?.global_rules ?? {}).map( ([pluginName, pluginConfig]) => [ pluginName, pluginName, - pluginConfig, + pluginConfig as Record, ], ) ?? [], ), @@ -151,14 +151,14 @@ export class DifferV3 { ([pluginName, pluginConfig]) => [ pluginName, pluginName, - pluginConfig, + pluginConfig as Record, ], ) ?? [], Object.entries(remote?.plugin_metadata ?? {}).map( ([pluginName, pluginConfig]) => [ pluginName, pluginName, - pluginConfig, + pluginConfig as Record, ], ) ?? [], ), @@ -192,12 +192,16 @@ export class DifferV3 { ), ...differ.diffResource( ADCSDK.ResourceType.UPSTREAM, - local?.upstreams?.map((res) => [ + local?.upstreams?.map((res: ADCSDK.Upstream & { id?: string }) => [ res.name!, res.id ?? ADCSDK.utils.generateId(generateResourceName(res.name!)), res, ]) ?? [], - remote?.upstreams?.map((res) => [res.name!, res.id!, res]) ?? [], + remote?.upstreams?.map((res: ADCSDK.Upstream & { id?: string }) => [ + res.name!, + res.id!, + res, + ]) ?? [], ), ]; @@ -596,7 +600,10 @@ export class DifferV3 { local = Object.fromEntries( Object.entries(local).map(([pluginName, config]) => { const defaultValue = this.defaultValue?.plugins?.[pluginName] ?? {}; - return [pluginName, this.mergeDefault(config, cloneDeep(defaultValue))]; + return [ + pluginName, + this.mergeDefault(config as ADCSDK.Plugin, cloneDeep(defaultValue)), + ]; }), ) as ADCSDK.Plugins; const checker = (left: ADCSDK.Plugins, right: ADCSDK.Plugins) => { diff --git a/libs/sdk/src/core/schema.ts b/libs/sdk/src/core/schema.ts index 95fbc3fe..76345cc4 100644 --- a/libs/sdk/src/core/schema.ts +++ b/libs/sdk/src/core/schema.ts @@ -378,6 +378,8 @@ export const ConfigurationSchema = z.strictObject({ plugin_metadata: pluginMetadataSchema.optional(), routes: z.array(routeSchema).optional(), stream_routes: z.array(streamRouteSchema).optional(), + consumer_credentials: z.array(consumerCredentialSchema).optional(), + upstreams: z.array(upstreamSchema({ id: idSchema.optional() })).optional(), }); export type Configuration = z.infer; From 31550d935bf812ce31178cde07599b6937627cb6 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 14:38:00 +0800 Subject: [PATCH 09/27] f --- libs/backend-api7/src/index.ts | 2 +- libs/backend-api7/src/transformer.ts | 2 +- libs/backend-api7/src/typing.ts | 1 + libs/backend-apisix/src/fetcher.ts | 15 +++------------ libs/backend-apisix/src/transformer.ts | 2 +- libs/differ/src/test/service-upstream.spec.ts | 2 ++ 6 files changed, 9 insertions(+), 15 deletions(-) diff --git a/libs/backend-api7/src/index.ts b/libs/backend-api7/src/index.ts index eb1eec5b..1bfc25a8 100644 --- a/libs/backend-api7/src/index.ts +++ b/libs/backend-api7/src/index.ts @@ -67,7 +67,7 @@ export class BackendAPI7 implements ADCSDK.Backend { const first = items.shift() || {}; if (!first?.properties) first.properties = {}; - return items.reduce((pv = {}, cv) => { + return items.reduce((pv, cv) => { Object.entries(cv?.properties ?? {}).forEach(([key, val]) => { if (!pv.properties) pv.properties = {}; pv.properties[key] = val; diff --git a/libs/backend-api7/src/transformer.ts b/libs/backend-api7/src/transformer.ts index 036b1735..9508904c 100644 --- a/libs/backend-api7/src/transformer.ts +++ b/libs/backend-api7/src/transformer.ts @@ -269,8 +269,8 @@ export class FromADC { return ADCSDK.utils.recursiveOmitUndefined({ id: ssl.id, labels: FromADC.transformLabels(ssl.labels), + status: 1, type: ssl.type ?? 'server', - snis: ssl.snis, cert: ssl.certificates[0].certificate, key: ssl.certificates[0].key, diff --git a/libs/backend-api7/src/typing.ts b/libs/backend-api7/src/typing.ts index a2751c33..7c99131e 100644 --- a/libs/backend-api7/src/typing.ts +++ b/libs/backend-api7/src/typing.ts @@ -106,6 +106,7 @@ export interface SSL { depth: number; }; snis?: string[]; + status?: number; } export interface GlobalRule { plugins: Plugins; diff --git a/libs/backend-apisix/src/fetcher.ts b/libs/backend-apisix/src/fetcher.ts index fc94a0b4..07881fc4 100644 --- a/libs/backend-apisix/src/fetcher.ts +++ b/libs/backend-apisix/src/fetcher.ts @@ -139,21 +139,12 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { map(({ list }) => // [{ 'key-auth': {}, 'basic-auth': {} }, { 'real-ip': {} }] => // { 'key-auth': {}, 'basic-auth': {}, 'real-ip': {} } - { - console.log('list', list); - - const returnData = Object.fromEntries( - list.flatMap((item) => Object.entries(item.value?.plugins ?? [])), - ); - - console.log('listGlobalRules returnData', returnData); - - return returnData; - }, + Object.fromEntries( + list.flatMap((item) => Object.entries(item.value?.plugins ?? [])), + ), ), ); } - private listPluginMetadata() { return this._list< typing.ListResponse> diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index 381648b6..98884804 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -364,7 +364,7 @@ export class FromADC { ): [typing.ConsumerGroup, Array] { const consumerGroupId = ADCSDK.utils.generateId(consumerGroup.name); const consumers: Array = (consumerGroup.consumers ?? []) - .map((c) => this.transformConsumer(c)) + .map(this.transformConsumer) .map((consumer) => ({ ...consumer, group_id: consumerGroupId })); return [ diff --git a/libs/differ/src/test/service-upstream.spec.ts b/libs/differ/src/test/service-upstream.spec.ts index 88fe7e5b..e0a272ce 100644 --- a/libs/differ/src/test/service-upstream.spec.ts +++ b/libs/differ/src/test/service-upstream.spec.ts @@ -143,6 +143,7 @@ describe('Differ V3 - service with upstreams', () => { services: [ { ...structuredClone(service), + // @ts-expect-error testing purposes upstreams: [{ id: upstream2Name, name: upstream2Name }], }, ], @@ -190,6 +191,7 @@ describe('Differ V3 - service with upstreams', () => { ...structuredClone(service), upstreams: [ { + // @ts-expect-error testing purposes id: ADCSDK.utils.generateId(`${serviceName}.${upstreamName}`), name: upstreamName, nodes: [{ host: '1.1.1.1', port: 80, weight: 1 }], From a6ea794184f5906d6a7e241048ab54a1bf26e6d3 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 15:10:43 +0800 Subject: [PATCH 10/27] f --- apps/cli/package.json | 27 +++++++++++++++++++++++++-- apps/cli/src/command/lint.command.ts | 6 +----- apps/cli/src/utils/listr.ts | 16 ++++++++++------ libs/sdk/package.json | 10 ++++++++++ 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 76d95f7c..3a527f78 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -13,6 +13,29 @@ }, "dependencies": { "express": "^5.1.0", - "winston": "^3.17.0" + "winston": "^3.17.0", + "axios": "^1.13.1", + "rxjs": "^7.8.1", + "supertest": "7.1.4", + "pluralize": "^8.0.0", + "semver": "^7.6.3", + "listr2": "^8.2.1", + "commander": "^13.1.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "chalk": "^4.1.2", + "parse-duration": "^1.1.0", + "qs": "^6.12.1", + "dotenv": "^16.4.5", + "zod": "^4.0.10", + "source-map-support": "^0.5.21", + "agentkeepalive": "^4.6.0", + "glob": "^11.0.3", + "signale": "^1.4.0", + "vitest": "3.0.0", + "@nx/webpack": "21.6.4", + "webpack": "5.101.3", + "terser-webpack-plugin": "^5.3.14", + "@api7/adc-sdk": "workspace:*" } -} +} \ No newline at end of file diff --git a/apps/cli/src/command/lint.command.ts b/apps/cli/src/command/lint.command.ts index a6322eaa..ca7f1d16 100644 --- a/apps/cli/src/command/lint.command.ts +++ b/apps/cli/src/command/lint.command.ts @@ -1,9 +1,5 @@ -import * as ADCSDK from '@api7/adc-sdk'; -import { Listr, ListrTask } from 'listr2'; -import pluralize from 'pluralize'; -import { ZodError } from 'zod'; +import { Listr } from 'listr2'; -import { check } from '../linter'; import { LintTask, LoadLocalConfigurationTask } from '../tasks'; import { SignaleRenderer } from '../utils/listr'; import { BaseCommand } from './helper'; diff --git a/apps/cli/src/utils/listr.ts b/apps/cli/src/utils/listr.ts index 6c66bcb3..d65fe5c8 100644 --- a/apps/cli/src/utils/listr.ts +++ b/apps/cli/src/utils/listr.ts @@ -1,5 +1,4 @@ import { LogEntry, LogEntryOptions, Logger } from '@api7/adc-sdk'; -import axios, { AxiosResponse } from 'axios'; import { ListrRenderer, ListrTaskEventType, @@ -64,8 +63,9 @@ export class SignaleRenderer implements ListrRenderer { if (err) { this.getScopedLogger().fatal(err); } else { - this.options.verbose > 0 && + if (this.options.verbose > 0) { this.getScopedLogger().star('All is well, see you next time!'); + } } } @@ -84,22 +84,26 @@ export class SignaleRenderer implements ListrRenderer { if (!task.hasTitle()) return; if (state === ListrTaskState.STARTED) { - rendererOptions?.verbose > 0 && + if (rendererOptions?.verbose > 0) { this.getScopedLogger(rendererOptions).start(task.title); + } } if (state === ListrTaskState.COMPLETED) { - rendererOptions?.verbose > 0 && + if (rendererOptions?.verbose > 0) { this.getScopedLogger(rendererOptions).success(task.title); + } } if (state === ListrTaskState.SKIPPED) { - rendererOptions?.verbose > 0 && + if (rendererOptions?.verbose > 0) { this.getScopedLogger(rendererOptions).info( `${task.title} is skipped${task.message.skip ? `: ${task.message.skip}` : ''}`, ); + } } if (state === ListrTaskState.FAILED) { - rendererOptions?.verbose > 0 && + if (rendererOptions?.verbose > 0) { this.getScopedLogger(rendererOptions).error(task.title); + } } }); diff --git a/libs/sdk/package.json b/libs/sdk/package.json index 4b1973d5..0112d121 100644 --- a/libs/sdk/package.json +++ b/libs/sdk/package.json @@ -40,5 +40,15 @@ } } } + }, + "dependencies": { + "axios": "^1.13.1", + "deep-diff": "^1.0.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "semver": "^7.6.3", + "tslib": "^2.6.2", + "vitest": "3.0.0", + "zod": "^4.0.10" } } From 93ab8b24faba1a246a6d528d40da3466a3eed6cc Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 15:12:46 +0800 Subject: [PATCH 11/27] f --- .github/workflows/lint.yaml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/lint.yaml diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 00000000..55643193 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,22 @@ +name: Lint +on: + push: + branches: + - main + pull_request: + branches: + - main +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + - uses: pnpm/action-setup@v4 + - name: Install dependencies + run: pnpm install + + - name: Run Lint Check + run: npx nx run-many --target=lint --all --skip-nx-cache From f8d73613db60e2d1087e400cf9c2c7f90c19b973 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 15:15:05 +0800 Subject: [PATCH 12/27] f --- package.json | 2 +- pnpm-lock.yaml | 124 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 104 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 689243b3..ad38e95d 100644 --- a/package.json +++ b/package.json @@ -79,4 +79,4 @@ "nx" ] } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 413c5733..c44cf46b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -149,7 +149,7 @@ importers: version: 8.41.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^3.0.5 - version: 3.2.4(vitest@3.2.4) + version: 3.2.4(vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) '@vitest/ui': specifier: ^3.0.0 version: 3.2.4(vitest@3.0.0) @@ -197,19 +197,88 @@ importers: version: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) vitest: specifier: ^3.0.0 - version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) webpack: specifier: 5.101.3 version: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9) apps/cli: dependencies: + '@api7/adc-sdk': + specifier: workspace:* + version: link:../../libs/sdk + '@nx/webpack': + specifier: 21.6.4 + version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3) + agentkeepalive: + specifier: ^4.6.0 + version: 4.6.0 + axios: + specifier: ^1.13.1 + version: 1.13.1 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + commander: + specifier: ^13.1.0 + version: 13.1.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 express: specifier: ^5.1.0 version: 5.1.0 + glob: + specifier: ^11.0.3 + version: 11.0.3 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + listr2: + specifier: ^8.2.1 + version: 8.2.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + parse-duration: + specifier: ^1.1.0 + version: 1.1.0 + pluralize: + specifier: ^8.0.0 + version: 8.0.0 + qs: + specifier: ^6.12.1 + version: 6.14.0 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + semver: + specifier: ^7.6.3 + version: 7.7.2 + signale: + specifier: ^1.4.0 + version: 1.4.0 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + supertest: + specifier: 7.1.4 + version: 7.1.4 + terser-webpack-plugin: + specifier: ^5.3.14 + version: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)) + vitest: + specifier: 3.0.0 + version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + webpack: + specifier: 5.101.3 + version: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9) winston: specifier: ^3.17.0 version: 3.17.0 + zod: + specifier: ^4.0.10 + version: 4.0.10 devDependencies: '@api7/adc-backend-api7': specifier: workspace:* @@ -226,18 +295,12 @@ importers: '@api7/adc-differ': specifier: workspace:* version: link:../../libs/differ - '@api7/adc-sdk': - specifier: workspace:* - version: link:../../libs/sdk '@types/express': specifier: ^5.0.3 version: 5.0.3 '@types/supertest': specifier: ^6.0.3 version: 6.0.3 - supertest: - specifier: ^7.1.4 - version: 7.1.4 libs/backend-api7: devDependencies: @@ -296,13 +359,32 @@ importers: specifier: workspace:* version: link:../sdk - libs/sdk: {} - - libs/tstetsetse: + libs/sdk: dependencies: + axios: + specifier: ^1.13.1 + version: 1.13.1 + deep-diff: + specifier: ^1.0.2 + version: 1.0.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + semver: + specifier: ^7.6.3 + version: 7.7.2 tslib: - specifier: ^2.3.0 + specifier: ^2.6.2 version: 2.8.1 + vitest: + specifier: 3.0.0 + version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + zod: + specifier: ^4.0.10 + version: 4.0.10 packages: @@ -8472,7 +8554,7 @@ snapshots: tsconfig-paths: 4.2.0 tslib: 2.8.1 vite: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) - vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -8867,7 +8949,7 @@ snapshots: colorette: 2.0.20 debug: 4.3.4 pirates: 4.0.6 - tslib: 2.6.3 + tslib: 2.8.1 typescript: 5.9.3 transitivePeerDependencies: - '@swc/types' @@ -9302,7 +9384,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': + '@vitest/coverage-v8@3.2.4(vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -9317,7 +9399,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -9368,7 +9450,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + vitest: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) '@vitest/utils@3.0.0': dependencies: @@ -11520,7 +11602,7 @@ snapshots: acorn: 8.14.1 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.3 + semver: 7.7.2 jsonc-parser@3.2.0: {} @@ -11700,7 +11782,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.2 make-error@1.3.6: {} @@ -12506,7 +12588,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 safe-buffer@5.1.2: {} @@ -13332,7 +13414,7 @@ snapshots: terser: 5.39.1 yaml: 2.8.0 - vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): + vitest@3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0): dependencies: '@vitest/expect': 3.0.0 '@vitest/mocker': 3.0.0(vite@6.4.1(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0)) From 87e3d4d14c369d2962695337651646cc76345998 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 16:05:15 +0800 Subject: [PATCH 13/27] f --- libs/backend-apisix/src/transformer.ts | 4 ++-- libs/sdk/src/core/schema.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index 98884804..8b763a2f 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -404,8 +404,8 @@ export class FromADC { return Object.entries(pluginMetadatas).reduce>( (pv, [key, value]) => { pv.push( - ADCSDK.utils.recursiveOmitUndefined({ - id: undefined, + ADCSDK.utils.recursiveOmitUndefined>({ + id: undefined , ...value, __plugin_name: key, }), diff --git a/libs/sdk/src/core/schema.ts b/libs/sdk/src/core/schema.ts index 76345cc4..0c78a2c5 100644 --- a/libs/sdk/src/core/schema.ts +++ b/libs/sdk/src/core/schema.ts @@ -21,7 +21,7 @@ const labelsSchema = z.record( export type Labels = z.infer; const pluginSchema = z.looseObject({}); export type Plugin = z.infer; -const pluginsSchema = pluginSchema; +const pluginsSchema = z.record(z.string(), pluginSchema); export type Plugins = z.infer; const exprSchema = z.array(z.any()); export type Expr = z.infer; From e118d92b82bec698d73240e907f078b9681a05b8 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 16:13:44 +0800 Subject: [PATCH 14/27] update --- libs/backend-api7/src/index.ts | 4 ++-- libs/backend-apisix/src/fetcher.ts | 2 +- libs/backend-apisix/src/transformer.ts | 20 +++++++------------- pnpm-lock.yaml | 2 +- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/libs/backend-api7/src/index.ts b/libs/backend-api7/src/index.ts index 1bfc25a8..56729e4d 100644 --- a/libs/backend-api7/src/index.ts +++ b/libs/backend-api7/src/index.ts @@ -65,8 +65,8 @@ export class BackendAPI7 implements ADCSDK.Backend { if (items.length < 2) return items[0]; if (!items.some((item) => item.type === 'object')) return {}; - const first = items.shift() || {}; - if (!first?.properties) first.properties = {}; + const first: JSONSchema4 = items.shift() || { type: 'object', properties: {} }; + if (!first.properties) first.properties = {}; return items.reduce((pv, cv) => { Object.entries(cv?.properties ?? {}).forEach(([key, val]) => { if (!pv.properties) pv.properties = {}; diff --git a/libs/backend-apisix/src/fetcher.ts b/libs/backend-apisix/src/fetcher.ts index 07881fc4..179cf7e9 100644 --- a/libs/backend-apisix/src/fetcher.ts +++ b/libs/backend-apisix/src/fetcher.ts @@ -152,7 +152,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { map(({ list }) => Object.fromEntries( list.map((item) => [ - item.key.split('/').pop() || item.key, + item.key.split('/').pop() ?? item.key, ADCSDK.utils.recursiveOmitUndefined(item.value), ]), ), diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index 8b763a2f..b5cfb942 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -1,5 +1,5 @@ import * as ADCSDK from '@api7/adc-sdk'; -import { filter, isEmpty, unset } from 'lodash'; +import { filter, isEmpty, unset, omit } from 'lodash'; import * as typing from './typing'; @@ -207,12 +207,10 @@ export class ToADC { }; }) : undefined; - const labels: Record = { - ...(upstream.labels ?? {}), - }; - delete (labels as Record)[ - typing.ADC_UPSTREAM_SERVICE_ID_LABEL - ]; + const labels: Record = omit( + upstream.labels ?? {}, + typing.ADC_UPSTREAM_SERVICE_ID_LABEL, + ); return ADCSDK.utils.recursiveOmitUndefined({ ...{ id: 'id' in upstream ? upstream.id : undefined }, name: upstream.name, @@ -443,12 +441,8 @@ export class FromADC { public transformUpstream( upstream: ADCSDK.Upstream, ): Omit { - const { id: _omit, ...rest } = upstream as { id?: string } & Omit< - ADCSDK.Upstream, - 'id' - >; - return ADCSDK.utils.recursiveOmitUndefined>({ - ...rest, + return ADCSDK.utils.recursiveOmitUndefined>({ + ...omit(upstream, 'id'), labels: FromADC.transformLabels(upstream.labels), }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c44cf46b..07a733f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,7 +196,7 @@ importers: specifier: 7.1.9 version: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) vitest: - specifier: ^3.0.0 + specifier: 3.0.0 version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) webpack: specifier: 5.101.3 From 8157da4b173280ba28be8255b402205d8f9b75e2 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 16:50:17 +0800 Subject: [PATCH 15/27] f --- libs/backend-api7/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/backend-api7/src/index.ts b/libs/backend-api7/src/index.ts index 56729e4d..1bfc25a8 100644 --- a/libs/backend-api7/src/index.ts +++ b/libs/backend-api7/src/index.ts @@ -65,8 +65,8 @@ export class BackendAPI7 implements ADCSDK.Backend { if (items.length < 2) return items[0]; if (!items.some((item) => item.type === 'object')) return {}; - const first: JSONSchema4 = items.shift() || { type: 'object', properties: {} }; - if (!first.properties) first.properties = {}; + const first = items.shift() || {}; + if (!first?.properties) first.properties = {}; return items.reduce((pv, cv) => { Object.entries(cv?.properties ?? {}).forEach(([key, val]) => { if (!pv.properties) pv.properties = {}; From c01236480e456621ea56d2a1eb795f107c3cc563 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 18:17:30 +0800 Subject: [PATCH 16/27] f --- .github/workflows/lint.yaml | 3 +++ apps/cli/src/command/utils.spec.ts | 3 +++ apps/cli/tsconfig.app.json | 3 ++- apps/cli/tsconfig.json | 2 +- libs/backend-api7/src/operator.ts | 2 ++ libs/backend-api7/src/transformer.ts | 2 +- libs/backend-api7/tsconfig.json | 10 +++++----- libs/backend-api7/tsconfig.lib.json | 17 +++++++++++++---- libs/backend-api7/tsconfig.spec.json | 3 +-- libs/backend-apisix-standalone/src/index.ts | 14 +++++++------- libs/backend-apisix-standalone/src/operator.ts | 2 +- libs/backend-apisix-standalone/tsconfig.json | 3 +++ .../backend-apisix-standalone/tsconfig.lib.json | 6 +++++- .../tsconfig.spec.json | 3 +-- libs/backend-apisix/src/operator.ts | 2 ++ libs/backend-apisix/src/transformer.ts | 2 +- libs/backend-apisix/tsconfig.json | 10 +++++----- libs/backend-apisix/tsconfig.lib.json | 9 +++++++-- libs/converter-openapi/src/index.ts | 1 + libs/differ/tsconfig.lib.json | 3 ++- libs/sdk/src/backend/index.ts | 2 +- tsconfig.base.json | 3 ++- tsconfig.json | 6 +++--- 23 files changed, 72 insertions(+), 39 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 55643193..2ddf9e07 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -18,5 +18,8 @@ jobs: - name: Install dependencies run: pnpm install + - name: Run TypeScript Type Check + run: npx nx run-many --target=typecheck --all --skip-nx-cache + - name: Run Lint Check run: npx nx run-many --target=lint --all --skip-nx-cache diff --git a/apps/cli/src/command/utils.spec.ts b/apps/cli/src/command/utils.spec.ts index d59a4935..b8d445c6 100644 --- a/apps/cli/src/command/utils.spec.ts +++ b/apps/cli/src/command/utils.spec.ts @@ -210,6 +210,7 @@ describe('CLI utils', () => { { name: 'TestRoute', uris: ['/test'], + // @ts-expect-error for test purpose metadata: { id: 'test_route' }, }, ], @@ -220,6 +221,7 @@ describe('CLI utils', () => { stream_routes: [ { name: 'TestStreamRoute', + // @ts-expect-error for test purpose metadata: { id: 'test_stream_route' }, }, ], @@ -229,6 +231,7 @@ describe('CLI utils', () => { { snis: ['test'], certificates: [], + // @ts-expect-error for test purpose metadata: { id: 'test_ssl' }, }, ], diff --git a/apps/cli/tsconfig.app.json b/apps/cli/tsconfig.app.json index 9d2c8442..7808eb88 100644 --- a/apps/cli/tsconfig.app.json +++ b/apps/cli/tsconfig.app.json @@ -12,7 +12,8 @@ "exclude": [ "vitest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts" + "src/**/*.test.ts", + "dist" ], "include": [ "src/**/*.ts" diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json index b1ab0c12..e8d74ecf 100644 --- a/apps/cli/tsconfig.json +++ b/apps/cli/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": [], + "include": ["src"], "references": [ { "path": "../../libs/differ" diff --git a/libs/backend-api7/src/operator.ts b/libs/backend-api7/src/operator.ts index 4ffe5a96..ecd030b0 100644 --- a/libs/backend-api7/src/operator.ts +++ b/libs/backend-api7/src/operator.ts @@ -271,6 +271,8 @@ export class Operator extends ADCSDK.backend.BackendEventSource { ); case ADCSDK.ResourceType.UPSTREAM: return fromADC.transformUpstream(event.newValue as ADCSDK.Upstream); + default: + throw new Error(`Unsupported resource type: ${event.resourceType}`); } } } diff --git a/libs/backend-api7/src/transformer.ts b/libs/backend-api7/src/transformer.ts index 9508904c..b72cba8e 100644 --- a/libs/backend-api7/src/transformer.ts +++ b/libs/backend-api7/src/transformer.ts @@ -284,7 +284,7 @@ export class FromADC { .map((certificate) => certificate.key), } : {}), - client: ssl.client, + client: ssl.client as typing.SSL['client'], }); } diff --git a/libs/backend-api7/tsconfig.json b/libs/backend-api7/tsconfig.json index 39ab5381..5a97f9b0 100644 --- a/libs/backend-api7/tsconfig.json +++ b/libs/backend-api7/tsconfig.json @@ -1,11 +1,11 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": [ - "src", - "test" - ], + "include": ["src"], "references": [ + { + "path": "../differ" + }, { "path": "../sdk" }, @@ -16,4 +16,4 @@ "path": "./tsconfig.spec.json" } ] -} \ No newline at end of file +} diff --git a/libs/backend-api7/tsconfig.lib.json b/libs/backend-api7/tsconfig.lib.json index 1d65ac03..cbc0b70b 100644 --- a/libs/backend-api7/tsconfig.lib.json +++ b/libs/backend-api7/tsconfig.lib.json @@ -12,10 +12,18 @@ "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "types": ["node"] + "types": [ + "node" + ], + "noEmit": false }, - "include": ["src/**/*.ts"], + "include": [ + "src/**/*.ts" + ], "references": [ + { + "path": "../differ/tsconfig.lib.json" + }, { "path": "../sdk/tsconfig.lib.json" } @@ -32,6 +40,7 @@ "src/**/*.test.js", "src/**/*.spec.js", "src/**/*.test.jsx", - "src/**/*.spec.jsx" + "src/**/*.spec.jsx", + "e2e/**/*.ts" ] -} +} \ No newline at end of file diff --git a/libs/backend-api7/tsconfig.spec.json b/libs/backend-api7/tsconfig.spec.json index b5c686cb..ca8733b1 100644 --- a/libs/backend-api7/tsconfig.spec.json +++ b/libs/backend-api7/tsconfig.spec.json @@ -29,8 +29,7 @@ "src/**/*.spec.js", "src/**/*.test.jsx", "src/**/*.spec.jsx", - "src/**/*.d.ts", - "e2e/**/*.ts" + "src/**/*.d.ts" ], "references": [ { diff --git a/libs/backend-apisix-standalone/src/index.ts b/libs/backend-apisix-standalone/src/index.ts index 269dec61..b33ef770 100644 --- a/libs/backend-apisix-standalone/src/index.ts +++ b/libs/backend-apisix-standalone/src/index.ts @@ -55,7 +55,7 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { } public async version() { - const cachedVersion = versionCache.get(this.opts.cacheKey); + const cachedVersion = versionCache.get(this.opts.cacheKey!); if (cachedVersion) return cachedVersion; const resp = await this.client.head<{ value: string }>( @@ -78,7 +78,7 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { // Only cache it when the actual value is obtained if (!semverEQ(version, mockVersion)) - versionCache.set(this.opts.cacheKey, version); + versionCache.set(this.opts.cacheKey!, version); return version; } @@ -92,7 +92,7 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { public dump(): Observable { return from(this.version()).pipe( switchMap((version) => { - const cachedConfig = configCache.get(this.opts.cacheKey); + const cachedConfig = configCache.get(this.opts.cacheKey!); if (cachedConfig) return of(cachedConfig); // Initialize config cache @@ -108,8 +108,8 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { return from(fetcher.dump()).pipe( map( ([config, rawConfig]) => ( - configCache.set(this.opts.cacheKey, config), - rawConfigCache.set(this.opts.cacheKey, rawConfig), + configCache.set(this.opts.cacheKey!, config), + rawConfigCache.set(this.opts.cacheKey!, rawConfig), config ), ), @@ -132,12 +132,12 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { return from(this.version()).pipe( switchMap((version) => { return new Operator({ - cacheKey: this.opts.cacheKey, + cacheKey: this.opts.cacheKey!, client: this.client, serverTokenMap: this.serverTokenMap, version, eventSubject: this.subject, - oldRawConfiguration: rawConfigCache.get(this.opts.cacheKey) ?? {}, + oldRawConfiguration: rawConfigCache.get(this.opts.cacheKey!) ?? {}, }).sync(events, opts); }), ); diff --git a/libs/backend-apisix-standalone/src/operator.ts b/libs/backend-apisix-standalone/src/operator.ts index 195d6632..4f551572 100644 --- a/libs/backend-apisix-standalone/src/operator.ts +++ b/libs/backend-apisix-standalone/src/operator.ts @@ -369,7 +369,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { keys: res.certificates.slice(1).map((cert) => cert.key), } : {}), - client: res.client, + client: res.client as typing.SSL['client'], ssl_protocols: res.ssl_protocols, status: 1, } satisfies typing.SSL as typing.SSL; diff --git a/libs/backend-apisix-standalone/tsconfig.json b/libs/backend-apisix-standalone/tsconfig.json index 030598f9..1026179e 100644 --- a/libs/backend-apisix-standalone/tsconfig.json +++ b/libs/backend-apisix-standalone/tsconfig.json @@ -6,6 +6,9 @@ { "path": "../sdk" }, + { + "path": "../differ" + }, { "path": "./tsconfig.lib.json" }, diff --git a/libs/backend-apisix-standalone/tsconfig.lib.json b/libs/backend-apisix-standalone/tsconfig.lib.json index 1d65ac03..2c8b6901 100644 --- a/libs/backend-apisix-standalone/tsconfig.lib.json +++ b/libs/backend-apisix-standalone/tsconfig.lib.json @@ -18,6 +18,9 @@ "references": [ { "path": "../sdk/tsconfig.lib.json" + }, + { + "path": "../differ/tsconfig.lib.json" } ], "exclude": [ @@ -32,6 +35,7 @@ "src/**/*.test.js", "src/**/*.spec.js", "src/**/*.test.jsx", - "src/**/*.spec.jsx" + "src/**/*.spec.jsx", + "e2e/**/*.ts" ] } diff --git a/libs/backend-apisix-standalone/tsconfig.spec.json b/libs/backend-apisix-standalone/tsconfig.spec.json index b5c686cb..ca8733b1 100644 --- a/libs/backend-apisix-standalone/tsconfig.spec.json +++ b/libs/backend-apisix-standalone/tsconfig.spec.json @@ -29,8 +29,7 @@ "src/**/*.spec.js", "src/**/*.test.jsx", "src/**/*.spec.jsx", - "src/**/*.d.ts", - "e2e/**/*.ts" + "src/**/*.d.ts" ], "references": [ { diff --git a/libs/backend-apisix/src/operator.ts b/libs/backend-apisix/src/operator.ts index 07719492..602ce154 100644 --- a/libs/backend-apisix/src/operator.ts +++ b/libs/backend-apisix/src/operator.ts @@ -254,6 +254,8 @@ export class Operator extends ADCSDK.backend.BackendEventSource { }; return upstream; } + default: + throw new Error(`Unsupported resource type: ${event.resourceType}`); } } } diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index b5cfb942..5fa4ff31 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -353,7 +353,7 @@ export class FromADC { .map((certificate) => certificate.key), } : {}), - client: ssl.client, + client: ssl.client as typing.SSL['client'], }); } diff --git a/libs/backend-apisix/tsconfig.json b/libs/backend-apisix/tsconfig.json index a366c0dc..82e92c0e 100644 --- a/libs/backend-apisix/tsconfig.json +++ b/libs/backend-apisix/tsconfig.json @@ -2,11 +2,11 @@ "extends": "../../tsconfig.base.json", "compilerOptions": {}, "files": [], - "include": [ - "src", - "e2e" - ], + "include": ["src"], "references": [ + { + "path": "../differ" + }, { "path": "../sdk" }, @@ -17,4 +17,4 @@ "path": "./tsconfig.spec.json" } ] -} \ No newline at end of file +} diff --git a/libs/backend-apisix/tsconfig.lib.json b/libs/backend-apisix/tsconfig.lib.json index 1d65ac03..3e40e78e 100644 --- a/libs/backend-apisix/tsconfig.lib.json +++ b/libs/backend-apisix/tsconfig.lib.json @@ -12,10 +12,14 @@ "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "types": ["node"] + "types": ["node"], + "skipLibCheck": true, }, "include": ["src/**/*.ts"], "references": [ + { + "path": "../differ/tsconfig.lib.json" + }, { "path": "../sdk/tsconfig.lib.json" } @@ -32,6 +36,7 @@ "src/**/*.test.js", "src/**/*.spec.js", "src/**/*.test.jsx", - "src/**/*.spec.jsx" + "src/**/*.spec.jsx", + "e2e/**/*.ts" ] } diff --git a/libs/converter-openapi/src/index.ts b/libs/converter-openapi/src/index.ts index f1bc5a8d..01a6dea5 100644 --- a/libs/converter-openapi/src/index.ts +++ b/libs/converter-openapi/src/index.ts @@ -112,6 +112,7 @@ export class OpenAPIConverter implements ADCSDK.Converter { console.log( `${method.toUpperCase()} "${path}" contains the service or upstream defaults, so it will be included to the separate service`, ); + return undefined; } else { return route; } diff --git a/libs/differ/tsconfig.lib.json b/libs/differ/tsconfig.lib.json index 1d65ac03..7da8892c 100644 --- a/libs/differ/tsconfig.lib.json +++ b/libs/differ/tsconfig.lib.json @@ -12,7 +12,8 @@ "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "types": ["node"] + "types": ["node"], + "skipLibCheck": true }, "include": ["src/**/*.ts"], "references": [ diff --git a/libs/sdk/src/backend/index.ts b/libs/sdk/src/backend/index.ts index 36664d82..c169cc3b 100644 --- a/libs/sdk/src/backend/index.ts +++ b/libs/sdk/src/backend/index.ts @@ -22,7 +22,7 @@ export interface BackendOptions { includeResourceType?: Array; excludeResourceType?: Array; - cacheKey: string; + cacheKey?: string; httpAgent?: httpAgent; httpsAgent?: httpsAgent; } diff --git a/tsconfig.base.json b/tsconfig.base.json index 01683ab0..a012dae1 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -9,6 +9,7 @@ "module": "nodenext", "lib": [ "esnext" - ] + ], + "skipLibCheck": true } } diff --git a/tsconfig.json b/tsconfig.json index 13bf6743..53218b88 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,9 @@ { "extends": "./tsconfig.base.json", "files": [], + "compilerOptions": { + "lib": ["esnext", "dom", "webworker"], + }, "references": [ { "path": "./apps/cli" @@ -22,9 +25,6 @@ }, { "path": "./libs/differ" - }, - { - "path": "./libs/tstetsetse" } ] } From 9c7b35993cda4028dba7d8cdb245a7ab716fbb12 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 18:18:54 +0800 Subject: [PATCH 17/27] f --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad38e95d..0c16014d 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "typescript-eslint": "^8.41.0", "url-loader": "^4.1.1", "vite": "7.1.9", - "vitest": "^3.0.0", + "vitest": "3.0.0", "webpack": "5.101.3" }, "dependencies": { From 6a58eddbbc838cd420014f56e088efff8fac6f27 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 18:19:59 +0800 Subject: [PATCH 18/27] f --- .github/workflows/{lint.yaml => typecheck.yaml} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename .github/workflows/{lint.yaml => typecheck.yaml} (81%) diff --git a/.github/workflows/lint.yaml b/.github/workflows/typecheck.yaml similarity index 81% rename from .github/workflows/lint.yaml rename to .github/workflows/typecheck.yaml index 2ddf9e07..46a2085b 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/typecheck.yaml @@ -1,4 +1,4 @@ -name: Lint +name: Typecheck on: push: branches: @@ -21,5 +21,3 @@ jobs: - name: Run TypeScript Type Check run: npx nx run-many --target=typecheck --all --skip-nx-cache - - name: Run Lint Check - run: npx nx run-many --target=lint --all --skip-nx-cache From eb6f7ca44781be96074f7128fe90cc4b277be0be Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 18:47:56 +0800 Subject: [PATCH 19/27] f --- apps/cli/src/command/utils.spec.ts | 7 ++----- apps/cli/tsconfig.app.json | 4 +--- apps/cli/tsconfig.json | 2 +- libs/backend-api7/tsconfig.json | 2 +- libs/backend-apisix/tsconfig.json | 2 +- libs/backend-apisix/tsconfig.lib.json | 11 +++++++---- libs/differ/src/test/service-upstream.spec.ts | 2 -- libs/differ/tsconfig.lib.json | 3 +-- libs/differ/tsconfig.spec.json | 1 + package.json | 2 +- 10 files changed, 16 insertions(+), 20 deletions(-) diff --git a/apps/cli/src/command/utils.spec.ts b/apps/cli/src/command/utils.spec.ts index b8d445c6..cc9e4c56 100644 --- a/apps/cli/src/command/utils.spec.ts +++ b/apps/cli/src/command/utils.spec.ts @@ -201,7 +201,7 @@ describe('CLI utils', () => { }); it('should remove metadata from dump result', () => { - const config: ADCSDK.Configuration = { + const config = { services: [ { name: 'TestService1', @@ -210,7 +210,6 @@ describe('CLI utils', () => { { name: 'TestRoute', uris: ['/test'], - // @ts-expect-error for test purpose metadata: { id: 'test_route' }, }, ], @@ -221,7 +220,6 @@ describe('CLI utils', () => { stream_routes: [ { name: 'TestStreamRoute', - // @ts-expect-error for test purpose metadata: { id: 'test_stream_route' }, }, ], @@ -231,11 +229,10 @@ describe('CLI utils', () => { { snis: ['test'], certificates: [], - // @ts-expect-error for test purpose metadata: { id: 'test_ssl' }, }, ], - }; + } as unknown as ADCSDK.Configuration; recursiveRemoveMetadataField(config); expect(config).toEqual({ services: [ diff --git a/apps/cli/tsconfig.app.json b/apps/cli/tsconfig.app.json index 7808eb88..856c651b 100644 --- a/apps/cli/tsconfig.app.json +++ b/apps/cli/tsconfig.app.json @@ -11,9 +11,7 @@ }, "exclude": [ "vitest.config.ts", - "src/**/*.spec.ts", - "src/**/*.test.ts", - "dist" + "src/**/*.spec.ts" ], "include": [ "src/**/*.ts" diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json index e8d74ecf..b1ab0c12 100644 --- a/apps/cli/tsconfig.json +++ b/apps/cli/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": ["src"], + "include": [], "references": [ { "path": "../../libs/differ" diff --git a/libs/backend-api7/tsconfig.json b/libs/backend-api7/tsconfig.json index 5a97f9b0..a042fbb1 100644 --- a/libs/backend-api7/tsconfig.json +++ b/libs/backend-api7/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": ["src"], + "include": [], "references": [ { "path": "../differ" diff --git a/libs/backend-apisix/tsconfig.json b/libs/backend-apisix/tsconfig.json index 82e92c0e..67a76e14 100644 --- a/libs/backend-apisix/tsconfig.json +++ b/libs/backend-apisix/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../../tsconfig.base.json", "compilerOptions": {}, "files": [], - "include": ["src"], + "include": [], "references": [ { "path": "../differ" diff --git a/libs/backend-apisix/tsconfig.lib.json b/libs/backend-apisix/tsconfig.lib.json index 3e40e78e..427c1259 100644 --- a/libs/backend-apisix/tsconfig.lib.json +++ b/libs/backend-apisix/tsconfig.lib.json @@ -12,10 +12,13 @@ "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "types": ["node"], - "skipLibCheck": true, + "types": [ + "node" + ] }, - "include": ["src/**/*.ts"], + "include": [ + "src/**/*.ts" + ], "references": [ { "path": "../differ/tsconfig.lib.json" @@ -39,4 +42,4 @@ "src/**/*.spec.jsx", "e2e/**/*.ts" ] -} +} \ No newline at end of file diff --git a/libs/differ/src/test/service-upstream.spec.ts b/libs/differ/src/test/service-upstream.spec.ts index e0a272ce..88fe7e5b 100644 --- a/libs/differ/src/test/service-upstream.spec.ts +++ b/libs/differ/src/test/service-upstream.spec.ts @@ -143,7 +143,6 @@ describe('Differ V3 - service with upstreams', () => { services: [ { ...structuredClone(service), - // @ts-expect-error testing purposes upstreams: [{ id: upstream2Name, name: upstream2Name }], }, ], @@ -191,7 +190,6 @@ describe('Differ V3 - service with upstreams', () => { ...structuredClone(service), upstreams: [ { - // @ts-expect-error testing purposes id: ADCSDK.utils.generateId(`${serviceName}.${upstreamName}`), name: upstreamName, nodes: [{ host: '1.1.1.1', port: 80, weight: 1 }], diff --git a/libs/differ/tsconfig.lib.json b/libs/differ/tsconfig.lib.json index 7da8892c..1d65ac03 100644 --- a/libs/differ/tsconfig.lib.json +++ b/libs/differ/tsconfig.lib.json @@ -12,8 +12,7 @@ "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "types": ["node"], - "skipLibCheck": true + "types": ["node"] }, "include": ["src/**/*.ts"], "references": [ diff --git a/libs/differ/tsconfig.spec.json b/libs/differ/tsconfig.spec.json index ca8733b1..d4bd813b 100644 --- a/libs/differ/tsconfig.spec.json +++ b/libs/differ/tsconfig.spec.json @@ -31,6 +31,7 @@ "src/**/*.spec.jsx", "src/**/*.d.ts" ], + "exclude": ["src/test/*.spec.ts"], "references": [ { "path": "./tsconfig.lib.json" diff --git a/package.json b/package.json index 0c16014d..19468883 100644 --- a/package.json +++ b/package.json @@ -79,4 +79,4 @@ "nx" ] } -} \ No newline at end of file +} From 7456b9855d2ef7bfacbcfe8dbd1689de60acb293 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 18:49:28 +0800 Subject: [PATCH 20/27] f --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 53218b88..a22ec64c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.base.json", "files": [], "compilerOptions": { - "lib": ["esnext", "dom", "webworker"], + "lib": ["esnext"], }, "references": [ { From 674d6b6560f3b22d87724f58cac8ad86a7b4d5c3 Mon Sep 17 00:00:00 2001 From: litesun Date: Tue, 4 Nov 2025 22:51:26 +0800 Subject: [PATCH 21/27] Potential fix for code scanning alert no. 21: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .github/workflows/typecheck.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/typecheck.yaml b/.github/workflows/typecheck.yaml index 46a2085b..9610afca 100644 --- a/.github/workflows/typecheck.yaml +++ b/.github/workflows/typecheck.yaml @@ -1,4 +1,6 @@ name: Typecheck +permissions: + contents: read on: push: branches: From 5b32cdf187838c2217787b1e38ea0621120ab37c Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 23:01:56 +0800 Subject: [PATCH 22/27] f --- apps/cli/eslint.config.ts | 3 +++ apps/cli/package.json | 12 +++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/cli/eslint.config.ts b/apps/cli/eslint.config.ts index 04c7b753..eabb305d 100644 --- a/apps/cli/eslint.config.ts +++ b/apps/cli/eslint.config.ts @@ -13,6 +13,9 @@ export default config([ ignoredFiles: [ '{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}', '{projectRoot}/vite.config.{js,ts,mjs,mts}', + '{projectRoot}/vitest.config.{js,ts,mjs,mts}', + '{projectRoot}/webpack.config.{js,ts}', + '{projectRoot}/e2e/**/*', ], }, ], diff --git a/apps/cli/package.json b/apps/cli/package.json index 3a527f78..4630b19e 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -9,16 +9,18 @@ "@api7/adc-sdk": "workspace:*", "@types/express": "^5.0.3", "@types/supertest": "^6.0.3", - "supertest": "^7.1.4" + "supertest": "^7.1.4", + "vitest": "3.0.0", + "@nx/webpack": "21.6.4", + "webpack": "5.101.3", + "terser-webpack-plugin": "^5.3.14" }, "dependencies": { "express": "^5.1.0", "winston": "^3.17.0", "axios": "^1.13.1", "rxjs": "^7.8.1", - "supertest": "7.1.4", "pluralize": "^8.0.0", - "semver": "^7.6.3", "listr2": "^8.2.1", "commander": "^13.1.0", "js-yaml": "^4.1.0", @@ -32,10 +34,6 @@ "agentkeepalive": "^4.6.0", "glob": "^11.0.3", "signale": "^1.4.0", - "vitest": "3.0.0", - "@nx/webpack": "21.6.4", - "webpack": "5.101.3", - "terser-webpack-plugin": "^5.3.14", "@api7/adc-sdk": "workspace:*" } } \ No newline at end of file From efc79ec478e76983a16d57749255fe85415d932e Mon Sep 17 00:00:00 2001 From: LiteSun Date: Tue, 4 Nov 2025 23:03:39 +0800 Subject: [PATCH 23/27] f --- pnpm-lock.yaml | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07a733f0..5cea1604 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -207,9 +207,6 @@ importers: '@api7/adc-sdk': specifier: workspace:* version: link:../../libs/sdk - '@nx/webpack': - specifier: 21.6.4 - version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3) agentkeepalive: specifier: ^4.6.0 version: 4.6.0 @@ -252,27 +249,12 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.1 - semver: - specifier: ^7.6.3 - version: 7.7.2 signale: specifier: ^1.4.0 version: 1.4.0 source-map-support: specifier: ^0.5.21 version: 0.5.21 - supertest: - specifier: 7.1.4 - version: 7.1.4 - terser-webpack-plugin: - specifier: ^5.3.14 - version: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)) - vitest: - specifier: 3.0.0 - version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) - webpack: - specifier: 5.101.3 - version: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9) winston: specifier: ^3.17.0 version: 3.17.0 @@ -295,12 +277,27 @@ importers: '@api7/adc-differ': specifier: workspace:* version: link:../../libs/differ + '@nx/webpack': + specifier: 21.6.4 + version: 21.6.4(@babel/traverse@7.28.0)(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(nx@21.6.4(@swc-node/register@1.9.2(@swc/core@1.13.5(@swc/helpers@0.5.17))(@swc/types@0.1.24)(typescript@5.9.3))(@swc/core@1.13.5(@swc/helpers@0.5.17)))(typescript@5.9.3) '@types/express': specifier: ^5.0.3 version: 5.0.3 '@types/supertest': specifier: ^6.0.3 version: 6.0.3 + supertest: + specifier: ^7.1.4 + version: 7.1.4 + terser-webpack-plugin: + specifier: ^5.3.14 + version: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)) + vitest: + specifier: 3.0.0 + version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) + webpack: + specifier: 5.101.3 + version: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9) libs/backend-api7: devDependencies: From 43770bdbc14218e95f246287be4696229fd816cf Mon Sep 17 00:00:00 2001 From: LiteSun Date: Wed, 5 Nov 2025 11:32:14 +0800 Subject: [PATCH 24/27] f --- libs/backend-api7/src/transformer.ts | 14 +++++++++----- libs/backend-api7/src/typing.ts | 6 +++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libs/backend-api7/src/transformer.ts b/libs/backend-api7/src/transformer.ts index b72cba8e..5b02d513 100644 --- a/libs/backend-api7/src/transformer.ts +++ b/libs/backend-api7/src/transformer.ts @@ -65,7 +65,10 @@ export class ToADC { } public transformUpstream(upstream: typing.Upstream): ADCSDK.Upstream { - return ADCSDK.utils.recursiveOmitUndefined({ + return ADCSDK.utils.recursiveOmitUndefined< + ADCSDK.Upstream & { id?: string } + >({ + id: upstream?.id, name: upstream.name, description: upstream.desc, labels: ToADC.transformLabels(upstream.labels), @@ -195,9 +198,9 @@ export class FromADC { labels: FromADC.transformLabels(route.labels), service_id: serviceId, plugins: route.plugins, - server_addr: route.server_addr || '', - server_port: route.server_port || 0, - remote_addr: route.remote_addr || '', + server_addr: route.server_addr, + server_port: route.server_port, + remote_addr: route.remote_addr, }); } @@ -218,8 +221,9 @@ export class FromADC { }); } - public transformUpstream(upstream: ADCSDK.Upstream): typing.Upstream { + public transformUpstream(upstream: ADCSDK.Upstream & { id?: string }): typing.Upstream { return ADCSDK.utils.recursiveOmitUndefined({ + id: upstream?.id, name: upstream.name || '', desc: upstream.description, labels: FromADC.transformLabels(upstream.labels), diff --git a/libs/backend-api7/src/typing.ts b/libs/backend-api7/src/typing.ts index 7c99131e..732749e4 100644 --- a/libs/backend-api7/src/typing.ts +++ b/libs/backend-api7/src/typing.ts @@ -53,9 +53,9 @@ export interface StreamRoute { plugins?: Plugins; - server_addr: string; - server_port: number; - remote_addr: string; + server_addr?: string; + server_port?: number; + remote_addr?: string; } export interface Service { id?: string; From 84708ed4c43373fe38b15e093db0c0189f33a288 Mon Sep 17 00:00:00 2001 From: LiteSun Date: Thu, 6 Nov 2025 15:48:24 +0800 Subject: [PATCH 25/27] f --- .vscode/settings.json | 3 +- apps/cli/package.json | 4 +-- apps/cli/src/command/typing.d.ts | 3 ++ libs/backend-api7/package.json | 5 ++-- libs/backend-api7/src/index.ts | 8 +++--- libs/backend-api7/src/transformer.ts | 28 +++++++++---------- libs/backend-api7/tsconfig.lib.json | 2 +- .../tsconfig.lib.json | 10 ++++--- .../tsconfig.spec.json | 4 +++ libs/backend-apisix/package.json | 3 +- libs/backend-apisix/src/fetcher.ts | 2 +- libs/backend-apisix/src/transformer.ts | 14 ++++++---- libs/backend-apisix/src/typing.ts | 2 +- libs/backend-apisix/tsconfig.lib.json | 6 ++-- libs/backend-apisix/tsconfig.spec.json | 4 +++ libs/sdk/src/backend/index.ts | 6 ++-- pnpm-lock.yaml | 16 +---------- tsconfig.json | 4 +-- 18 files changed, 61 insertions(+), 63 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ad92582b..5b5a1f1e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "editor.formatOnSave": true + "editor.formatOnSave": true, + "files.insertFinalNewline": true } diff --git a/apps/cli/package.json b/apps/cli/package.json index 4630b19e..659aa070 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -10,7 +10,7 @@ "@types/express": "^5.0.3", "@types/supertest": "^6.0.3", "supertest": "^7.1.4", - "vitest": "3.0.0", + "vitest": "^3.0.0", "@nx/webpack": "21.6.4", "webpack": "5.101.3", "terser-webpack-plugin": "^5.3.14" @@ -36,4 +36,4 @@ "signale": "^1.4.0", "@api7/adc-sdk": "workspace:*" } -} \ No newline at end of file +} diff --git a/apps/cli/src/command/typing.d.ts b/apps/cli/src/command/typing.d.ts index 652337df..636b7400 100644 --- a/apps/cli/src/command/typing.d.ts +++ b/apps/cli/src/command/typing.d.ts @@ -9,6 +9,9 @@ export type BackendOptions = { server: string; token: string; gatewayGroup: string; + cacheKey: string; + httpAgent: httpAgent; + httpsAgent: httpsAgent; labelSelector?: Record; includeResourceType?: Array; diff --git a/libs/backend-api7/package.json b/libs/backend-api7/package.json index 14291e88..35abb345 100644 --- a/libs/backend-api7/package.json +++ b/libs/backend-api7/package.json @@ -10,8 +10,7 @@ }, "devDependencies": { "@api7/adc-differ": "workspace:*", - "@api7/adc-sdk": "workspace:*", - "@types/jest": "^30.0.0" + "@api7/adc-sdk": "workspace:*" }, "nx": { "name": "backend-api7", @@ -31,4 +30,4 @@ } } } -} \ No newline at end of file +} diff --git a/libs/backend-api7/src/index.ts b/libs/backend-api7/src/index.ts index 1bfc25a8..e88d1d94 100644 --- a/libs/backend-api7/src/index.ts +++ b/libs/backend-api7/src/index.ts @@ -12,7 +12,7 @@ import * as typing from './typing'; export class BackendAPI7 implements ADCSDK.Backend { private readonly client: AxiosInstance; - private readonly gatewayGroupName?: string; + private readonly gatewayGroupName: string; private static logScope = ['API7']; private readonly subject = new Subject(); @@ -31,7 +31,7 @@ export class BackendAPI7 implements ADCSDK.Backend { httpsAgent: opts.httpsAgent, ...(opts.timeout ? { timeout: opts.timeout } : {}), }); - this.gatewayGroupName = opts.gatewayGroup; + this.gatewayGroupName = opts.gatewayGroup!; } public metadata() { @@ -55,8 +55,8 @@ export class BackendAPI7 implements ADCSDK.Backend { return (this._version = resp?.data?.value === 'dev' - ? semver.coerce('999.999.999')! - : semver.coerce(resp?.data?.value) || semver.coerce('0.0.0')!); + ? new semver.SemVer('999.999.999') + : semver.coerce(resp?.data?.value) || new semver.SemVer('0.0.0')); } public async defaultValue() { diff --git a/libs/backend-api7/src/transformer.ts b/libs/backend-api7/src/transformer.ts index 5b02d513..0dd91940 100644 --- a/libs/backend-api7/src/transformer.ts +++ b/libs/backend-api7/src/transformer.ts @@ -137,16 +137,14 @@ export class ToADC { public transformGlobalRule( globalRules: Array, ): Record { - const entries: Array<[string, ADCSDK.GlobalRule]> = globalRules.map( - (globalRule) => { - const [name, config] = Object.entries(globalRule.plugins)[0] as [ + return Object.fromEntries( + globalRules.map((globalRule) => { + return Object.entries(globalRule.plugins)[0] as [ string, ADCSDK.GlobalRule, ]; - return [name, config]; - }, + }), ); - return Object.fromEntries(entries); } public transformPluginMetadatas( @@ -159,8 +157,8 @@ export class ToADC { export class FromADC { private static transformLabels( labels?: ADCSDK.Labels, - ): Record { - if (!labels) return {}; + ): Record | undefined { + if (!labels) return undefined; return Object.entries(labels).reduce>( (pv, [key, value]) => { pv[key] = typeof value === 'string' ? value : JSON.stringify(value); @@ -172,7 +170,7 @@ export class FromADC { public transformRoute(route: ADCSDK.Route, serviceId: string): typing.Route { return ADCSDK.utils.recursiveOmitUndefined({ - route_id: route.id || '', + route_id: route.id!, name: route.name, desc: route.description, labels: FromADC.transformLabels(route.labels), @@ -183,7 +181,7 @@ export class FromADC { paths: route.uris, priority: route.priority, timeout: route.timeout, - vars: route.vars || [], + vars: route.vars!, }); } @@ -192,9 +190,9 @@ export class FromADC { serviceId: string, ): typing.StreamRoute { return ADCSDK.utils.recursiveOmitUndefined({ - stream_route_id: route.id || '', + stream_route_id: route.id!, name: route.name, - desc: route.description || '', + desc: route.description!, labels: FromADC.transformLabels(route.labels), service_id: serviceId, plugins: route.plugins, @@ -221,10 +219,12 @@ export class FromADC { }); } - public transformUpstream(upstream: ADCSDK.Upstream & { id?: string }): typing.Upstream { + public transformUpstream( + upstream: ADCSDK.Upstream & { id?: string }, + ): typing.Upstream { return ADCSDK.utils.recursiveOmitUndefined({ id: upstream?.id, - name: upstream.name || '', + name: upstream.name!, desc: upstream.description, labels: FromADC.transformLabels(upstream.labels), type: upstream.type, diff --git a/libs/backend-api7/tsconfig.lib.json b/libs/backend-api7/tsconfig.lib.json index cbc0b70b..95d905ce 100644 --- a/libs/backend-api7/tsconfig.lib.json +++ b/libs/backend-api7/tsconfig.lib.json @@ -43,4 +43,4 @@ "src/**/*.spec.jsx", "e2e/**/*.ts" ] -} \ No newline at end of file +} diff --git a/libs/backend-apisix-standalone/tsconfig.lib.json b/libs/backend-apisix-standalone/tsconfig.lib.json index 2c8b6901..2d4a3ecd 100644 --- a/libs/backend-apisix-standalone/tsconfig.lib.json +++ b/libs/backend-apisix-standalone/tsconfig.lib.json @@ -12,9 +12,13 @@ "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "types": ["node"] + "types": [ + "node" + ] }, - "include": ["src/**/*.ts"], + "include": [ + "src/**/*.ts" + ], "references": [ { "path": "../sdk/tsconfig.lib.json" @@ -35,7 +39,5 @@ "src/**/*.test.js", "src/**/*.spec.js", "src/**/*.test.jsx", - "src/**/*.spec.jsx", - "e2e/**/*.ts" ] } diff --git a/libs/backend-apisix-standalone/tsconfig.spec.json b/libs/backend-apisix-standalone/tsconfig.spec.json index ca8733b1..cd99154e 100644 --- a/libs/backend-apisix-standalone/tsconfig.spec.json +++ b/libs/backend-apisix-standalone/tsconfig.spec.json @@ -31,6 +31,10 @@ "src/**/*.spec.jsx", "src/**/*.d.ts" ], + "exclude": [ + "src/**/*.spec.jsx", + "e2e/**/*.ts" + ], "references": [ { "path": "./tsconfig.lib.json" diff --git a/libs/backend-apisix/package.json b/libs/backend-apisix/package.json index 0085571c..5cd35254 100644 --- a/libs/backend-apisix/package.json +++ b/libs/backend-apisix/package.json @@ -10,8 +10,7 @@ }, "devDependencies": { "@api7/adc-differ": "workspace:*", - "@api7/adc-sdk": "workspace:*", - "@types/jest": "^30.0.0" + "@api7/adc-sdk": "workspace:*" }, "nx": { "name": "backend-apisix", diff --git a/libs/backend-apisix/src/fetcher.ts b/libs/backend-apisix/src/fetcher.ts index 179cf7e9..11bf26ae 100644 --- a/libs/backend-apisix/src/fetcher.ts +++ b/libs/backend-apisix/src/fetcher.ts @@ -152,7 +152,7 @@ export class Fetcher extends ADCSDK.backend.BackendEventSource { map(({ list }) => Object.fromEntries( list.map((item) => [ - item.key.split('/').pop() ?? item.key, + item.key.split('/').pop() as string, ADCSDK.utils.recursiveOmitUndefined(item.value), ]), ), diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index 5fa4ff31..04b02a22 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -1,5 +1,5 @@ import * as ADCSDK from '@api7/adc-sdk'; -import { filter, isEmpty, unset, omit } from 'lodash'; +import { filter, isEmpty, omit, unset } from 'lodash'; import * as typing from './typing'; @@ -122,7 +122,7 @@ export class ToADC { skip_mtls_uri_regex: ssl.client.skip_mtls_uri_regex, } : undefined, - ssl_protocols: ssl.ssl_protocols as ('TLSv1.1' | 'TLSv1.2' | 'TLSv1.3')[], + ssl_protocols: ssl.ssl_protocols, }); } @@ -368,11 +368,15 @@ export class FromADC { return [ ADCSDK.utils.recursiveOmitUndefined({ ...consumerGroup, - id: consumerGroupId, + // @ts-expect-error ignored + id: undefined, + name: undefined, + consumers: undefined, labels: { ...FromADC.transformLabels(consumerGroup.labels), ADC_NAME: consumerGroup.name, }, + }), consumers, ]; @@ -403,7 +407,7 @@ export class FromADC { (pv, [key, value]) => { pv.push( ADCSDK.utils.recursiveOmitUndefined>({ - id: undefined , + id: undefined, ...value, __plugin_name: key, }), @@ -441,7 +445,7 @@ export class FromADC { public transformUpstream( upstream: ADCSDK.Upstream, ): Omit { - return ADCSDK.utils.recursiveOmitUndefined>({ + return ADCSDK.utils.recursiveOmitUndefined>({ ...omit(upstream, 'id'), labels: FromADC.transformLabels(upstream.labels), }); diff --git a/libs/backend-apisix/src/typing.ts b/libs/backend-apisix/src/typing.ts index a53b3898..1a31025d 100644 --- a/libs/backend-apisix/src/typing.ts +++ b/libs/backend-apisix/src/typing.ts @@ -96,7 +96,7 @@ export interface SSL { depth: number; skip_mtls_uri_regex?: Array; }; - ssl_protocols?: Array; + ssl_protocols?: ('TLSv1.1' | 'TLSv1.2' | 'TLSv1.3')[]; status: number; } diff --git a/libs/backend-apisix/tsconfig.lib.json b/libs/backend-apisix/tsconfig.lib.json index 427c1259..ecb59350 100644 --- a/libs/backend-apisix/tsconfig.lib.json +++ b/libs/backend-apisix/tsconfig.lib.json @@ -38,8 +38,6 @@ "src/**/*.spec.tsx", "src/**/*.test.js", "src/**/*.spec.js", - "src/**/*.test.jsx", - "src/**/*.spec.jsx", - "e2e/**/*.ts" + "src/**/*.test.jsx" ] -} \ No newline at end of file +} diff --git a/libs/backend-apisix/tsconfig.spec.json b/libs/backend-apisix/tsconfig.spec.json index ca8733b1..cd99154e 100644 --- a/libs/backend-apisix/tsconfig.spec.json +++ b/libs/backend-apisix/tsconfig.spec.json @@ -31,6 +31,10 @@ "src/**/*.spec.jsx", "src/**/*.d.ts" ], + "exclude": [ + "src/**/*.spec.jsx", + "e2e/**/*.ts" + ], "references": [ { "path": "./tsconfig.lib.json" diff --git a/libs/sdk/src/backend/index.ts b/libs/sdk/src/backend/index.ts index c169cc3b..447ce34b 100644 --- a/libs/sdk/src/backend/index.ts +++ b/libs/sdk/src/backend/index.ts @@ -22,9 +22,9 @@ export interface BackendOptions { includeResourceType?: Array; excludeResourceType?: Array; - cacheKey?: string; - httpAgent?: httpAgent; - httpsAgent?: httpsAgent; + cacheKey: string; + httpAgent: httpAgent; + httpsAgent: httpsAgent; } export const BackendEventType = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cea1604..2d1e8cea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -293,7 +293,7 @@ importers: specifier: ^5.3.14 version: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.9)) vitest: - specifier: 3.0.0 + specifier: ^3.0.0 version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) webpack: specifier: 5.101.3 @@ -307,9 +307,6 @@ importers: '@api7/adc-sdk': specifier: workspace:* version: link:../sdk - '@types/jest': - specifier: ^30.0.0 - version: 30.0.0 libs/backend-apisix: devDependencies: @@ -319,9 +316,6 @@ importers: '@api7/adc-sdk': specifier: workspace:* version: link:../sdk - '@types/jest': - specifier: ^30.0.0 - version: 30.0.0 libs/backend-apisix-standalone: devDependencies: @@ -2211,9 +2205,6 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@30.0.0': - resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -9143,11 +9134,6 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@30.0.0': - dependencies: - expect: 30.0.5 - pretty-format: 30.0.5 - '@types/js-yaml@4.0.9': {} '@types/json-schema@7.0.15': {} diff --git a/tsconfig.json b/tsconfig.json index a22ec64c..705a18b5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,7 @@ { "extends": "./tsconfig.base.json", "files": [], - "compilerOptions": { - "lib": ["esnext"], - }, + "compilerOptions": {}, "references": [ { "path": "./apps/cli" From 14fd5a505c450121590e8b10b0ef81378835730f Mon Sep 17 00:00:00 2001 From: LiteSun Date: Thu, 6 Nov 2025 15:55:26 +0800 Subject: [PATCH 26/27] f --- libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts | 4 ++-- package.json | 2 +- pnpm-lock.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts b/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts index 6988de99..caa5a745 100644 --- a/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts +++ b/libs/backend-apisix/e2e/sync-and-dump-1.e2e-spec.ts @@ -424,7 +424,7 @@ describe('Sync and Dump - 1', () => { const plugin1Name = 'prometheus'; const plugin1 = { prefer_name: true, - } as unknown as ADCSDK.GlobalRule; + } as ADCSDK.Plugin; const plugin2Name = 'file-logger'; const plugin2 = { path: 'logs/file.log', @@ -444,7 +444,7 @@ describe('Sync and Dump - 1', () => { }); it('Update plugin1', async () => { - plugin1.test = { value: 'test' }; + plugin1.test = 'test'; await syncEvents(backend, [ updateEvent(ADCSDK.ResourceType.GLOBAL_RULE, plugin1Name, plugin1), ]); diff --git a/package.json b/package.json index 19468883..689243b3 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "typescript-eslint": "^8.41.0", "url-loader": "^4.1.1", "vite": "7.1.9", - "vitest": "3.0.0", + "vitest": "^3.0.0", "webpack": "5.101.3" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d1e8cea..a4b1382c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,7 +196,7 @@ importers: specifier: 7.1.9 version: 7.1.9(@types/node@22.16.5)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) vitest: - specifier: 3.0.0 + specifier: ^3.0.0 version: 3.0.0(@types/node@22.16.5)(@vitest/ui@3.2.4(vitest@3.0.0))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.86.0)(sass@1.86.0)(terser@5.39.1)(yaml@2.8.0) webpack: specifier: 5.101.3 From 508c80e65a1c17fafe82d7076115c6859c2ca58c Mon Sep 17 00:00:00 2001 From: LiteSun Date: Thu, 6 Nov 2025 16:00:56 +0800 Subject: [PATCH 27/27] f --- libs/backend-apisix/src/transformer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/backend-apisix/src/transformer.ts b/libs/backend-apisix/src/transformer.ts index 04b02a22..26899745 100644 --- a/libs/backend-apisix/src/transformer.ts +++ b/libs/backend-apisix/src/transformer.ts @@ -368,15 +368,15 @@ export class FromADC { return [ ADCSDK.utils.recursiveOmitUndefined({ ...consumerGroup, - // @ts-expect-error ignored + // @ts-ignore id: undefined, + // @ts-ignore name: undefined, consumers: undefined, labels: { ...FromADC.transformLabels(consumerGroup.labels), ADC_NAME: consumerGroup.name, }, - }), consumers, ];