@@ -7,7 +7,7 @@ const isDirectory = async (path) => fs.existsSync(path) && fs.lstatSync(path).is
77
88const RUNTIME_DIST_DIRNAME = 'dist' ;
99
10- const RUNTIME_VERSIONS = [ 1 ] ;
10+ export const RUNTIME_VERSIONS = [ 'v1' ] ;
1111
1212/** @type {import('.').MANIFEST_FILENAME } */
1313export const MANIFEST_FILENAME = 'runtime.json' ;
@@ -37,43 +37,50 @@ export async function generateManifest(baseDir) {
3737 return results ;
3838}
3939
40- // /** @type {import('.').generateMetadataForVersion } */
41- // export async function generateMetadataForVersion(version) {
42- // const baseDir = path.resolve(RUNTIME_DIR, version, RUNTIME_DIST_DIRNAME);
43- // if (!(await isDirectory(baseDir))) {
44- // throw new Error(`Not a directory: ${baseDir}`);
45- // }
46- // const { declarations, html, sources, styles } = await generateManifest(baseDir);
47- // return {
48- // baseDir,
49- // importPaths: sources.map((filename) => `/runtime/${version}/${filename}`),
50- // manifest: {
51- // declarations,
52- // html,
53- // sources,
54- // styles
55- // }
56- // };
57- // }
58-
5940/** @type {import('.').generateMetadata } */
6041export async function generateMetadata ( options ) {
6142 const require = module . createRequire ( options . rootDir ) ;
43+
44+ /** @type {import('.').RuntimeMetadataMap } */
6245 const metadata = new Map ( ) ;
63- for ( const version of RUNTIME_VERSIONS ) {
64- const packageDir = path . dirname ( require . resolve ( `@opendatacapture/runtime-v${ version } /package.json` ) ) ;
46+
47+ for ( const v of RUNTIME_VERSIONS ) {
48+ const packageDir = path . dirname ( require . resolve ( `@opendatacapture/runtime-${ v } /package.json` ) ) ;
6549 const baseDir = path . resolve ( packageDir , RUNTIME_DIST_DIRNAME ) ;
6650 const { declarations, html, sources, styles } = await generateManifest ( baseDir ) ;
6751
68- metadata . set ( `v${ version } ` , {
52+ const importPathPattern = / ^ ( @ ? [ ^ @ / ] + (?: \/ [ ^ @ / ] + ) ? ) (?: @ ( [ ^ / ] + ) ) ? / ;
53+
54+ /** @type {Map<string, import('.').RuntimePackageMetadata> } */
55+ const packages = new Map ( ) ;
56+
57+ /** @param {string } filename @param {'css' | 'html' | 'js' } kind */
58+ const addToPackage = ( filename , kind ) => {
59+ const match = filename . match ( importPathPattern ) ;
60+ if ( ! match ) {
61+ throw new Error ( `Unexpected import path pattern: ${ filename } ` ) ;
62+ }
63+ const [ name , version ] = /** @type {[string, string] } */ ( match . slice ( 1 , 3 ) ) ;
64+ const key = name + '$' + version ;
65+ if ( ! packages . has ( key ) ) {
66+ packages . set ( key , { exports : { css : [ ] , html : [ ] , js : [ ] } , name, version } ) ;
67+ }
68+ packages . get ( key ) ?. exports [ kind ] . push ( `/runtime/${ v } /${ filename } ` ) ;
69+ } ;
70+
71+ sources . forEach ( ( source ) => addToPackage ( source , 'js' ) ) ;
72+ html . forEach ( ( file ) => addToPackage ( file , 'html' ) ) ;
73+ styles . forEach ( ( style ) => addToPackage ( style , 'css' ) ) ;
74+
75+ metadata . set ( v , {
6976 baseDir,
70- importPaths : sources . map ( ( filename ) => `/runtime/${ version } /${ filename } ` ) ,
7177 manifest : {
7278 declarations,
7379 html,
7480 sources,
7581 styles
76- }
82+ } ,
83+ packages : [ ...packages . values ( ) ]
7784 } ) ;
7885 }
7986 return metadata ;
0 commit comments