UNPKG

@stencil/core

Version:

A Compiler for Web Components and Progressive Web Apps

303 lines (297 loc) • 9.4 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var mockDoc = require('../mock-doc'); var runtime = require('../runtime'); const queuedTicks = []; const queuedWriteTasks = []; const queuedReadTasks = []; const moduleLoaded = new Map(); const queuedLoadModules = []; const caughtErrors = []; const consoleError = (e) => { caughtErrors.push(e); }; function resetTaskQueue() { queuedTicks.length = 0; queuedWriteTasks.length = 0; queuedReadTasks.length = 0; moduleLoaded.clear(); queuedLoadModules.length = 0; caughtErrors.length = 0; } const nextTick = (cb) => { queuedTicks.push(cb); }; function flushTicks() { return new Promise((resolve, reject) => { function drain() { try { if (queuedTicks.length > 0) { const writeTasks = queuedTicks.slice(); queuedTicks.length = 0; let cb; while ((cb = writeTasks.shift())) { cb(Date.now()); } } if (queuedTicks.length > 0) { process.nextTick(drain); } else { resolve(); } } catch (e) { reject(`flushTicks: ${e}`); } } process.nextTick(drain); }); } function writeTask(cb) { queuedWriteTasks.push(cb); } function readTask(cb) { queuedReadTasks.push(cb); } function flushQueue() { return new Promise((resolve, reject) => { async function drain() { try { if (queuedReadTasks.length > 0) { const readTasks = queuedReadTasks.slice(); queuedReadTasks.length = 0; let cb; while ((cb = readTasks.shift())) { const result = cb(Date.now()); if (result != null && typeof result.then === 'function') { await result; } } } if (queuedWriteTasks.length > 0) { const writeTasks = queuedWriteTasks.slice(); queuedWriteTasks.length = 0; let cb; while ((cb = writeTasks.shift())) { const result = cb(Date.now()); if (result != null && typeof result.then === 'function') { await result; } } } if ((queuedReadTasks.length + queuedWriteTasks.length) > 0) { process.nextTick(drain); } else { resolve(); } } catch (e) { reject(`flushQueue: ${e}`); } } process.nextTick(drain); }); } async function flushAll() { while ((queuedTicks.length + queuedLoadModules.length + queuedWriteTasks.length + queuedReadTasks.length) > 0) { await flushTicks(); await flushLoadModule(); await flushQueue(); } if (caughtErrors.length > 0) { const err = caughtErrors[0]; if (err == null) { throw new Error('Error!'); } if (typeof err === 'string') { throw new Error(err); } throw err; } } function loadModule(cmpMeta, _hostRef, _hmrVersionId) { return new Promise(resolve => { queuedLoadModules.push({ bundleId: cmpMeta.$lazyBundleIds$, resolve: () => resolve(moduleLoaded.get(cmpMeta.$lazyBundleIds$)) }); }); } function flushLoadModule(bundleId) { return new Promise((resolve, reject) => { try { process.nextTick(() => { if (bundleId != null) { for (let i = 0; i < queuedLoadModules.length; i++) { if (queuedLoadModules[i].bundleId === bundleId) { queuedLoadModules[i].resolve(); queuedLoadModules.splice(i, 1); i--; } } } else { let queuedLoadModule; while ((queuedLoadModule = queuedLoadModules.shift())) { queuedLoadModule.resolve(); } } resolve(); }); } catch (e) { reject(`flushLoadModule: ${e}`); } }); } function registerModule(bundleId, Cstr) { moduleLoaded.set(bundleId, Cstr); } const win = mockDoc.setupGlobal(global); const doc = win.document; const hostRefs = new Map(); const styles = new Map(); const cssVarShim = false; const Build = { isDev: true, isBrowser: false }; const plt = { $flags$: 0, $resourcesUrl$: '', raf: (h) => requestAnimationFrame(h), ael: (el, eventName, listener, opts) => el.addEventListener(eventName, listener, opts), rel: (el, eventName, listener, opts) => el.removeEventListener(eventName, listener, opts), }; const supportsShadowDom = true; const supportsListenerOptions = true; const supportsConstructibleStylesheets = false; let isAutoApplyingChanges = false; let autoApplyTimer = undefined; function resetPlatform() { mockDoc.resetWindow(win); hostRefs.clear(); styles.clear(); plt.$flags$ = 0; Object.keys(Context).forEach(key => delete Context[key]); if (plt.$orgLocNodes$ != null) { plt.$orgLocNodes$.clear(); plt.$orgLocNodes$ = undefined; } win.location.href = plt.$resourcesUrl$ = `http://testing.stenciljs.com/`; resetTaskQueue(); stopAutoApplyChanges(); cstrs.clear(); } function stopAutoApplyChanges() { isAutoApplyingChanges = false; if (autoApplyTimer) { clearTimeout(autoApplyTimer); autoApplyTimer = undefined; } } async function startAutoApplyChanges() { isAutoApplyingChanges = true; flushAll().then(() => { if (isAutoApplyingChanges) { autoApplyTimer = setTimeout(() => { startAutoApplyChanges(); }, 100); } }); } function registerContext(context) { if (context) { Object.assign(Context, context); } } const getHostRef = (elm) => { return hostRefs.get(elm); }; const registerInstance = (lazyInstance, hostRef) => { if (lazyInstance == null || lazyInstance.constructor == null) { throw new Error(`Invalid component constructor`); } if (hostRef == null) { const Cstr = lazyInstance.constructor; const tagName = (Cstr.COMPILER_META && Cstr.COMPILER_META.tagName) ? Cstr.COMPILER_META.tagName : 'div'; const elm = document.createElement(tagName); registerHost(elm); hostRef = getHostRef(elm); } hostRef.$lazyInstance$ = lazyInstance; return hostRefs.set(lazyInstance, hostRef); }; const registerHost = (elm) => { const hostRef = { $flags$: 0, $hostElement$: elm, $instanceValues$: new Map(), }; hostRef.$onReadyPromise$ = new Promise(r => hostRef.$onReadyResolve$ = r); hostRefs.set(elm, hostRef); }; const Context = {}; const cstrs = new Map(); const registerComponents = (Cstrs) => { Cstrs.forEach(Cstr => { cstrs.set(Cstr.COMPILER_META.tagName, Cstr); }); }; const isMemberInElement = (elm, memberName) => { if (elm != null) { if (memberName in elm) { return true; } const cstr = cstrs.get(elm.nodeName.toLowerCase()); if (cstr != null && cstr.COMPILER_META != null && cstr.COMPILER_META.properties != null) { return cstr.COMPILER_META.properties.some(p => p.name === memberName); } } return false; }; const patchDynamicImport = (_) => { return; }; Object.keys(runtime).forEach(function (k) { if (k !== 'default') Object.defineProperty(exports, k, { enumerable: true, get: function () { return runtime[k]; } }); }); exports.Build = Build; exports.Context = Context; exports.consoleError = consoleError; exports.cssVarShim = cssVarShim; exports.doc = doc; exports.flushAll = flushAll; exports.flushLoadModule = flushLoadModule; exports.flushQueue = flushQueue; exports.flushTicks = flushTicks; exports.getHostRef = getHostRef; exports.isMemberInElement = isMemberInElement; exports.loadModule = loadModule; exports.nextTick = nextTick; exports.patchDynamicImport = patchDynamicImport; exports.plt = plt; exports.readTask = readTask; exports.registerComponents = registerComponents; exports.registerContext = registerContext; exports.registerHost = registerHost; exports.registerInstance = registerInstance; exports.registerModule = registerModule; exports.resetPlatform = resetPlatform; exports.resetTaskQueue = resetTaskQueue; exports.startAutoApplyChanges = startAutoApplyChanges; exports.stopAutoApplyChanges = stopAutoApplyChanges; exports.styles = styles; exports.supportsConstructibleStylesheets = supportsConstructibleStylesheets; exports.supportsListenerOptions = supportsListenerOptions; exports.supportsShadowDom = supportsShadowDom; exports.win = win; exports.writeTask = writeTask;