43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
import { deepSignal } from 'deepsignal';
|
|
|
|
const isObject = ( item ) =>
|
|
item && typeof item === 'object' && ! Array.isArray( item );
|
|
|
|
export const deepMerge = ( target, source ) => {
|
|
if ( isObject( target ) && isObject( source ) ) {
|
|
for ( const key in source ) {
|
|
if ( isObject( source[ key ] ) ) {
|
|
if ( ! target[ key ] ) Object.assign( target, { [ key ]: {} } );
|
|
deepMerge( target[ key ], source[ key ] );
|
|
} else {
|
|
Object.assign( target, { [ key ]: source[ key ] } );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const getSerializedState = () => {
|
|
const storeTag = document.querySelector(
|
|
`script[type="application/json"]#store`
|
|
);
|
|
if ( ! storeTag ) return {};
|
|
try {
|
|
const { state } = JSON.parse( storeTag.textContent );
|
|
if ( isObject( state ) ) return state;
|
|
throw Error( 'Parsed state is not an object' );
|
|
} catch ( e ) {
|
|
console.log( e );
|
|
}
|
|
return {};
|
|
};
|
|
|
|
const rawState = getSerializedState();
|
|
export const rawStore = { state: deepSignal( rawState ) };
|
|
|
|
if ( typeof window !== 'undefined' ) window.store = rawStore;
|
|
|
|
export const store = ( { state, ...block } ) => {
|
|
deepMerge( rawStore, block );
|
|
deepMerge( rawState, state );
|
|
};
|