Skip to content

Commit

Permalink
Improved recursive typing of PackFolders
Browse files Browse the repository at this point in the history
  • Loading branch information
JPMeehan committed May 20, 2024
1 parent 687c3e8 commit bfb2615
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/foundry/common/packages/base-package.d.mts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type DataModel from "../abstract/data.mjs";
import type { ReleaseData } from "../config.mjs/releaseData.d.mts";
import * as fields from "../data/fields.mjs";
import type { DataModelValidationFailure } from "../data/validation-failure.d.mts";
import type { BaseFolder } from "../documents/module.d.mts";
import type { CONST } from "../module.d.mts";
import type { LogCompatibilityWarningOptions } from "../utils/logging.d.mts";

Expand Down Expand Up @@ -200,16 +201,22 @@ declare namespace BasePackage {
};

// TODO: Figure out proper recursion here
type RecursiveDepth = [never, 0, 1, 2, 3];
type RecursiveDepth = [1, 2, 3, never];

type PackageCompendiumFolderSchema<Depth extends number> = {
name: fields.StringField;
sorting: fields.StringField;
name: fields.StringField<{ required: true; blank: false }>;
sorting: fields.StringField<{
required: false;
blank: false;
initial: undefined;
choices: typeof BaseFolder.SORTING_MODES;
}>;
color: fields.ColorField;
packs: fields.SetField<fields.StringField<{ required: true; blank: false }>>;
} & Depth extends 0
? {}
: { folders: fields.SetField<fields.SchemaField<PackageCompendiumFolderSchema<Depth>>> };
folders: Depth extends number
? fields.SetField<fields.SchemaField<PackageCompendiumFolderSchema<RecursiveDepth[Depth]>>>
: never;
};

type Schema = {
/**
Expand Down Expand Up @@ -300,7 +307,7 @@ declare namespace BasePackage {
*/
packs: PackageCompendiumPacks<fields.SchemaField<PackageCompendiumSchema>>;

packFolders: fields.SetField<fields.SchemaField<PackageCompendiumFolderSchema<4>>>;
packFolders: fields.SetField<fields.SchemaField<PackageCompendiumFolderSchema<1>>>;

/**
* An organized object of relationships to other Packages
Expand Down Expand Up @@ -385,7 +392,7 @@ export class PackageCompendiumFolder<Depth extends number> extends fields.Schema
}: InexactPartial<{
/** @defaultValue `1` */
depth: Depth;
options: fields.SchemaField.DefaultOptions;
options: fields.SchemaField.Options<BasePackage.PackageCompendiumFolderSchema<Depth>>;
}>);
}

Expand Down
8 changes: 8 additions & 0 deletions tests/foundry/common/packages/base-package.mjs.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ expectTypeOf(packageCompendia.ownership.ASSISTANT).toEqualTypeOf<
expectTypeOf(myPackage.id).toEqualTypeOf<string>();
expectTypeOf(myPackage.changelog).toEqualTypeOf<string | undefined>();

// Checking the sets
expectTypeOf(myPackage._source.packs[0].banner).toEqualTypeOf<string | undefined>();
expectTypeOf(myPackage._source.authors[0].discord).toEqualTypeOf<string | undefined>();
expectTypeOf(myPackage.languages.first()!.lang).toEqualTypeOf<string>();

// Checking packFolders
expectTypeOf(myPackage.packFolders.first()!.name).toEqualTypeOf<string>();
// This end result is weird but best option that could be found
expectTypeOf(myPackage.packFolders.first()!.folders.first()!.folders.first()!.folders.first()!.folders).toEqualTypeOf<
Record<string, unknown>
>();

0 comments on commit bfb2615

Please sign in to comment.