diff --git a/dist/drill.js b/dist/drill.js index 0bb55b0..266737e 100644 --- a/dist/drill.js +++ b/dist/drill.js @@ -1,10 +1,110 @@ -//! drill.js - v5.3.8 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO +//! drill.js - v5.3.9 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) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.lm = factory()); })(this, (function () { 'use strict'; + // const error_origin = "http://127.0.0.1:5793/errors"; + const error_origin = "https://ofajs.github.io/ofa-errors/errors"; + + // 存放错误信息的数据对象 + const errors = {}; + + if (globalThis.navigator && navigator.language) { + let langFirst = navigator.language.toLowerCase().split("-")[0]; + + if (langFirst === "zh" && navigator.language.toLowerCase() !== "zh-cn") { + langFirst = "zhft"; + } + + (async () => { + if (localStorage["ofa-errors"]) { + const targetLangErrors = JSON.parse(localStorage["ofa-errors"]); + Object.assign(errors, targetLangErrors); + } + + const errCacheTime = localStorage["ofa-errors-time"]; + + if (!errCacheTime || Date.now() > Number(errCacheTime) + 5 * 60 * 1000) { + const targetLangErrors = await fetch(`${error_origin}/${langFirst}.json`) + .then((e) => e.json()) + .catch(() => null); + + if (targetLangErrors) { + localStorage["ofa-errors"] = JSON.stringify(targetLangErrors); + localStorage["ofa-errors-time"] = Date.now(); + } else { + targetLangErrors = await fetch(`${error_origin}/en.json`) + .then((e) => e.json()) + .catch((error) => { + console.error(error); + return null; + }); + } + + Object.assign(errors, targetLangErrors); + } + })(); + } + + let isSafari = false; + if (globalThis.navigator) { + isSafari = + navigator.userAgent.includes("Safari") && + !navigator.userAgent.includes("Chrome"); + } + + /** + * 根据键、选项和错误对象生成错误对象。 + * + * @param {string} key - 错误描述的键。 + * @param {Object} [options] - 映射相关值的选项对象。 + * @param {Error} [error] - 原始错误对象。 + * @returns {Error} 生成的错误对象。 + */ + const getErr = (key, options, error) => { + let desc = getErrDesc(key, options); + + let errObj; + if (error) { + if (isSafari) { + desc += `\nCaused by: ${error.toString()}\n ${error.stack.replace( + /\n/g, + "\n " + )}`; + } + errObj = new Error(desc, { cause: error }); + } else { + errObj = new Error(desc); + } + return errObj; + }; + + /** + * 根据键、选项生成错误描述 + * + * @param {string} key - 错误描述的键。 + * @param {Object} [options] - 映射相关值的选项对象。 + * @returns {string} 生成的错误描述。 + */ + const getErrDesc = (key, options) => { + if (!errors[key]) { + return `Error code: "${key}", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`; + } + + let desc = errors[key]; + + // 映射相关值 + if (options) { + for (let k in options) { + desc = desc.replace(new RegExp(`{${k}}`, "g"), options[k]); + } + } + + return desc; + }; + const getOid = () => Math.random().toString(32).slice(2); class Onion { @@ -92,13 +192,16 @@ ctx.result = await import(`${d.origin}${d.pathname}`); } } catch (error) { - const err = wrapError( - `Failed to load module ${ctx.realUrl || url}`, + const err = getErr( + "load_module", + { + url: ctx.realUrl || url, + }, error ); if (notHttp) { - console.log("Failed to load module:", ctx); + console.log("load failed:", ctx.realUrl || url, " ctx:", ctx); } throw err; @@ -116,11 +219,14 @@ try { resp = await wrapFetch(url, params); } catch (error) { - throw wrapError(`Load ${url} failed`, error); + throw getErr("load_fail", { url }, error); } if (!/^2.{2}$/.test(resp.status)) { - throw new Error(`Load ${url} failed: status code ${resp.status}`); + throw getErr("load_fail_status", { + url, + status: resp.status, + }); } ctx.result = await resp.text(); @@ -187,13 +293,6 @@ await next(); }); - const wrapError = (desc, error) => { - const err = new Error(`${desc} \n ${error.toString()}`, { - cause: error, - }); - return err; - }; - const aliasMap = {}; async function config(opts) { @@ -201,18 +300,25 @@ if (alias) { Object.entries(alias).forEach(([name, path]) => { - if (/^@.+/.test(name)) { - if (!aliasMap[name]) { - if (!/^\./.test(path)) { - aliasMap[name] = path; - } else { - throw new Error( - `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'` - ); - } + if (!/^@.+/.test(name)) { + throw getErr("config_alias_name_error", { + name, + }); + } + + if (!aliasMap[name]) { + if (!/^\./.test(path)) { + aliasMap[name] = path; } else { - throw new Error(`Alias already exists: '${name}'`); + throw getErr("alias_relate_name", { + name, + path, + }); } + } else { + throw getErr("alias_already", { + name, + }); } }); } @@ -234,7 +340,10 @@ if (aliasMap[first]) { lastUrl = [aliasMap[first].replace(/\/$/, ""), ...args].join("/"); } else { - throw new Error(`No alias defined ${first}`); + throw getErr("no_alias", { + name: first, + url: moduleName, + }); } } @@ -343,8 +452,15 @@ return createLoad(meta, opts); } - Object.assign(lm$1, { - use, + Object.defineProperties(lm$1, { + use: { + value: use, + }, + alias: { + get() { + return { ...aliasMap }; + }, + }, }); class LoadModule extends HTMLElement { diff --git a/dist/drill.min.js b/dist/drill.min.js index cd3b59d..24d9146 100644 --- a/dist/drill.min.js +++ b/dist/drill.min.js @@ -1,3 +1,3 @@ -//! drill.js - v5.3.8 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),a=s.includes("-direct")?t:`${n.origin}${n.pathname}`;let i=e.get(a);i||(i=fetch(a),e.set(a,i));return(await i).clone()},n={},a=(e,s)=>{(n[e]||(n[e]=new t)).use(s)},i=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{a(t,e)})):a(t,e)};i(["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=r(`Failed to load module ${t.realUrl||e}`,s);throw a&&console.log("Failed to load module:",t),n}}await e()})),i(["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 r(`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()})),i("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()})),i("wasm",(async(t,e)=>{if(!t.result){const{url:e,params:n}=t,a=await s(e,n).then((t=>t.arrayBuffer())),i=await WebAssembly.compile(a),r=new WebAssembly.Instance(i);t.result=r.exports}await e()})),i("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 r=(t,e)=>new Error(`${t} \n ${e.toString()}`,{cause:e}),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 new Error(`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 i,r=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?i=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(r=t.replace(/^\-\-real\:/,""))})),i||(i=a.slice(2+(a.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:r,...e},l=n[i];if(l)await l.run(o);else{const e=await fetch(t),s=e.headers.get("Content-Type"),a=[["application/javascript","js"],["application/json","json"],["text/html","html"],["text/xml","xml"]].find((t=>s.includes(t[0])));let i;a&&(i=n[a[1]]),i?await i.run(o):o.result=e}if(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 i=l(n,t.url);return d(i,{params:a,...e})}))(t,e)}Object.assign(u,{use:i});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)};return"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 new Error(`Alias already exists: '${t}'`);if(/^\./.test(e))throw new Error(`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.9 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";const t="https://ofajs.github.io/ofa-errors/errors",e={};if(globalThis.navigator&&navigator.language){let s=navigator.language.toLowerCase().split("-")[0];"zh"===s&&"zh-cn"!==navigator.language.toLowerCase()&&(s="zhft"),(async()=>{if(localStorage["ofa-errors"]){const t=JSON.parse(localStorage["ofa-errors"]);Object.assign(e,t)}const a=localStorage["ofa-errors-time"];if(!a||Date.now()>Number(a)+3e5){const a=await fetch(`${t}/${s}.json`).then((t=>t.json())).catch((()=>null));a?(localStorage["ofa-errors"]=JSON.stringify(a),localStorage["ofa-errors-time"]=Date.now()):a=await fetch(`${t}/en.json`).then((t=>t.json())).catch((t=>(console.error(t),null))),Object.assign(e,a)}})()}let s=!1;globalThis.navigator&&(s=navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome"));const a=(t,e,a)=>{let r,o=n(t,e);return a?(s&&(o+=`\nCaused by: ${a.toString()}\n ${a.stack.replace(/\n/g,"\n ")}`),r=new Error(o,{cause:a})):r=new Error(o),r},n=(t,s)=>{if(!e[t])return`Error code: "${t}", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`;let a=e[t];if(s)for(let t in s)a=a.replace(new RegExp(`{${t}}`,"g"),s[t]);return a};class r{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()),a=async()=>{e++,e{const s=new URL(t),a=e.includes("-direct")?t:`${s.origin}${s.pathname}`;let n=o.get(a);n||(n=fetch(a),o.set(a,n));return(await n).clone()},l={},c=(t,e)=>{(l[t]||(l[t]=new r)).use(e)},u=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{c(t,e)})):c(t,e)};u(["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=a("load_module",{url:t.realUrl||e},s);throw r&&console.log("load failed:",t.realUrl||e," ctx:",t),n}}await e()})),u(["txt","html","htm"],(async(t,e)=>{if(!t.result){const{url:e,params:s}=t;let n;try{n=await i(e,s)}catch(t){throw a("load_fail",{url:e},t)}if(!/^2.{2}$/.test(n.status))throw a("load_fail_status",{url:e,status:n.status});t.result=await n.text()}await e()})),u("json",(async(t,e)=>{if(!t.result){const{url:e,params:s}=t;t.result=await i(e,s).then((t=>t.json()))}await e()})),u("wasm",(async(t,e)=>{if(!t.result){const{url:e,params:s}=t,a=await i(e,s).then((t=>t.arrayBuffer())),n=await WebAssembly.compile(a),r=new WebAssembly.Instance(n);t.result=r.exports}await e()})),u("css",(async(t,e)=>{if(!t.result){const{url:e,element:s,params:a}=t;if(s){const t=document.createElement("link");t.rel="stylesheet",t.href=e;const a=s.getRootNode();let n;a===document?a.head.append(t):a.appendChild(t),s.addEventListener("disconnected",n=e=>{t.remove(),s.removeEventListener("disconnected",n)})}else t.result=await i(e,a).then((t=>t.text()))}await e()}));const d={};const h=(t,e)=>{if(t.startsWith("http://")||t.startsWith("https://"))return t;const[s,...n]=t.split(" ");let r=s;if(/^@/.test(s)){const[e,...n]=s.split("/");if(!d[e])throw a("no_alias",{name:e,url:t});r=[d[e].replace(/\/$/,""),...n].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},f=Symbol("loaded"),m=async(t,e)=>{const s=new URL(t),{pathname:a}=s;let n,r=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?n=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(r=t.replace(/^\-\-real\:/,""))})),n||(n=a.slice(2+(a.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:r,...e},i=l[n];if(i)await i.run(o);else{const e=await fetch(t),s=e.headers.get("Content-Type"),a=[["application/javascript","js"],["application/json","json"],["text/html","html"],["text/xml","xml"]].find((t=>s.includes(t[0])));let n;a&&(n=l[a[1]]),n?await n.run(o):o.result=e}if(e&&e.element){const{element:t}=e;t[f]=!0;const s=new Event("load");t.dispatchEvent(s)}return e.params&&e.params.includes("-ctx")?o:o.result};function p(t,e){return((t,e)=>(t||(t={url:document.location.href}),s=>{let[a,...n]=s.split(" ");const r=h(a,t.url);return m(r,{params:n,...e})}))(t,e)}Object.defineProperties(p,{use:{value:u},alias:{get:()=>({...d})}});class w extends HTMLElement{constructor(...t){super(...t),this[f]=!1,Object.defineProperties(this,{loaded:{get:()=>this[f]}}),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 g extends w{constructor(...t){super(...t)}}const b=()=>{customElements.define("load-module",w),customElements.define("l-m",g),window.removeEventListener("load",b)};return"complete"===document.readyState?b():window.addEventListener("load",b),p.config=async function(t){const{alias:e}=t;return e&&Object.entries(e).forEach((([t,e])=>{if(!/^@.+/.test(t))throw a("config_alias_name_error",{name:t});if(d[t])throw a("alias_already",{name:t});if(/^\./.test(e))throw a("alias_relate_name",{name:t,path:e});d[t]=e})),!0},p.path=h,Object.freeze(p),window.lm=p,p})); //# sourceMappingURL=drill.min.js.map diff --git a/dist/drill.min.js.map b/dist/drill.min.js.map index d77f65b..cf9c57c 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();\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 cause: error,\n });\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 new Error(\n `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'`\n );\n }\n } else {\n throw new Error(`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 new Error(`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 const result = await fetch(url);\n const contentType = result.headers.get(\"Content-Type\");\n\n const targetMapObject = [\n [\"application/javascript\", \"js\"],\n [\"application/json\", \"json\"],\n [\"text/html\", \"html\"],\n [\"text/xml\", \"xml\"],\n ].find((e) => contentType.includes(e[0]));\n\n let newOni;\n if (targetMapObject) {\n newOni = processor[targetMapObject[1]];\n }\n\n if (newOni) {\n await newOni.run(ctx);\n } else {\n ctx.result = result;\n }\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","cause","aliasMap","path","moduleName","baseURI","startsWith","split","lastUrl","first","args","replace","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","contentType","headers","targetMapObject","find","newOni","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":["../ofa-error/main.js","../src/onion.mjs","../src/use.mjs","../src/config.mjs","../src/main.mjs","../src/component.mjs","../src/base.mjs"],"sourcesContent":["// const error_origin = \"http://127.0.0.1:5793/errors\";\nconst error_origin = \"https://ofajs.github.io/ofa-errors/errors\";\n\n// 存放错误信息的数据对象\nconst errors = {};\n\nif (globalThis.navigator && navigator.language) {\n let langFirst = navigator.language.toLowerCase().split(\"-\")[0];\n\n if (langFirst === \"zh\" && navigator.language.toLowerCase() !== \"zh-cn\") {\n langFirst = \"zhft\";\n }\n\n (async () => {\n if (localStorage[\"ofa-errors\"]) {\n const targetLangErrors = JSON.parse(localStorage[\"ofa-errors\"]);\n Object.assign(errors, targetLangErrors);\n }\n\n const errCacheTime = localStorage[\"ofa-errors-time\"];\n\n if (!errCacheTime || Date.now() > Number(errCacheTime) + 5 * 60 * 1000) {\n const targetLangErrors = await fetch(`${error_origin}/${langFirst}.json`)\n .then((e) => e.json())\n .catch(() => null);\n\n if (targetLangErrors) {\n localStorage[\"ofa-errors\"] = JSON.stringify(targetLangErrors);\n localStorage[\"ofa-errors-time\"] = Date.now();\n } else {\n targetLangErrors = await fetch(`${error_origin}/en.json`)\n .then((e) => e.json())\n .catch((error) => {\n console.error(error);\n return null;\n });\n }\n\n Object.assign(errors, targetLangErrors);\n }\n })();\n}\n\nlet isSafari = false;\nif (globalThis.navigator) {\n isSafari =\n navigator.userAgent.includes(\"Safari\") &&\n !navigator.userAgent.includes(\"Chrome\");\n}\n\n/**\n * 根据键、选项和错误对象生成错误对象。\n *\n * @param {string} key - 错误描述的键。\n * @param {Object} [options] - 映射相关值的选项对象。\n * @param {Error} [error] - 原始错误对象。\n * @returns {Error} 生成的错误对象。\n */\nexport const getErr = (key, options, error) => {\n let desc = getErrDesc(key, options);\n\n let errObj;\n if (error) {\n if (isSafari) {\n desc += `\\nCaused by: ${error.toString()}\\n ${error.stack.replace(\n /\\n/g,\n \"\\n \"\n )}`;\n }\n errObj = new Error(desc, { cause: error });\n } else {\n errObj = new Error(desc);\n }\n return errObj;\n};\n\n/**\n * 根据键、选项生成错误描述\n *\n * @param {string} key - 错误描述的键。\n * @param {Object} [options] - 映射相关值的选项对象。\n * @returns {string} 生成的错误描述。\n */\nexport const getErrDesc = (key, options) => {\n if (!errors[key]) {\n return `Error code: \"${key}\", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`;\n }\n\n let desc = errors[key];\n\n // 映射相关值\n if (options) {\n for (let k in options) {\n desc = desc.replace(new RegExp(`{${k}}`, \"g\"), options[k]);\n }\n }\n\n return desc;\n};\n","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 { getErr } from \"../ofa-error/main.js\";\nimport 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 = getErr(\n \"load_module\",\n {\n url: ctx.realUrl || url,\n },\n error\n );\n\n if (notHttp) {\n console.log(\"load failed:\", ctx.realUrl || url, \" ctx:\", 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 getErr(\"load_fail\", { url }, error);\n }\n\n if (!/^2.{2}$/.test(resp.status)) {\n throw getErr(\"load_fail_status\", {\n url,\n status: resp.status,\n });\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","import { getErr } from \"../ofa-error/main.js\";\n\nexport 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 throw getErr(\"config_alias_name_error\", {\n name,\n });\n }\n\n if (!aliasMap[name]) {\n if (!/^\\./.test(path)) {\n aliasMap[name] = path;\n } else {\n throw getErr(\"alias_relate_name\", {\n name,\n path,\n });\n }\n } else {\n throw getErr(\"alias_already\", {\n 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 getErr(\"no_alias\", {\n name: first,\n url: moduleName,\n });\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 const result = await fetch(url);\n const contentType = result.headers.get(\"Content-Type\");\n\n const targetMapObject = [\n [\"application/javascript\", \"js\"],\n [\"application/json\", \"json\"],\n [\"text/html\", \"html\"],\n [\"text/xml\", \"xml\"],\n ].find((e) => contentType.includes(e[0]));\n\n let newOni;\n if (targetMapObject) {\n newOni = processor[targetMapObject[1]];\n }\n\n if (newOni) {\n await newOni.run(ctx);\n } else {\n ctx.result = result;\n }\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.defineProperties(lm, {\n use: {\n value: use,\n },\n alias: {\n get() {\n return { ...aliasMap };\n },\n },\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":["error_origin","errors","globalThis","navigator","language","langFirst","toLowerCase","split","localStorage","targetLangErrors","JSON","parse","Object","assign","errCacheTime","Date","now","Number","fetch","then","e","json","catch","stringify","error","console","isSafari","userAgent","includes","getErr","key","options","errObj","desc","getErrDesc","toString","stack","replace","Error","cause","k","RegExp","Onion","constructor","this","_middlewares","Map","use","middleware","oid","Math","random","slice","set","unuse","delete","async","context","index","middlewares","Array","from","values","next","length","caches","wrapFetch","url","params","d","URL","reUrl","origin","pathname","fetchObj","get","clone","processor","addHandler","name","handler","Function","forEach","ctx","result","notHttp","test","import","err","realUrl","log","resp","status","text","data","arrayBuffer","module","WebAssembly","compile","instance","Instance","exports","element","link","document","createElement","rel","href","root","getRootNode","f","head","append","appendChild","addEventListener","remove","removeEventListener","aliasMap","path","moduleName","baseURI","startsWith","lastUrl","first","args","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","contentType","headers","targetMapObject","find","newOni","event","Event","dispatchEvent","lm","meta","ourl","reurl","createLoad","defineProperties","value","alias","LoadModule","HTMLElement","super","loaded","_init","__initSrc","attributes","hasOwnProperty","src","getAttribute","undefined","load","configurable","connectedCallback","CustomEvent","_root","disconnectedCallback","attributeChangedCallback","oldValue","newValue","warn","tagName","setAttribute","observedAttributes","LM","ready","customElements","define","window","readyState","config","entries","freeze"],"mappings":"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"} \ No newline at end of file diff --git a/dist/drill.min.mjs b/dist/drill.min.mjs index fd11543..d7980cc 100644 --- a/dist/drill.min.mjs +++ b/dist/drill.min.mjs @@ -1,3 +1,3 @@ -//! drill.js - v5.3.8 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)=>new Error(`${t} \n ${e.toString()}`,{cause:e}),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 new Error(`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);else{const e=await fetch(t),s=e.headers.get("Content-Type"),a=[["application/javascript","js"],["application/json","json"],["text/html","html"],["text/xml","xml"]].find((t=>s.includes(t[0])));let r;a&&(r=n[a[1]]),r?await r.run(o):o.result=e}if(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 new Error(`Alias already exists: '${t}'`);if(/^\./.test(e))throw new Error(`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.9 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO +const t="https://ofajs.github.io/ofa-errors/errors",e={};if(globalThis.navigator&&navigator.language){let a=navigator.language.toLowerCase().split("-")[0];"zh"===a&&"zh-cn"!==navigator.language.toLowerCase()&&(a="zhft"),(async()=>{if(localStorage["ofa-errors"]){const t=JSON.parse(localStorage["ofa-errors"]);Object.assign(e,t)}const s=localStorage["ofa-errors-time"];if(!s||Date.now()>Number(s)+3e5){const s=await fetch(`${t}/${a}.json`).then((t=>t.json())).catch((()=>null));s?(localStorage["ofa-errors"]=JSON.stringify(s),localStorage["ofa-errors-time"]=Date.now()):s=await fetch(`${t}/en.json`).then((t=>t.json())).catch((t=>(console.error(t),null))),Object.assign(e,s)}})()}let a=!1;globalThis.navigator&&(a=navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome"));const s=(t,e,s)=>{let r,o=n(t,e);return s?(a&&(o+=`\nCaused by: ${s.toString()}\n ${s.stack.replace(/\n/g,"\n ")}`),r=new Error(o,{cause:s})):r=new Error(o),r},n=(t,a)=>{if(!e[t])return`Error code: "${t}", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`;let s=e[t];if(a)for(let t in a)s=s.replace(new RegExp(`{${t}}`,"g"),a[t]);return s};class r{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 a=Array.from(this._middlewares.values()),s=async()=>{e++,e{const a=new URL(t),s=e.includes("-direct")?t:`${a.origin}${a.pathname}`;let n=o.get(s);n||(n=fetch(s),o.set(s,n));return(await n).clone()},l={},c=(t,e)=>{(l[t]||(l[t]=new r)).use(e)},u=(t,e)=>{t instanceof Function&&(e=t,t=["js","mjs"]),t instanceof Array?t.forEach((t=>{c(t,e)})):c(t,e)};u(["mjs","js"],(async(t,e)=>{if(!t.result){const{url:e,params:a}=t,n=new URL(e),r=/^blob:/.test(e)||/^data:/.test(e);try{r||a.includes("-direct")?t.result=await import(e):t.result=await import(`${n.origin}${n.pathname}`)}catch(a){const n=s("load_module",{url:t.realUrl||e},a);throw r&&console.log("load failed:",t.realUrl||e," ctx:",t),n}}await e()})),u(["txt","html","htm"],(async(t,e)=>{if(!t.result){const{url:e,params:a}=t;let n;try{n=await i(e,a)}catch(t){throw s("load_fail",{url:e},t)}if(!/^2.{2}$/.test(n.status))throw s("load_fail_status",{url:e,status:n.status});t.result=await n.text()}await e()})),u("json",(async(t,e)=>{if(!t.result){const{url:e,params:a}=t;t.result=await i(e,a).then((t=>t.json()))}await e()})),u("wasm",(async(t,e)=>{if(!t.result){const{url:e,params:a}=t,s=await i(e,a).then((t=>t.arrayBuffer())),n=await WebAssembly.compile(s),r=new WebAssembly.Instance(n);t.result=r.exports}await e()})),u("css",(async(t,e)=>{if(!t.result){const{url:e,element:a,params:s}=t;if(a){const t=document.createElement("link");t.rel="stylesheet",t.href=e;const s=a.getRootNode();let n;s===document?s.head.append(t):s.appendChild(t),a.addEventListener("disconnected",n=e=>{t.remove(),a.removeEventListener("disconnected",n)})}else t.result=await i(e,s).then((t=>t.text()))}await e()}));const h={};const d=(t,e)=>{if(t.startsWith("http://")||t.startsWith("https://"))return t;const[a,...n]=t.split(" ");let r=a;if(/^@/.test(a)){const[e,...n]=a.split("/");if(!h[e])throw s("no_alias",{name:e,url:t});r=[h[e].replace(/\/$/,""),...n].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},f=Symbol("loaded"),m=async(t,e)=>{const a=new URL(t),{pathname:s}=a;let n,r=null;e.params&&e.params.forEach((t=>{/^\..+/.test(t)?n=t.replace(/^\.(.+)/,"$1"):/^\-\-real/.test(t)&&(r=t.replace(/^\-\-real\:/,""))})),n||(n=s.slice(2+(s.lastIndexOf(".")-1>>>0)));const o={url:t,result:null,realUrl:r,...e},i=l[n];if(i)await i.run(o);else{const e=await fetch(t),a=e.headers.get("Content-Type"),s=[["application/javascript","js"],["application/json","json"],["text/html","html"],["text/xml","xml"]].find((t=>a.includes(t[0])));let n;s&&(n=l[s[1]]),n?await n.run(o):o.result=e}if(e&&e.element){const{element:t}=e;t[f]=!0;const a=new Event("load");t.dispatchEvent(a)}return e.params&&e.params.includes("-ctx")?o:o.result};function p(t,e){return((t,e)=>(t||(t={url:document.location.href}),a=>{let[s,...n]=a.split(" ");const r=d(s,t.url);return m(r,{params:n,...e})}))(t,e)}Object.defineProperties(p,{use:{value:u},alias:{get:()=>({...h})}});class w extends HTMLElement{constructor(...t){super(...t),this[f]=!1,Object.defineProperties(this,{loaded:{get:()=>this[f]}}),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,a){"src"===t?a&&null===e?this._init():this.__initSrc&&e&&a!==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===a&&this._init()}static get observedAttributes(){return["src","pause"]}}class g extends w{constructor(...t){super(...t)}}const _=()=>{customElements.define("load-module",w),customElements.define("l-m",g),window.removeEventListener("load",_)};"complete"===document.readyState?_():window.addEventListener("load",_),p.config=async function(t){const{alias:e}=t;return e&&Object.entries(e).forEach((([t,e])=>{if(!/^@.+/.test(t))throw s("config_alias_name_error",{name:t});if(h[t])throw s("alias_already",{name:t});if(/^\./.test(e))throw s("alias_relate_name",{name:t,path:e});h[t]=e})),!0},p.path=d,Object.freeze(p),window.lm=p;export{p as default}; //# sourceMappingURL=drill.min.mjs.map diff --git a/dist/drill.min.mjs.map b/dist/drill.min.mjs.map index 3287dc4..cd8edcb 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();\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 cause: error,\n });\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 new Error(\n `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'`\n );\n }\n } else {\n throw new Error(`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 new Error(`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 const result = await fetch(url);\n const contentType = result.headers.get(\"Content-Type\");\n\n const targetMapObject = [\n [\"application/javascript\", \"js\"],\n [\"application/json\", \"json\"],\n [\"text/html\", \"html\"],\n [\"text/xml\", \"xml\"],\n ].find((e) => contentType.includes(e[0]));\n\n let newOni;\n if (targetMapObject) {\n newOni = processor[targetMapObject[1]];\n }\n\n if (newOni) {\n await newOni.run(ctx);\n } else {\n ctx.result = result;\n }\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","cause","aliasMap","path","moduleName","baseURI","startsWith","split","lastUrl","first","args","replace","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","contentType","headers","targetMapObject","find","newOni","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":["../ofa-error/main.js","../src/onion.mjs","../src/use.mjs","../src/config.mjs","../src/main.mjs","../src/component.mjs","../src/base.mjs"],"sourcesContent":["// const error_origin = \"http://127.0.0.1:5793/errors\";\nconst error_origin = \"https://ofajs.github.io/ofa-errors/errors\";\n\n// 存放错误信息的数据对象\nconst errors = {};\n\nif (globalThis.navigator && navigator.language) {\n let langFirst = navigator.language.toLowerCase().split(\"-\")[0];\n\n if (langFirst === \"zh\" && navigator.language.toLowerCase() !== \"zh-cn\") {\n langFirst = \"zhft\";\n }\n\n (async () => {\n if (localStorage[\"ofa-errors\"]) {\n const targetLangErrors = JSON.parse(localStorage[\"ofa-errors\"]);\n Object.assign(errors, targetLangErrors);\n }\n\n const errCacheTime = localStorage[\"ofa-errors-time\"];\n\n if (!errCacheTime || Date.now() > Number(errCacheTime) + 5 * 60 * 1000) {\n const targetLangErrors = await fetch(`${error_origin}/${langFirst}.json`)\n .then((e) => e.json())\n .catch(() => null);\n\n if (targetLangErrors) {\n localStorage[\"ofa-errors\"] = JSON.stringify(targetLangErrors);\n localStorage[\"ofa-errors-time\"] = Date.now();\n } else {\n targetLangErrors = await fetch(`${error_origin}/en.json`)\n .then((e) => e.json())\n .catch((error) => {\n console.error(error);\n return null;\n });\n }\n\n Object.assign(errors, targetLangErrors);\n }\n })();\n}\n\nlet isSafari = false;\nif (globalThis.navigator) {\n isSafari =\n navigator.userAgent.includes(\"Safari\") &&\n !navigator.userAgent.includes(\"Chrome\");\n}\n\n/**\n * 根据键、选项和错误对象生成错误对象。\n *\n * @param {string} key - 错误描述的键。\n * @param {Object} [options] - 映射相关值的选项对象。\n * @param {Error} [error] - 原始错误对象。\n * @returns {Error} 生成的错误对象。\n */\nexport const getErr = (key, options, error) => {\n let desc = getErrDesc(key, options);\n\n let errObj;\n if (error) {\n if (isSafari) {\n desc += `\\nCaused by: ${error.toString()}\\n ${error.stack.replace(\n /\\n/g,\n \"\\n \"\n )}`;\n }\n errObj = new Error(desc, { cause: error });\n } else {\n errObj = new Error(desc);\n }\n return errObj;\n};\n\n/**\n * 根据键、选项生成错误描述\n *\n * @param {string} key - 错误描述的键。\n * @param {Object} [options] - 映射相关值的选项对象。\n * @returns {string} 生成的错误描述。\n */\nexport const getErrDesc = (key, options) => {\n if (!errors[key]) {\n return `Error code: \"${key}\", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`;\n }\n\n let desc = errors[key];\n\n // 映射相关值\n if (options) {\n for (let k in options) {\n desc = desc.replace(new RegExp(`{${k}}`, \"g\"), options[k]);\n }\n }\n\n return desc;\n};\n","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 { getErr } from \"../ofa-error/main.js\";\nimport 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 = getErr(\n \"load_module\",\n {\n url: ctx.realUrl || url,\n },\n error\n );\n\n if (notHttp) {\n console.log(\"load failed:\", ctx.realUrl || url, \" ctx:\", 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 getErr(\"load_fail\", { url }, error);\n }\n\n if (!/^2.{2}$/.test(resp.status)) {\n throw getErr(\"load_fail_status\", {\n url,\n status: resp.status,\n });\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","import { getErr } from \"../ofa-error/main.js\";\n\nexport 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 throw getErr(\"config_alias_name_error\", {\n name,\n });\n }\n\n if (!aliasMap[name]) {\n if (!/^\\./.test(path)) {\n aliasMap[name] = path;\n } else {\n throw getErr(\"alias_relate_name\", {\n name,\n path,\n });\n }\n } else {\n throw getErr(\"alias_already\", {\n 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 getErr(\"no_alias\", {\n name: first,\n url: moduleName,\n });\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 const result = await fetch(url);\n const contentType = result.headers.get(\"Content-Type\");\n\n const targetMapObject = [\n [\"application/javascript\", \"js\"],\n [\"application/json\", \"json\"],\n [\"text/html\", \"html\"],\n [\"text/xml\", \"xml\"],\n ].find((e) => contentType.includes(e[0]));\n\n let newOni;\n if (targetMapObject) {\n newOni = processor[targetMapObject[1]];\n }\n\n if (newOni) {\n await newOni.run(ctx);\n } else {\n ctx.result = result;\n }\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.defineProperties(lm, {\n use: {\n value: use,\n },\n alias: {\n get() {\n return { ...aliasMap };\n },\n },\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":["error_origin","errors","globalThis","navigator","language","langFirst","toLowerCase","split","localStorage","targetLangErrors","JSON","parse","Object","assign","errCacheTime","Date","now","Number","fetch","then","e","json","catch","stringify","error","console","isSafari","userAgent","includes","getErr","key","options","errObj","desc","getErrDesc","toString","stack","replace","Error","cause","k","RegExp","Onion","constructor","this","_middlewares","Map","use","middleware","oid","Math","random","slice","set","unuse","delete","async","context","index","middlewares","Array","from","values","next","length","caches","wrapFetch","url","params","d","URL","reUrl","origin","pathname","fetchObj","get","clone","processor","addHandler","name","handler","Function","forEach","ctx","result","notHttp","test","import","err","realUrl","log","resp","status","text","data","arrayBuffer","module","WebAssembly","compile","instance","Instance","exports","element","link","document","createElement","rel","href","root","getRootNode","f","head","append","appendChild","addEventListener","remove","removeEventListener","aliasMap","path","moduleName","baseURI","startsWith","lastUrl","first","args","join","location","base","LOADED","Symbol","agent","opts","urldata","type","lastIndexOf","oni","run","contentType","headers","targetMapObject","find","newOni","event","Event","dispatchEvent","lm","meta","ourl","reurl","createLoad","defineProperties","value","alias","LoadModule","HTMLElement","super","loaded","_init","__initSrc","attributes","hasOwnProperty","src","getAttribute","undefined","load","configurable","connectedCallback","CustomEvent","_root","disconnectedCallback","attributeChangedCallback","oldValue","newValue","warn","tagName","setAttribute","observedAttributes","LM","ready","customElements","define","window","readyState","config","entries","freeze"],"mappings":"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"} \ No newline at end of file diff --git a/dist/drill.mjs b/dist/drill.mjs index 946abd8..c461c63 100644 --- a/dist/drill.mjs +++ b/dist/drill.mjs @@ -1,4 +1,104 @@ -//! drill.js - v5.3.8 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO +//! drill.js - v5.3.9 https://github.com/kirakiray/drill.js (c) 2018-2024 YAO +// const error_origin = "http://127.0.0.1:5793/errors"; +const error_origin = "https://ofajs.github.io/ofa-errors/errors"; + +// 存放错误信息的数据对象 +const errors = {}; + +if (globalThis.navigator && navigator.language) { + let langFirst = navigator.language.toLowerCase().split("-")[0]; + + if (langFirst === "zh" && navigator.language.toLowerCase() !== "zh-cn") { + langFirst = "zhft"; + } + + (async () => { + if (localStorage["ofa-errors"]) { + const targetLangErrors = JSON.parse(localStorage["ofa-errors"]); + Object.assign(errors, targetLangErrors); + } + + const errCacheTime = localStorage["ofa-errors-time"]; + + if (!errCacheTime || Date.now() > Number(errCacheTime) + 5 * 60 * 1000) { + const targetLangErrors = await fetch(`${error_origin}/${langFirst}.json`) + .then((e) => e.json()) + .catch(() => null); + + if (targetLangErrors) { + localStorage["ofa-errors"] = JSON.stringify(targetLangErrors); + localStorage["ofa-errors-time"] = Date.now(); + } else { + targetLangErrors = await fetch(`${error_origin}/en.json`) + .then((e) => e.json()) + .catch((error) => { + console.error(error); + return null; + }); + } + + Object.assign(errors, targetLangErrors); + } + })(); +} + +let isSafari = false; +if (globalThis.navigator) { + isSafari = + navigator.userAgent.includes("Safari") && + !navigator.userAgent.includes("Chrome"); +} + +/** + * 根据键、选项和错误对象生成错误对象。 + * + * @param {string} key - 错误描述的键。 + * @param {Object} [options] - 映射相关值的选项对象。 + * @param {Error} [error] - 原始错误对象。 + * @returns {Error} 生成的错误对象。 + */ +const getErr = (key, options, error) => { + let desc = getErrDesc(key, options); + + let errObj; + if (error) { + if (isSafari) { + desc += `\nCaused by: ${error.toString()}\n ${error.stack.replace( + /\n/g, + "\n " + )}`; + } + errObj = new Error(desc, { cause: error }); + } else { + errObj = new Error(desc); + } + return errObj; +}; + +/** + * 根据键、选项生成错误描述 + * + * @param {string} key - 错误描述的键。 + * @param {Object} [options] - 映射相关值的选项对象。 + * @returns {string} 生成的错误描述。 + */ +const getErrDesc = (key, options) => { + if (!errors[key]) { + return `Error code: "${key}", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`; + } + + let desc = errors[key]; + + // 映射相关值 + if (options) { + for (let k in options) { + desc = desc.replace(new RegExp(`{${k}}`, "g"), options[k]); + } + } + + return desc; +}; + const getOid = () => Math.random().toString(32).slice(2); class Onion { @@ -86,13 +186,16 @@ use(["mjs", "js"], async (ctx, next) => { ctx.result = await import(`${d.origin}${d.pathname}`); } } catch (error) { - const err = wrapError( - `Failed to load module ${ctx.realUrl || url}`, + const err = getErr( + "load_module", + { + url: ctx.realUrl || url, + }, error ); if (notHttp) { - console.log("Failed to load module:", ctx); + console.log("load failed:", ctx.realUrl || url, " ctx:", ctx); } throw err; @@ -110,11 +213,14 @@ use(["txt", "html", "htm"], async (ctx, next) => { try { resp = await wrapFetch(url, params); } catch (error) { - throw wrapError(`Load ${url} failed`, error); + throw getErr("load_fail", { url }, error); } if (!/^2.{2}$/.test(resp.status)) { - throw new Error(`Load ${url} failed: status code ${resp.status}`); + throw getErr("load_fail_status", { + url, + status: resp.status, + }); } ctx.result = await resp.text(); @@ -181,13 +287,6 @@ use("css", async (ctx, next) => { await next(); }); -const wrapError = (desc, error) => { - const err = new Error(`${desc} \n ${error.toString()}`, { - cause: error, - }); - return err; -}; - const aliasMap = {}; async function config(opts) { @@ -195,18 +294,25 @@ async function config(opts) { if (alias) { Object.entries(alias).forEach(([name, path]) => { - if (/^@.+/.test(name)) { - if (!aliasMap[name]) { - if (!/^\./.test(path)) { - aliasMap[name] = path; - } else { - throw new Error( - `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'` - ); - } + if (!/^@.+/.test(name)) { + throw getErr("config_alias_name_error", { + name, + }); + } + + if (!aliasMap[name]) { + if (!/^\./.test(path)) { + aliasMap[name] = path; } else { - throw new Error(`Alias already exists: '${name}'`); + throw getErr("alias_relate_name", { + name, + path, + }); } + } else { + throw getErr("alias_already", { + name, + }); } }); } @@ -228,7 +334,10 @@ const path = (moduleName, baseURI) => { if (aliasMap[first]) { lastUrl = [aliasMap[first].replace(/\/$/, ""), ...args].join("/"); } else { - throw new Error(`No alias defined ${first}`); + throw getErr("no_alias", { + name: first, + url: moduleName, + }); } } @@ -337,8 +446,15 @@ function lm$1(meta, opts) { return createLoad(meta, opts); } -Object.assign(lm$1, { - use, +Object.defineProperties(lm$1, { + use: { + value: use, + }, + alias: { + get() { + return { ...aliasMap }; + }, + }, }); class LoadModule extends HTMLElement { diff --git a/ofa-error/main.js b/ofa-error/main.js new file mode 100644 index 0000000..a59b10c --- /dev/null +++ b/ofa-error/main.js @@ -0,0 +1,99 @@ +// const error_origin = "http://127.0.0.1:5793/errors"; +const error_origin = "https://ofajs.github.io/ofa-errors/errors"; + +// 存放错误信息的数据对象 +const errors = {}; + +if (globalThis.navigator && navigator.language) { + let langFirst = navigator.language.toLowerCase().split("-")[0]; + + if (langFirst === "zh" && navigator.language.toLowerCase() !== "zh-cn") { + langFirst = "zhft"; + } + + (async () => { + if (localStorage["ofa-errors"]) { + const targetLangErrors = JSON.parse(localStorage["ofa-errors"]); + Object.assign(errors, targetLangErrors); + } + + const errCacheTime = localStorage["ofa-errors-time"]; + + if (!errCacheTime || Date.now() > Number(errCacheTime) + 5 * 60 * 1000) { + const targetLangErrors = await fetch(`${error_origin}/${langFirst}.json`) + .then((e) => e.json()) + .catch(() => null); + + if (targetLangErrors) { + localStorage["ofa-errors"] = JSON.stringify(targetLangErrors); + localStorage["ofa-errors-time"] = Date.now(); + } else { + targetLangErrors = await fetch(`${error_origin}/en.json`) + .then((e) => e.json()) + .catch((error) => { + console.error(error); + return null; + }); + } + + Object.assign(errors, targetLangErrors); + } + })(); +} + +let isSafari = false; +if (globalThis.navigator) { + isSafari = + navigator.userAgent.includes("Safari") && + !navigator.userAgent.includes("Chrome"); +} + +/** + * 根据键、选项和错误对象生成错误对象。 + * + * @param {string} key - 错误描述的键。 + * @param {Object} [options] - 映射相关值的选项对象。 + * @param {Error} [error] - 原始错误对象。 + * @returns {Error} 生成的错误对象。 + */ +export const getErr = (key, options, error) => { + let desc = getErrDesc(key, options); + + let errObj; + if (error) { + if (isSafari) { + desc += `\nCaused by: ${error.toString()}\n ${error.stack.replace( + /\n/g, + "\n " + )}`; + } + errObj = new Error(desc, { cause: error }); + } else { + errObj = new Error(desc); + } + return errObj; +}; + +/** + * 根据键、选项生成错误描述 + * + * @param {string} key - 错误描述的键。 + * @param {Object} [options] - 映射相关值的选项对象。 + * @returns {string} 生成的错误描述。 + */ +export const getErrDesc = (key, options) => { + if (!errors[key]) { + return `Error code: "${key}", please go to https://github.com/ofajs/ofa-errors to view the corresponding error information`; + } + + let desc = errors[key]; + + // 映射相关值 + if (options) { + for (let k in options) { + desc = desc.replace(new RegExp(`{${k}}`, "g"), options[k]); + } + } + + return desc; +}; diff --git a/package-lock.json b/package-lock.json index c1d0211..c600bbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "drill.js", - "version": "5.3.8", + "version": "5.3.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "drill.js", - "version": "5.3.8", + "version": "5.3.9", "license": "MIT", "dependencies": { "less": "^4.1.3", @@ -14,7 +14,7 @@ "typescript": "^5.1.3" }, "devDependencies": { - "@playwright/test": "^1.38.1", + "@playwright/test": "^1.45.1", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.1.0", @@ -29,9 +29,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -45,9 +45,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -61,9 +61,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -77,9 +77,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -93,9 +93,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -109,9 +109,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -125,9 +125,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -141,9 +141,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -157,9 +157,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" ], @@ -173,9 +173,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -189,9 +189,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -205,9 +205,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -221,9 +221,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -237,9 +237,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -253,9 +253,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -269,9 +269,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -285,9 +285,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -301,9 +301,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" ], @@ -317,9 +317,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -333,9 +333,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -349,9 +349,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -365,9 +365,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -445,18 +445,18 @@ "dev": true }, "node_modules/@playwright/test": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.1.tgz", - "integrity": "sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.1.tgz", + "integrity": "sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==", "dev": true, "dependencies": { - "playwright": "1.38.1" + "playwright": "1.45.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@rollup/plugin-commonjs": { @@ -940,13 +940,10 @@ } }, "node_modules/concordance/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -1108,9 +1105,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -1120,28 +1117,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/escape-html": { @@ -1201,9 +1198,9 @@ "dev": true }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -1597,18 +1594,6 @@ "get-func-name": "^2.0.0" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", @@ -1719,9 +1704,9 @@ "devOptional": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -1861,9 +1846,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -1899,39 +1884,39 @@ } }, "node_modules/playwright": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.1.tgz", - "integrity": "sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.1.tgz", + "integrity": "sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==", "dev": true, "dependencies": { - "playwright-core": "1.38.1" + "playwright-core": "1.45.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.1.tgz", - "integrity": "sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.1.tgz", + "integrity": "sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==", "dev": true, "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -1948,9 +1933,9 @@ } ], "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2070,9 +2055,9 @@ "dev": true }, "node_modules/rollup": { - "version": "3.21.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", - "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -2118,9 +2103,9 @@ "optional": true }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "optional": true, "bin": { "semver": "bin/semver" @@ -2179,9 +2164,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2366,14 +2351,14 @@ } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -2381,12 +2366,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -2399,6 +2388,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -2557,12 +2549,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/ylru": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", diff --git a/package.json b/package.json index 076e853..0355d2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "drill.js", - "version": "5.3.8", + "version": "5.3.9", "description": "A declarative modular framework that runs on the browser", "main": "dist/drill.js", "exports": { @@ -10,9 +10,9 @@ "scripts": { "bump": "node scripts/bump-version.js && npm run build && npm i", "build": "rollup -c", - "static-server": "node scripts/static-server", + "static": "node scripts/static-server", "test": "npm run playwright && npx vitest", - "playwright": "node scripts/playwright-test", + "playwright": "npx playwright test", "jest": "", "codegen": "npx playwright codegen localhost:3340/" }, @@ -21,7 +21,7 @@ "url": "git+https://github.com/kirakiray/drill.js.git" }, "devDependencies": { - "@playwright/test": "^1.38.1", + "@playwright/test": "^1.45.1", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.1.0", @@ -60,4 +60,4 @@ "loader", "es modules" ] -} \ No newline at end of file +} diff --git a/playwright.config.js b/playwright.config.js index 4bab16a..94b8fdf 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -5,13 +5,12 @@ const { defineConfig, devices } = require("@playwright/test"); * Read environment variables from file. * https://github.com/motdotla/dotenv */ -// require('dotenv').config(); +// require('dotenv').config({ path: path.resolve(__dirname, '.env') }); /** * @see https://playwright.dev/docs/test-configuration */ module.exports = defineConfig({ - // testDir: './test', testDir: "./", testMatch: ["**/*.spec.js"], /* Run tests in files in parallel */ @@ -31,6 +30,7 @@ module.exports = defineConfig({ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: "on-first-retry", + baseURL: "http://127.0.0.1:3340", }, /* Configure projects for major browsers */ @@ -67,14 +67,14 @@ module.exports = defineConfig({ // }, // { // name: 'Google Chrome', - // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, // }, ], /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // url: 'http://127.0.0.1:3000', - // reuseExistingServer: !process.env.CI, - // }, + webServer: { + command: "npm run static", + // url: "http://127.0.0.1:3340", + // reuseExistingServer: true, + }, }); diff --git a/scripts/playwright-test.js b/scripts/playwright-test.js deleted file mode 100644 index 633104e..0000000 --- a/scripts/playwright-test.js +++ /dev/null @@ -1,13 +0,0 @@ -const { server, home } = require("./static-server"); -const shell = require("shelljs"); - -// 运行命令行命令 -shell.exec(`npx playwright test`, function (code, stdout, stderr) { - console.log("Exit code:", code); - console.log("Program output:", stdout); - console.log("Program stderr:", stderr); - server.close(); - if (code !== 0) { - throw "run error"; - } -}); diff --git a/src/config.mjs b/src/config.mjs index 3e1626a..a753198 100644 --- a/src/config.mjs +++ b/src/config.mjs @@ -1,3 +1,5 @@ +import { getErr } from "../ofa-error/main.js"; + export const aliasMap = {}; export default async function config(opts) { @@ -5,18 +7,25 @@ export default async function config(opts) { if (alias) { Object.entries(alias).forEach(([name, path]) => { - if (/^@.+/.test(name)) { - if (!aliasMap[name]) { - if (!/^\./.test(path)) { - aliasMap[name] = path; - } else { - throw new Error( - `The address does not match the specification, please use '/' or or the beginning of the protocol: '${path}'` - ); - } + if (!/^@.+/.test(name)) { + throw getErr("config_alias_name_error", { + name, + }); + } + + if (!aliasMap[name]) { + if (!/^\./.test(path)) { + aliasMap[name] = path; } else { - throw new Error(`Alias already exists: '${name}'`); + throw getErr("alias_relate_name", { + name, + path, + }); } + } else { + throw getErr("alias_already", { + name, + }); } }); } @@ -38,7 +47,10 @@ export const path = (moduleName, baseURI) => { if (aliasMap[first]) { lastUrl = [aliasMap[first].replace(/\/$/, ""), ...args].join("/"); } else { - throw new Error(`No alias defined ${first}`); + throw getErr("no_alias", { + name: first, + url: moduleName, + }); } } diff --git a/src/main.mjs b/src/main.mjs index daa5b12..5c1babd 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -90,6 +90,13 @@ export default function lm(meta, opts) { return createLoad(meta, opts); } -Object.assign(lm, { - use, +Object.defineProperties(lm, { + use: { + value: use, + }, + alias: { + get() { + return { ...aliasMap }; + }, + }, }); diff --git a/src/use.mjs b/src/use.mjs index 282036e..71f4bde 100644 --- a/src/use.mjs +++ b/src/use.mjs @@ -1,3 +1,4 @@ +import { getErr } from "../ofa-error/main.js"; import Onion from "./onion.mjs"; export const caches = new Map(); @@ -54,13 +55,16 @@ use(["mjs", "js"], async (ctx, next) => { ctx.result = await import(`${d.origin}${d.pathname}`); } } catch (error) { - const err = wrapError( - `Failed to load module ${ctx.realUrl || url}`, + const err = getErr( + "load_module", + { + url: ctx.realUrl || url, + }, error ); if (notHttp) { - console.log("Failed to load module:", ctx); + console.log("load failed:", ctx.realUrl || url, " ctx:", ctx); } throw err; @@ -78,11 +82,14 @@ use(["txt", "html", "htm"], async (ctx, next) => { try { resp = await wrapFetch(url, params); } catch (error) { - throw wrapError(`Load ${url} failed`, error); + throw getErr("load_fail", { url }, error); } if (!/^2.{2}$/.test(resp.status)) { - throw new Error(`Load ${url} failed: status code ${resp.status}`); + throw getErr("load_fail_status", { + url, + status: resp.status, + }); } ctx.result = await resp.text(); @@ -148,10 +155,3 @@ use("css", async (ctx, next) => { await next(); }); - -const wrapError = (desc, error) => { - const err = new Error(`${desc} \n ${error.toString()}`, { - cause: error, - }); - return err; -}; diff --git a/test/load-module.spec.js b/test/load-module.spec.js new file mode 100644 index 0000000..70ee5e5 --- /dev/null +++ b/test/load-module.spec.js @@ -0,0 +1,78 @@ +const { test, expect } = require("@playwright/test"); + +test("load es module", async ({ page }) => { + await page.goto( + "http://localhost:3340/test/statics/load-module/es-module.html" + ); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + await expect(await page.innerText("body")).toBe("test module 1"); +}); + +test("load ctx", async ({ page }) => { + await page.goto("http://localhost:3340/test/statics/load-module/ctx.html"); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + await expect(await page.innerText("body")).toBe("test module 1"); +}); + +test("load txt", async ({ page }) => { + await page.goto("http://localhost:3340/test/statics/load-module/txt.html"); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + await expect(await page.innerText("body")).toBe("I am txt file"); +}); + +test("load json", async ({ page }) => { + await page.goto("http://localhost:3340/test/statics/load-module/json.html"); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + expect(await page.innerText("body")).toEqual( + JSON.stringify({ + name: "ccc json", + }) + ); +}); + +test("load wasm", async ({ page }) => { + await page.goto("http://localhost:3340/test/statics/load-module/wasm.html"); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + await expect(await page.innerText("body")).toBe("6-9"); +}); + +test("load css", async ({ page }) => { + await page.goto("http://localhost:3340/test/statics/load-module/css.html"); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + await expect(await page.innerText("body")).toBe( + "#test-ele { background-color: red; color: rgb(0, 0, 255); }" + ); +}); + +test("load lm-css", async ({ page }) => { + await page.goto("http://localhost:3340/test/statics/load-module/lm-css.html"); + + await new Promise((resolve) => setTimeout(resolve, 500)); + + // 获取 #test-ele 元素 + const testElement = await page.$("#test-ele"); + + // 获取背景色和字体颜色 + const backgroundColor = await testElement.evaluate((element) => { + return window.getComputedStyle(element).backgroundColor; + }); + + const color = await testElement.evaluate((element) => { + return window.getComputedStyle(element).color; + }); + + await expect(backgroundColor).toBe("rgb(255, 0, 0)"); + await expect(color).toBe("rgb(0, 0, 255)"); +}); diff --git a/test/main.spec.js b/test/main.spec.js index 7c02763..8c18ea9 100644 --- a/test/main.spec.js +++ b/test/main.spec.js @@ -1,14 +1,27 @@ const { test, expect } = require("@playwright/test"); -test("load module are all correct", async ({ page }) => { - await page.goto("http://localhost:3340/test/statics/load-module.html"); - - await new Promise((res) => setTimeout(res, 1200)); - - await expect((await page.$$(".jasmine-specs .jasmine-passed")).length).toBe( - 7 - ); -}); +// test("load module are all correct", async ({ page }) => { +// await page.goto("http://localhost:3340/test/statics/load-module.html"); + +// await page.evaluate(() => window.location.reload()); + +// await page.getByRole("link", { name: "• load in ctx mode" }).click(); +// await page.goBack(); +// await page.getByRole("link", { name: "• load css by element" }).click(); +// await page.goBack(); +// await page.getByRole("link", { name: "• load css succeed" }).click(); +// await page.goBack(); +// await page.getByRole("link", { name: "• load wasm succeed" }).click(); +// await page.goBack(); +// await page.getByRole("link", { name: "• load json succeed" }).click(); +// await page.goBack(); +// await page.getByRole("link", { name: "• load txt succeed" }).click(); +// await page.goBack(); +// await page.getByRole("link", { name: "• load es module succeed" }).click(); +// await page.goBack(); + +// await expect(true).toBe(true); +// }); test("use", async ({ page }) => { await page.goto("http://localhost:3340/test/statics/use.html"); @@ -38,7 +51,13 @@ test("use", async ({ page }) => { await expect(data2.length).toBe(3); }); -test("load module count with parameters", async ({ page }) => { +test("load module count with parameters", async ({ page, browserName }) => { + if (browserName === "firefox") { + // There are problems with the test cases in firefox, but there are no problems in real browsers. + test.skip(true, "Still working on Firefox"); + return; + } + await page.goto("http://localhost:3340/test/statics/cache.html"); await new Promise((res) => setTimeout(res, 100)); @@ -72,8 +91,8 @@ test("param type", async ({ page }) => { test("load alias path", async ({ page, browserName }) => { if (browserName === "firefox") { - // There are problems with the test cases in firefox, but there are no problems, so you don't need firefox to test them. - test.skip(true, "Still working on it"); + // There are problems with the test cases in firefox, but there are no problems in real browsers. + test.skip(true, "Still working on Firefox"); return; } diff --git a/test/statics/load-module.html b/test/statics/load-module.html deleted file mode 100644 index 91e16a2..0000000 --- a/test/statics/load-module.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - load module test - - - - - - - - - - - - - - diff --git a/test/statics/load-module/css.html b/test/statics/load-module/css.html new file mode 100644 index 0000000..f061f2d --- /dev/null +++ b/test/statics/load-module/css.html @@ -0,0 +1,19 @@ + + + + + + + load css + + + + + + diff --git a/test/statics/load-module/ctx.html b/test/statics/load-module/ctx.html new file mode 100644 index 0000000..3d5bc94 --- /dev/null +++ b/test/statics/load-module/ctx.html @@ -0,0 +1,17 @@ + + + + + + + load ctx + + + + + + diff --git a/test/statics/load-module/es-module.html b/test/statics/load-module/es-module.html new file mode 100644 index 0000000..62ff114 --- /dev/null +++ b/test/statics/load-module/es-module.html @@ -0,0 +1,17 @@ + + + + + + + load es module + + + + + + diff --git a/test/statics/load-module/json.html b/test/statics/load-module/json.html new file mode 100644 index 0000000..cfdcef6 --- /dev/null +++ b/test/statics/load-module/json.html @@ -0,0 +1,19 @@ + + + + + + + load json + + + + + + diff --git a/test/statics/load-module/lm-css.html b/test/statics/load-module/lm-css.html new file mode 100644 index 0000000..dfba753 --- /dev/null +++ b/test/statics/load-module/lm-css.html @@ -0,0 +1,14 @@ + + + + + + + load css + + + + +
test-ele
+ + diff --git a/test/statics/load-module/txt.html b/test/statics/load-module/txt.html new file mode 100644 index 0000000..310410b --- /dev/null +++ b/test/statics/load-module/txt.html @@ -0,0 +1,18 @@ + + + + + + + load txt + + + + + + diff --git a/test/statics/load-module/wasm.html b/test/statics/load-module/wasm.html new file mode 100644 index 0000000..1ff9372 --- /dev/null +++ b/test/statics/load-module/wasm.html @@ -0,0 +1,19 @@ + + + + + + + load wasm + + + + + + diff --git a/test/statics/self/load-module.js b/test/statics/self/load-module.js deleted file mode 100644 index 65b34c1..0000000 --- a/test/statics/self/load-module.js +++ /dev/null @@ -1,59 +0,0 @@ -const load = lm(import.meta); - -describe("load module", () => { - test("load es module succeed", async () => { - const data = await load("../esm/test-module1.mjs"); - - expect(data.val).toEqual("test module 1"); - }); - - test("load txt succeed", async () => { - const data = await load("../other/bbb.txt"); - - expect(data).toEqual("I am txt file"); - }); - - test("load json succeed", async () => { - const data = await load("../other/ccc.json"); - - expect(data).toEqual({ - name: "ccc json", - }); - }); - - test("load wasm succeed", async () => { - const { add, square } = await load("../other/wasm/test.wasm"); - - expect(add(3, 3)).toBe(6); - - expect(square(3, 3)).toBe(9); - }); - - test("load css succeed", async () => { - const cssContent = await load("../other/test.css"); - - expect(cssContent.includes("#test-ele")).toBe(true); - }); - - test("load css by element", async () => { - await new Promise((res) => setTimeout(res, 50)); - - expect(getComputedStyle(document.querySelector("#test-ele")).color).toBe( - "rgb(0, 0, 255)" - ); - - document.querySelector(`l-m[src="./other/test.css"]`).remove(); - - await new Promise((res) => setTimeout(res, 1)); - - expect(getComputedStyle(document.querySelector("#test-ele")).color).toBe( - "rgb(0, 0, 0)" - ); - }); - - test("load in ctx mode", async () => { - const ctx = await load("../esm/test-module1.mjs -ctx"); - - expect(ctx.result.val).toEqual("test module 1"); - }); -}); diff --git a/test/statics/simple-test.html b/test/statics/simple-test.html new file mode 100644 index 0000000..adfdbcd --- /dev/null +++ b/test/statics/simple-test.html @@ -0,0 +1,21 @@ + + + + + + simple test + + + + + + +