31 lines
		
	
	
		
			900 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			900 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { randomUUID } from "crypto"
 | 
						|
import { JSX } from "preact/jsx-runtime"
 | 
						|
 | 
						|
export type JSResource = {
 | 
						|
  loadTime: 'beforeDOMReady' | 'afterDOMReady'
 | 
						|
  moduleType?: 'module',
 | 
						|
  spaPreserve?: boolean
 | 
						|
} & ({
 | 
						|
  src: string
 | 
						|
  contentType: 'external'
 | 
						|
} | {
 | 
						|
  script: string
 | 
						|
  contentType: 'inline'
 | 
						|
})
 | 
						|
 | 
						|
export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element {
 | 
						|
  const scriptType = resource.moduleType ?? 'application/javascript'
 | 
						|
  const spaPreserve = preserve ?? resource.spaPreserve
 | 
						|
  if (resource.contentType === 'external') {
 | 
						|
    return <script key={resource.src} src={resource.src} type={scriptType} spa-preserve={spaPreserve}/>
 | 
						|
  } else {
 | 
						|
    const content = resource.script
 | 
						|
    return <script key={randomUUID()} type={scriptType} spa-preserve={spaPreserve}>{content}</script>
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export interface StaticResources {
 | 
						|
  css: string[],
 | 
						|
  js: JSResource[]
 | 
						|
}
 |