Skip to content

Commit a376620

Browse files
committed
fix(async-stack): export correct types for public API
1 parent 04131d3 commit a376620

8 files changed

Lines changed: 70 additions & 53 deletions

File tree

.changeset/warm-horses-swim.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@svelte-put/async-stack': patch
3+
---
4+
5+
better public exported API

packages/async-stack/src/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Quang Phan. All rights reserved. Licensed under the MIT license.
22

3-
export { stack, StackBuilder } from './stack-builder.js'
4-
export { StackItem } from './stack-item.svelte.js';
3+
export { stack } from './stack-builder.js';
54
export { Stack } from './stack.svelte.js';
5+
export { StackItem } from './stack-item.svelte.js';
6+
export * from './types.public.js';
67

packages/async-stack/src/stack-builder.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import { Stack } from './stack.svelte.js';
22

33
/**
4-
* @template {Record<string, import('svelte').Component>} [VariantMap={}]
4+
* @template {Record<string, import('svelte').Component<any>>} [VariantMap={}]
55
*/
66
export class StackBuilder {
7-
/** @type {Record<string, import('./types').StackItemVariantConfig<string, import('svelte').Component>>} */
7+
/** @type {Record<string, import('./types.package').StackItemVariantConfig<string, import('svelte').Component<any>>>} */
88
#variantConfigMap = {};
99

1010
/**
11-
* @type {import('./types').StackItemCommonConfig<string, import('svelte').Component> | undefined}
11+
* @type {import('./types.package').StackItemCommonConfig<string, import('svelte').Component<any>> | undefined}
1212
*/
1313
#init;
1414

1515
/**
16-
* @param {import('./types').StackItemCommonConfig<string, import('svelte').Component>} [init]
16+
* @param {import('./types.package').StackItemCommonConfig<string, import('svelte').Component<any>>} [init]
1717
*/
1818
constructor(init) {
1919
this.#init = init;
@@ -22,9 +22,9 @@ export class StackBuilder {
2222
/**
2323
* add config for a stack item variant
2424
* @template {string} Variant
25-
* @template {import('svelte').Component} UserComponent
25+
* @template {import('svelte').Component<any>} UserComponent
2626
* @param {Variant} variant
27-
* @param {UserComponent | Omit<import('./types').StackItemVariantConfig<Variant, UserComponent>, 'variant'>} config
27+
* @param {UserComponent | Omit<import('./types.package').StackItemVariantConfig<Variant, UserComponent>, 'variant'>} config
2828
* @returns {StackBuilder<VariantMap & Record<Variant, UserComponent>> }
2929
*/
3030
addVariant(variant, config) {
@@ -52,7 +52,7 @@ export class StackBuilder {
5252
}
5353

5454
/**
55-
* @param {import('./types').StackItemCommonConfig<string, import('svelte').Component>} [init]
55+
* @param {import('./types.package').StackItemCommonConfig<string, import('svelte').Component>} [init]
5656
* @returns {StackBuilder}
5757
*/
5858
export function stack(init) {

packages/async-stack/src/stack-item.svelte.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/**
2-
* @template {import('svelte').Component} [UserComponent=import('svelte').Component]
3-
* @template [Resolved=import('./types.d.ts').ComponentResolved<UserComponent>]
2+
* @template {import('svelte').Component<any>} [UserComponent=import('svelte').Component<any>]
3+
* @template [Resolved=import('./types.public').ComponentResolved<UserComponent>]
44
*/
55
export class StackItem {
6-
/** @type {import('./types.d.ts').StackItemState} */
6+
/** @type {import('./types.package').StackItemState} */
77
// eslint-disable-next-line no-undef
88
state = $state('idle');
9-
/** @type {Required<import('./types.d.ts').StackItemInstanceConfig<string, UserComponent>>} */
9+
/** @type {Required<import('./types.package').StackItemInstanceConfig<string, UserComponent>>} */
1010
config;
1111

1212
#internals = {
@@ -25,7 +25,7 @@ export class StackItem {
2525
resolution;
2626

2727
/**
28-
* @param {Required<import('./types.d.ts').StackItemInstanceConfig<string, UserComponent>>} config
28+
* @param {Required<import('./types.package').StackItemInstanceConfig<string, UserComponent>>} config
2929
*/
3030
constructor(config) {
3131
this.config = config;
@@ -46,14 +46,14 @@ export class StackItem {
4646
this.state = 'timeout';
4747
}, this.#internals.msToTimeout);
4848
this.state = 'elapsing';
49-
}
49+
};
5050

5151
pause = () => {
5252
if (this.state === 'paused' || this.state === 'idle') return;
5353
clearTimeout(this.#internals.timeoutId);
5454
this.#internals.msToTimeout -= new Date().getTime() - this.#internals.lastStartedTime;
5555
this.state = 'paused';
56-
}
56+
};
5757

5858
/**
5959
* @param {Resolved} [resolved]
@@ -64,6 +64,6 @@ export class StackItem {
6464
this.#internals.resolve(resolved);
6565
this.state = 'resolved';
6666
return this.resolution;
67-
}
67+
};
6868
}
6969

packages/async-stack/src/stack.svelte.js

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import { MissingComponentInCustomPush, NotFoundVariantConfig } from './errors.js
44
import { StackItem } from './stack-item.svelte.js';
55

66
/**
7-
* @template {Record<string, import('svelte').Component>} [VariantMap={}]
7+
* @template {Record<string, import('svelte').Component<any>>} [VariantMap={}]
88
*/
99
export class Stack {
10-
/** @type {Record<string, import('./types.d.ts').StackItemVariantConfig<string, import('svelte').Component>>} */
10+
/** @type {Record<string, import('./types.package').StackItemVariantConfig<string, import('svelte').Component<any>>>} */
1111
#variantConfigMap = {};
1212
#counter = 0;
1313

@@ -19,7 +19,7 @@ export class Stack {
1919
items = $state([]);
2020

2121
/**
22-
* @type {Required<import('./types.d.ts').StackItemCommonConfig<string, import('svelte').Component>>}
22+
* @type {Required<import('./types.package').StackItemCommonConfig<string, import('svelte').Component<any>>>}
2323
*/
2424
// eslint-disable-next-line no-undef
2525
config = $state({
@@ -32,7 +32,7 @@ export class Stack {
3232
* register the element to render a stack item into
3333
* @param {HTMLElement} node
3434
* @param {StackItem<any>} item
35-
* @returns {import('./types.d.ts').StackItemRenderActionReturn}
35+
* @returns {import('./types.package').StackItemRenderActionReturn}
3636
*/
3737
render: (node, item) => {
3838
mount(item.config.component, {
@@ -48,46 +48,48 @@ export class Stack {
4848
};
4949

5050
/**
51-
* @param {Record<keyof VariantMap, import('./types.d.ts').StackItemVariantConfig<string, import('svelte').Component>>} variantConfigMap
52-
* @param {import('./types.d.ts').StackItemCommonConfig<string, import('svelte').Component>} [init]
51+
* @param {Record<keyof VariantMap, import('./types.package').StackItemVariantConfig<string, import('svelte').Component>>} variantConfigMap
52+
* @param {import('./types.package').StackItemCommonConfig<string, import('svelte').Component<any>>} [init]
5353
*/
5454
constructor(variantConfigMap, init) {
5555
if (init?.id) this.config.id = init.id;
5656
if (init?.timeout) this.config.timeout = init.timeout;
5757
this.#variantConfigMap = variantConfigMap;
5858
}
5959

60-
6160
/**
6261
* @template {Extract<keyof VariantMap, string>} Variant
6362
* @template {VariantMap[Variant]} [UserComponent=VariantMap[Variant]]
6463
* @overload
6564
* @param {Variant} variant
66-
* @param {import('./types.d.ts').StackItemByVariantPushConfig<Variant, UserComponent>} [config]
65+
* @param {import('./types.package').StackItemByVariantPushConfig<Variant, UserComponent>} [config]
6766
* @returns {StackItem<UserComponent>}
6867
*/
6968
/**
70-
* @template {import('svelte').Component} UserComponent
69+
* @template {Extract<keyof VariantMap, string>} Variant
70+
* @template {VariantMap[Variant]} [UserComponent=VariantMap[Variant]]
7171
* @overload
7272
* @param {'custom'} variant
73-
* @param {import('./types.d.ts').StackItemCustomPushConfig<UserComponent>} config
73+
* @param {import('./types.package').StackItemCustomPushConfig<UserComponent>} config
7474
* @returns {StackItem<UserComponent>}
7575
*/
7676
/**
77-
* @param {string} variant
78-
* @param {import('./types.d.ts').StackItemByVariantPushConfig<string, import('svelte').Component> | import('./types.d.ts').StackItemCustomPushConfig<import('svelte').Component>} [config]
77+
* @template {Extract<keyof VariantMap, string>} Variant
78+
* @template {VariantMap[Variant]} [UserComponent=VariantMap[Variant]]
79+
* @param {Variant} variant
80+
* @param {import('./types.package').StackItemByVariantPushConfig<Variant, UserComponent> | import('./types.package').StackItemCustomPushConfig<UserComponent>} [config]
7981
* @returns {StackItem<any>}
8082
*/
8183
push(variant, config) {
8284
// STEP 1: resolve instance config, merge with common config and variant config, if any
83-
/** @type {import('./types.d.ts').StackItemInstanceConfig<string, import('svelte').Component>} */
85+
/** @type {import('./types.package').StackItemInstanceConfig<string, import('svelte').Component<any>>} */
8486
let instanceConfig;
85-
/** @type {NonNullable<import('./types.d.ts').StackItemCommonConfig<string, import('svelte').Component>['id']>} */
87+
/** @type {NonNullable<import('./types.package').StackItemCommonConfig<string, import('svelte').Component>['id']>} */
8688
let idResolver;
8789

8890
if (variant === 'custom') {
8991
const rConfig =
90-
/** @type {import('./types.d.ts').StackItemCustomPushConfig<import('svelte').Component>} */ (
92+
/** @type {import('./types.package').StackItemCustomPushConfig<import('svelte').Component<any>>} */ (
9193
config
9294
);
9395
if (!rConfig || !rConfig.component) {
@@ -149,21 +151,21 @@ export class Stack {
149151
}
150152

151153
/**
152-
* @template {import('svelte').Component} [UserComponent=import('svelte').Component]
154+
* @template {import('svelte').Component<any>} [UserComponent=import('svelte').Component]
153155
* @overload
154156
* @param {string} [id]
155157
* @param {any} [detail]
156158
* @returns {StackItem<UserComponent> | null}
157159
*/
158160
/**
159-
* @template {import('svelte').Component} [UserComponent=import('svelte').Component]
161+
* @template {import('svelte').Component<any>} [UserComponent=import('svelte').Component]
160162
* @overload
161-
* @param {import('./types.d.ts').StackItemPopVerboseInput<UserComponent>} [config]
163+
* @param {import('./types.package').StackItemPopVerboseInput<UserComponent>} [config]
162164
* @returns {StackItem<UserComponent> | null}
163165
*/
164166
/**
165-
* @template {import('svelte').Component} [UserComponent=import('svelte').Component]
166-
* @param {string | import('./types.d.ts').StackItemPopVerboseInput<UserComponent>} [config]
167+
* @template {import('svelte').Component<any>} [UserComponent=import('svelte').Component]
168+
* @param {string | import('./types.package').StackItemPopVerboseInput<UserComponent>} [config]
167169
* @param {any} [resolved]
168170
* @returns {StackItem<UserComponent> | null}
169171
*/

packages/async-stack/src/types.d.ts renamed to packages/async-stack/src/types.package.d.ts

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,11 @@ import type { Component, ComponentProps } from 'svelte';
33
import { ActionReturn } from 'svelte/action';
44

55
import type { StackItem } from './stack-item.svelte.js';
6-
7-
export declare type StackItemProps<Resolved> = {
8-
/** the stack item instance injected by the stack */
9-
item: Omit<StackItem<import('svelte').Component<StackItemProps<Resolved>>>, '#internals'>;
10-
};
11-
12-
export type ComponentResolved<UserComponent extends Component> =
13-
ComponentProps<UserComponent> extends StackItemProps<infer Resolved>
14-
? Resolved
15-
: any;
6+
import type { ComponentResolved } from './types.public.js';
167

178
export type StackItemCommonConfig<
189
Variant extends string,
19-
UserComponent extends Component,
10+
UserComponent extends Component<any>,
2011
> = {
2112
/**
2213
* milliseconds to wait and automatically pop the stack item.
@@ -41,7 +32,7 @@ export type StackItemCommonConfig<
4132
/** predefined variant config provided while building a {@link Stack} instance */
4233
export type StackItemVariantConfig<
4334
Variant extends string,
44-
UserComponent extends Component,
35+
UserComponent extends Component<any>,
4536
> = StackItemCommonConfig<Variant, UserComponent> & {
4637
/** string variant representing this config, must be unique within a {@link Stack} instance */
4738
variant: Variant;
@@ -54,7 +45,7 @@ export type StackItemVariantConfig<
5445
/** a resolved config for a {@link StackItemInstance} */
5546
export type StackItemInstanceConfig<
5647
Variant extends string,
57-
UserComponent extends Component,
48+
UserComponent extends Component<any>,
5849
> = Required<Omit<StackItemVariantConfig<Variant, UserComponent>, 'id'>> & {
5950
id: string;
6051
timeout: number;
@@ -64,20 +55,20 @@ export type StackItemState = 'idle' | 'elapsing' | 'paused' | 'timeout' | 'resol
6455

6556
export type StackItemByVariantPushConfig<
6657
Variant extends string,
67-
UserComponent extends Component,
58+
UserComponent extends Component<any>,
6859
> = StackItemCommonConfig< Variant, UserComponent> & {
6960
props?: Omit<ComponentProps<UserComponent>, 'item'>;
7061
};
7162

7263
export type StackItemCustomPushConfig<
73-
UserComponent extends Component,
64+
UserComponent extends Component<any>,
7465
> = StackItemCommonConfig<'custom', UserComponent> & {
7566
component: UserComponent;
7667
props?: Omit<ComponentProps<UserComponent>, 'item'>;
7768
};
7869

7970
export type StackItemPopVerboseInput <
80-
UserComponent extends Component,
71+
UserComponent extends Component<any>,
8172
>= {
8273
id?: string;
8374
resolved?: ComponentResolved<UserComponent>;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import type { Component, ComponentProps } from 'svelte';
3+
4+
import type { StackItem } from './stack-item.svelte.js';
5+
6+
export interface StackItemProps<Resolved> {
7+
/** the stack item instance injected by the stack */
8+
item: Omit<StackItem<Component<StackItemProps<Resolved>>, Resolved>, '#internals'>;
9+
}
10+
11+
export type ComponentResolved<UserComponent extends Component<any>> =
12+
ComponentProps<UserComponent> extends { item: { resolution: Promise<infer Resolved> } }
13+
? Resolved
14+
: any;
15+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/** to provide typing only, see types.public.d.ts */
2+
export {};
3+

0 commit comments

Comments
 (0)