diff --git a/.changeset/loud-rockets-press.md b/.changeset/loud-rockets-press.md new file mode 100644 index 0000000..853ec05 --- /dev/null +++ b/.changeset/loud-rockets-press.md @@ -0,0 +1,5 @@ +--- +"@hyperse/track": patch +--- + +Fix to transform recursive call,typescript type missing diff --git a/.changeset/swift-vans-kneel.md b/.changeset/swift-vans-kneel.md new file mode 100644 index 0000000..1ab14a4 --- /dev/null +++ b/.changeset/swift-vans-kneel.md @@ -0,0 +1,5 @@ +--- +"@hyperse/track": patch +--- + +fix typing diff --git a/examples/next-example/track/track.ts b/examples/next-example/track/track.ts index d2f0cde..de98c2a 100644 --- a/examples/next-example/track/track.ts +++ b/examples/next-example/track/track.ts @@ -34,13 +34,13 @@ export const reportTrack = () => { .before((ctx, eventType, eventData) => { console.log('before', ctx, eventType, eventData); }) - .transform(['addCart', 'addCart'], (ctx, eventType, eventData) => { + .transform(['addCart', 'real_addCart'], (ctx, eventType, eventData) => { if (eventData) { return [eventData]; } return []; }) - .transform(['addCartList', 'addCart'], (ctx, eventType, eventData) => { + .transform(['addCartList', 'real_addCart'], (ctx, eventType, eventData) => { return eventData || []; }) .transform('pv', (ctx, eventType, eventData) => { @@ -63,10 +63,8 @@ export const reportTrack = () => { }); return trackBuilder - .init(() => { - return { - reportAdapter: adapter, - }; + .init({ + reportAdapter: adapter, }) .before((ctx) => { console.log('before track', ctx); diff --git a/examples/next-example/track/types.ts b/examples/next-example/track/types.ts index cf6d1f9..e80ef97 100644 --- a/examples/next-example/track/types.ts +++ b/examples/next-example/track/types.ts @@ -34,8 +34,8 @@ export type ReportRealEventData = { userName: string; userId: string; }; - addCart?: GoodsRecord[]; -}; + real_addCart?: GoodsRecord[]; +} & ReportEventData; export interface GoodsRecord { goodsName: string; diff --git a/src/adapter/adapter-builder.ts b/src/adapter/adapter-builder.ts index f8b983c..3f1ebf4 100644 --- a/src/adapter/adapter-builder.ts +++ b/src/adapter/adapter-builder.ts @@ -1,4 +1,3 @@ -import { UnionToTuple } from '../types/type-union-tuple.js'; import { AdapterAfterFunction, AdapterBeforeFunction, @@ -9,6 +8,7 @@ import { } from '../types/types-adapter.js'; import { TrackAdapterOptions, TrackContext } from '../types/types-create.js'; import { TrackEventDataBase } from '../types/types-track.js'; +import { TransformHook } from '../types/types-transform-hook.js'; /** * A builder for creating a track adapter. @@ -44,7 +44,12 @@ export class AdapterBuilder< return { setup: this.mountSetupHook, before: this.mountBeforeHook, - transform: this.mountTransformHook, + transform: this.mountTransformHook as TransformHook< + ReturnType, + Context, + EventData, + RealEventData + >, build: this.executeBuild, }; } @@ -52,14 +57,24 @@ export class AdapterBuilder< private buildSetupChainer() { return { before: this.mountBeforeHook, - transform: this.mountTransformHook, + transform: this.mountTransformHook as TransformHook< + ReturnType, + Context, + EventData, + RealEventData + >, build: this.executeBuild, }; } private buildBeforeChainer() { return { - transform: this.mountTransformHook, + transform: this.mountTransformHook as TransformHook< + ReturnType, + Context, + EventData, + RealEventData + >, build: this.executeBuild, }; } @@ -139,19 +154,10 @@ export class AdapterBuilder< return this.mountTransformHook(eventType, fun); }; - const result = { + return { transform: transform, ...this.buildTransformChainer(), }; - - return result as UnionToTuple< - Exclude< - keyof LeftEventData, - TransformEventType - > - >['length'] extends 0 - ? ReturnType - : typeof result; }; private mountAfterHook = ( diff --git a/src/types/index.ts b/src/types/index.ts index efa0123..8a6d5b4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -3,3 +3,4 @@ export * from './types-adapter.js'; export * from './types-create.js'; export * from './types-logger.js'; export * from './types-track.js'; +export * from './types-transform-hook.js'; diff --git a/src/types/types-adapter.ts b/src/types/types-adapter.ts index 86576e1..95ef269 100644 --- a/src/types/types-adapter.ts +++ b/src/types/types-adapter.ts @@ -88,7 +88,7 @@ export interface TrackAdapter< Context extends TrackContext, EventData extends TrackEventDataBase, AdapterOptions extends TrackAdapterOptions, - RealEventData extends TrackEventDataBase, + RealEventData extends TrackEventDataBase = EventData, > { /** * The adapter hook Performs data consolidation against the rules defined by AdapterOptions diff --git a/src/types/types-track.ts b/src/types/types-track.ts index 03a1c23..dd1df8d 100644 --- a/src/types/types-track.ts +++ b/src/types/types-track.ts @@ -58,5 +58,5 @@ export type TrackAdapterMap< Context extends TrackContext, EventData extends TrackEventDataBase, > = { - [name: string]: TrackAdapter; + [name: string]: TrackAdapter; }; diff --git a/src/types/types-transform-hook.ts b/src/types/types-transform-hook.ts new file mode 100644 index 0000000..ca4d71f --- /dev/null +++ b/src/types/types-transform-hook.ts @@ -0,0 +1,96 @@ +import { UnionToTuple } from './type-union-tuple.js'; +import { + TransformEventData, + TransformEventType, + TransformReturns, +} from './types-adapter.js'; +import { TrackContext } from './types-create.js'; +import { TrackEventDataBase } from './types-track.js'; + +/** + * Represents the return type of the TransformHookReturns function. + * + * @template OtherChainer - The type of the other chainer. + * @template Context - The type of the context. + * @template Key - The type of the key. + * @template LeftEventData - The type of the left event data. + * @template RealEventData - The type of the real event data. + */ +export type TransformHookReturns< + OtherChainer, + Context, + Key, + LeftEventData, + RealEventData, +> = < + RightKey extends + | keyof RightEventData + | [keyof RightEventData, keyof RealEventData], + RightEventData = Key extends keyof LeftEventData + ? Omit + : Key extends [keyof LeftEventData, keyof RealEventData] + ? Omit + : never, +>( + eventType: RightKey, + fun: ( + ctx: Context, + eventType: TransformEventType, + eventData: TransformEventData + ) => TransformReturns +) => UnionToTuple< + Exclude< + keyof RightEventData, + TransformEventType + > +>['length'] extends 0 + ? OtherChainer + : OtherChainer & { + transform: TransformHookReturns< + OtherChainer, + Context, + RightKey, + RightEventData, + RealEventData + >; + }; + +/** + * Represents a transform hook function. + * + * @template OtherChainer - The type of the other chainer. + * @template Context - The type of the track context. + * @template EventData - The type of the track event data. + * @template RealEventData - The type of the real event data. + */ +export type TransformHook< + OtherChainer, + Context extends TrackContext, + EventData extends TrackEventDataBase, + RealEventData extends TrackEventDataBase = EventData, +> = < + Key extends keyof LeftEventData | [keyof LeftEventData, keyof RealEventData], + LeftEventData = EventData, +>( + eventType: Key, + fun: ( + ctx: Context, + eventType: TransformEventType, + eventData: TransformEventData + ) => TransformReturns +) => UnionToTuple< + Exclude< + keyof LeftEventData, + TransformEventType + > +>['length'] extends 0 + ? OtherChainer + : OtherChainer & { + transform: TransformHookReturns< + OtherChainer, + Context, + Key, + EventData, + RealEventData + >; + }; diff --git a/website/docs/api/track-builder.md b/website/docs/api/track-builder.md index e45521d..4b5ec0e 100644 --- a/website/docs/api/track-builder.md +++ b/website/docs/api/track-builder.md @@ -95,7 +95,7 @@ The `select` method is used to choose which adapters should be used during the t The context in which the tracking is occurring. This typically includes details such as user information, environment, or other contextual data relevant to the tracking event. -- **adapterMap** : `Record>` +- **adapterMap** : `Record>` A map of available adapters, where the key is the adapter name and the value is the adapter instance.