Skip to content

Commit

Permalink
Re-organize types for maximum compatibility
Browse files Browse the repository at this point in the history
Add shims for TypeScript's 'node' module resolution algorithm. The exports map is only used with the `node16` algorithm.

Write types in CommonJS, so they can be exported from ESM files. The other way around is prone to, at the very least, confusing warnings.
  • Loading branch information
novemberborn authored Sep 25, 2022
1 parent 2d3f394 commit 3ebe65c
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 97 deletions.
14 changes: 12 additions & 2 deletions entrypoints/main.d.cts
Original file line number Diff line number Diff line change
@@ -1,2 +1,12 @@
export {default} from './main.js';
export * from './main.js';
import type {TestFn} from '../types/test-fn.cjs';

export * from '../types/assertions.cjs';
export * from '../types/try-fn.cjs';
export * from '../types/test-fn.cjs';
export * from '../types/subscribable.cjs';

/** Call to declare a test, or chain to declare hooks or test modifiers */
declare const test: TestFn;

/** Call to declare a test, or chain to declare hooks or test modifiers */
export default test;
14 changes: 2 additions & 12 deletions entrypoints/main.d.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,2 @@
import type {TestFn} from '../types/test-fn.js';

export * from '../types/assertions.js';
export * from '../types/try-fn.js';
export * from '../types/test-fn.js';
export * from '../types/subscribable.js';

/** Call to declare a test, or chain to declare hooks or test modifiers */
declare const test: TestFn;

/** Call to declare a test, or chain to declare hooks or test modifiers */
export default test;
export * from './main.cjs';
export {default} from './main.cjs';
78 changes: 77 additions & 1 deletion entrypoints/plugin.d.cts
Original file line number Diff line number Diff line change
@@ -1 +1,77 @@
export * from './plugin.js'
import type {URL} from 'node:url';

export namespace SharedWorker {
export type ProtocolIdentifier = 'ava-4';

export type FactoryOptions = {
negotiateProtocol <Data = unknown>(supported: readonly ['ava-4']): Protocol<Data>;
// Add overloads for additional protocols.
};

export type Factory = (options: FactoryOptions) => void;

export type Protocol<Data = unknown> = {
readonly initialData: Data;
readonly protocol: 'ava-4';
broadcast: (data: Data) => BroadcastMessage<Data>;
ready: () => Protocol<Data>;
subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
testWorkers: () => AsyncIterableIterator<TestWorker<Data>>;
};

export type BroadcastMessage<Data = unknown> = {
readonly id: string;
replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type PublishedMessage<Data = unknown> = {
readonly id: string;
replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type ReceivedMessage<Data = unknown> = {
readonly data: Data;
readonly id: string;
readonly testWorker: TestWorker;
reply: (data: Data) => PublishedMessage<Data>;
};

export type TestWorker<Data = unknown> = {
readonly id: string;
readonly file: string;
publish: (data: Data) => PublishedMessage<Data>;
subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
teardown: (fn: (() => Promise<void>) | (() => void)) => () => Promise<void>;
};

export namespace Plugin {
export type RegistrationOptions<Identifier extends ProtocolIdentifier, Data = unknown> = {
readonly filename: string | URL;
readonly initialData?: Data;
readonly supportedProtocols: readonly Identifier[];
readonly teardown?: () => void;
};

export type Protocol<Data = unknown> = {
readonly available: Promise<void>;
readonly currentlyAvailable: boolean;
readonly protocol: 'ava-4';
publish: (data: Data) => PublishedMessage<Data>;
subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type PublishedMessage<Data = unknown> = {
readonly id: string;
replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type ReceivedMessage<Data = unknown> = {
readonly data: Data;
readonly id: string;
reply: (data: Data) => PublishedMessage<Data>;
};
}
}

export function registerSharedWorker<Data = unknown>(options: SharedWorker.Plugin.RegistrationOptions<'ava-4', Data>): SharedWorker.Plugin.Protocol<Data>;
// Add overloads for additional protocols.
78 changes: 1 addition & 77 deletions entrypoints/plugin.d.ts
Original file line number Diff line number Diff line change
@@ -1,77 +1 @@
import type {URL} from 'node:url';

export namespace SharedWorker {
export type ProtocolIdentifier = 'ava-4';

export type FactoryOptions = {
negotiateProtocol <Data = unknown>(supported: readonly ['ava-4']): Protocol<Data>;
// Add overloads for additional protocols.
};

export type Factory = (options: FactoryOptions) => void;

export type Protocol<Data = unknown> = {
readonly initialData: Data;
readonly protocol: 'ava-4';
broadcast: (data: Data) => BroadcastMessage<Data>;
ready: () => Protocol<Data>;
subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
testWorkers: () => AsyncIterableIterator<TestWorker<Data>>;
};

export type BroadcastMessage<Data = unknown> = {
readonly id: string;
replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type PublishedMessage<Data = unknown> = {
readonly id: string;
replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type ReceivedMessage<Data = unknown> = {
readonly data: Data;
readonly id: string;
readonly testWorker: TestWorker;
reply: (data: Data) => PublishedMessage<Data>;
};

export type TestWorker<Data = unknown> = {
readonly id: string;
readonly file: string;
publish: (data: Data) => PublishedMessage<Data>;
subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
teardown: (fn: (() => Promise<void>) | (() => void)) => () => Promise<void>;
};

export namespace Plugin {
export type RegistrationOptions<Identifier extends ProtocolIdentifier, Data = unknown> = {
readonly filename: string | URL;
readonly initialData?: Data;
readonly supportedProtocols: readonly Identifier[];
readonly teardown?: () => void;
};

export type Protocol<Data = unknown> = {
readonly available: Promise<void>;
readonly currentlyAvailable: boolean;
readonly protocol: 'ava-4';
publish: (data: Data) => PublishedMessage<Data>;
subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type PublishedMessage<Data = unknown> = {
readonly id: string;
replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
};

export type ReceivedMessage<Data = unknown> = {
readonly data: Data;
readonly id: string;
reply: (data: Data) => PublishedMessage<Data>;
};
}
}

export function registerSharedWorker<Data = unknown>(options: SharedWorker.Plugin.RegistrationOptions<'ava-4', Data>): SharedWorker.Plugin.Protocol<Data>;
// Add overloads for additional protocols.
export type * from './plugin.cjs';
4 changes: 4 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// For compatibility with resolution algorithms other than Node16.

export * from './entrypoints/main.cjs';
export {default} from './entrypoints/main.cjs';
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
"files": [
"entrypoints",
"lib",
"types"
"types",
"*.d.ts"
],
"keywords": [
"🦄",
Expand Down
3 changes: 3 additions & 0 deletions plugin.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// For compatibility with resolution algorithms other than Node16.

export * from './entrypoints/plugin.cjs';
File renamed without changes.
File renamed without changes.
6 changes: 3 additions & 3 deletions types/test-fn.d.ts → types/test-fn.d.cts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type {Assertions} from './assertions.js';
import type {Subscribable} from './subscribable.js';
import type {TryFn} from './try-fn.js';
import type {Assertions} from './assertions.cjs';
import type {Subscribable} from './subscribable.cjs';
import type {TryFn} from './try-fn.cjs';

/** The `t` value passed to test & hook implementations. */
export type ExecutionContext<Context = unknown> = {
Expand Down
2 changes: 1 addition & 1 deletion types/try-fn.d.ts → types/try-fn.d.cts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {Implementation} from './test-fn.js';
import type {Implementation} from './test-fn.cjs';

export type CommitDiscardOptions = {
/**
Expand Down

0 comments on commit 3ebe65c

Please sign in to comment.