import { major } from './version'; import { createLoadImplement as createH5LoadImplement } from './h5'; import { createLoadImplement as createNativeLoadImplement } from './native'; //TODO: temp const BUILD_VERSION = '__JOLIBOX_LOCAL_SDK_VERSION__'; const currentVersion = BUILD_VERSION; const currentMajorVersion = major(currentVersion); /** * Due to security restrictions on iOS, dynamically loading script tags is not supported. * Therefore, a loadScript method needs to be injected on the client side to implement evalJavascriptFun. * Link:https://mabin004.github.io/2018/06/25/iOS%E5%BA%94%E7%94%A8%E6%B2%99%E7%AE%B1/ */ declare global { interface Window { JoliAndroidSDKBridge?: unknown; webkit?: unknown; } } const isNative = !!(navigator.userAgent || '').includes('JoliboxPlatformSDK'); const loadScript = isNative ? (params: { path: string }) => { const res = window.prompt( 'invoke', JSON.stringify({ event: 'loadScriptSync', paramsString: JSON.stringify(params) }) ); if (res) { const { data } = JSON.parse(res); if (typeof data === 'object' && 'content' in data) { return data.content; } return data; } return undefined; } : undefined; let moduleOrigin = 'https://jsdelivr.jolibox.com'; const stgOrigin = 'https://stg-jsdelivr.jolibox.com'; const currentScript = window.document.currentScript as HTMLScriptElement | null; if (currentScript) { const src = new URL(currentScript.src); moduleOrigin = src.origin; // "https://stg-jsdelivr.jolibox.com" } /** * Do not expose the logic of dynamically retrieving URL information in the config, * as this logic needs to remain self-contained within the SDK. */ export const getBoostrapModuleUrl = (version: string | number, targetOrigin?: string) => `${targetOrigin ?? moduleOrigin}/npm/@jolibox/bootstrap@${version}/dist/index.js`; export const getImplementModuleUrl = (version: string | number, targetOrigin?: string) => `${targetOrigin ?? moduleOrigin}/npm/@jolibox/implement@${version}/dist/index.js`; const checkReleaseVersion = (version: string): boolean => { const semverRegex = /^\d+\.\d+\.\d+$/; return semverRegex.test(version); }; const fetchVersion = !checkReleaseVersion(currentVersion) ? currentVersion : currentMajorVersion; const IMMEDIATE_SCRIPT_URL = getBoostrapModuleUrl(fetchVersion); const REMOTE_IMPLEMENT_URL = getImplementModuleUrl(fetchVersion); /** * load entry */ function loadImplement(): void { if (isNative) { createNativeLoadImplement(loadScript!, { bootstrapUrl: IMMEDIATE_SCRIPT_URL, implementUrl: REMOTE_IMPLEMENT_URL })(); } else { createH5LoadImplement({ bootstrapUrl: IMMEDIATE_SCRIPT_URL, implementUrl: REMOTE_IMPLEMENT_URL, currentMajorVersion, currentVersion })(); } } loadImplement();