1+ import { defu } from 'defu' ;
12import { mount , tick , unmount } from 'svelte' ;
23
34import { MissingComponentInCustomPush , NotFoundVariantConfig } from './errors.js' ;
@@ -59,7 +60,7 @@ export class Stack {
5960 */
6061 constructor ( variantConfigMap , init ) {
6162 if ( init ?. id ) this . config . id = init . id ;
62- if ( init ?. timeout ) this . config . timeout = init . timeout ;
63+ if ( init ?. timeout ) this . config . timeout = init . timeout || 0 ;
6364 this . #variantConfigMap = variantConfigMap ;
6465 }
6566
@@ -71,11 +72,13 @@ export class Stack {
7172 * @returns {StackItem<any> }
7273 */
7374 push ( variant , config ) {
75+ /** @typedef {import('./types.package').StackItemInstanceConfig<string, import('svelte').Component<any>> } InstanceConfig */
76+
77+ /** @typedef {NonNullable<import('./types.package').StackItemCommonConfig<any, import('svelte').Component>['id']> } IdResolver */
78+
7479 // STEP 1: resolve instance config, merge with common config and variant config, if any
75- /** @type {import('./types.package').StackItemInstanceConfig<string, import('svelte').Component<any>> } */
76- let instanceConfig ;
77- /** @type {NonNullable<import('./types.package').StackItemCommonConfig<string, import('svelte').Component>['id']> } */
78- let idResolver ;
80+ /** @type {Omit<InstanceConfig,'id'> & { id: IdResolver } } */
81+ let mergedConfig ;
7982
8083 if ( variant === 'custom' ) {
8184 const rConfig =
@@ -85,48 +88,35 @@ export class Stack {
8588 if ( ! rConfig || ! rConfig . component ) {
8689 throw new MissingComponentInCustomPush ( ) ;
8790 }
88- instanceConfig = {
89- ...this . config ,
90- ...rConfig ,
91- variant : 'custom' ,
92- component : rConfig . component ,
93- props : rConfig . props ?? { } ,
94- id : '' ,
95- } ;
96- idResolver = /** @type {any } */ ( rConfig . id ) ?? this . config . id ;
91+ mergedConfig = defu ( { variant : 'custom' } , rConfig , this . config ) ;
9792 } else {
93+ const rConfig =
94+ /** @type {import('./types.package').StackItemByVariantPushConfig<string, import('svelte').Component<any>> } */ (
95+ config
96+ ) ;
9897 const variantConfig = this . #variantConfigMap[ variant ] ;
9998 if ( ! variantConfig ) {
10099 throw new NotFoundVariantConfig ( variant , Object . keys ( this . #variantConfigMap) ) ;
101100 }
102- instanceConfig = {
103- ...this . config ,
104- ...variantConfig ,
105- ...config ,
106- props : {
107- ...variantConfig . props ,
108- ...config ?. props ,
109- } ,
110- id : '' ,
111- } ;
112- idResolver = /** @type {any } */ ( config ?. id ) ?? variantConfig . id ?? this . config . id ;
101+ mergedConfig = /** @type {typeof mergedConfig } */ ( defu ( rConfig , variantConfig , this . config ) ) ;
113102 }
114103
115104 // STEP 2: resolve id for the stack item
116- if ( idResolver === 'counter' ) {
117- instanceConfig . id = ( ++ this . #counter) . toString ( ) ;
118- } else if ( idResolver === 'uuid' ) {
119- instanceConfig . id =
105+ let id = '' ;
106+ if ( mergedConfig . id === 'counter' ) {
107+ id = ( ++ this . #counter) . toString ( ) ;
108+ } else if ( mergedConfig . id === 'uuid' ) {
109+ id =
120110 'crypto' in globalThis && crypto . randomUUID
121111 ? crypto . randomUUID ( )
122112 : ( ++ this . #counter) . toString ( ) ;
123113 } else {
124- instanceConfig . id = idResolver ( instanceConfig ) ;
114+ id = mergedConfig . id ( mergedConfig ) ;
125115 }
126116
127117 // STEP 3: preparing the `StackItem` instance
128118 /** @type {StackItem<any> } */
129- let pushed = new StackItem ( instanceConfig ) ;
119+ let pushed = new StackItem ( { ... mergedConfig , id } ) ;
130120 pushed . resolution . then ( ( ) => {
131121 this . items = this . items . filter ( ( n ) => n . config . id !== pushed . config . id ) ;
132122 } ) ;
0 commit comments