import { createResource, ResourceReturn, createSignal, Resource, Setter } from "../src"; import { InitializedResource, InitializedResourceReturn } from "../src/reactive/signal"; type Assert = T; // https://github.com/Microsoft/TypeScript/issues/27024#issuecomment-421529650 type Equals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false; /* createResource inference tests */ // without source, initialValue // with fetcher { const resourceReturn = createResource( k => { return Promise.resolve(1); type Tests = Assert>> & Assert>; }, { storage: createSignal, name: "test", deferStream: true, onHydrated: (k, info) => { type Tests = Assert> & Assert>; } } ); } // without source // with fetcher, initialValue { const resourceReturn = createResource( k => { return Promise.resolve(1); type Tests = Assert< Equals> > & Assert>; }, { initialValue: 1, storage: createSignal, name: "test", deferStream: true, onHydrated: (k, info) => { type Tests = Assert> & Assert>; } } ); type ResourceActions = typeof resourceReturn[1]; type Tests = Assert>>; } // without initialValue // with source, fetcher { const resourceReturn = createResource( () => 1, k => { return Promise.resolve(1); type Tests = Assert>> & Assert>; }, { storage: createSignal, name: "test", deferStream: true, onHydrated: (k, info) => { type Tests = Assert> & Assert>; } } ); type ResourceActions = typeof resourceReturn[1]; type Tests = Assert>>; } // with source, fetcher, initialValue { const resourceReturn = createResource( () => 1, k => { return Promise.resolve(1); type Tests = Assert< Equals> > & Assert>; }, { initialValue: 1, storage: createSignal, name: "test", deferStream: true, onHydrated: (k, info) => { type Tests = Assert> & Assert>; } } ); } /* Resource type tests */ { let resource!: Resource; const resourceValue = resource(); let initializedResource!: InitializedResource; const initializedResourceValue = initializedResource(); type Tests = Assert> & Assert> & Assert< Equals > & Assert>; switch (resource.state) { case "errored": const errorValue = resource(); break; case "pending": const pendingValue = resource(); break; case "ready": const readyValue = resource(); break; case "refreshing": const refreshingValue = resource(); break; case "unresolved": const unresolvedValue = resource(); break; // this is weird but it works type Test = Assert> & Assert> & Assert> & Assert> & Assert>; } switch (initializedResource.state) { case "errored": const errorValue = initializedResource(); break; case "ready": const readyValue = initializedResource(); break; case "refreshing": const refreshingValue = initializedResource(); break; // this is weird but it works type Test = Assert> & Assert> & Assert>; } }