From 63d546cc6e2272e035be4df0dcc712591377493c Mon Sep 17 00:00:00 2001 From: huang yao <5945154+kirakiray@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:44:53 +0800 Subject: [PATCH 1/2] feat: Reduce the number of accesses to non-dynamic files --- src/use.mjs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/use.mjs b/src/use.mjs index 998fec5..01c756a 100644 --- a/src/use.mjs +++ b/src/use.mjs @@ -1,12 +1,16 @@ import Onion from "./onion.mjs"; export const caches = new Map(); -const wrapFetch = async (url) => { - let fetchObj = caches.get(url); +export const wrapFetch = async (url, params) => { + const d = new URL(url); + + const reUrl = params.includes("-direct") ? url : `${d.origin}${d.pathname}`; + + let fetchObj = caches.get(reUrl); if (!fetchObj) { - fetchObj = fetch(url); - caches.set(url, fetchObj); + fetchObj = fetch(reUrl); + caches.set(reUrl, fetchObj); } const resp = await fetchObj; @@ -68,11 +72,11 @@ use(["mjs", "js"], async (ctx, next) => { use(["txt", "html", "htm"], async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; let resp; try { - resp = await wrapFetch(url); + resp = await wrapFetch(url, params); } catch (error) { throw wrapError(`Load ${url} failed`, error); } @@ -89,9 +93,9 @@ use(["txt", "html", "htm"], async (ctx, next) => { use("json", async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; - ctx.result = await wrapFetch(url).then((e) => e.json()); + ctx.result = await wrapFetch(url, params).then((e) => e.json()); } await next(); @@ -99,9 +103,9 @@ use("json", async (ctx, next) => { use("wasm", async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; - const data = await wrapFetch(url).then((e) => e.arrayBuffer()); + const data = await wrapFetch(url, params).then((e) => e.arrayBuffer()); const module = await WebAssembly.compile(data); const instance = new WebAssembly.Instance(module); @@ -114,7 +118,7 @@ use("wasm", async (ctx, next) => { use("css", async (ctx, next) => { if (!ctx.result) { - const { url, element } = ctx; + const { url, element, params } = ctx; if (element) { const link = document.createElement("link"); @@ -138,7 +142,7 @@ use("css", async (ctx, next) => { }) ); } else { - ctx.result = await wrapFetch(url).then((e) => e.text()); + ctx.result = await wrapFetch(url, params).then((e) => e.text()); } } From 5ce0913ea834257aa2e2aaab4138f31ec839ecab Mon Sep 17 00:00:00 2001 From: huang yao <5945154+kirakiray@users.noreply.github.com> Date: Sat, 6 Jan 2024 15:09:39 +0800 Subject: [PATCH 2/2] chore: bump version --- dist/drill.js | 30 +++++++++++++++++------------- dist/drill.min.js | 4 ++-- dist/drill.min.js.map | 2 +- dist/drill.min.mjs | 4 ++-- dist/drill.min.mjs.map | 2 +- dist/drill.mjs | 30 +++++++++++++++++------------- package-lock.json | 4 ++-- package.json | 2 +- 8 files changed, 43 insertions(+), 35 deletions(-) diff --git a/dist/drill.js b/dist/drill.js index 16dff67..2e21530 100644 --- a/dist/drill.js +++ b/dist/drill.js @@ -1,4 +1,4 @@ -//! drill.js - v5.3.4 https://github.com/kirakiray/drill.js (c) 2018-2023 YAO +//! drill.js - v5.3.5 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : @@ -39,12 +39,16 @@ } const caches = new Map(); - const wrapFetch = async (url) => { - let fetchObj = caches.get(url); + const wrapFetch = async (url, params) => { + const d = new URL(url); + + const reUrl = params.includes("-direct") ? url : `${d.origin}${d.pathname}`; + + let fetchObj = caches.get(reUrl); if (!fetchObj) { - fetchObj = fetch(url); - caches.set(url, fetchObj); + fetchObj = fetch(reUrl); + caches.set(reUrl, fetchObj); } const resp = await fetchObj; @@ -106,11 +110,11 @@ use(["txt", "html", "htm"], async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; let resp; try { - resp = await wrapFetch(url); + resp = await wrapFetch(url, params); } catch (error) { throw wrapError(`Load ${url} failed`, error); } @@ -127,9 +131,9 @@ use("json", async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; - ctx.result = await wrapFetch(url).then((e) => e.json()); + ctx.result = await wrapFetch(url, params).then((e) => e.json()); } await next(); @@ -137,9 +141,9 @@ use("wasm", async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; - const data = await wrapFetch(url).then((e) => e.arrayBuffer()); + const data = await wrapFetch(url, params).then((e) => e.arrayBuffer()); const module = await WebAssembly.compile(data); const instance = new WebAssembly.Instance(module); @@ -152,7 +156,7 @@ use("css", async (ctx, next) => { if (!ctx.result) { - const { url, element } = ctx; + const { url, element, params } = ctx; if (element) { const link = document.createElement("link"); @@ -176,7 +180,7 @@ }) ); } else { - ctx.result = await wrapFetch(url).then((e) => e.text()); + ctx.result = await wrapFetch(url, params).then((e) => e.text()); } } diff --git a/dist/drill.min.js b/dist/drill.min.js index d097ccb..46242c7 100644 --- a/dist/drill.min.js +++ b/dist/drill.min.js @@ -1,3 +1,3 @@ -//! drill.js - v5.3.4 https://github.com/kirakiray/drill.js (c) 2018-2023 YAO -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lm=e()}(this,(function(){"use strict";class t{constructor(){this._middlewares=new Map}use(t){const e=Math.random().toString(32).slice(2);return this._middlewares.set(e,t),e}unuse(t){return this._middlewares.delete(t)}async run(t){let e=-1;const s=Array.from(this._middlewares.values()),n=async()=>{e++,e{let s=e.get(t);s||(s=fetch(t),e.set(t,s));return(await s).clone()},n={},i=(e,s)=>{(n[e]||(n[e]=new t)).use(s)},r=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{i(t,e)})):i(t,e)};r(["mjs","js"],(async(t,e)=>{if(!t.result){const{url:e,params:s}=t,n=new URL(e),i=/^blob:/.test(e)||/^data:/.test(e);try{i||s.includes("-direct")?t.result=await import(e):t.result=await import(`${n.origin}${n.pathname}`)}catch(s){const n=a(`Failed to load module ${t.realUrl||e}`,s);throw i&&console.log("Failed to load module:",t),n}}await e()})),r(["txt","html","htm"],(async(t,e)=>{if(!t.result){const{url:e}=t;let n;try{n=await s(e)}catch(t){throw a(`Load ${e} failed`,t)}if(!/^2.{2}$/.test(n.status))throw new Error(`Load ${e} failed: status code ${n.status}`);t.result=await n.text()}await e()})),r("json",(async(t,e)=>{if(!t.result){const{url:e}=t;t.result=await s(e).then((t=>t.json()))}await e()})),r("wasm",(async(t,e)=>{if(!t.result){const{url:e}=t,n=await s(e).then((t=>t.arrayBuffer())),i=await WebAssembly.compile(n),r=new WebAssembly.Instance(i);t.result=r.exports}await e()})),r("css",(async(t,e)=>{if(!t.result){const{url:e,element:n}=t;if(n){const t=document.createElement("link");t.rel="stylesheet",t.href=e;const s=n.getRootNode();let i;s===document?s.head.append(t):s.appendChild(t),n.addEventListener("disconnected",i=e=>{t.remove(),n.removeEventListener("disconnected",i)})}else t.result=await s(e).then((t=>t.text()))}await e()}));const a=(t,e)=>{const s=new Error(`${t} \n ${e.toString()}`);return s.error=e,s},o={};const l=(t,e)=>{if(t.startsWith("http://")||t.startsWith("https://"))return t;const[s,...n]=t.split(" ");let i=s;if(/^@/.test(s)){const[t,...e]=s.split("/");if(!o[t])throw`No alias defined ${t}`;i=[o[t].replace(/\/$/,""),...e].join("/")}if("undefined"!=typeof location){const t=e?new URL(e,location.href):location.href;i=new URL(i,t).href}return n.length?`${i} ${n.join(" ")}`:i},c=Symbol("loaded"),d=async(t,e)=>{const s=new URL(t),{pathname:i}=s;let r,a=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?r=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(a=t.replace(/^\-\-real\:/,""))})),r||(r=i.slice(2+(i.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:a,...e},l=n[r];if(l?await l.run(o):o.result=fetch(t),e&&e.element){const{element:t}=e;t[c]=!0;const s=new Event("load");t.dispatchEvent(s)}return e.params&&e.params.includes("-ctx")?o:o.result};function u(t,e){return((t,e)=>(t||(t={url:document.location.href}),s=>{let[n,...i]=s.split(" ");const r=l(n,t.url);return d(r,{params:i,...e})}))(t,e)}Object.assign(u,{use:r});class h extends HTMLElement{constructor(...t){super(...t),this[c]=!1,Object.defineProperties(this,{loaded:{get:()=>this[c]}}),this._init()}_init(){if(this.__initSrc||this.attributes.hasOwnProperty("pause"))return;let t=this.getAttribute("src");if(!t)return;this.__initSrc=t;lm(void 0,{element:this})(t),Object.defineProperties(this,{src:{configurable:!0,value:t}})}connectedCallback(){const t=new CustomEvent("connected");t.root=this._root=this.getRootNode(),this.dispatchEvent(t)}disconnectedCallback(){const t=new CustomEvent("disconnected");t.root=this._root,delete this._root,this.dispatchEvent(t)}attributeChangedCallback(t,e,s){"src"===t?s&&null===e?this._init():this.__initSrc&&e&&s!==this.__initSrc&&(console.warn(`${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`),this.setAttribute("src",this.__initSrc)):"pause"===t&&null===s&&this._init()}static get observedAttributes(){return["src","pause"]}}class f extends h{constructor(...t){super(...t)}}const m=()=>{customElements.define("load-module",h),customElements.define("l-m",f),window.removeEventListener("load",m)};return"complete"===document.readyState?m():window.addEventListener("load",m),u.config=async function(t){const{alias:e}=t;return e&&Object.entries(e).forEach((([t,e])=>{if(/^@.+/.test(t)){if(o[t])throw`Alias already exists: '${t}'`;if(/^\./.test(e))throw`The address does not match the specification, please use '/' or or the beginning of the protocol: '${e}'`;o[t]=e}})),!0},u.path=l,Object.freeze(u),window.lm=u,u})); +//! drill.js - v5.3.5 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lm=e()}(this,(function(){"use strict";class t{constructor(){this._middlewares=new Map}use(t){const e=Math.random().toString(32).slice(2);return this._middlewares.set(e,t),e}unuse(t){return this._middlewares.delete(t)}async run(t){let e=-1;const s=Array.from(this._middlewares.values()),n=async()=>{e++,e{const n=new URL(t),i=s.includes("-direct")?t:`${n.origin}${n.pathname}`;let r=e.get(i);r||(r=fetch(i),e.set(i,r));return(await r).clone()},n={},i=(e,s)=>{(n[e]||(n[e]=new t)).use(s)},r=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{i(t,e)})):i(t,e)};r(["mjs","js"],(async(t,e)=>{if(!t.result){const{url:e,params:s}=t,n=new URL(e),i=/^blob:/.test(e)||/^data:/.test(e);try{i||s.includes("-direct")?t.result=await import(e):t.result=await import(`${n.origin}${n.pathname}`)}catch(s){const n=a(`Failed to load module ${t.realUrl||e}`,s);throw i&&console.log("Failed to load module:",t),n}}await e()})),r(["txt","html","htm"],(async(t,e)=>{if(!t.result){const{url:e,params:n}=t;let i;try{i=await s(e,n)}catch(t){throw a(`Load ${e} failed`,t)}if(!/^2.{2}$/.test(i.status))throw new Error(`Load ${e} failed: status code ${i.status}`);t.result=await i.text()}await e()})),r("json",(async(t,e)=>{if(!t.result){const{url:e,params:n}=t;t.result=await s(e,n).then((t=>t.json()))}await e()})),r("wasm",(async(t,e)=>{if(!t.result){const{url:e,params:n}=t,i=await s(e,n).then((t=>t.arrayBuffer())),r=await WebAssembly.compile(i),a=new WebAssembly.Instance(r);t.result=a.exports}await e()})),r("css",(async(t,e)=>{if(!t.result){const{url:e,element:n,params:i}=t;if(n){const t=document.createElement("link");t.rel="stylesheet",t.href=e;const s=n.getRootNode();let i;s===document?s.head.append(t):s.appendChild(t),n.addEventListener("disconnected",i=e=>{t.remove(),n.removeEventListener("disconnected",i)})}else t.result=await s(e,i).then((t=>t.text()))}await e()}));const a=(t,e)=>{const s=new Error(`${t} \n ${e.toString()}`);return s.error=e,s},o={};const l=(t,e)=>{if(t.startsWith("http://")||t.startsWith("https://"))return t;const[s,...n]=t.split(" ");let i=s;if(/^@/.test(s)){const[t,...e]=s.split("/");if(!o[t])throw`No alias defined ${t}`;i=[o[t].replace(/\/$/,""),...e].join("/")}if("undefined"!=typeof location){const t=e?new URL(e,location.href):location.href;i=new URL(i,t).href}return n.length?`${i} ${n.join(" ")}`:i},c=Symbol("loaded"),d=async(t,e)=>{const s=new URL(t),{pathname:i}=s;let r,a=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?r=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(a=t.replace(/^\-\-real\:/,""))})),r||(r=i.slice(2+(i.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:a,...e},l=n[r];if(l?await l.run(o):o.result=fetch(t),e&&e.element){const{element:t}=e;t[c]=!0;const s=new Event("load");t.dispatchEvent(s)}return e.params&&e.params.includes("-ctx")?o:o.result};function u(t,e){return((t,e)=>(t||(t={url:document.location.href}),s=>{let[n,...i]=s.split(" ");const r=l(n,t.url);return d(r,{params:i,...e})}))(t,e)}Object.assign(u,{use:r});class h extends HTMLElement{constructor(...t){super(...t),this[c]=!1,Object.defineProperties(this,{loaded:{get:()=>this[c]}}),this._init()}_init(){if(this.__initSrc||this.attributes.hasOwnProperty("pause"))return;let t=this.getAttribute("src");if(!t)return;this.__initSrc=t;lm(void 0,{element:this})(t),Object.defineProperties(this,{src:{configurable:!0,value:t}})}connectedCallback(){const t=new CustomEvent("connected");t.root=this._root=this.getRootNode(),this.dispatchEvent(t)}disconnectedCallback(){const t=new CustomEvent("disconnected");t.root=this._root,delete this._root,this.dispatchEvent(t)}attributeChangedCallback(t,e,s){"src"===t?s&&null===e?this._init():this.__initSrc&&e&&s!==this.__initSrc&&(console.warn(`${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`),this.setAttribute("src",this.__initSrc)):"pause"===t&&null===s&&this._init()}static get observedAttributes(){return["src","pause"]}}class f extends h{constructor(...t){super(...t)}}const m=()=>{customElements.define("load-module",h),customElements.define("l-m",f),window.removeEventListener("load",m)};return"complete"===document.readyState?m():window.addEventListener("load",m),u.config=async function(t){const{alias:e}=t;return e&&Object.entries(e).forEach((([t,e])=>{if(/^@.+/.test(t)){if(o[t])throw`Alias already exists: '${t}'`;if(/^\./.test(e))throw`The address does not match the specification, please use '/' or or the beginning of the protocol: '${e}'`;o[t]=e}})),!0},u.path=l,Object.freeze(u),window.lm=u,u})); //# sourceMappingURL=drill.min.js.map diff --git a/dist/drill.min.js.map b/dist/drill.min.js.map index e2e19eb..bd190ec 100644 --- a/dist/drill.min.js.map +++ b/dist/drill.min.js.map @@ -1 +1 @@ -{"version":3,"file":"drill.min.js","sources":["../src/onion.mjs","../src/use.mjs","../src/config.mjs","../src/main.mjs","../src/component.mjs","../src/base.mjs"],"sourcesContent":["const getOid = () => Math.random().toString(32).slice(2);\n\nexport default class Onion {\n constructor() {\n this._middlewares = new Map();\n }\n\n use(middleware) {\n const oid = getOid();\n this._middlewares.set(oid, middleware);\n return oid;\n }\n\n unuse(oid) {\n return this._middlewares.delete(oid);\n }\n\n async run(context) {\n let index = -1;\n\n const middlewares = Array.from(this._middlewares.values());\n\n const next = async () => {\n index++;\n if (index < middlewares.length) {\n await middlewares[index](context, next);\n }\n };\n\n await next();\n }\n}\n","import Onion from \"./onion.mjs\";\n\nexport const caches = new Map();\nconst wrapFetch = async (url) => {\n let fetchObj = caches.get(url);\n\n if (!fetchObj) {\n fetchObj = fetch(url);\n caches.set(url, fetchObj);\n }\n\n const resp = await fetchObj;\n\n return resp.clone();\n};\n\nexport const processor = {};\n\nconst addHandler = (name, handler) => {\n const oni = processor[name] || (processor[name] = new Onion());\n oni.use(handler);\n};\n\nexport const use = (name, handler) => {\n if (name instanceof Function) {\n handler = name;\n name = [\"js\", \"mjs\"];\n }\n\n if (name instanceof Array) {\n name.forEach((name) => {\n addHandler(name, handler);\n });\n return;\n }\n\n addHandler(name, handler);\n};\n\nuse([\"mjs\", \"js\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n const d = new URL(url);\n\n const notHttp = /^blob:/.test(url) || /^data:/.test(url);\n try {\n if (notHttp || params.includes(\"-direct\")) {\n ctx.result = await import(url);\n } else {\n ctx.result = await import(`${d.origin}${d.pathname}`);\n }\n } catch (error) {\n const err = wrapError(\n `Failed to load module ${ctx.realUrl || url}`,\n error\n );\n\n if (notHttp) {\n console.log(\"Failed to load module:\", ctx);\n }\n\n throw err;\n }\n }\n\n await next();\n});\n\nuse([\"txt\", \"html\", \"htm\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url } = ctx;\n\n let resp;\n try {\n resp = await wrapFetch(url);\n } catch (error) {\n throw wrapError(`Load ${url} failed`, error);\n }\n\n if (!/^2.{2}$/.test(resp.status)) {\n throw new Error(`Load ${url} failed: status code ${resp.status}`);\n }\n\n ctx.result = await resp.text();\n }\n\n await next();\n});\n\nuse(\"json\", async (ctx, next) => {\n if (!ctx.result) {\n const { url } = ctx;\n\n ctx.result = await wrapFetch(url).then((e) => e.json());\n }\n\n await next();\n});\n\nuse(\"wasm\", async (ctx, next) => {\n if (!ctx.result) {\n const { url } = ctx;\n\n const data = await wrapFetch(url).then((e) => e.arrayBuffer());\n\n const module = await WebAssembly.compile(data);\n const instance = new WebAssembly.Instance(module);\n\n ctx.result = instance.exports;\n }\n\n await next();\n});\n\nuse(\"css\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, element } = ctx;\n\n if (element) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = url;\n\n const root = element.getRootNode();\n\n if (root === document) {\n root.head.append(link);\n } else {\n root.appendChild(link);\n }\n\n let f;\n element.addEventListener(\n \"disconnected\",\n (f = (e) => {\n link.remove();\n element.removeEventListener(\"disconnected\", f);\n })\n );\n } else {\n ctx.result = await wrapFetch(url).then((e) => e.text());\n }\n }\n\n await next();\n});\n\nconst wrapError = (desc, error) => {\n const err = new Error(`${desc} \\n ${error.toString()}`);\n err.error = error;\n return err;\n};\n","export const aliasMap = {};\n\nexport default async function config(opts) {\n const { alias } = opts;\n\n if (alias) {\n Object.entries(alias).forEach(([name, path]) => {\n if (/^@.+/.test(name)) {\n if (!aliasMap[name]) {\n if (!/^\\./.test(path)) {\n aliasMap[name] = path;\n } else {\n throw `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'`;\n }\n } else {\n throw `Alias already exists: '${name}'`;\n }\n }\n });\n }\n return true;\n}\n\nexport const path = (moduleName, baseURI) => {\n if (moduleName.startsWith(\"http://\") || moduleName.startsWith(\"https://\")) {\n return moduleName;\n }\n\n const [url, ...params] = moduleName.split(\" \");\n\n let lastUrl = url;\n\n if (/^@/.test(url)) {\n const [first, ...args] = url.split(\"/\");\n\n if (aliasMap[first]) {\n lastUrl = [aliasMap[first].replace(/\\/$/, \"\"), ...args].join(\"/\");\n } else {\n throw `No alias defined ${first}`;\n }\n }\n\n if (typeof location !== \"undefined\") {\n const base = baseURI ? new URL(baseURI, location.href) : location.href;\n\n const moduleURL = new URL(lastUrl, base);\n\n lastUrl = moduleURL.href;\n }\n\n if (params.length) {\n return `${lastUrl} ${params.join(\" \")}`;\n }\n\n return lastUrl;\n};\n","import { processor, use } from \"./use.mjs\";\nimport { aliasMap, path } from \"./config.mjs\";\nexport const LOADED = Symbol(\"loaded\");\n\nconst createLoad = (meta, opts) => {\n if (!meta) {\n meta = {\n url: document.location.href,\n };\n }\n const load = (ourl) => {\n let [url, ...params] = ourl.split(\" \");\n\n const reurl = path(url, meta.url);\n\n return agent(reurl, { params, ...opts });\n };\n return load;\n};\n\nexport const agent = async (url, opts) => {\n const urldata = new URL(url);\n const { pathname } = urldata;\n\n let type;\n let realUrl = null;\n\n opts.params &&\n opts.params.forEach((e) => {\n if (/^\\..+/.test(e)) {\n type = e.replace(/^\\.(.+)/, \"$1\");\n } else if (/^\\-\\-real/.test(e)) {\n realUrl = e.replace(/^\\-\\-real\\:/, \"\");\n }\n });\n\n if (!type) {\n type = pathname.slice(((pathname.lastIndexOf(\".\") - 1) >>> 0) + 2);\n }\n\n const ctx = {\n url,\n result: null,\n realUrl,\n ...opts,\n };\n\n const oni = processor[type];\n\n if (oni) {\n await oni.run(ctx);\n } else {\n ctx.result = fetch(url);\n }\n\n if (opts && opts.element) {\n const { element } = opts;\n element[LOADED] = true;\n const event = new Event(\"load\");\n element.dispatchEvent(event);\n }\n\n if (opts.params && opts.params.includes(\"-ctx\")) {\n return ctx;\n }\n\n return ctx.result;\n};\n\nexport default function lm(meta, opts) {\n return createLoad(meta, opts);\n}\n\nObject.assign(lm, {\n use,\n});\n","import { agent, LOADED } from \"./main.mjs\";\n\nclass LoadModule extends HTMLElement {\n constructor(...args) {\n super(...args);\n\n this[LOADED] = false;\n\n Object.defineProperties(this, {\n loaded: {\n get: () => this[LOADED],\n },\n });\n\n this._init();\n }\n\n _init() {\n if (this.__initSrc || this.attributes.hasOwnProperty(\"pause\")) {\n return;\n }\n\n let src = this.getAttribute(\"src\");\n\n if (!src) {\n return;\n // throw `The ${this.tagName.toLowerCase()} element requires the src attribut `;\n }\n this.__initSrc = src;\n\n const load = lm(undefined, {\n element: this,\n });\n\n load(src);\n\n Object.defineProperties(this, {\n src: {\n configurable: true,\n value: src,\n },\n });\n }\n\n connectedCallback() {\n const event = new CustomEvent(\"connected\");\n event.root = this._root = this.getRootNode();\n this.dispatchEvent(event);\n }\n\n disconnectedCallback() {\n const event = new CustomEvent(\"disconnected\");\n event.root = this._root;\n delete this._root;\n this.dispatchEvent(event);\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"src\") {\n if (newValue && oldValue === null) {\n this._init();\n } else if (this.__initSrc && oldValue && newValue !== this.__initSrc) {\n console.warn(\n `${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`\n );\n this.setAttribute(\"src\", this.__initSrc);\n }\n } else if (name === \"pause\" && newValue === null) {\n this._init();\n }\n }\n\n static get observedAttributes() {\n return [\"src\", \"pause\"];\n }\n}\n\nclass LM extends LoadModule {\n constructor(...args) {\n super(...args);\n }\n}\n\nconst ready = () => {\n customElements.define(\"load-module\", LoadModule);\n customElements.define(\"l-m\", LM);\n window.removeEventListener(\"load\", ready);\n};\n\nif (document.readyState === \"complete\") {\n ready();\n} else {\n window.addEventListener(\"load\", ready);\n}\n","import lm from \"./main.mjs\";\nimport \"./component.mjs\";\nimport config, { path } from \"./config.mjs\";\nlm.config = config;\nlm.path = path;\nObject.freeze(lm);\n\nwindow.lm = lm;\n\nexport default lm;\n"],"names":["Onion","constructor","this","_middlewares","Map","use","middleware","oid","Math","random","toString","slice","set","unuse","delete","async","context","index","middlewares","Array","from","values","next","length","caches","wrapFetch","url","fetchObj","get","fetch","clone","processor","addHandler","name","handler","Function","forEach","ctx","result","params","d","URL","notHttp","test","includes","import","origin","pathname","error","err","wrapError","realUrl","console","log","resp","status","Error","text","then","e","json","data","arrayBuffer","module","WebAssembly","compile","instance","Instance","exports","element","link","document","createElement","rel","href","root","getRootNode","f","head","append","appendChild","addEventListener","remove","removeEventListener","desc","aliasMap","path","moduleName","baseURI","startsWith","split","lastUrl","first","args","replace","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","event","Event","dispatchEvent","lm","meta","ourl","reurl","createLoad","Object","assign","LoadModule","HTMLElement","super","defineProperties","loaded","_init","__initSrc","attributes","hasOwnProperty","src","getAttribute","undefined","load","configurable","value","connectedCallback","CustomEvent","_root","disconnectedCallback","attributeChangedCallback","oldValue","newValue","warn","tagName","toLowerCase","setAttribute","observedAttributes","LM","ready","customElements","define","window","readyState","config","alias","entries","freeze"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"drill.min.js","sources":["../src/onion.mjs","../src/use.mjs","../src/config.mjs","../src/main.mjs","../src/component.mjs","../src/base.mjs"],"sourcesContent":["const getOid = () => Math.random().toString(32).slice(2);\n\nexport default class Onion {\n constructor() {\n this._middlewares = new Map();\n }\n\n use(middleware) {\n const oid = getOid();\n this._middlewares.set(oid, middleware);\n return oid;\n }\n\n unuse(oid) {\n return this._middlewares.delete(oid);\n }\n\n async run(context) {\n let index = -1;\n\n const middlewares = Array.from(this._middlewares.values());\n\n const next = async () => {\n index++;\n if (index < middlewares.length) {\n await middlewares[index](context, next);\n }\n };\n\n await next();\n }\n}\n","import Onion from \"./onion.mjs\";\n\nexport const caches = new Map();\nexport const wrapFetch = async (url, params) => {\n const d = new URL(url);\n\n const reUrl = params.includes(\"-direct\") ? url : `${d.origin}${d.pathname}`;\n\n let fetchObj = caches.get(reUrl);\n\n if (!fetchObj) {\n fetchObj = fetch(reUrl);\n caches.set(reUrl, fetchObj);\n }\n\n const resp = await fetchObj;\n\n return resp.clone();\n};\n\nexport const processor = {};\n\nconst addHandler = (name, handler) => {\n const oni = processor[name] || (processor[name] = new Onion());\n oni.use(handler);\n};\n\nexport const use = (name, handler) => {\n if (name instanceof Function) {\n handler = name;\n name = [\"js\", \"mjs\"];\n }\n\n if (name instanceof Array) {\n name.forEach((name) => {\n addHandler(name, handler);\n });\n return;\n }\n\n addHandler(name, handler);\n};\n\nuse([\"mjs\", \"js\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n const d = new URL(url);\n\n const notHttp = /^blob:/.test(url) || /^data:/.test(url);\n try {\n if (notHttp || params.includes(\"-direct\")) {\n ctx.result = await import(url);\n } else {\n ctx.result = await import(`${d.origin}${d.pathname}`);\n }\n } catch (error) {\n const err = wrapError(\n `Failed to load module ${ctx.realUrl || url}`,\n error\n );\n\n if (notHttp) {\n console.log(\"Failed to load module:\", ctx);\n }\n\n throw err;\n }\n }\n\n await next();\n});\n\nuse([\"txt\", \"html\", \"htm\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n\n let resp;\n try {\n resp = await wrapFetch(url, params);\n } catch (error) {\n throw wrapError(`Load ${url} failed`, error);\n }\n\n if (!/^2.{2}$/.test(resp.status)) {\n throw new Error(`Load ${url} failed: status code ${resp.status}`);\n }\n\n ctx.result = await resp.text();\n }\n\n await next();\n});\n\nuse(\"json\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n\n ctx.result = await wrapFetch(url, params).then((e) => e.json());\n }\n\n await next();\n});\n\nuse(\"wasm\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n\n const data = await wrapFetch(url, params).then((e) => e.arrayBuffer());\n\n const module = await WebAssembly.compile(data);\n const instance = new WebAssembly.Instance(module);\n\n ctx.result = instance.exports;\n }\n\n await next();\n});\n\nuse(\"css\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, element, params } = ctx;\n\n if (element) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = url;\n\n const root = element.getRootNode();\n\n if (root === document) {\n root.head.append(link);\n } else {\n root.appendChild(link);\n }\n\n let f;\n element.addEventListener(\n \"disconnected\",\n (f = (e) => {\n link.remove();\n element.removeEventListener(\"disconnected\", f);\n })\n );\n } else {\n ctx.result = await wrapFetch(url, params).then((e) => e.text());\n }\n }\n\n await next();\n});\n\nconst wrapError = (desc, error) => {\n const err = new Error(`${desc} \\n ${error.toString()}`);\n err.error = error;\n return err;\n};\n","export const aliasMap = {};\n\nexport default async function config(opts) {\n const { alias } = opts;\n\n if (alias) {\n Object.entries(alias).forEach(([name, path]) => {\n if (/^@.+/.test(name)) {\n if (!aliasMap[name]) {\n if (!/^\\./.test(path)) {\n aliasMap[name] = path;\n } else {\n throw `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'`;\n }\n } else {\n throw `Alias already exists: '${name}'`;\n }\n }\n });\n }\n return true;\n}\n\nexport const path = (moduleName, baseURI) => {\n if (moduleName.startsWith(\"http://\") || moduleName.startsWith(\"https://\")) {\n return moduleName;\n }\n\n const [url, ...params] = moduleName.split(\" \");\n\n let lastUrl = url;\n\n if (/^@/.test(url)) {\n const [first, ...args] = url.split(\"/\");\n\n if (aliasMap[first]) {\n lastUrl = [aliasMap[first].replace(/\\/$/, \"\"), ...args].join(\"/\");\n } else {\n throw `No alias defined ${first}`;\n }\n }\n\n if (typeof location !== \"undefined\") {\n const base = baseURI ? new URL(baseURI, location.href) : location.href;\n\n const moduleURL = new URL(lastUrl, base);\n\n lastUrl = moduleURL.href;\n }\n\n if (params.length) {\n return `${lastUrl} ${params.join(\" \")}`;\n }\n\n return lastUrl;\n};\n","import { processor, use } from \"./use.mjs\";\nimport { aliasMap, path } from \"./config.mjs\";\nexport const LOADED = Symbol(\"loaded\");\n\nconst createLoad = (meta, opts) => {\n if (!meta) {\n meta = {\n url: document.location.href,\n };\n }\n const load = (ourl) => {\n let [url, ...params] = ourl.split(\" \");\n\n const reurl = path(url, meta.url);\n\n return agent(reurl, { params, ...opts });\n };\n return load;\n};\n\nexport const agent = async (url, opts) => {\n const urldata = new URL(url);\n const { pathname } = urldata;\n\n let type;\n let realUrl = null;\n\n opts.params &&\n opts.params.forEach((e) => {\n if (/^\\..+/.test(e)) {\n type = e.replace(/^\\.(.+)/, \"$1\");\n } else if (/^\\-\\-real/.test(e)) {\n realUrl = e.replace(/^\\-\\-real\\:/, \"\");\n }\n });\n\n if (!type) {\n type = pathname.slice(((pathname.lastIndexOf(\".\") - 1) >>> 0) + 2);\n }\n\n const ctx = {\n url,\n result: null,\n realUrl,\n ...opts,\n };\n\n const oni = processor[type];\n\n if (oni) {\n await oni.run(ctx);\n } else {\n ctx.result = fetch(url);\n }\n\n if (opts && opts.element) {\n const { element } = opts;\n element[LOADED] = true;\n const event = new Event(\"load\");\n element.dispatchEvent(event);\n }\n\n if (opts.params && opts.params.includes(\"-ctx\")) {\n return ctx;\n }\n\n return ctx.result;\n};\n\nexport default function lm(meta, opts) {\n return createLoad(meta, opts);\n}\n\nObject.assign(lm, {\n use,\n});\n","import { agent, LOADED } from \"./main.mjs\";\n\nclass LoadModule extends HTMLElement {\n constructor(...args) {\n super(...args);\n\n this[LOADED] = false;\n\n Object.defineProperties(this, {\n loaded: {\n get: () => this[LOADED],\n },\n });\n\n this._init();\n }\n\n _init() {\n if (this.__initSrc || this.attributes.hasOwnProperty(\"pause\")) {\n return;\n }\n\n let src = this.getAttribute(\"src\");\n\n if (!src) {\n return;\n // throw `The ${this.tagName.toLowerCase()} element requires the src attribut `;\n }\n this.__initSrc = src;\n\n const load = lm(undefined, {\n element: this,\n });\n\n load(src);\n\n Object.defineProperties(this, {\n src: {\n configurable: true,\n value: src,\n },\n });\n }\n\n connectedCallback() {\n const event = new CustomEvent(\"connected\");\n event.root = this._root = this.getRootNode();\n this.dispatchEvent(event);\n }\n\n disconnectedCallback() {\n const event = new CustomEvent(\"disconnected\");\n event.root = this._root;\n delete this._root;\n this.dispatchEvent(event);\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"src\") {\n if (newValue && oldValue === null) {\n this._init();\n } else if (this.__initSrc && oldValue && newValue !== this.__initSrc) {\n console.warn(\n `${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`\n );\n this.setAttribute(\"src\", this.__initSrc);\n }\n } else if (name === \"pause\" && newValue === null) {\n this._init();\n }\n }\n\n static get observedAttributes() {\n return [\"src\", \"pause\"];\n }\n}\n\nclass LM extends LoadModule {\n constructor(...args) {\n super(...args);\n }\n}\n\nconst ready = () => {\n customElements.define(\"load-module\", LoadModule);\n customElements.define(\"l-m\", LM);\n window.removeEventListener(\"load\", ready);\n};\n\nif (document.readyState === \"complete\") {\n ready();\n} else {\n window.addEventListener(\"load\", ready);\n}\n","import lm from \"./main.mjs\";\nimport \"./component.mjs\";\nimport config, { path } from \"./config.mjs\";\nlm.config = config;\nlm.path = path;\nObject.freeze(lm);\n\nwindow.lm = lm;\n\nexport default lm;\n"],"names":["Onion","constructor","this","_middlewares","Map","use","middleware","oid","Math","random","toString","slice","set","unuse","delete","async","context","index","middlewares","Array","from","values","next","length","caches","wrapFetch","url","params","d","URL","reUrl","includes","origin","pathname","fetchObj","get","fetch","clone","processor","addHandler","name","handler","Function","forEach","ctx","result","notHttp","test","import","error","err","wrapError","realUrl","console","log","resp","status","Error","text","then","e","json","data","arrayBuffer","module","WebAssembly","compile","instance","Instance","exports","element","link","document","createElement","rel","href","root","getRootNode","f","head","append","appendChild","addEventListener","remove","removeEventListener","desc","aliasMap","path","moduleName","baseURI","startsWith","split","lastUrl","first","args","replace","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","event","Event","dispatchEvent","lm","meta","ourl","reurl","createLoad","Object","assign","LoadModule","HTMLElement","super","defineProperties","loaded","_init","__initSrc","attributes","hasOwnProperty","src","getAttribute","undefined","load","configurable","value","connectedCallback","CustomEvent","_root","disconnectedCallback","attributeChangedCallback","oldValue","newValue","warn","tagName","toLowerCase","setAttribute","observedAttributes","LM","ready","customElements","define","window","readyState","config","alias","entries","freeze"],"mappings":";mOAEe,MAAMA,EACnBC,cACEC,KAAKC,aAAe,IAAIC,GACzB,CAEDC,IAAIC,GACF,MAAMC,EARWC,KAAKC,SAASC,SAAS,IAAIC,MAAM,GAUlD,OADAT,KAAKC,aAAaS,IAAIL,EAAKD,GACpBC,CACR,CAEDM,MAAMN,GACJ,OAAOL,KAAKC,aAAaW,OAAOP,EACjC,CAEDQ,UAAUC,GACR,IAAIC,GAAS,EAEb,MAAMC,EAAcC,MAAMC,KAAKlB,KAAKC,aAAakB,UAE3CC,EAAOP,UACXE,IACIA,EAAQC,EAAYK,cAChBL,EAAYD,GAAOD,EAASM,EACnC,QAGGA,GACP,EC5BI,MAAME,EAAS,IAAIpB,IACbqB,EAAYV,MAAOW,EAAKC,KACnC,MAAMC,EAAI,IAAIC,IAAIH,GAEZI,EAAQH,EAAOI,SAAS,WAAaL,EAAM,GAAGE,EAAEI,SAASJ,EAAEK,WAEjE,IAAIC,EAAWV,EAAOW,IAAIL,GAErBI,IACHA,EAAWE,MAAMN,GACjBN,EAAOZ,IAAIkB,EAAOI,IAKpB,aAFmBA,GAEPG,OAAO,EAGRC,EAAY,CAAA,EAEnBC,EAAa,CAACC,EAAMC,MACZH,EAAUE,KAAUF,EAAUE,GAAQ,IAAIxC,IAClDK,IAAIoC,EAAQ,EAGLpC,EAAM,CAACmC,EAAMC,KACpBD,aAAgBE,WAClBD,EAAUD,EACVA,EAAO,CAAC,KAAM,QAGZA,aAAgBrB,MAClBqB,EAAKG,SAASH,IACZD,EAAWC,EAAMC,EAAQ,IAK7BF,EAAWC,EAAMC,EAAQ,EAG3BpC,EAAI,CAAC,MAAO,OAAOU,MAAO6B,EAAKtB,KAC7B,IAAKsB,EAAIC,OAAQ,CACf,MAAMnB,IAAEA,EAAGC,OAAEA,GAAWiB,EAClBhB,EAAI,IAAIC,IAAIH,GAEZoB,EAAU,SAASC,KAAKrB,IAAQ,SAASqB,KAAKrB,GACpD,IACMoB,GAAWnB,EAAOI,SAAS,WAC7Ba,EAAIC,aAAeG,OAAOtB,GAE1BkB,EAAIC,aAAeG,OAAO,GAAGpB,EAAEI,SAASJ,EAAEK,WAE7C,CAAC,MAAOgB,GACP,MAAMC,EAAMC,EACV,yBAAyBP,EAAIQ,SAAW1B,IACxCuB,GAOF,MAJIH,GACFO,QAAQC,IAAI,yBAA0BV,GAGlCM,CACP,CACF,OAEK5B,GAAM,IAGdjB,EAAI,CAAC,MAAO,OAAQ,QAAQU,MAAO6B,EAAKtB,KACtC,IAAKsB,EAAIC,OAAQ,CACf,MAAMnB,IAAEA,EAAGC,OAAEA,GAAWiB,EAExB,IAAIW,EACJ,IACEA,QAAa9B,EAAUC,EAAKC,EAC7B,CAAC,MAAOsB,GACP,MAAME,EAAU,QAAQzB,WAAcuB,EACvC,CAED,IAAK,UAAUF,KAAKQ,EAAKC,QACvB,MAAM,IAAIC,MAAM,QAAQ/B,yBAA2B6B,EAAKC,UAG1DZ,EAAIC,aAAeU,EAAKG,MACzB,OAEKpC,GAAM,IAGdjB,EAAI,QAAQU,MAAO6B,EAAKtB,KACtB,IAAKsB,EAAIC,OAAQ,CACf,MAAMnB,IAAEA,EAAGC,OAAEA,GAAWiB,EAExBA,EAAIC,aAAepB,EAAUC,EAAKC,GAAQgC,MAAMC,GAAMA,EAAEC,QACzD,OAEKvC,GAAM,IAGdjB,EAAI,QAAQU,MAAO6B,EAAKtB,KACtB,IAAKsB,EAAIC,OAAQ,CACf,MAAMnB,IAAEA,EAAGC,OAAEA,GAAWiB,EAElBkB,QAAarC,EAAUC,EAAKC,GAAQgC,MAAMC,GAAMA,EAAEG,gBAElDC,QAAeC,YAAYC,QAAQJ,GACnCK,EAAW,IAAIF,YAAYG,SAASJ,GAE1CpB,EAAIC,OAASsB,EAASE,OACvB,OAEK/C,GAAM,IAGdjB,EAAI,OAAOU,MAAO6B,EAAKtB,KACrB,IAAKsB,EAAIC,OAAQ,CACf,MAAMnB,IAAEA,EAAG4C,QAAEA,EAAO3C,OAAEA,GAAWiB,EAEjC,GAAI0B,EAAS,CACX,MAAMC,EAAOC,SAASC,cAAc,QACpCF,EAAKG,IAAM,aACXH,EAAKI,KAAOjD,EAEZ,MAAMkD,EAAON,EAAQO,cAQrB,IAAIC,EANAF,IAASJ,SACXI,EAAKG,KAAKC,OAAOT,GAEjBK,EAAKK,YAAYV,GAInBD,EAAQY,iBACN,eACCJ,EAAKlB,IACJW,EAAKY,SACLb,EAAQc,oBAAoB,eAAgBN,EAAE,EAGxD,MACMlC,EAAIC,aAAepB,EAAUC,EAAKC,GAAQgC,MAAMC,GAAMA,EAAEF,QAE3D,OAEKpC,GAAM,IAGd,MAAM6B,EAAY,CAACkC,EAAMpC,KACvB,MAAMC,EAAM,IAAIO,MAAM,GAAG4B,SAAYpC,EAAMvC,cAE3C,OADAwC,EAAID,MAAQA,EACLC,CAAG,EC1JCoC,EAAW,CAAA,EAuBjB,MAAMC,EAAO,CAACC,EAAYC,KAC/B,GAAID,EAAWE,WAAW,YAAcF,EAAWE,WAAW,YAC5D,OAAOF,EAGT,MAAO9D,KAAQC,GAAU6D,EAAWG,MAAM,KAE1C,IAAIC,EAAUlE,EAEd,GAAI,KAAKqB,KAAKrB,GAAM,CAClB,MAAOmE,KAAUC,GAAQpE,EAAIiE,MAAM,KAEnC,IAAIL,EAASO,GAGX,KAAM,oBAAoBA,IAF1BD,EAAU,CAACN,EAASO,GAAOE,QAAQ,MAAO,OAAQD,GAAME,KAAK,IAIhE,CAED,GAAwB,oBAAbC,SAA0B,CACnC,MAAMC,EAAOT,EAAU,IAAI5D,IAAI4D,EAASQ,SAAStB,MAAQsB,SAAStB,KAIlEiB,EAFkB,IAAI/D,IAAI+D,EAASM,GAEfvB,IACrB,CAED,OAAIhD,EAAOJ,OACF,GAAGqE,KAAWjE,EAAOqE,KAAK,OAG5BJ,CAAO,ECpDHO,EAASC,OAAO,UAkBhBC,EAAQtF,MAAOW,EAAK4E,KAC/B,MAAMC,EAAU,IAAI1E,IAAIH,IAClBO,SAAEA,GAAasE,EAErB,IAAIC,EACApD,EAAU,KAEdkD,EAAK3E,QACH2E,EAAK3E,OAAOgB,SAASiB,IACf,QAAQb,KAAKa,GACf4C,EAAO5C,EAAEmC,QAAQ,UAAW,MACnB,YAAYhD,KAAKa,KAC1BR,EAAUQ,EAAEmC,QAAQ,cAAe,IACpC,IAGAS,IACHA,EAAOvE,EAAStB,MAAgD,GAAxCsB,EAASwE,YAAY,KAAO,IAAO,KAG7D,MAAM7D,EAAM,CACVlB,MACAmB,OAAQ,KACRO,aACGkD,GAGCI,EAAMpE,EAAUkE,GAQtB,GANIE,QACIA,EAAIC,IAAI/D,GAEdA,EAAIC,OAAST,MAAMV,GAGjB4E,GAAQA,EAAKhC,QAAS,CACxB,MAAMA,QAAEA,GAAYgC,EACpBhC,EAAQ6B,IAAU,EAClB,MAAMS,EAAQ,IAAIC,MAAM,QACxBvC,EAAQwC,cAAcF,EACvB,CAED,OAAIN,EAAK3E,QAAU2E,EAAK3E,OAAOI,SAAS,QAC/Ba,EAGFA,EAAIC,MAAM,EAGJ,SAASkE,EAAGC,EAAMV,GAC/B,MAlEiB,EAACU,EAAMV,KACnBU,IACHA,EAAO,CACLtF,IAAK8C,SAASyB,SAAStB,OAGbsC,IACZ,IAAKvF,KAAQC,GAAUsF,EAAKtB,MAAM,KAElC,MAAMuB,EAAQ3B,EAAK7D,EAAKsF,EAAKtF,KAE7B,OAAO2E,EAAMa,EAAO,CAAEvF,YAAW2E,GAAO,GAuDnCa,CAAWH,EAAMV,EAC1B,CAEAc,OAAOC,OAAON,EAAI,CAChB1G,QCxEF,MAAMiH,UAAmBC,YACvBtH,eAAe6F,GACb0B,SAAS1B,GAET5F,KAAKiG,IAAU,EAEfiB,OAAOK,iBAAiBvH,KAAM,CAC5BwH,OAAQ,CACNvF,IAAK,IAAMjC,KAAKiG,MAIpBjG,KAAKyH,OACN,CAEDA,QACE,GAAIzH,KAAK0H,WAAa1H,KAAK2H,WAAWC,eAAe,SACnD,OAGF,IAAIC,EAAM7H,KAAK8H,aAAa,OAE5B,IAAKD,EACH,OAGF7H,KAAK0H,UAAYG,EAEJhB,QAAGkB,EAAW,CACzB3D,QAASpE,MAGXgI,CAAKH,GAELX,OAAOK,iBAAiBvH,KAAM,CAC5B6H,IAAK,CACHI,cAAc,EACdC,MAAOL,IAGZ,CAEDM,oBACE,MAAMzB,EAAQ,IAAI0B,YAAY,aAC9B1B,EAAMhC,KAAO1E,KAAKqI,MAAQrI,KAAK2E,cAC/B3E,KAAK4G,cAAcF,EACpB,CAED4B,uBACE,MAAM5B,EAAQ,IAAI0B,YAAY,gBAC9B1B,EAAMhC,KAAO1E,KAAKqI,aACXrI,KAAKqI,MACZrI,KAAK4G,cAAcF,EACpB,CAED6B,yBAAyBjG,EAAMkG,EAAUC,GAC1B,QAATnG,EACEmG,GAAyB,OAAbD,EACdxI,KAAKyH,QACIzH,KAAK0H,WAAac,GAAYC,IAAazI,KAAK0H,YACzDvE,QAAQuF,KACN,GAAG1I,KAAK2I,QAAQC,6EAElB5I,KAAK6I,aAAa,MAAO7I,KAAK0H,YAEd,UAATpF,GAAiC,OAAbmG,GAC7BzI,KAAKyH,OAER,CAEUqB,gCACT,MAAO,CAAC,MAAO,QAChB,EAGH,MAAMC,UAAW3B,EACfrH,eAAe6F,GACb0B,SAAS1B,EACV,EAGH,MAAMoD,EAAQ,KACZC,eAAeC,OAAO,cAAe9B,GACrC6B,eAAeC,OAAO,MAAOH,GAC7BI,OAAOjE,oBAAoB,OAAQ8D,EAAM,QAGf,aAAxB1E,SAAS8E,WACXJ,IAEAG,OAAOnE,iBAAiB,OAAQgE,GCzFlCnC,EAAGwC,OHDYxI,eAAsBuF,GACnC,MAAMkD,MAAEA,GAAUlD,EAiBlB,OAfIkD,GACFpC,OAAOqC,QAAQD,GAAO7G,SAAQ,EAAEH,EAAM+C,MACpC,GAAI,OAAOxC,KAAKP,GAAO,CACrB,GAAK8C,EAAS9C,GAOZ,KAAM,0BAA0BA,KANhC,GAAK,MAAMO,KAAKwC,GAGd,KAAM,sGAAsGA,KAF5GD,EAAS9C,GAAQ+C,CAOtB,MAGE,CACT,EGjBAwB,EAAGxB,KAAOA,EACV6B,OAAOsC,OAAO3C,GAEdsC,OAAOtC,GAAKA"} \ No newline at end of file diff --git a/dist/drill.min.mjs b/dist/drill.min.mjs index 061d2c7..1231da2 100644 --- a/dist/drill.min.mjs +++ b/dist/drill.min.mjs @@ -1,3 +1,3 @@ -//! drill.js - v5.3.4 https://github.com/kirakiray/drill.js (c) 2018-2023 YAO -class t{constructor(){this._middlewares=new Map}use(t){const e=Math.random().toString(32).slice(2);return this._middlewares.set(e,t),e}unuse(t){return this._middlewares.delete(t)}async run(t){let e=-1;const s=Array.from(this._middlewares.values()),n=async()=>{e++,e{let s=e.get(t);s||(s=fetch(t),e.set(t,s));return(await s).clone()},n={},r=(e,s)=>{(n[e]||(n[e]=new t)).use(s)},a=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{r(t,e)})):r(t,e)};a(["mjs","js"],(async(t,e)=>{if(!t.result){const{url:e,params:s}=t,n=new URL(e),r=/^blob:/.test(e)||/^data:/.test(e);try{r||s.includes("-direct")?t.result=await import(e):t.result=await import(`${n.origin}${n.pathname}`)}catch(s){const n=i(`Failed to load module ${t.realUrl||e}`,s);throw r&&console.log("Failed to load module:",t),n}}await e()})),a(["txt","html","htm"],(async(t,e)=>{if(!t.result){const{url:e}=t;let n;try{n=await s(e)}catch(t){throw i(`Load ${e} failed`,t)}if(!/^2.{2}$/.test(n.status))throw new Error(`Load ${e} failed: status code ${n.status}`);t.result=await n.text()}await e()})),a("json",(async(t,e)=>{if(!t.result){const{url:e}=t;t.result=await s(e).then((t=>t.json()))}await e()})),a("wasm",(async(t,e)=>{if(!t.result){const{url:e}=t,n=await s(e).then((t=>t.arrayBuffer())),r=await WebAssembly.compile(n),a=new WebAssembly.Instance(r);t.result=a.exports}await e()})),a("css",(async(t,e)=>{if(!t.result){const{url:e,element:n}=t;if(n){const t=document.createElement("link");t.rel="stylesheet",t.href=e;const s=n.getRootNode();let r;s===document?s.head.append(t):s.appendChild(t),n.addEventListener("disconnected",r=e=>{t.remove(),n.removeEventListener("disconnected",r)})}else t.result=await s(e).then((t=>t.text()))}await e()}));const i=(t,e)=>{const s=new Error(`${t} \n ${e.toString()}`);return s.error=e,s},o={};const l=(t,e)=>{if(t.startsWith("http://")||t.startsWith("https://"))return t;const[s,...n]=t.split(" ");let r=s;if(/^@/.test(s)){const[t,...e]=s.split("/");if(!o[t])throw`No alias defined ${t}`;r=[o[t].replace(/\/$/,""),...e].join("/")}if("undefined"!=typeof location){const t=e?new URL(e,location.href):location.href;r=new URL(r,t).href}return n.length?`${r} ${n.join(" ")}`:r},c=Symbol("loaded"),d=async(t,e)=>{const s=new URL(t),{pathname:r}=s;let a,i=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?a=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(i=t.replace(/^\-\-real\:/,""))})),a||(a=r.slice(2+(r.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:i,...e},l=n[a];if(l?await l.run(o):o.result=fetch(t),e&&e.element){const{element:t}=e;t[c]=!0;const s=new Event("load");t.dispatchEvent(s)}return e.params&&e.params.includes("-ctx")?o:o.result};function u(t,e){return((t,e)=>(t||(t={url:document.location.href}),s=>{let[n,...r]=s.split(" ");const a=l(n,t.url);return d(a,{params:r,...e})}))(t,e)}Object.assign(u,{use:a});class h extends HTMLElement{constructor(...t){super(...t),this[c]=!1,Object.defineProperties(this,{loaded:{get:()=>this[c]}}),this._init()}_init(){if(this.__initSrc||this.attributes.hasOwnProperty("pause"))return;let t=this.getAttribute("src");if(!t)return;this.__initSrc=t;lm(void 0,{element:this})(t),Object.defineProperties(this,{src:{configurable:!0,value:t}})}connectedCallback(){const t=new CustomEvent("connected");t.root=this._root=this.getRootNode(),this.dispatchEvent(t)}disconnectedCallback(){const t=new CustomEvent("disconnected");t.root=this._root,delete this._root,this.dispatchEvent(t)}attributeChangedCallback(t,e,s){"src"===t?s&&null===e?this._init():this.__initSrc&&e&&s!==this.__initSrc&&(console.warn(`${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`),this.setAttribute("src",this.__initSrc)):"pause"===t&&null===s&&this._init()}static get observedAttributes(){return["src","pause"]}}class m extends h{constructor(...t){super(...t)}}const f=()=>{customElements.define("load-module",h),customElements.define("l-m",m),window.removeEventListener("load",f)};"complete"===document.readyState?f():window.addEventListener("load",f),u.config=async function(t){const{alias:e}=t;return e&&Object.entries(e).forEach((([t,e])=>{if(/^@.+/.test(t)){if(o[t])throw`Alias already exists: '${t}'`;if(/^\./.test(e))throw`The address does not match the specification, please use '/' or or the beginning of the protocol: '${e}'`;o[t]=e}})),!0},u.path=l,Object.freeze(u),window.lm=u;export{u as default}; +//! drill.js - v5.3.5 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO +class t{constructor(){this._middlewares=new Map}use(t){const e=Math.random().toString(32).slice(2);return this._middlewares.set(e,t),e}unuse(t){return this._middlewares.delete(t)}async run(t){let e=-1;const s=Array.from(this._middlewares.values()),n=async()=>{e++,e{const n=new URL(t),a=s.includes("-direct")?t:`${n.origin}${n.pathname}`;let r=e.get(a);r||(r=fetch(a),e.set(a,r));return(await r).clone()},n={},a=(e,s)=>{(n[e]||(n[e]=new t)).use(s)},r=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{a(t,e)})):a(t,e)};r(["mjs","js"],(async(t,e)=>{if(!t.result){const{url:e,params:s}=t,n=new URL(e),a=/^blob:/.test(e)||/^data:/.test(e);try{a||s.includes("-direct")?t.result=await import(e):t.result=await import(`${n.origin}${n.pathname}`)}catch(s){const n=i(`Failed to load module ${t.realUrl||e}`,s);throw a&&console.log("Failed to load module:",t),n}}await e()})),r(["txt","html","htm"],(async(t,e)=>{if(!t.result){const{url:e,params:n}=t;let a;try{a=await s(e,n)}catch(t){throw i(`Load ${e} failed`,t)}if(!/^2.{2}$/.test(a.status))throw new Error(`Load ${e} failed: status code ${a.status}`);t.result=await a.text()}await e()})),r("json",(async(t,e)=>{if(!t.result){const{url:e,params:n}=t;t.result=await s(e,n).then((t=>t.json()))}await e()})),r("wasm",(async(t,e)=>{if(!t.result){const{url:e,params:n}=t,a=await s(e,n).then((t=>t.arrayBuffer())),r=await WebAssembly.compile(a),i=new WebAssembly.Instance(r);t.result=i.exports}await e()})),r("css",(async(t,e)=>{if(!t.result){const{url:e,element:n,params:a}=t;if(n){const t=document.createElement("link");t.rel="stylesheet",t.href=e;const s=n.getRootNode();let a;s===document?s.head.append(t):s.appendChild(t),n.addEventListener("disconnected",a=e=>{t.remove(),n.removeEventListener("disconnected",a)})}else t.result=await s(e,a).then((t=>t.text()))}await e()}));const i=(t,e)=>{const s=new Error(`${t} \n ${e.toString()}`);return s.error=e,s},o={};const l=(t,e)=>{if(t.startsWith("http://")||t.startsWith("https://"))return t;const[s,...n]=t.split(" ");let a=s;if(/^@/.test(s)){const[t,...e]=s.split("/");if(!o[t])throw`No alias defined ${t}`;a=[o[t].replace(/\/$/,""),...e].join("/")}if("undefined"!=typeof location){const t=e?new URL(e,location.href):location.href;a=new URL(a,t).href}return n.length?`${a} ${n.join(" ")}`:a},c=Symbol("loaded"),d=async(t,e)=>{const s=new URL(t),{pathname:a}=s;let r,i=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?r=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(i=t.replace(/^\-\-real\:/,""))})),r||(r=a.slice(2+(a.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:i,...e},l=n[r];if(l?await l.run(o):o.result=fetch(t),e&&e.element){const{element:t}=e;t[c]=!0;const s=new Event("load");t.dispatchEvent(s)}return e.params&&e.params.includes("-ctx")?o:o.result};function u(t,e){return((t,e)=>(t||(t={url:document.location.href}),s=>{let[n,...a]=s.split(" ");const r=l(n,t.url);return d(r,{params:a,...e})}))(t,e)}Object.assign(u,{use:r});class h extends HTMLElement{constructor(...t){super(...t),this[c]=!1,Object.defineProperties(this,{loaded:{get:()=>this[c]}}),this._init()}_init(){if(this.__initSrc||this.attributes.hasOwnProperty("pause"))return;let t=this.getAttribute("src");if(!t)return;this.__initSrc=t;lm(void 0,{element:this})(t),Object.defineProperties(this,{src:{configurable:!0,value:t}})}connectedCallback(){const t=new CustomEvent("connected");t.root=this._root=this.getRootNode(),this.dispatchEvent(t)}disconnectedCallback(){const t=new CustomEvent("disconnected");t.root=this._root,delete this._root,this.dispatchEvent(t)}attributeChangedCallback(t,e,s){"src"===t?s&&null===e?this._init():this.__initSrc&&e&&s!==this.__initSrc&&(console.warn(`${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`),this.setAttribute("src",this.__initSrc)):"pause"===t&&null===s&&this._init()}static get observedAttributes(){return["src","pause"]}}class m extends h{constructor(...t){super(...t)}}const w=()=>{customElements.define("load-module",h),customElements.define("l-m",m),window.removeEventListener("load",w)};"complete"===document.readyState?w():window.addEventListener("load",w),u.config=async function(t){const{alias:e}=t;return e&&Object.entries(e).forEach((([t,e])=>{if(/^@.+/.test(t)){if(o[t])throw`Alias already exists: '${t}'`;if(/^\./.test(e))throw`The address does not match the specification, please use '/' or or the beginning of the protocol: '${e}'`;o[t]=e}})),!0},u.path=l,Object.freeze(u),window.lm=u;export{u as default}; //# sourceMappingURL=drill.min.mjs.map diff --git a/dist/drill.min.mjs.map b/dist/drill.min.mjs.map index 33768be..7b28bf6 100644 --- a/dist/drill.min.mjs.map +++ b/dist/drill.min.mjs.map @@ -1 +1 @@ -{"version":3,"file":"drill.min.mjs","sources":["../src/onion.mjs","../src/use.mjs","../src/config.mjs","../src/main.mjs","../src/component.mjs","../src/base.mjs"],"sourcesContent":["const getOid = () => Math.random().toString(32).slice(2);\n\nexport default class Onion {\n constructor() {\n this._middlewares = new Map();\n }\n\n use(middleware) {\n const oid = getOid();\n this._middlewares.set(oid, middleware);\n return oid;\n }\n\n unuse(oid) {\n return this._middlewares.delete(oid);\n }\n\n async run(context) {\n let index = -1;\n\n const middlewares = Array.from(this._middlewares.values());\n\n const next = async () => {\n index++;\n if (index < middlewares.length) {\n await middlewares[index](context, next);\n }\n };\n\n await next();\n }\n}\n","import Onion from \"./onion.mjs\";\n\nexport const caches = new Map();\nconst wrapFetch = async (url) => {\n let fetchObj = caches.get(url);\n\n if (!fetchObj) {\n fetchObj = fetch(url);\n caches.set(url, fetchObj);\n }\n\n const resp = await fetchObj;\n\n return resp.clone();\n};\n\nexport const processor = {};\n\nconst addHandler = (name, handler) => {\n const oni = processor[name] || (processor[name] = new Onion());\n oni.use(handler);\n};\n\nexport const use = (name, handler) => {\n if (name instanceof Function) {\n handler = name;\n name = [\"js\", \"mjs\"];\n }\n\n if (name instanceof Array) {\n name.forEach((name) => {\n addHandler(name, handler);\n });\n return;\n }\n\n addHandler(name, handler);\n};\n\nuse([\"mjs\", \"js\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n const d = new URL(url);\n\n const notHttp = /^blob:/.test(url) || /^data:/.test(url);\n try {\n if (notHttp || params.includes(\"-direct\")) {\n ctx.result = await import(url);\n } else {\n ctx.result = await import(`${d.origin}${d.pathname}`);\n }\n } catch (error) {\n const err = wrapError(\n `Failed to load module ${ctx.realUrl || url}`,\n error\n );\n\n if (notHttp) {\n console.log(\"Failed to load module:\", ctx);\n }\n\n throw err;\n }\n }\n\n await next();\n});\n\nuse([\"txt\", \"html\", \"htm\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url } = ctx;\n\n let resp;\n try {\n resp = await wrapFetch(url);\n } catch (error) {\n throw wrapError(`Load ${url} failed`, error);\n }\n\n if (!/^2.{2}$/.test(resp.status)) {\n throw new Error(`Load ${url} failed: status code ${resp.status}`);\n }\n\n ctx.result = await resp.text();\n }\n\n await next();\n});\n\nuse(\"json\", async (ctx, next) => {\n if (!ctx.result) {\n const { url } = ctx;\n\n ctx.result = await wrapFetch(url).then((e) => e.json());\n }\n\n await next();\n});\n\nuse(\"wasm\", async (ctx, next) => {\n if (!ctx.result) {\n const { url } = ctx;\n\n const data = await wrapFetch(url).then((e) => e.arrayBuffer());\n\n const module = await WebAssembly.compile(data);\n const instance = new WebAssembly.Instance(module);\n\n ctx.result = instance.exports;\n }\n\n await next();\n});\n\nuse(\"css\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, element } = ctx;\n\n if (element) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = url;\n\n const root = element.getRootNode();\n\n if (root === document) {\n root.head.append(link);\n } else {\n root.appendChild(link);\n }\n\n let f;\n element.addEventListener(\n \"disconnected\",\n (f = (e) => {\n link.remove();\n element.removeEventListener(\"disconnected\", f);\n })\n );\n } else {\n ctx.result = await wrapFetch(url).then((e) => e.text());\n }\n }\n\n await next();\n});\n\nconst wrapError = (desc, error) => {\n const err = new Error(`${desc} \\n ${error.toString()}`);\n err.error = error;\n return err;\n};\n","export const aliasMap = {};\n\nexport default async function config(opts) {\n const { alias } = opts;\n\n if (alias) {\n Object.entries(alias).forEach(([name, path]) => {\n if (/^@.+/.test(name)) {\n if (!aliasMap[name]) {\n if (!/^\\./.test(path)) {\n aliasMap[name] = path;\n } else {\n throw `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'`;\n }\n } else {\n throw `Alias already exists: '${name}'`;\n }\n }\n });\n }\n return true;\n}\n\nexport const path = (moduleName, baseURI) => {\n if (moduleName.startsWith(\"http://\") || moduleName.startsWith(\"https://\")) {\n return moduleName;\n }\n\n const [url, ...params] = moduleName.split(\" \");\n\n let lastUrl = url;\n\n if (/^@/.test(url)) {\n const [first, ...args] = url.split(\"/\");\n\n if (aliasMap[first]) {\n lastUrl = [aliasMap[first].replace(/\\/$/, \"\"), ...args].join(\"/\");\n } else {\n throw `No alias defined ${first}`;\n }\n }\n\n if (typeof location !== \"undefined\") {\n const base = baseURI ? new URL(baseURI, location.href) : location.href;\n\n const moduleURL = new URL(lastUrl, base);\n\n lastUrl = moduleURL.href;\n }\n\n if (params.length) {\n return `${lastUrl} ${params.join(\" \")}`;\n }\n\n return lastUrl;\n};\n","import { processor, use } from \"./use.mjs\";\nimport { aliasMap, path } from \"./config.mjs\";\nexport const LOADED = Symbol(\"loaded\");\n\nconst createLoad = (meta, opts) => {\n if (!meta) {\n meta = {\n url: document.location.href,\n };\n }\n const load = (ourl) => {\n let [url, ...params] = ourl.split(\" \");\n\n const reurl = path(url, meta.url);\n\n return agent(reurl, { params, ...opts });\n };\n return load;\n};\n\nexport const agent = async (url, opts) => {\n const urldata = new URL(url);\n const { pathname } = urldata;\n\n let type;\n let realUrl = null;\n\n opts.params &&\n opts.params.forEach((e) => {\n if (/^\\..+/.test(e)) {\n type = e.replace(/^\\.(.+)/, \"$1\");\n } else if (/^\\-\\-real/.test(e)) {\n realUrl = e.replace(/^\\-\\-real\\:/, \"\");\n }\n });\n\n if (!type) {\n type = pathname.slice(((pathname.lastIndexOf(\".\") - 1) >>> 0) + 2);\n }\n\n const ctx = {\n url,\n result: null,\n realUrl,\n ...opts,\n };\n\n const oni = processor[type];\n\n if (oni) {\n await oni.run(ctx);\n } else {\n ctx.result = fetch(url);\n }\n\n if (opts && opts.element) {\n const { element } = opts;\n element[LOADED] = true;\n const event = new Event(\"load\");\n element.dispatchEvent(event);\n }\n\n if (opts.params && opts.params.includes(\"-ctx\")) {\n return ctx;\n }\n\n return ctx.result;\n};\n\nexport default function lm(meta, opts) {\n return createLoad(meta, opts);\n}\n\nObject.assign(lm, {\n use,\n});\n","import { agent, LOADED } from \"./main.mjs\";\n\nclass LoadModule extends HTMLElement {\n constructor(...args) {\n super(...args);\n\n this[LOADED] = false;\n\n Object.defineProperties(this, {\n loaded: {\n get: () => this[LOADED],\n },\n });\n\n this._init();\n }\n\n _init() {\n if (this.__initSrc || this.attributes.hasOwnProperty(\"pause\")) {\n return;\n }\n\n let src = this.getAttribute(\"src\");\n\n if (!src) {\n return;\n // throw `The ${this.tagName.toLowerCase()} element requires the src attribut `;\n }\n this.__initSrc = src;\n\n const load = lm(undefined, {\n element: this,\n });\n\n load(src);\n\n Object.defineProperties(this, {\n src: {\n configurable: true,\n value: src,\n },\n });\n }\n\n connectedCallback() {\n const event = new CustomEvent(\"connected\");\n event.root = this._root = this.getRootNode();\n this.dispatchEvent(event);\n }\n\n disconnectedCallback() {\n const event = new CustomEvent(\"disconnected\");\n event.root = this._root;\n delete this._root;\n this.dispatchEvent(event);\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"src\") {\n if (newValue && oldValue === null) {\n this._init();\n } else if (this.__initSrc && oldValue && newValue !== this.__initSrc) {\n console.warn(\n `${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`\n );\n this.setAttribute(\"src\", this.__initSrc);\n }\n } else if (name === \"pause\" && newValue === null) {\n this._init();\n }\n }\n\n static get observedAttributes() {\n return [\"src\", \"pause\"];\n }\n}\n\nclass LM extends LoadModule {\n constructor(...args) {\n super(...args);\n }\n}\n\nconst ready = () => {\n customElements.define(\"load-module\", LoadModule);\n customElements.define(\"l-m\", LM);\n window.removeEventListener(\"load\", ready);\n};\n\nif (document.readyState === \"complete\") {\n ready();\n} else {\n window.addEventListener(\"load\", ready);\n}\n","import lm from \"./main.mjs\";\nimport \"./component.mjs\";\nimport config, { path } from \"./config.mjs\";\nlm.config = config;\nlm.path = path;\nObject.freeze(lm);\n\nwindow.lm = lm;\n\nexport default lm;\n"],"names":["Onion","constructor","this","_middlewares","Map","use","middleware","oid","Math","random","toString","slice","set","unuse","delete","async","context","index","middlewares","Array","from","values","next","length","caches","wrapFetch","url","fetchObj","get","fetch","clone","processor","addHandler","name","handler","Function","forEach","ctx","result","params","d","URL","notHttp","test","includes","import","origin","pathname","error","err","wrapError","realUrl","console","log","resp","status","Error","text","then","e","json","data","arrayBuffer","module","WebAssembly","compile","instance","Instance","exports","element","link","document","createElement","rel","href","root","getRootNode","f","head","append","appendChild","addEventListener","remove","removeEventListener","desc","aliasMap","path","moduleName","baseURI","startsWith","split","lastUrl","first","args","replace","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","event","Event","dispatchEvent","lm","meta","ourl","reurl","createLoad","Object","assign","LoadModule","HTMLElement","super","defineProperties","loaded","_init","__initSrc","attributes","hasOwnProperty","src","getAttribute","undefined","load","configurable","value","connectedCallback","CustomEvent","_root","disconnectedCallback","attributeChangedCallback","oldValue","newValue","warn","tagName","toLowerCase","setAttribute","observedAttributes","LM","ready","customElements","define","window","readyState","config","alias","entries","freeze"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"drill.min.mjs","sources":["../src/onion.mjs","../src/use.mjs","../src/config.mjs","../src/main.mjs","../src/component.mjs","../src/base.mjs"],"sourcesContent":["const getOid = () => Math.random().toString(32).slice(2);\n\nexport default class Onion {\n constructor() {\n this._middlewares = new Map();\n }\n\n use(middleware) {\n const oid = getOid();\n this._middlewares.set(oid, middleware);\n return oid;\n }\n\n unuse(oid) {\n return this._middlewares.delete(oid);\n }\n\n async run(context) {\n let index = -1;\n\n const middlewares = Array.from(this._middlewares.values());\n\n const next = async () => {\n index++;\n if (index < middlewares.length) {\n await middlewares[index](context, next);\n }\n };\n\n await next();\n }\n}\n","import Onion from \"./onion.mjs\";\n\nexport const caches = new Map();\nexport const wrapFetch = async (url, params) => {\n const d = new URL(url);\n\n const reUrl = params.includes(\"-direct\") ? url : `${d.origin}${d.pathname}`;\n\n let fetchObj = caches.get(reUrl);\n\n if (!fetchObj) {\n fetchObj = fetch(reUrl);\n caches.set(reUrl, fetchObj);\n }\n\n const resp = await fetchObj;\n\n return resp.clone();\n};\n\nexport const processor = {};\n\nconst addHandler = (name, handler) => {\n const oni = processor[name] || (processor[name] = new Onion());\n oni.use(handler);\n};\n\nexport const use = (name, handler) => {\n if (name instanceof Function) {\n handler = name;\n name = [\"js\", \"mjs\"];\n }\n\n if (name instanceof Array) {\n name.forEach((name) => {\n addHandler(name, handler);\n });\n return;\n }\n\n addHandler(name, handler);\n};\n\nuse([\"mjs\", \"js\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n const d = new URL(url);\n\n const notHttp = /^blob:/.test(url) || /^data:/.test(url);\n try {\n if (notHttp || params.includes(\"-direct\")) {\n ctx.result = await import(url);\n } else {\n ctx.result = await import(`${d.origin}${d.pathname}`);\n }\n } catch (error) {\n const err = wrapError(\n `Failed to load module ${ctx.realUrl || url}`,\n error\n );\n\n if (notHttp) {\n console.log(\"Failed to load module:\", ctx);\n }\n\n throw err;\n }\n }\n\n await next();\n});\n\nuse([\"txt\", \"html\", \"htm\"], async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n\n let resp;\n try {\n resp = await wrapFetch(url, params);\n } catch (error) {\n throw wrapError(`Load ${url} failed`, error);\n }\n\n if (!/^2.{2}$/.test(resp.status)) {\n throw new Error(`Load ${url} failed: status code ${resp.status}`);\n }\n\n ctx.result = await resp.text();\n }\n\n await next();\n});\n\nuse(\"json\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n\n ctx.result = await wrapFetch(url, params).then((e) => e.json());\n }\n\n await next();\n});\n\nuse(\"wasm\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, params } = ctx;\n\n const data = await wrapFetch(url, params).then((e) => e.arrayBuffer());\n\n const module = await WebAssembly.compile(data);\n const instance = new WebAssembly.Instance(module);\n\n ctx.result = instance.exports;\n }\n\n await next();\n});\n\nuse(\"css\", async (ctx, next) => {\n if (!ctx.result) {\n const { url, element, params } = ctx;\n\n if (element) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = url;\n\n const root = element.getRootNode();\n\n if (root === document) {\n root.head.append(link);\n } else {\n root.appendChild(link);\n }\n\n let f;\n element.addEventListener(\n \"disconnected\",\n (f = (e) => {\n link.remove();\n element.removeEventListener(\"disconnected\", f);\n })\n );\n } else {\n ctx.result = await wrapFetch(url, params).then((e) => e.text());\n }\n }\n\n await next();\n});\n\nconst wrapError = (desc, error) => {\n const err = new Error(`${desc} \\n ${error.toString()}`);\n err.error = error;\n return err;\n};\n","export const aliasMap = {};\n\nexport default async function config(opts) {\n const { alias } = opts;\n\n if (alias) {\n Object.entries(alias).forEach(([name, path]) => {\n if (/^@.+/.test(name)) {\n if (!aliasMap[name]) {\n if (!/^\\./.test(path)) {\n aliasMap[name] = path;\n } else {\n throw `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'`;\n }\n } else {\n throw `Alias already exists: '${name}'`;\n }\n }\n });\n }\n return true;\n}\n\nexport const path = (moduleName, baseURI) => {\n if (moduleName.startsWith(\"http://\") || moduleName.startsWith(\"https://\")) {\n return moduleName;\n }\n\n const [url, ...params] = moduleName.split(\" \");\n\n let lastUrl = url;\n\n if (/^@/.test(url)) {\n const [first, ...args] = url.split(\"/\");\n\n if (aliasMap[first]) {\n lastUrl = [aliasMap[first].replace(/\\/$/, \"\"), ...args].join(\"/\");\n } else {\n throw `No alias defined ${first}`;\n }\n }\n\n if (typeof location !== \"undefined\") {\n const base = baseURI ? new URL(baseURI, location.href) : location.href;\n\n const moduleURL = new URL(lastUrl, base);\n\n lastUrl = moduleURL.href;\n }\n\n if (params.length) {\n return `${lastUrl} ${params.join(\" \")}`;\n }\n\n return lastUrl;\n};\n","import { processor, use } from \"./use.mjs\";\nimport { aliasMap, path } from \"./config.mjs\";\nexport const LOADED = Symbol(\"loaded\");\n\nconst createLoad = (meta, opts) => {\n if (!meta) {\n meta = {\n url: document.location.href,\n };\n }\n const load = (ourl) => {\n let [url, ...params] = ourl.split(\" \");\n\n const reurl = path(url, meta.url);\n\n return agent(reurl, { params, ...opts });\n };\n return load;\n};\n\nexport const agent = async (url, opts) => {\n const urldata = new URL(url);\n const { pathname } = urldata;\n\n let type;\n let realUrl = null;\n\n opts.params &&\n opts.params.forEach((e) => {\n if (/^\\..+/.test(e)) {\n type = e.replace(/^\\.(.+)/, \"$1\");\n } else if (/^\\-\\-real/.test(e)) {\n realUrl = e.replace(/^\\-\\-real\\:/, \"\");\n }\n });\n\n if (!type) {\n type = pathname.slice(((pathname.lastIndexOf(\".\") - 1) >>> 0) + 2);\n }\n\n const ctx = {\n url,\n result: null,\n realUrl,\n ...opts,\n };\n\n const oni = processor[type];\n\n if (oni) {\n await oni.run(ctx);\n } else {\n ctx.result = fetch(url);\n }\n\n if (opts && opts.element) {\n const { element } = opts;\n element[LOADED] = true;\n const event = new Event(\"load\");\n element.dispatchEvent(event);\n }\n\n if (opts.params && opts.params.includes(\"-ctx\")) {\n return ctx;\n }\n\n return ctx.result;\n};\n\nexport default function lm(meta, opts) {\n return createLoad(meta, opts);\n}\n\nObject.assign(lm, {\n use,\n});\n","import { agent, LOADED } from \"./main.mjs\";\n\nclass LoadModule extends HTMLElement {\n constructor(...args) {\n super(...args);\n\n this[LOADED] = false;\n\n Object.defineProperties(this, {\n loaded: {\n get: () => this[LOADED],\n },\n });\n\n this._init();\n }\n\n _init() {\n if (this.__initSrc || this.attributes.hasOwnProperty(\"pause\")) {\n return;\n }\n\n let src = this.getAttribute(\"src\");\n\n if (!src) {\n return;\n // throw `The ${this.tagName.toLowerCase()} element requires the src attribut `;\n }\n this.__initSrc = src;\n\n const load = lm(undefined, {\n element: this,\n });\n\n load(src);\n\n Object.defineProperties(this, {\n src: {\n configurable: true,\n value: src,\n },\n });\n }\n\n connectedCallback() {\n const event = new CustomEvent(\"connected\");\n event.root = this._root = this.getRootNode();\n this.dispatchEvent(event);\n }\n\n disconnectedCallback() {\n const event = new CustomEvent(\"disconnected\");\n event.root = this._root;\n delete this._root;\n this.dispatchEvent(event);\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"src\") {\n if (newValue && oldValue === null) {\n this._init();\n } else if (this.__initSrc && oldValue && newValue !== this.__initSrc) {\n console.warn(\n `${this.tagName.toLowerCase()} change src is invalid, only the first change will be loaded`\n );\n this.setAttribute(\"src\", this.__initSrc);\n }\n } else if (name === \"pause\" && newValue === null) {\n this._init();\n }\n }\n\n static get observedAttributes() {\n return [\"src\", \"pause\"];\n }\n}\n\nclass LM extends LoadModule {\n constructor(...args) {\n super(...args);\n }\n}\n\nconst ready = () => {\n customElements.define(\"load-module\", LoadModule);\n customElements.define(\"l-m\", LM);\n window.removeEventListener(\"load\", ready);\n};\n\nif (document.readyState === \"complete\") {\n ready();\n} else {\n window.addEventListener(\"load\", ready);\n}\n","import lm from \"./main.mjs\";\nimport \"./component.mjs\";\nimport config, { path } from \"./config.mjs\";\nlm.config = config;\nlm.path = path;\nObject.freeze(lm);\n\nwindow.lm = lm;\n\nexport default lm;\n"],"names":["Onion","constructor","this","_middlewares","Map","use","middleware","oid","Math","random","toString","slice","set","unuse","delete","async","context","index","middlewares","Array","from","values","next","length","caches","wrapFetch","url","params","d","URL","reUrl","includes","origin","pathname","fetchObj","get","fetch","clone","processor","addHandler","name","handler","Function","forEach","ctx","result","notHttp","test","import","error","err","wrapError","realUrl","console","log","resp","status","Error","text","then","e","json","data","arrayBuffer","module","WebAssembly","compile","instance","Instance","exports","element","link","document","createElement","rel","href","root","getRootNode","f","head","append","appendChild","addEventListener","remove","removeEventListener","desc","aliasMap","path","moduleName","baseURI","startsWith","split","lastUrl","first","args","replace","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","event","Event","dispatchEvent","lm","meta","ourl","reurl","createLoad","Object","assign","LoadModule","HTMLElement","super","defineProperties","loaded","_init","__initSrc","attributes","hasOwnProperty","src","getAttribute","undefined","load","configurable","value","connectedCallback","CustomEvent","_root","disconnectedCallback","attributeChangedCallback","oldValue","newValue","warn","tagName","toLowerCase","setAttribute","observedAttributes","LM","ready","customElements","define","window","readyState","config","alias","entries","freeze"],"mappings":"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"} \ No newline at end of file diff --git a/dist/drill.mjs b/dist/drill.mjs index d280f64..e009e04 100644 --- a/dist/drill.mjs +++ b/dist/drill.mjs @@ -1,4 +1,4 @@ -//! drill.js - v5.3.4 https://github.com/kirakiray/drill.js (c) 2018-2023 YAO +//! drill.js - v5.3.5 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO const getOid = () => Math.random().toString(32).slice(2); class Onion { @@ -33,12 +33,16 @@ class Onion { } const caches = new Map(); -const wrapFetch = async (url) => { - let fetchObj = caches.get(url); +const wrapFetch = async (url, params) => { + const d = new URL(url); + + const reUrl = params.includes("-direct") ? url : `${d.origin}${d.pathname}`; + + let fetchObj = caches.get(reUrl); if (!fetchObj) { - fetchObj = fetch(url); - caches.set(url, fetchObj); + fetchObj = fetch(reUrl); + caches.set(reUrl, fetchObj); } const resp = await fetchObj; @@ -100,11 +104,11 @@ use(["mjs", "js"], async (ctx, next) => { use(["txt", "html", "htm"], async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; let resp; try { - resp = await wrapFetch(url); + resp = await wrapFetch(url, params); } catch (error) { throw wrapError(`Load ${url} failed`, error); } @@ -121,9 +125,9 @@ use(["txt", "html", "htm"], async (ctx, next) => { use("json", async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; - ctx.result = await wrapFetch(url).then((e) => e.json()); + ctx.result = await wrapFetch(url, params).then((e) => e.json()); } await next(); @@ -131,9 +135,9 @@ use("json", async (ctx, next) => { use("wasm", async (ctx, next) => { if (!ctx.result) { - const { url } = ctx; + const { url, params } = ctx; - const data = await wrapFetch(url).then((e) => e.arrayBuffer()); + const data = await wrapFetch(url, params).then((e) => e.arrayBuffer()); const module = await WebAssembly.compile(data); const instance = new WebAssembly.Instance(module); @@ -146,7 +150,7 @@ use("wasm", async (ctx, next) => { use("css", async (ctx, next) => { if (!ctx.result) { - const { url, element } = ctx; + const { url, element, params } = ctx; if (element) { const link = document.createElement("link"); @@ -170,7 +174,7 @@ use("css", async (ctx, next) => { }) ); } else { - ctx.result = await wrapFetch(url).then((e) => e.text()); + ctx.result = await wrapFetch(url, params).then((e) => e.text()); } } diff --git a/package-lock.json b/package-lock.json index bf74a57..e662ccc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "drill.js", - "version": "5.3.4", + "version": "5.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "drill.js", - "version": "5.3.4", + "version": "5.3.5", "license": "MIT", "dependencies": { "less": "^4.1.3", diff --git a/package.json b/package.json index 24f6c66..9d0c810 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "drill.js", - "version": "5.3.4", + "version": "5.3.5", "description": "A declarative modular framework that runs on the browser", "main": "dist/drill.js", "exports": {