@wordpress/interactivity-router
Version:
Package that exposes state and actions from the `core/router` store, part of the Interactivity API.
88 lines (79 loc) • 2.37 kB
text/typescript
/**
* This code is derived from the following projects:
*
* 1. dynamic-importmap (https://github.com/keller-mark/dynamic-importmap)
* 2. es-module-shims (https://github.com/guybedford/es-module-shims)
*
* The original implementation was created by Guy Bedford in es-module-shims,
* then adapted by Mark Keller in dynamic-importmap, and further modified
* for use in this project.
*
* Both projects are licensed under the MIT license.
*
* MIT License: https://opensource.org/licenses/MIT
*/
/**
* Internal dependencies
*/
import { addImportMap, resolve } from './resolver';
import { initPromise, topLevelLoad, preloadModule } from './loader';
type ImportMap = {
imports?: Record< string, string >;
scopes?: Record< string, Record< string, string > >;
};
// TODO: check if this baseURI should change per document, and so
// it need to be passed as a parameter to methods like `importWithMap`
// and `preloadWithMap`.
const baseUrl = document.baseURI;
const pageBaseUrl = baseUrl;
Object.defineProperty( self, 'wpInteractivityRouterImport', {
value: importShim,
writable: false,
enumerable: false,
configurable: false,
} );
async function importShim< Module = unknown >( id: string ) {
await initPromise;
return topLevelLoad< Module >( resolve( id, pageBaseUrl ), {
credentials: 'same-origin',
} );
}
/**
* Imports the module with the passed ID.
*
* The module is resolved against the internal dynamic import map,
* extended with the passed import map.
*
* @param id Module ID.
* @param importMapIn Import map.
* @return Resolved module.
*/
export async function importWithMap< Module = unknown >(
id: string,
importMapIn: ImportMap
) {
addImportMap( importMapIn );
return importShim< Module >( id );
}
/**
* Preloads the module with the passed ID along with its dependencies.
*
* The module is resolved against the internal dynamic import map,
* extended with the passed import map.
*
* @param id Module ID.
* @param importMapIn Import map.
* @return Resolved `ModuleLoad` instance.
*/
export async function preloadWithMap( id: string, importMapIn: ImportMap ) {
addImportMap( importMapIn );
await initPromise;
return preloadModule( resolve( id, pageBaseUrl ), {
credentials: 'same-origin',
} );
}
export {
initialImportMap,
importPreloadedModule,
type ModuleLoad,
} from './loader';