Skip to content

Commit

Permalink
infer both payload and opts from modules
Browse files Browse the repository at this point in the history
  • Loading branch information
locksten committed Apr 19, 2024
1 parent 72a0743 commit bb64160
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 11 deletions.
9 changes: 6 additions & 3 deletions packages/core/src/engines/creators.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import { generateEngineExtensions } from '.';
import { getContext } from '../context/provider';
import { RnvModule } from '../modules/types';
import { createTaskMap } from '../tasks/creators';
import { RnvPlatformKey } from '../types';
import { extractEngineId } from './nameExtractor';
import type { CreateRnvEngineOpts, RnvEngine, RnvEnginePlatforms } from './types';

export const createRnvEngine = <OKey, Payload>(opts: CreateRnvEngineOpts<OKey, Payload>) => {
export const createRnvEngine = <OKey extends string = never, Modules extends [RnvModule, ...RnvModule[]] = any>(
opts: CreateRnvEngineOpts<OKey, Modules>
) => {
if (!opts.config.name) {
throw new Error('Engine name is required. check your renative.engine.json file');
}
Expand All @@ -21,14 +24,14 @@ export const createRnvEngine = <OKey, Payload>(opts: CreateRnvEngineOpts<OKey, P
}
});

const engine: RnvEngine<OKey, Payload> = {
const engine: RnvEngine<OKey, Modules> = {
...opts,
platforms,
id: opts.config.name,
serverDirName: opts.serverDirName || '',
projectDirName: opts.projectDirName || '',
runtimeExtraProps: opts.runtimeExtraProps || {},
tasks: createTaskMap<OKey>({
tasks: createTaskMap<any>({
tasks: [...opts.tasks, ...(opts.extendModules?.flatMap((m) => m.originalTasks) ?? [])],
ownerID: opts.config.name,
ownerType: 'engine',
Expand Down
21 changes: 13 additions & 8 deletions packages/core/src/engines/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ export type RnvEnginePlatforms = Partial<Record<RnvPlatformKey, RnvEnginePlatfor

type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;

// type ExtractModulePayload<T extends RnvModule> = T extends RnvModule<any, infer Payload> ? Payload : never;
type ExtractModulePayload<T extends RnvModule> = T extends RnvModule<any, infer Payload> ? Payload : never;
type ExtractModuleOKey<T extends RnvModule> = T extends RnvModule<infer OKey, any> ? OKey : never;

// type ExtractKeyedModule<OKey> = OKey extends string ? RnvModule<OKey> : never;

Expand All @@ -18,16 +19,16 @@ type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (

// export type KeyAwareModule<OKey> = [RnvModule<OKey>, ...RnvModule<OKey>[]];

export type KeyAwareModule<OKey> = ReadonlyArray<RnvModule<OKey>>;
// export type KeyAwareModule<OKey> = ReadonlyArray<RnvModule<OKey>>;

// export type KeyAwareModule<OKey> = [RnvModule<OKey>, ...RnvModule<OKey>[]];

export type CreateRnvEngineOpts<OKey, Payload> = {
export type CreateRnvEngineOpts<OKey extends string, Modules extends [RnvModule<any>, ...RnvModule<any>[]]> = {
originalTemplatePlatformsDir?: string;
platforms: RnvEnginePlatforms;
config: ConfigFileEngine;
tasks: ReadonlyArray<RnvTask<OKey, any>>;
extendModules?: ReadonlyArray<RnvModule<OKey, Payload>>;
tasks: ReadonlyArray<RnvTask<OKey, UnionToIntersection<ExtractModulePayload<Modules[number]>>>>;
extendModules?: Modules;
rootPath?: string;
originalTemplatePlatformProjectDir?: string;
projectDirName?: string;
Expand All @@ -36,20 +37,24 @@ export type CreateRnvEngineOpts<OKey, Payload> = {
serverDirName?: string;
};

export type RnvEngine<OKey = string, Payload = any> = {
export type RnvEngine<
OKey extends string = string,
Modules extends [RnvModule, ...RnvModule[]] = any,
OKeys extends string = OKey | ExtractModuleOKey<Modules[number]>
> = {
originalTemplatePlatformsDir?: string;
platforms: RnvEnginePlatforms;
id: string;
config: ConfigFileEngine;
tasks: RnvTaskMap<OKey>;
tasks: RnvTaskMap<OKeys>;
rootPath?: string;
originalTemplatePlatformProjectDir?: string;
projectDirName: string;
runtimeExtraProps: Record<string, string>;
outputDirName?: string;
serverDirName: string;
initContextPayload: () => void;
getContext: () => RnvContext<UnionToIntersection<Payload>, OKey>;
getContext: () => RnvContext<UnionToIntersection<ExtractModulePayload<Modules[number]>>, OKeys>;
};

export type RnvEnginePlatform = {
Expand Down

0 comments on commit bb64160

Please sign in to comment.