From 64106cfd3995a2488e8c3880b259be48b8c9b59e Mon Sep 17 00:00:00 2001 From: Martin Rocek Date: Fri, 23 Dec 2022 00:49:06 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=96=20(Release):=203.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - README.md | 16 +- dist/env.d.ts | 1 + dist/silent-box.cjs.js | 1 + dist/silent-box.es.js | 282 ++++++ dist/silent-box.iife.js | 1 + dist/silent-box.umd.js | 1 + dist/src/components/SilentBoxGallery.vue.d.ts | 139 +++ dist/src/components/SilentBoxOverlay.vue.d.ts | 72 ++ dist/src/main.d.ts | 3 + dist/src/shims.vue.d.ts | 5 + dist/src/types.d.ts | 14 + dist/src/utils/httpUtils.d.ts | 8 + dist/src/utils/itemUtils.d.ts | 29 + dist/src/utils/videoUtils.d.ts | 14 + dist/style.css | 1 + package-lock.json | 925 +++++++++++++++++- package.json | 10 +- src/components/SilentBoxGallery.vue | 14 +- src/components/SilentBoxOverlay.vue | 36 +- src/tests/components/SilentBoxGallery.test.ts | 6 +- src/tests/components/SilentBoxOverlay.test.ts | 12 +- tsconfig.app.json | 2 +- tsconfig.json | 1 + tsconfig.vitest.json | 2 +- vite.config.ts | 4 +- 26 files changed, 1549 insertions(+), 51 deletions(-) create mode 100644 dist/env.d.ts create mode 100644 dist/silent-box.cjs.js create mode 100644 dist/silent-box.es.js create mode 100644 dist/silent-box.iife.js create mode 100644 dist/silent-box.umd.js create mode 100644 dist/src/components/SilentBoxGallery.vue.d.ts create mode 100644 dist/src/components/SilentBoxOverlay.vue.d.ts create mode 100644 dist/src/main.d.ts create mode 100644 dist/src/shims.vue.d.ts create mode 100644 dist/src/types.d.ts create mode 100644 dist/src/utils/httpUtils.d.ts create mode 100644 dist/src/utils/itemUtils.d.ts create mode 100644 dist/src/utils/videoUtils.d.ts create mode 100644 dist/style.css diff --git a/.gitignore b/.gitignore index 385644c..e74d92e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules -dist build coverage \ No newline at end of file diff --git a/README.md b/README.md index 02fef63..1a5f80f 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,13 @@ Import the plugin into Vue: ```js import { createApp } from 'vue' import VueSilentbox from 'vue-silentbox' +import 'vue-silentbox/dist/style.css' -const app = createApp({ - // ... your app stuff +createApp({ + // your app props ... }) -app.use(VueSilentbox) +.use(VueSilentbox) +.mount('#root') ```
@@ -47,8 +49,10 @@ app.use(VueSilentbox) Define an array of images in the data object of your Vue instance or component. ```js import { createApp } from 'vue' +import VueSilentbox from 'vue-silentbox' +import 'vue-silentbox/dist/style.css' -const app = createApp({ +createApp({ data: { images: [ { @@ -64,8 +68,8 @@ const app = createApp({ ] }, }) -app.use(VueSilentbox) -app.mount('#app') +.use(VueSilentbox) +.mount('#root') ``` Then in the template you use a `silent-box` component to display the gallery. diff --git a/dist/env.d.ts b/dist/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/dist/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/dist/silent-box.cjs.js b/dist/silent-box.cjs.js new file mode 100644 index 0000000..6addbe4 --- /dev/null +++ b/dist/silent-box.cjs.js @@ -0,0 +1 @@ +"use strict";const e=require("vue"),k=n=>{const t=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/.exec(n);return t!=null&&t[7]!==void 0?t[7]:""},I=n=>{const t=/(vimeo(pro)?\.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/.exec(n);return t?t[3]:""},L=n=>{if(B(n))try{const i=new XMLHttpRequest;return i.open("GET",n,!1),i.send(null),JSON.parse(i.responseText)}catch(i){return console.log(i),null}throw new Error("Given string: url is not valid URL address.")},E=n=>["youtube.com","youtu.be","vimeo.com"].some(t=>n.includes(t)),$=n=>[".mp4",".ogg",".webm",".mov",".flv",".wmv",".mkv"].some(t=>n.toLowerCase().includes(t)),N=(n,i="")=>{var t;if(/(youtu\.?be)/.test(n)){const r=k(n);return`${location.protocol}//img.youtube.com/vi/${r}/hqdefault.jpg`}else if(/(vimeo(pro)?\.com)/.test(n)){const r=I(n),a=L(`${location.protocol}//vimeo.com/api/v2/video/${r}.json`);return a&&a.length>0?(t=a[0])==null?void 0:t.thumbnail_medium:i}else{if(B(n))return n;throw new Error("Given string: src is not valid URL address.")}},B=n=>new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(n),S=e.createElementVNode("div",{id:"silentbox-overlay__background"},null,-1),R=["onClick"],G={id:"silentbox-overlay__embed"},M={id:"silentbox-overlay__container"},T=["allow","src"],U={key:1,class:"silentbox-video__frame"},z=["src","autoplay","controls"],K=["srcset","src","alt"],Y=["onClick","onKeyup"],O=e.createElementVNode("div",{class:"icon"},null,-1),P=[O],X={key:0,id:"silentbox-overlay__arrow-buttons"},A=["onClick","onKeyup"],D=["onClick","onKeyup"],C=e.defineComponent({__name:"SilentBoxOverlay",props:{item:null,visible:{type:Boolean},currentItem:null,totalItems:null},emits:["silentbox-internal-close-overlay","silentbox-internal-get-next-item","silentbox-internal-get-prev-item","silentbox-overlay-opened","silentbox-overlay-hidden"],setup(n,{emit:i}){const t=n,r=s=>{let l="";const d=k(s);return d&&(l=`${location.protocol}//www.youtube.com/embed/${d}?rel=0`,t.item.autoplay&&(l+="&autoplay=1"),t.item.controls||(l+="&controls=0")),l},a=s=>{let l="";const d=I(s);return d&&(l=`${location.protocol}//player.vimeo.com/video/${d}?rel=0`,t.item.autoplay&&(l+="&autoplay=1")),l},c=s=>/(youtu\.?be)/.test(s)?r(s):/(vimeo(pro)?\.com)/.test(s)?a(s):s,h=()=>{document.body.classList.contains("silentbox-is-opened")||document.body.classList.add("silentbox-is-opened")},y=()=>{document.body.classList.contains("silentbox-is-opened")&&document.body.classList.remove("silentbox-is-opened")},v=e.reactive({name:"silentbox-animation__swipe-left"}),b=()=>{i("silentbox-internal-close-overlay")},u=()=>{v.name="silentbox-animation__swipe-left",i("silentbox-internal-get-next-item")},m=()=>{v.name="silentbox-animation__swipe-right",i("silentbox-internal-get-prev-item")},p=e.reactive({posX:0,posY:0}),x=s=>{const{clientX:l,clientY:d}=s.touches[0];p.posX=l,p.posY=d},_=s=>{const{clientX:l,clientY:d}=s.touches[0],{posX:f,posY:g}=p;if(f===0||g===0)return;const w=f-l,V=g-d;Math.abs(w)>Math.abs(V)&&(w>0?u():m()),p.posX=0,p.posY=0},o=s=>{s.code==="Escape"&&b(),s.code==="ArrowRight"&&u(),s.code==="ArrowLeft"&&m()};return e.onUpdated(()=>{t.visible?(window.addEventListener("keyup",o),h()):(window.removeEventListener("keyup",o),y())}),(s,l)=>t.visible?(e.openBlock(),e.createElementBlock("div",{key:0,id:"silentbox-overlay",role:"overlay",onTouchstart:x,onTouchmove:_},[S,e.createVNode(e.Transition,{name:v.name,mode:"out-in"},{default:e.withCtx(()=>[(e.openBlock(),e.createElementBlock("div",{id:"silentbox-overlay__content",onClick:e.withModifiers(b,["stop"]),key:t.item.src},[e.createElementVNode("div",G,[e.createElementVNode("div",M,[e.unref(E)(t.item.src)?(e.openBlock(),e.createElementBlock("iframe",{key:0,allow:`accelerometer; ${!!t.item.autoplay&&"autoplay;"} encrypted-media; gyroscope; picture-in-picture`,src:c(t.item.src),frameborder:"0",width:"100%",height:"100%",allowfullscreen:""},null,8,T)):e.unref($)(t.item.src)?(e.openBlock(),e.createElementBlock("div",U,[e.createElementVNode("video",{src:t.item.src,autoplay:!!t.item.autoplay,controls:t.item.controls,class:"silentbox-video__embed"},null,8,z)])):(e.openBlock(),e.createElementBlock("img",{key:2,srcset:t.item.srcSet?t.item.srcSet.join(","):t.item.src,src:t.item.src,alt:t.item.alt},null,8,K))]),t.item.description?(e.openBlock(),e.createElementBlock("p",{key:0,id:"silentbox-overlay__description",onClick:l[0]||(l[0]=e.withModifiers(()=>{},["prevent","stop"]))},e.toDisplayString(t.item.description),1)):e.createCommentVNode("",!0)])],8,R))]),_:1},8,["name"]),e.createElementVNode("button",{id:"silentbox-overlay__close-button",role:"button",tabindex:"3",onClick:e.withModifiers(b,["prevent"]),onKeyup:e.withKeys(b,["enter"])},P,40,Y),t.totalItems>1?(e.openBlock(),e.createElementBlock("div",X,[e.createElementVNode("button",{class:"arrow arrow-previous",role:"button",tabindex:"2",onClick:e.withModifiers(m,["stop"]),onKeyup:e.withKeys(m,["enter"])},null,40,A),e.createElementVNode("button",{class:"arrow arrow-next",role:"button",tabindex:"1",onClick:e.withModifiers(u,["stop"]),onKeyup:e.withKeys(u,["enter"])},null,40,D)])):e.createCommentVNode("",!0)],32)):e.createCommentVNode("",!0)}});const H=["href","onClick"],j=["loading","src","alt","width","height"],q=e.defineComponent({__name:"SilentBoxGallery",props:{lazyLoading:{type:Boolean},previewCount:null,fallbackThumbnail:null,gallery:null,image:null},emits:["silentbox-overlay-opened","silentbox-overlay-hidden","silentbox-overlay-next-item-displayed","silentbox-overlay-prev-item-displayed"],setup(n,{expose:i,emit:t}){const r=n,a=e.computed(()=>r.gallery?r.gallery.length:1),c=e.reactive({item:{src:"",alt:"",thumbnailWidth:150,thumbnailHeight:0,thumbnail:"",autoplay:!1,controls:!0,description:""},visible:!1,currentItem:0,totalItems:a}),h=o=>E(o)?N(o,r.fallbackThumbnail):o,y=o=>({...c.item,...o,thumbnail:o.thumbnail?o.thumbnail:h(o.src)}),v=()=>r.gallery&&r.gallery.length>0?r.gallery.map(y):r.image?[y(r.image)]:[],b=e.computed(()=>r.previewCount&&r.previewCount>0&&r.gallery?r.gallery.slice(0,r.previewCount).map(y):v()),u=e.computed(()=>v()),m=(o,s=0)=>{c.visible=!0,c.item=o,c.currentItem=s,t("silentbox-overlay-opened",o)},p=()=>{c.visible=!1,t("silentbox-overlay-hidden",c.item)},x=()=>{let o=c.currentItem+1;o=o<=u.value.length-1?o:0,c.item=u.value[o],c.currentItem=o,t("silentbox-overlay-next-item-displayed",c.item)},_=()=>{let o=c.currentItem-1;o=o>=0?o:u.value.length-1,c.item=u.value[o],c.currentItem=o,t("silentbox-overlay-prev-item-displayed",c.item)};return i({openOverlay:m}),(o,s)=>(e.openBlock(),e.createElementBlock("div",null,[e.renderSlot(o.$slots,"default"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(b),(l,d)=>(e.openBlock(),e.createElementBlock("a",{key:l.src,href:l.src,onClick:e.withModifiers(f=>m(l,d),["prevent"]),class:"silentbox-item"},[e.renderSlot(o.$slots,"silentbox-item",{silentboxItem:l},()=>[e.createElementVNode("img",{loading:n.lazyLoading?"lazy":"eager",src:l.thumbnail,alt:l.alt,width:l.thumbnailWidth,height:l.thumbnailHeight},null,8,j)])],8,H))),128)),e.createVNode(C,{visible:c.visible,item:c.item,"current-item":c.currentItem,"total-items":e.unref(a),onSilentboxInternalCloseOverlay:p,onSilentboxInternalGetNextItem:x,onSilentboxInternalGetPrevItem:_},null,8,["visible","item","current-item","total-items"])]))}});const F={install:n=>{n.component("silent-box",q),n.config.globalProperties.$silentbox={open:i=>{const t=document.createElement("div");t.setAttribute("id","silentbox--false-root");const r=e.createApp(C,{item:i,currentItem:1,totalItems:1,visible:!0,onSilentboxInternalCloseOverlay:()=>{a.$emit("silentbox-overlay-hidden",i),r.unmount(),t.remove()}}),a=r.mount(t);a.$emit("silentbox-overlay-opened",i),a.$forceUpdate(),document.body.appendChild(a.$el)}}}};module.exports=F; diff --git a/dist/silent-box.es.js b/dist/silent-box.es.js new file mode 100644 index 0000000..a3d9ca4 --- /dev/null +++ b/dist/silent-box.es.js @@ -0,0 +1,282 @@ +import { defineComponent as G, reactive as S, onUpdated as N, openBlock as d, createElementBlock as u, createVNode as T, Transition as O, withCtx as P, withModifiers as x, createElementVNode as p, unref as f, toDisplayString as X, createCommentVNode as C, withKeys as L, computed as $, renderSlot as R, Fragment as A, renderList as D, createApp as H } from "vue"; +const U = (o) => { + const e = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/.exec(o); + return e != null && e[7] !== void 0 ? e[7] : ""; +}, z = (o) => { + const e = /(vimeo(pro)?\.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/.exec(o); + return e ? e[3] : ""; +}, j = (o) => { + if (K(o)) + try { + const i = new XMLHttpRequest(); + return i.open("GET", o, !1), i.send(null), JSON.parse(i.responseText); + } catch (i) { + return console.log(i), null; + } + throw new Error("Given string: url is not valid URL address."); +}, B = (o) => [ + "youtube.com", + "youtu.be", + "vimeo.com" +].some((e) => o.includes(e)), F = (o) => [ + ".mp4", + ".ogg", + ".webm", + ".mov", + ".flv", + ".wmv", + ".mkv" +].some((e) => o.toLowerCase().includes(e)), q = (o, i = "") => { + var e; + if (/(youtu\.?be)/.test(o)) { + const l = U(o); + return `${location.protocol}//img.youtube.com/vi/${l}/hqdefault.jpg`; + } else if (/(vimeo(pro)?\.com)/.test(o)) { + const l = z(o), a = j(`${location.protocol}//vimeo.com/api/v2/video/${l}.json`); + return a && a.length > 0 ? (e = a[0]) == null ? void 0 : e.thumbnail_medium : i; + } else { + if (K(o)) + return o; + throw new Error("Given string: src is not valid URL address."); + } +}, K = (o) => new RegExp( + "^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$", + "i" +).test(o), W = /* @__PURE__ */ p("div", { id: "silentbox-overlay__background" }, null, -1), J = ["onClick"], Q = { id: "silentbox-overlay__embed" }, Z = { id: "silentbox-overlay__container" }, ee = ["allow", "src"], te = { + key: 1, + class: "silentbox-video__frame" +}, oe = ["src", "autoplay", "controls"], ne = ["srcset", "src", "alt"], ie = ["onClick", "onKeyup"], le = /* @__PURE__ */ p("div", { class: "icon" }, null, -1), se = [ + le +], re = { + key: 0, + id: "silentbox-overlay__arrow-buttons" +}, ae = ["onClick", "onKeyup"], ce = ["onClick", "onKeyup"], Y = /* @__PURE__ */ G({ + __name: "SilentBoxOverlay", + props: { + item: null, + visible: { type: Boolean }, + currentItem: null, + totalItems: null + }, + emits: [ + "silentbox-internal-close-overlay", + "silentbox-internal-get-next-item", + "silentbox-internal-get-prev-item", + "silentbox-overlay-opened", + "silentbox-overlay-hidden" + ], + setup(o, { emit: i }) { + const e = o, l = (s) => { + let n = ""; + const c = U(s); + return c && (n = `${location.protocol}//www.youtube.com/embed/${c}?rel=0`, e.item.autoplay && (n += "&autoplay=1"), e.item.controls || (n += "&controls=0")), n; + }, a = (s) => { + let n = ""; + const c = z(s); + return c && (n = `${location.protocol}//player.vimeo.com/video/${c}?rel=0`, e.item.autoplay && (n += "&autoplay=1")), n; + }, r = (s) => /(youtu\.?be)/.test(s) ? l(s) : /(vimeo(pro)?\.com)/.test(s) ? a(s) : s, g = () => { + document.body.classList.contains("silentbox-is-opened") || document.body.classList.add("silentbox-is-opened"); + }, _ = () => { + document.body.classList.contains("silentbox-is-opened") && document.body.classList.remove("silentbox-is-opened"); + }, y = S({ + name: "silentbox-animation__swipe-left" + }), h = () => { + i("silentbox-internal-close-overlay"); + }, m = () => { + y.name = "silentbox-animation__swipe-left", i("silentbox-internal-get-next-item"); + }, v = () => { + y.name = "silentbox-animation__swipe-right", i("silentbox-internal-get-prev-item"); + }, b = S({ + posX: 0, + posY: 0 + }), w = (s) => { + const { clientX: n, clientY: c } = s.touches[0]; + b.posX = n, b.posY = c; + }, I = (s) => { + const { clientX: n, clientY: c } = s.touches[0], { posX: k, posY: V } = b; + if (k === 0 || V === 0) + return; + const E = k - n, M = V - c; + Math.abs(E) > Math.abs(M) && (E > 0 ? m() : v()), b.posX = 0, b.posY = 0; + }, t = (s) => { + s.code === "Escape" && h(), s.code === "ArrowRight" && m(), s.code === "ArrowLeft" && v(); + }; + return N(() => { + e.visible ? (window.addEventListener("keyup", t), g()) : (window.removeEventListener("keyup", t), _()); + }), (s, n) => e.visible ? (d(), u("div", { + key: 0, + id: "silentbox-overlay", + role: "overlay", + onTouchstart: w, + onTouchmove: I + }, [ + W, + T(O, { + name: y.name, + mode: "out-in" + }, { + default: P(() => [ + (d(), u("div", { + id: "silentbox-overlay__content", + onClick: x(h, ["stop"]), + key: e.item.src + }, [ + p("div", Q, [ + p("div", Z, [ + f(B)(e.item.src) ? (d(), u("iframe", { + key: 0, + allow: `accelerometer; ${!!e.item.autoplay && "autoplay;"} encrypted-media; gyroscope; picture-in-picture`, + src: r(e.item.src), + frameborder: "0", + width: "100%", + height: "100%", + allowfullscreen: "" + }, null, 8, ee)) : f(F)(e.item.src) ? (d(), u("div", te, [ + p("video", { + src: e.item.src, + autoplay: !!e.item.autoplay, + controls: e.item.controls, + class: "silentbox-video__embed" + }, null, 8, oe) + ])) : (d(), u("img", { + key: 2, + srcset: e.item.srcSet ? e.item.srcSet.join(",") : e.item.src, + src: e.item.src, + alt: e.item.alt + }, null, 8, ne)) + ]), + e.item.description ? (d(), u("p", { + key: 0, + id: "silentbox-overlay__description", + onClick: n[0] || (n[0] = x(() => { + }, ["prevent", "stop"])) + }, X(e.item.description), 1)) : C("", !0) + ]) + ], 8, J)) + ]), + _: 1 + }, 8, ["name"]), + p("button", { + id: "silentbox-overlay__close-button", + role: "button", + tabindex: "3", + onClick: x(h, ["prevent"]), + onKeyup: L(h, ["enter"]) + }, se, 40, ie), + e.totalItems > 1 ? (d(), u("div", re, [ + p("button", { + class: "arrow arrow-previous", + role: "button", + tabindex: "2", + onClick: x(v, ["stop"]), + onKeyup: L(v, ["enter"]) + }, null, 40, ae), + p("button", { + class: "arrow arrow-next", + role: "button", + tabindex: "1", + onClick: x(m, ["stop"]), + onKeyup: L(m, ["enter"]) + }, null, 40, ce) + ])) : C("", !0) + ], 32)) : C("", !0); + } +}); +const de = ["href", "onClick"], ue = ["loading", "src", "alt", "width", "height"], me = /* @__PURE__ */ G({ + __name: "SilentBoxGallery", + props: { + lazyLoading: { type: Boolean }, + previewCount: null, + fallbackThumbnail: null, + gallery: null, + image: null + }, + emits: [ + "silentbox-overlay-opened", + "silentbox-overlay-hidden", + "silentbox-overlay-next-item-displayed", + "silentbox-overlay-prev-item-displayed" + ], + setup(o, { expose: i, emit: e }) { + const l = o, a = $(() => l.gallery ? l.gallery.length : 1), r = S({ + item: { + src: "", + alt: "", + thumbnailWidth: 150, + thumbnailHeight: 0, + thumbnail: "", + autoplay: !1, + controls: !0, + description: "" + }, + visible: !1, + currentItem: 0, + totalItems: a + }), g = (t) => B(t) ? q(t, l.fallbackThumbnail) : t, _ = (t) => ({ + ...r.item, + ...t, + thumbnail: t.thumbnail ? t.thumbnail : g(t.src) + }), y = () => l.gallery && l.gallery.length > 0 ? l.gallery.map(_) : l.image ? [_(l.image)] : [], h = $(() => l.previewCount && l.previewCount > 0 && l.gallery ? l.gallery.slice(0, l.previewCount).map(_) : y()), m = $(() => y()), v = (t, s = 0) => { + r.visible = !0, r.item = t, r.currentItem = s, e("silentbox-overlay-opened", t); + }, b = () => { + r.visible = !1, e("silentbox-overlay-hidden", r.item); + }, w = () => { + let t = r.currentItem + 1; + t = t <= m.value.length - 1 ? t : 0, r.item = m.value[t], r.currentItem = t, e("silentbox-overlay-next-item-displayed", r.item); + }, I = () => { + let t = r.currentItem - 1; + t = t >= 0 ? t : m.value.length - 1, r.item = m.value[t], r.currentItem = t, e("silentbox-overlay-prev-item-displayed", r.item); + }; + return i({ openOverlay: v }), (t, s) => (d(), u("div", null, [ + R(t.$slots, "default"), + (d(!0), u(A, null, D(f(h), (n, c) => (d(), u("a", { + key: n.src, + href: n.src, + onClick: x((k) => v(n, c), ["prevent"]), + class: "silentbox-item" + }, [ + R(t.$slots, "silentbox-item", { silentboxItem: n }, () => [ + p("img", { + loading: o.lazyLoading ? "lazy" : "eager", + src: n.thumbnail, + alt: n.alt, + width: n.thumbnailWidth, + height: n.thumbnailHeight + }, null, 8, ue) + ]) + ], 8, de))), 128)), + T(Y, { + visible: r.visible, + item: r.item, + "current-item": r.currentItem, + "total-items": f(a), + onSilentboxInternalCloseOverlay: b, + onSilentboxInternalGetNextItem: w, + onSilentboxInternalGetPrevItem: I + }, null, 8, ["visible", "item", "current-item", "total-items"]) + ])); + } +}); +const ve = { + install: (o) => { + o.component("silent-box", me), o.config.globalProperties.$silentbox = { + open: (i) => { + const e = document.createElement("div"); + e.setAttribute("id", "silentbox--false-root"); + const l = H(Y, { + item: i, + currentItem: 1, + totalItems: 1, + visible: !0, + onSilentboxInternalCloseOverlay: () => { + a.$emit("silentbox-overlay-hidden", i), l.unmount(), e.remove(); + } + }), a = l.mount(e); + a.$emit("silentbox-overlay-opened", i), a.$forceUpdate(), document.body.appendChild(a.$el); + } + }; + } +}; +export { + ve as default +}; diff --git a/dist/silent-box.iife.js b/dist/silent-box.iife.js new file mode 100644 index 0000000..3c8249c --- /dev/null +++ b/dist/silent-box.iife.js @@ -0,0 +1 @@ +var SilentBox=function(e){"use strict";const v=n=>{const t=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/.exec(n);return t!=null&&t[7]!==void 0?t[7]:""},w=n=>{const t=/(vimeo(pro)?\.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/.exec(n);return t?t[3]:""},C=n=>{if(I(n))try{const i=new XMLHttpRequest;return i.open("GET",n,!1),i.send(null),JSON.parse(i.responseText)}catch(i){return console.log(i),null}throw new Error("Given string: url is not valid URL address.")},k=n=>["youtube.com","youtu.be","vimeo.com"].some(t=>n.includes(t)),L=n=>[".mp4",".ogg",".webm",".mov",".flv",".wmv",".mkv"].some(t=>n.toLowerCase().includes(t)),$=(n,i="")=>{var t;if(/(youtu\.?be)/.test(n)){const r=v(n);return`${location.protocol}//img.youtube.com/vi/${r}/hqdefault.jpg`}else if(/(vimeo(pro)?\.com)/.test(n)){const r=w(n),c=C(`${location.protocol}//vimeo.com/api/v2/video/${r}.json`);return c&&c.length>0?(t=c[0])==null?void 0:t.thumbnail_medium:i}else{if(I(n))return n;throw new Error("Given string: src is not valid URL address.")}},I=n=>new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(n),S=e.createElementVNode("div",{id:"silentbox-overlay__background"},null,-1),N=["onClick"],R={id:"silentbox-overlay__embed"},G={id:"silentbox-overlay__container"},M=["allow","src"],T={key:1,class:"silentbox-video__frame"},U=["src","autoplay","controls"],z=["srcset","src","alt"],K=["onClick","onKeyup"],Y=[e.createElementVNode("div",{class:"icon"},null,-1)],O={key:0,id:"silentbox-overlay__arrow-buttons"},P=["onClick","onKeyup"],X=["onClick","onKeyup"],E=e.defineComponent({__name:"SilentBoxOverlay",props:{item:null,visible:{type:Boolean},currentItem:null,totalItems:null},emits:["silentbox-internal-close-overlay","silentbox-internal-get-next-item","silentbox-internal-get-prev-item","silentbox-overlay-opened","silentbox-overlay-hidden"],setup(n,{emit:i}){const t=n,r=s=>{let l="";const d=v(s);return d&&(l=`${location.protocol}//www.youtube.com/embed/${d}?rel=0`,t.item.autoplay&&(l+="&autoplay=1"),t.item.controls||(l+="&controls=0")),l},c=s=>{let l="";const d=w(s);return d&&(l=`${location.protocol}//player.vimeo.com/video/${d}?rel=0`,t.item.autoplay&&(l+="&autoplay=1")),l},a=s=>/(youtu\.?be)/.test(s)?r(s):/(vimeo(pro)?\.com)/.test(s)?c(s):s,_=()=>{document.body.classList.contains("silentbox-is-opened")||document.body.classList.add("silentbox-is-opened")},h=()=>{document.body.classList.contains("silentbox-is-opened")&&document.body.classList.remove("silentbox-is-opened")},b=e.reactive({name:"silentbox-animation__swipe-left"}),y=()=>{i("silentbox-internal-close-overlay")},m=()=>{b.name="silentbox-animation__swipe-left",i("silentbox-internal-get-next-item")},p=()=>{b.name="silentbox-animation__swipe-right",i("silentbox-internal-get-prev-item")},u=e.reactive({posX:0,posY:0}),x=s=>{const{clientX:l,clientY:d}=s.touches[0];u.posX=l,u.posY=d},f=s=>{const{clientX:l,clientY:d}=s.touches[0],{posX:g,posY:B}=u;if(g===0||B===0)return;const V=g-l,j=B-d;Math.abs(V)>Math.abs(j)&&(V>0?m():p()),u.posX=0,u.posY=0},o=s=>{s.code==="Escape"&&y(),s.code==="ArrowRight"&&m(),s.code==="ArrowLeft"&&p()};return e.onUpdated(()=>{t.visible?(window.addEventListener("keyup",o),_()):(window.removeEventListener("keyup",o),h())}),(s,l)=>t.visible?(e.openBlock(),e.createElementBlock("div",{key:0,id:"silentbox-overlay",role:"overlay",onTouchstart:x,onTouchmove:f},[S,e.createVNode(e.Transition,{name:b.name,mode:"out-in"},{default:e.withCtx(()=>[(e.openBlock(),e.createElementBlock("div",{id:"silentbox-overlay__content",onClick:e.withModifiers(y,["stop"]),key:t.item.src},[e.createElementVNode("div",R,[e.createElementVNode("div",G,[e.unref(k)(t.item.src)?(e.openBlock(),e.createElementBlock("iframe",{key:0,allow:`accelerometer; ${!!t.item.autoplay&&"autoplay;"} encrypted-media; gyroscope; picture-in-picture`,src:a(t.item.src),frameborder:"0",width:"100%",height:"100%",allowfullscreen:""},null,8,M)):e.unref(L)(t.item.src)?(e.openBlock(),e.createElementBlock("div",T,[e.createElementVNode("video",{src:t.item.src,autoplay:!!t.item.autoplay,controls:t.item.controls,class:"silentbox-video__embed"},null,8,U)])):(e.openBlock(),e.createElementBlock("img",{key:2,srcset:t.item.srcSet?t.item.srcSet.join(","):t.item.src,src:t.item.src,alt:t.item.alt},null,8,z))]),t.item.description?(e.openBlock(),e.createElementBlock("p",{key:0,id:"silentbox-overlay__description",onClick:l[0]||(l[0]=e.withModifiers(()=>{},["prevent","stop"]))},e.toDisplayString(t.item.description),1)):e.createCommentVNode("",!0)])],8,N))]),_:1},8,["name"]),e.createElementVNode("button",{id:"silentbox-overlay__close-button",role:"button",tabindex:"3",onClick:e.withModifiers(y,["prevent"]),onKeyup:e.withKeys(y,["enter"])},Y,40,K),t.totalItems>1?(e.openBlock(),e.createElementBlock("div",O,[e.createElementVNode("button",{class:"arrow arrow-previous",role:"button",tabindex:"2",onClick:e.withModifiers(p,["stop"]),onKeyup:e.withKeys(p,["enter"])},null,40,P),e.createElementVNode("button",{class:"arrow arrow-next",role:"button",tabindex:"1",onClick:e.withModifiers(m,["stop"]),onKeyup:e.withKeys(m,["enter"])},null,40,X)])):e.createCommentVNode("",!0)],32)):e.createCommentVNode("",!0)}}),q="",A=["href","onClick"],D=["loading","src","alt","width","height"],H=e.defineComponent({__name:"SilentBoxGallery",props:{lazyLoading:{type:Boolean},previewCount:null,fallbackThumbnail:null,gallery:null,image:null},emits:["silentbox-overlay-opened","silentbox-overlay-hidden","silentbox-overlay-next-item-displayed","silentbox-overlay-prev-item-displayed"],setup(n,{expose:i,emit:t}){const r=n,c=e.computed(()=>r.gallery?r.gallery.length:1),a=e.reactive({item:{src:"",alt:"",thumbnailWidth:150,thumbnailHeight:0,thumbnail:"",autoplay:!1,controls:!0,description:""},visible:!1,currentItem:0,totalItems:c}),_=o=>k(o)?$(o,r.fallbackThumbnail):o,h=o=>({...a.item,...o,thumbnail:o.thumbnail?o.thumbnail:_(o.src)}),b=()=>r.gallery&&r.gallery.length>0?r.gallery.map(h):r.image?[h(r.image)]:[],y=e.computed(()=>r.previewCount&&r.previewCount>0&&r.gallery?r.gallery.slice(0,r.previewCount).map(h):b()),m=e.computed(()=>b()),p=(o,s=0)=>{a.visible=!0,a.item=o,a.currentItem=s,t("silentbox-overlay-opened",o)},u=()=>{a.visible=!1,t("silentbox-overlay-hidden",a.item)},x=()=>{let o=a.currentItem+1;o=o<=m.value.length-1?o:0,a.item=m.value[o],a.currentItem=o,t("silentbox-overlay-next-item-displayed",a.item)},f=()=>{let o=a.currentItem-1;o=o>=0?o:m.value.length-1,a.item=m.value[o],a.currentItem=o,t("silentbox-overlay-prev-item-displayed",a.item)};return i({openOverlay:p}),(o,s)=>(e.openBlock(),e.createElementBlock("div",null,[e.renderSlot(o.$slots,"default"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(y),(l,d)=>(e.openBlock(),e.createElementBlock("a",{key:l.src,href:l.src,onClick:e.withModifiers(g=>p(l,d),["prevent"]),class:"silentbox-item"},[e.renderSlot(o.$slots,"silentbox-item",{silentboxItem:l},()=>[e.createElementVNode("img",{loading:n.lazyLoading?"lazy":"eager",src:l.thumbnail,alt:l.alt,width:l.thumbnailWidth,height:l.thumbnailHeight},null,8,D)])],8,A))),128)),e.createVNode(E,{visible:a.visible,item:a.item,"current-item":a.currentItem,"total-items":e.unref(c),onSilentboxInternalCloseOverlay:u,onSilentboxInternalGetNextItem:x,onSilentboxInternalGetPrevItem:f},null,8,["visible","item","current-item","total-items"])]))}}),W="";return{install:n=>{n.component("silent-box",H),n.config.globalProperties.$silentbox={open:i=>{const t=document.createElement("div");t.setAttribute("id","silentbox--false-root");const r=e.createApp(E,{item:i,currentItem:1,totalItems:1,visible:!0,onSilentboxInternalCloseOverlay:()=>{c.$emit("silentbox-overlay-hidden",i),r.unmount(),t.remove()}}),c=r.mount(t);c.$emit("silentbox-overlay-opened",i),c.$forceUpdate(),document.body.appendChild(c.$el)}}}}}(Vue); diff --git a/dist/silent-box.umd.js b/dist/silent-box.umd.js new file mode 100644 index 0000000..81f593c --- /dev/null +++ b/dist/silent-box.umd.js @@ -0,0 +1 @@ +(function(e,y){typeof exports=="object"&&typeof module<"u"?module.exports=y(require("vue")):typeof define=="function"&&define.amd?define(["vue"],y):(e=typeof globalThis<"u"?globalThis:e||self,e.SilentBox=y(e.Vue))})(this,function(e){"use strict";const y=n=>{const t=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/.exec(n);return t!=null&&t[7]!==void 0?t[7]:""},w=n=>{const t=/(vimeo(pro)?\.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/.exec(n);return t?t[3]:""},C=n=>{if(I(n))try{const l=new XMLHttpRequest;return l.open("GET",n,!1),l.send(null),JSON.parse(l.responseText)}catch(l){return console.log(l),null}throw new Error("Given string: url is not valid URL address.")},k=n=>["youtube.com","youtu.be","vimeo.com"].some(t=>n.includes(t)),L=n=>[".mp4",".ogg",".webm",".mov",".flv",".wmv",".mkv"].some(t=>n.toLowerCase().includes(t)),$=(n,l="")=>{var t;if(/(youtu\.?be)/.test(n)){const r=y(n);return`${location.protocol}//img.youtube.com/vi/${r}/hqdefault.jpg`}else if(/(vimeo(pro)?\.com)/.test(n)){const r=w(n),a=C(`${location.protocol}//vimeo.com/api/v2/video/${r}.json`);return a&&a.length>0?(t=a[0])==null?void 0:t.thumbnail_medium:l}else{if(I(n))return n;throw new Error("Given string: src is not valid URL address.")}},I=n=>new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(n),S=e.createElementVNode("div",{id:"silentbox-overlay__background"},null,-1),N=["onClick"],T={id:"silentbox-overlay__embed"},R={id:"silentbox-overlay__container"},G=["allow","src"],M={key:1,class:"silentbox-video__frame"},U=["src","autoplay","controls"],z=["srcset","src","alt"],K=["onClick","onKeyup"],Y=[e.createElementVNode("div",{class:"icon"},null,-1)],O={key:0,id:"silentbox-overlay__arrow-buttons"},P=["onClick","onKeyup"],X=["onClick","onKeyup"],E=e.defineComponent({__name:"SilentBoxOverlay",props:{item:null,visible:{type:Boolean},currentItem:null,totalItems:null},emits:["silentbox-internal-close-overlay","silentbox-internal-get-next-item","silentbox-internal-get-prev-item","silentbox-overlay-opened","silentbox-overlay-hidden"],setup(n,{emit:l}){const t=n,r=s=>{let i="";const d=y(s);return d&&(i=`${location.protocol}//www.youtube.com/embed/${d}?rel=0`,t.item.autoplay&&(i+="&autoplay=1"),t.item.controls||(i+="&controls=0")),i},a=s=>{let i="";const d=w(s);return d&&(i=`${location.protocol}//player.vimeo.com/video/${d}?rel=0`,t.item.autoplay&&(i+="&autoplay=1")),i},c=s=>/(youtu\.?be)/.test(s)?r(s):/(vimeo(pro)?\.com)/.test(s)?a(s):s,_=()=>{document.body.classList.contains("silentbox-is-opened")||document.body.classList.add("silentbox-is-opened")},x=()=>{document.body.classList.contains("silentbox-is-opened")&&document.body.classList.remove("silentbox-is-opened")},b=e.reactive({name:"silentbox-animation__swipe-left"}),h=()=>{l("silentbox-internal-close-overlay")},m=()=>{b.name="silentbox-animation__swipe-left",l("silentbox-internal-get-next-item")},p=()=>{b.name="silentbox-animation__swipe-right",l("silentbox-internal-get-prev-item")},u=e.reactive({posX:0,posY:0}),f=s=>{const{clientX:i,clientY:d}=s.touches[0];u.posX=i,u.posY=d},v=s=>{const{clientX:i,clientY:d}=s.touches[0],{posX:g,posY:B}=u;if(g===0||B===0)return;const V=g-i,H=B-d;Math.abs(V)>Math.abs(H)&&(V>0?m():p()),u.posX=0,u.posY=0},o=s=>{s.code==="Escape"&&h(),s.code==="ArrowRight"&&m(),s.code==="ArrowLeft"&&p()};return e.onUpdated(()=>{t.visible?(window.addEventListener("keyup",o),_()):(window.removeEventListener("keyup",o),x())}),(s,i)=>t.visible?(e.openBlock(),e.createElementBlock("div",{key:0,id:"silentbox-overlay",role:"overlay",onTouchstart:f,onTouchmove:v},[S,e.createVNode(e.Transition,{name:b.name,mode:"out-in"},{default:e.withCtx(()=>[(e.openBlock(),e.createElementBlock("div",{id:"silentbox-overlay__content",onClick:e.withModifiers(h,["stop"]),key:t.item.src},[e.createElementVNode("div",T,[e.createElementVNode("div",R,[e.unref(k)(t.item.src)?(e.openBlock(),e.createElementBlock("iframe",{key:0,allow:`accelerometer; ${!!t.item.autoplay&&"autoplay;"} encrypted-media; gyroscope; picture-in-picture`,src:c(t.item.src),frameborder:"0",width:"100%",height:"100%",allowfullscreen:""},null,8,G)):e.unref(L)(t.item.src)?(e.openBlock(),e.createElementBlock("div",M,[e.createElementVNode("video",{src:t.item.src,autoplay:!!t.item.autoplay,controls:t.item.controls,class:"silentbox-video__embed"},null,8,U)])):(e.openBlock(),e.createElementBlock("img",{key:2,srcset:t.item.srcSet?t.item.srcSet.join(","):t.item.src,src:t.item.src,alt:t.item.alt},null,8,z))]),t.item.description?(e.openBlock(),e.createElementBlock("p",{key:0,id:"silentbox-overlay__description",onClick:i[0]||(i[0]=e.withModifiers(()=>{},["prevent","stop"]))},e.toDisplayString(t.item.description),1)):e.createCommentVNode("",!0)])],8,N))]),_:1},8,["name"]),e.createElementVNode("button",{id:"silentbox-overlay__close-button",role:"button",tabindex:"3",onClick:e.withModifiers(h,["prevent"]),onKeyup:e.withKeys(h,["enter"])},Y,40,K),t.totalItems>1?(e.openBlock(),e.createElementBlock("div",O,[e.createElementVNode("button",{class:"arrow arrow-previous",role:"button",tabindex:"2",onClick:e.withModifiers(p,["stop"]),onKeyup:e.withKeys(p,["enter"])},null,40,P),e.createElementVNode("button",{class:"arrow arrow-next",role:"button",tabindex:"1",onClick:e.withModifiers(m,["stop"]),onKeyup:e.withKeys(m,["enter"])},null,40,X)])):e.createCommentVNode("",!0)],32)):e.createCommentVNode("",!0)}}),F="",j=["href","onClick"],A=["loading","src","alt","width","height"],D=e.defineComponent({__name:"SilentBoxGallery",props:{lazyLoading:{type:Boolean},previewCount:null,fallbackThumbnail:null,gallery:null,image:null},emits:["silentbox-overlay-opened","silentbox-overlay-hidden","silentbox-overlay-next-item-displayed","silentbox-overlay-prev-item-displayed"],setup(n,{expose:l,emit:t}){const r=n,a=e.computed(()=>r.gallery?r.gallery.length:1),c=e.reactive({item:{src:"",alt:"",thumbnailWidth:150,thumbnailHeight:0,thumbnail:"",autoplay:!1,controls:!0,description:""},visible:!1,currentItem:0,totalItems:a}),_=o=>k(o)?$(o,r.fallbackThumbnail):o,x=o=>({...c.item,...o,thumbnail:o.thumbnail?o.thumbnail:_(o.src)}),b=()=>r.gallery&&r.gallery.length>0?r.gallery.map(x):r.image?[x(r.image)]:[],h=e.computed(()=>r.previewCount&&r.previewCount>0&&r.gallery?r.gallery.slice(0,r.previewCount).map(x):b()),m=e.computed(()=>b()),p=(o,s=0)=>{c.visible=!0,c.item=o,c.currentItem=s,t("silentbox-overlay-opened",o)},u=()=>{c.visible=!1,t("silentbox-overlay-hidden",c.item)},f=()=>{let o=c.currentItem+1;o=o<=m.value.length-1?o:0,c.item=m.value[o],c.currentItem=o,t("silentbox-overlay-next-item-displayed",c.item)},v=()=>{let o=c.currentItem-1;o=o>=0?o:m.value.length-1,c.item=m.value[o],c.currentItem=o,t("silentbox-overlay-prev-item-displayed",c.item)};return l({openOverlay:p}),(o,s)=>(e.openBlock(),e.createElementBlock("div",null,[e.renderSlot(o.$slots,"default"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(h),(i,d)=>(e.openBlock(),e.createElementBlock("a",{key:i.src,href:i.src,onClick:e.withModifiers(g=>p(i,d),["prevent"]),class:"silentbox-item"},[e.renderSlot(o.$slots,"silentbox-item",{silentboxItem:i},()=>[e.createElementVNode("img",{loading:n.lazyLoading?"lazy":"eager",src:i.thumbnail,alt:i.alt,width:i.thumbnailWidth,height:i.thumbnailHeight},null,8,A)])],8,j))),128)),e.createVNode(E,{visible:c.visible,item:c.item,"current-item":c.currentItem,"total-items":e.unref(a),onSilentboxInternalCloseOverlay:u,onSilentboxInternalGetNextItem:f,onSilentboxInternalGetPrevItem:v},null,8,["visible","item","current-item","total-items"])]))}}),W="";return{install:n=>{n.component("silent-box",D),n.config.globalProperties.$silentbox={open:l=>{const t=document.createElement("div");t.setAttribute("id","silentbox--false-root");const r=e.createApp(E,{item:l,currentItem:1,totalItems:1,visible:!0,onSilentboxInternalCloseOverlay:()=>{a.$emit("silentbox-overlay-hidden",l),r.unmount(),t.remove()}}),a=r.mount(t);a.$emit("silentbox-overlay-opened",l),a.$forceUpdate(),document.body.appendChild(a.$el)}}}}}); diff --git a/dist/src/components/SilentBoxGallery.vue.d.ts b/dist/src/components/SilentBoxGallery.vue.d.ts new file mode 100644 index 0000000..6cf792b --- /dev/null +++ b/dist/src/components/SilentBoxGallery.vue.d.ts @@ -0,0 +1,139 @@ +import type { ItemProps } from '../types'; +import { type OverlayProps } from './SilentBoxOverlay.vue'; +export interface GalleryProps { + lazyLoading?: boolean; + previewCount?: number; + fallbackThumbnail?: string; + gallery?: ItemProps[]; + image?: ItemProps; +} +declare const _sfc_main: import("vue").DefineComponent<{ + lazyLoading: { + type: BooleanConstructor; + required: false; + }; + previewCount: { + type: NumberConstructor; + required: false; + }; + fallbackThumbnail: { + type: StringConstructor; + required: false; + }; + gallery: { + type: ArrayConstructor; + required: false; + }; + image: { + type: any; + required: false; + }; +}, { + props: any; + totalItems: import("vue").ComputedRef; + overlay: OverlayProps; + getThumbnailURL: (itemSrc: string) => string; + mapGalleryItem: (item: ItemProps) => ItemProps; + getGalleryItems: () => ItemProps[]; + getGalleryThumbnails: import("vue").ComputedRef; + getGallery: import("vue").ComputedRef; + emit: (event: "silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-overlay-next-item-displayed" | "silentbox-overlay-prev-item-displayed", ...args: any[]) => void; + openOverlay: (item: ItemProps, index?: number) => void; + hideOverlay: () => void; + showNextItem: () => void; + showPrevItem: () => void; + SilentBoxOverlay: import("vue").DefineComponent<{ + item: { + type: any; + required: true; + }; + visible: { + type: BooleanConstructor; + required: true; + }; + currentItem: { + type: NumberConstructor; + required: true; + }; + totalItems: { + type: NumberConstructor; + required: true; + }; + }, { + props: any; + getYouTubeVideoURL: (url: string) => string; + getVimeoVideoURL: (url: string) => string; + getVideoURL: (url: string) => string; + lockScrolling: () => void; + unlockScrolling: () => void; + animation: { + name: string; + }; + emit: (event: "silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-internal-close-overlay" | "silentbox-internal-get-next-item" | "silentbox-internal-get-prev-item", ...args: any[]) => void; + handleClose: () => void; + handleMoveNext: () => void; + handleMovePrev: () => void; + touchPosition: { + posX: number; + posY: number; + }; + touchStart: (event: TouchEvent) => void; + handleTouchMove: (event: TouchEvent) => void; + handleKeyInteraction: (event: KeyboardEvent) => void; + readonly isEmbedVideo: (itemSrc: string) => boolean; + readonly isLocalVideo: (itemSrc: string) => boolean; + }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-internal-close-overlay" | "silentbox-internal-get-next-item" | "silentbox-internal-get-prev-item")[], "silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-internal-close-overlay" | "silentbox-internal-get-next-item" | "silentbox-internal-get-prev-item", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly> & { + "onSilentbox-overlay-opened"?: (...args: any[]) => any; + "onSilentbox-overlay-hidden"?: (...args: any[]) => any; + "onSilentbox-internal-close-overlay"?: (...args: any[]) => any; + "onSilentbox-internal-get-next-item"?: (...args: any[]) => any; + "onSilentbox-internal-get-prev-item"?: (...args: any[]) => any; + }, {}>; +}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-overlay-next-item-displayed" | "silentbox-overlay-prev-item-displayed")[], "silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-overlay-next-item-displayed" | "silentbox-overlay-prev-item-displayed", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly> & { + "onSilentbox-overlay-opened"?: (...args: any[]) => any; + "onSilentbox-overlay-hidden"?: (...args: any[]) => any; + "onSilentbox-overlay-next-item-displayed"?: (...args: any[]) => any; + "onSilentbox-overlay-prev-item-displayed"?: (...args: any[]) => any; +}, { + lazyLoading: boolean; + image: any; +}>; +export default _sfc_main; diff --git a/dist/src/components/SilentBoxOverlay.vue.d.ts b/dist/src/components/SilentBoxOverlay.vue.d.ts new file mode 100644 index 0000000..c141462 --- /dev/null +++ b/dist/src/components/SilentBoxOverlay.vue.d.ts @@ -0,0 +1,72 @@ +import type { ItemProps } from '../types'; +export interface OverlayProps { + item: ItemProps; + visible: boolean; + currentItem: number; + totalItems: number; +} +declare const _sfc_main: import("vue").DefineComponent<{ + item: { + type: any; + required: true; + }; + visible: { + type: BooleanConstructor; + required: true; + }; + currentItem: { + type: NumberConstructor; + required: true; + }; + totalItems: { + type: NumberConstructor; + required: true; + }; +}, { + props: any; + getYouTubeVideoURL: (url: string) => string; + getVimeoVideoURL: (url: string) => string; + getVideoURL: (url: string) => string; + lockScrolling: () => void; + unlockScrolling: () => void; + animation: { + name: string; + }; + emit: (event: "silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-internal-close-overlay" | "silentbox-internal-get-next-item" | "silentbox-internal-get-prev-item", ...args: any[]) => void; + handleClose: () => void; + handleMoveNext: () => void; + handleMovePrev: () => void; + touchPosition: { + posX: number; + posY: number; + }; + touchStart: (event: TouchEvent) => void; + handleTouchMove: (event: TouchEvent) => void; + handleKeyInteraction: (event: KeyboardEvent) => void; + readonly isEmbedVideo: (itemSrc: string) => boolean; + readonly isLocalVideo: (itemSrc: string) => boolean; +}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-internal-close-overlay" | "silentbox-internal-get-next-item" | "silentbox-internal-get-prev-item")[], "silentbox-overlay-opened" | "silentbox-overlay-hidden" | "silentbox-internal-close-overlay" | "silentbox-internal-get-next-item" | "silentbox-internal-get-prev-item", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly> & { + "onSilentbox-overlay-opened"?: (...args: any[]) => any; + "onSilentbox-overlay-hidden"?: (...args: any[]) => any; + "onSilentbox-internal-close-overlay"?: (...args: any[]) => any; + "onSilentbox-internal-get-next-item"?: (...args: any[]) => any; + "onSilentbox-internal-get-prev-item"?: (...args: any[]) => any; +}, {}>; +export default _sfc_main; diff --git a/dist/src/main.d.ts b/dist/src/main.d.ts new file mode 100644 index 0000000..33ab9b7 --- /dev/null +++ b/dist/src/main.d.ts @@ -0,0 +1,3 @@ +import { type Plugin } from 'vue'; +declare const SilentBox: Plugin; +export default SilentBox; diff --git a/dist/src/shims.vue.d.ts b/dist/src/shims.vue.d.ts new file mode 100644 index 0000000..2b97bd9 --- /dev/null +++ b/dist/src/shims.vue.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/dist/src/types.d.ts b/dist/src/types.d.ts new file mode 100644 index 0000000..8e28f18 --- /dev/null +++ b/dist/src/types.d.ts @@ -0,0 +1,14 @@ +export interface ItemProps { + src: string; + srcSet?: string[]; + thumbnailWidth: number; + thumbnailHeight: number; + thumbnail?: string; + alt?: string; + description?: string; + autoplay?: boolean; + controls?: boolean; +} +export interface OverlayEventProps { + item: ItemProps; +} diff --git a/dist/src/utils/httpUtils.d.ts b/dist/src/utils/httpUtils.d.ts new file mode 100644 index 0000000..c4b5318 --- /dev/null +++ b/dist/src/utils/httpUtils.d.ts @@ -0,0 +1,8 @@ +/** + * XMLHttpRequest is used because Vue does not work very well with top-level + * async setup. Thus, we need to make this call synchronnous. + * + * @param {string} url + * return any + */ +export declare const httpGet: (url: string) => any; diff --git a/dist/src/utils/itemUtils.d.ts b/dist/src/utils/itemUtils.d.ts new file mode 100644 index 0000000..7aec433 --- /dev/null +++ b/dist/src/utils/itemUtils.d.ts @@ -0,0 +1,29 @@ +/** + * Check whether video is embedable and supported by SilentBox + * + * @param {string} itemSrc + * @return boolean + */ +export declare const isEmbedVideo: (itemSrc: string) => boolean; +/** + * Check whether item is supported local video. + * + * @param {string} itemSrc + * @return boolean + */ +export declare const isLocalVideo: (itemSrc: string) => boolean; +/** + * Get thumbnail for item. + * + * @param {string} src + * @param {string} fallbackThumbnail + * @return string + */ +export declare const getThumbnail: (src: string, fallbackThumbnail?: string) => string; +/** + * Check for valid URL string. + * + * @param {string} src + * return boolean + */ +export declare const isValidURL: (src: string) => boolean; diff --git a/dist/src/utils/videoUtils.d.ts b/dist/src/utils/videoUtils.d.ts new file mode 100644 index 0000000..6d32e7a --- /dev/null +++ b/dist/src/utils/videoUtils.d.ts @@ -0,0 +1,14 @@ +/** + * Get video ID from YouTube/YouTu.Be video. + * + * @params {string} url + * @return string + */ +export declare const getYoutubeVideoId: (url: string) => string; +/** + * Get video ID from Vimeo/VimeoPro video. + * + * @params {string} url + * @return string + */ +export declare const getVimeoVideoId: (url: string) => string; diff --git a/dist/style.css b/dist/style.css new file mode 100644 index 0000000..2b3436a --- /dev/null +++ b/dist/style.css @@ -0,0 +1 @@ +.silentbox-is-opened{overflow:hidden}#silentbox-overlay{display:block;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:999}#silentbox-overlay__background{background:rgba(0,0,0,.75);backdrop-filter:blur(20px);cursor:default;display:block;height:100%;left:0;position:absolute;top:0;width:100%}#silentbox-overlay__content{cursor:default;display:block;height:100%;position:relative;width:100%}#silentbox-overlay__embed{bottom:0;cursor:default;display:block;height:80%;left:0;margin:auto;position:absolute;right:0;top:-2.5rem;width:75%}#silentbox-overlay__embed img,#silentbox-overlay__embed iframe{background-color:#000;bottom:0;box-shadow:0 0 1.5rem #00000073;cursor:default;display:block;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}#silentbox-overlay__container{cursor:default;height:100%;margin:0;position:relative;text-align:center;width:100%}#silentbox-overlay__description{display:block;padding-top:1rem;text-align:center;color:#fff}#silentbox-overlay__close-button{background:rgba(0,0,0,0);border:none;color:#fff;cursor:pointer;height:2.5rem;position:absolute;right:0;top:0;transition:background-color .25s ease-out;width:2.5rem}#silentbox-overlay__close-button:hover,#silentbox-overlay__close-button:focus{background-color:#00000080;outline:none}@media (max-width: 1024px){#silentbox-overlay__close-button{height:5.75rem;width:5.75rem}}#silentbox-overlay__close-button .icon{color:#fff;cursor:pointer;height:1rem;left:.7rem;margin:50% 50% 0 0;position:absolute;right:0px;top:-.5rem;transition:.25s ease;width:1rem}@media (max-width: 1024px){#silentbox-overlay__close-button .icon{height:2.5rem;width:2.5rem;left:-1rem}}#silentbox-overlay__close-button .icon:before,#silentbox-overlay__close-button .icon:after{background:#fff;content:"";height:2px;left:5%;position:absolute;top:50%;transition:.25s ease;width:100%}#silentbox-overlay__close-button .icon:before{transform:rotate(-45deg)}#silentbox-overlay__close-button .icon:after{transform:rotate(45deg)}#silentbox-overlay__close-button .icon:hover:before,#silentbox-overlay__close-button .icon:hover:after,#silentbox-overlay__close-button .icon:focus:before,#silentbox-overlay__close-button .icon:focus:after{background:#58e8d2;left:25%;width:50%}#silentbox-overlay__arrow-buttons .arrow{border-left:2px solid #fff;border-top:2px solid #fff;cursor:pointer;height:1.5rem;position:absolute;width:1.5rem}#silentbox-overlay__arrow-buttons .arrow:hover,#silentbox-overlay__arrow-buttons .arrow:focus{outline:none;border-color:#58e8d2}#silentbox-overlay__arrow-buttons .arrow-previous{left:2rem;top:50%;transform:rotate(-45deg)}#silentbox-overlay__arrow-buttons .arrow-previous:hover,#silentbox-overlay__arrow-buttons .arrow-previous:focus{animation-duration:1s;animation-iteration-count:infinite;animation-name:pulsingPrevious}#silentbox-overlay__arrow-buttons .arrow-next{right:2rem;top:50%;transform:rotate(135deg)}#silentbox-overlay__arrow-buttons .arrow-next:hover,#silentbox-overlay__arrow-buttons .arrow-next:focus{animation-duration:1s;animation-iteration-count:infinite;animation-name:pulsingNext}#silentbox-overlay .silentbox-video__frame{display:flex;justify-content:center;align-items:center;width:100%;height:100%}#silentbox-overlay .silentbox-video__embed{outline:none}#silentbox-overlay .silentbox-video__embed:active,#silentbox-overlay .silentbox-video__embed:focus,#silentbox-overlay .silentbox-video__embed:hover{outline:none}.silentbox-animation__swipe-left-enter-active{transition:all .3s ease;opacity:0;transform:translate(25vw)}.silentbox-animation__swipe-left-leave-active{transition:all .3s ease;transition:opacity .5s}.silentbox-animation__swipe-left-enter-to{opacity:1;transition:all .3s ease;transform:translate(0)}.silentbox-animation__swipe-left-leave-to{opacity:0;transition:all .3s ease;transform:translate(-25vw)}.silentbox-animation__swipe-right-enter-active{transition:all .3s ease;opacity:0;transform:translate(-25vw)}.silentbox-animation__swipe-right-leave-active{transition:all .3s ease;transition:opacity .5s}.silentbox-animation__swipe-right-enter-to{opacity:1;transition:all .3s ease;transform:translate(0)}.silentbox-animation__swipe-right-leave-to{opacity:0;transition:all .3s ease;transform:translate(25vw)}@keyframes pulsingNext{0%{animation-timing-function:ease-in;right:2rem}25%{animation-timing-function:ease-in;right:1.75rem}75%{animation-timing-function:ease-in;right:2.25rem}to{animation-timing-function:ease-in;right:2rem}}@keyframes pulsingPrevious{0%{animation-timing-function:ease-in;left:2rem}25%{animation-timing-function:ease-in;left:1.75rem}75%{animation-timing-function:ease-in;left:2.25rem}to{animation-timing-function:ease-in;left:2rem}}.silentbox-item{cursor:pointer;display:inline-block;text-decoration:underline} diff --git a/package-lock.json b/package-lock.json index 6d41c75..290c713 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "name": "vue-silentbox", - "version": "3.0.0-alpha.1", + "version": "3.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vue-silentbox", - "version": "3.0.0-alpha.1", + "version": "3.0.0", "dependencies": { "vue": "^3.2.40" }, "devDependencies": { + "@babel/types": "^7.20.7", "@testing-library/vue": "^6.6.1", "@types/jsdom": "^20.0.0", "@types/node": "^16.11.56", @@ -29,6 +30,7 @@ "sass": "^1.55.0", "typescript": "~4.7.4", "vite": "^3.0.9", + "vite-plugin-dts": "^1.7.1", "vitest": "^0.23.4", "vue-tsc": "^1.0.3" } @@ -45,6 +47,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", @@ -162,6 +173,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -290,6 +315,96 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.33.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.7.tgz", + "integrity": "sha512-fQT2v/j/55DhvMFiopLtth66E7xTFNhnumMKgKY14SaG6qU/V1W0e4nOAgbA+SmLakQjAd1Evu06ofaVaxBPbA==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.25.3", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.53.3", + "@rushstack/rig-package": "0.3.17", + "@rushstack/ts-command-line": "4.13.1", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.3.tgz", + "integrity": "sha512-WWxBUq77p2iZ+5VF7Nmrm3y/UtqCh5bYV8ii3khwq3w99+fXWpvfsAhgSLsC7k8XDQc6De4ssMxH6He/qe1pzg==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.53.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -325,6 +440,137 @@ "node": ">= 8" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.53.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.53.3.tgz", + "integrity": "sha512-H0+T5koi5MFhJUd5ND3dI3bwLhvlABetARl78L3lWftJVQEPyzcgTStvTTRiIM5mCltyTM8VYm6BuCtNUuxD0Q==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.17.tgz", + "integrity": "sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/rig-package/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.1.tgz", + "integrity": "sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@testing-library/dom": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", @@ -371,6 +617,45 @@ "node": ">= 10" } }, + "node_modules/@ts-morph/common": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", + "integrity": "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "node_modules/@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -401,6 +686,12 @@ "@types/node": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, "node_modules/@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -1305,6 +1596,12 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1323,6 +1620,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1335,6 +1641,16 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2441,6 +2757,29 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2575,6 +2914,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -2756,6 +3101,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2898,6 +3252,12 @@ "node": ">=8" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -2979,6 +3339,33 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/kolorist": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.6.0.tgz", + "integrity": "sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==", + "dev": true + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3025,6 +3412,18 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3148,6 +3547,18 @@ "node": "*" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3341,6 +3752,12 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3860,6 +4277,12 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3869,6 +4292,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4058,6 +4490,15 @@ "node": ">=14.0.0" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4097,6 +4538,16 @@ "node": ">=12" } }, + "node_modules/ts-morph": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", + "integrity": "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.17.0", + "code-block-writer": "^11.0.3" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -4218,6 +4669,15 @@ "node": ">=10.12.0" } }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vite": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.7.tgz", @@ -4259,6 +4719,28 @@ } } }, + "node_modules/vite-plugin-dts": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-1.7.1.tgz", + "integrity": "sha512-2oGMnAjcrZN7jM1TloiS1b1mCn42s3El04ix2RFhId5P1WfMigF8WAwsqT6a6jk0Yso8t7AeZsBkkxYShR0hBQ==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor": "^7.33.5", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.53.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.6.0", + "ts-morph": "^16.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": ">=2.9.0" + } + }, "node_modules/vitest": { "version": "0.23.4", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.23.4.tgz", @@ -4586,6 +5068,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } } }, "dependencies": { @@ -4598,6 +5100,12 @@ "@babel/highlight": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", @@ -4687,6 +5195,17 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -4775,6 +5294,84 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@microsoft/api-extractor": { + "version": "7.33.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.7.tgz", + "integrity": "sha512-fQT2v/j/55DhvMFiopLtth66E7xTFNhnumMKgKY14SaG6qU/V1W0e4nOAgbA+SmLakQjAd1Evu06ofaVaxBPbA==", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.25.3", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.53.3", + "@rushstack/rig-package": "0.3.17", + "@rushstack/ts-command-line": "4.13.1", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + } + } + }, + "@microsoft/api-extractor-model": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.3.tgz", + "integrity": "sha512-WWxBUq77p2iZ+5VF7Nmrm3y/UtqCh5bYV8ii3khwq3w99+fXWpvfsAhgSLsC7k8XDQc6De4ssMxH6He/qe1pzg==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.53.3" + } + }, + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4801,6 +5398,120 @@ "fastq": "^1.6.0" } }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@rushstack/node-core-library": { + "version": "3.53.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.53.3.tgz", + "integrity": "sha512-H0+T5koi5MFhJUd5ND3dI3bwLhvlABetARl78L3lWftJVQEPyzcgTStvTTRiIM5mCltyTM8VYm6BuCtNUuxD0Q==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "dependencies": { + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@rushstack/rig-package": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.17.tgz", + "integrity": "sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "@rushstack/ts-command-line": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.1.tgz", + "integrity": "sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, "@testing-library/dom": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", @@ -4834,6 +5545,44 @@ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true }, + "@ts-morph/common": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", + "integrity": "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -4864,6 +5613,12 @@ "@types/node": "*" } }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, "@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -5528,6 +6283,12 @@ "wrap-ansi": "^7.0.0" } }, + "code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5543,6 +6304,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5552,6 +6319,13 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "optional": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6291,6 +7065,25 @@ "mime-types": "^2.1.12" } }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6385,6 +7178,12 @@ "slash": "^3.0.0" } }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -6529,6 +7328,12 @@ "resolve-from": "^4.0.0" } }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6641,6 +7446,12 @@ "istanbul-lib-report": "^3.0.0" } }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -6708,6 +7519,30 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "kolorist": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.6.0.tgz", + "integrity": "sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6739,6 +7574,18 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6834,6 +7681,12 @@ "brace-expansion": "^1.1.7" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6982,6 +7835,12 @@ "entities": "^4.4.0" } }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7335,6 +8194,12 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7344,6 +8209,12 @@ "safe-buffer": "~5.1.0" } }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -7493,6 +8364,12 @@ "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", "dev": true }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7523,6 +8400,16 @@ "punycode": "^2.1.1" } }, + "ts-morph": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", + "integrity": "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==", + "dev": true, + "requires": { + "@ts-morph/common": "~0.17.0", + "code-block-writer": "^11.0.3" + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -7613,6 +8500,12 @@ "convert-source-map": "^1.6.0" } }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, "vite": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.7.tgz", @@ -7626,6 +8519,22 @@ "rollup": "~2.78.0" } }, + "vite-plugin-dts": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-1.7.1.tgz", + "integrity": "sha512-2oGMnAjcrZN7jM1TloiS1b1mCn42s3El04ix2RFhId5P1WfMigF8WAwsqT6a6jk0Yso8t7AeZsBkkxYShR0hBQ==", + "dev": true, + "requires": { + "@microsoft/api-extractor": "^7.33.5", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.53.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.6.0", + "ts-morph": "^16.0.0" + } + }, "vitest": { "version": "0.23.4", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.23.4.tgz", @@ -7839,6 +8748,18 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "requires": { + "commander": "^9.4.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } } } } diff --git a/package.json b/package.json index 48d792b..634b5ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-silentbox", - "version": "3.0.0-alpha.1", + "version": "3.0.0", "scripts": { "build": "run-p type-check build-only", "preview": "vite preview --port 4173", @@ -14,10 +14,11 @@ "dependencies": { "vue": "^3.2.40" }, - "main": "dist/my-lib.js", - "module": "dist/my-lib.mjs", - "typings": "dist/my-lib.d.ts", + "main": "dist/silent-box.umd.js", + "module": "dist/silent-box.es.js", + "typings": "dist/src/main.d.ts", "devDependencies": { + "@babel/types": "^7.20.7", "@testing-library/vue": "^6.6.1", "@types/jsdom": "^20.0.0", "@types/node": "^16.11.56", @@ -36,6 +37,7 @@ "sass": "^1.55.0", "typescript": "~4.7.4", "vite": "^3.0.9", + "vite-plugin-dts": "^1.7.1", "vitest": "^0.23.4", "vue-tsc": "^1.0.3" } diff --git a/src/components/SilentBoxGallery.vue b/src/components/SilentBoxGallery.vue index 86cbc5b..27af6e3 100644 --- a/src/components/SilentBoxGallery.vue +++ b/src/components/SilentBoxGallery.vue @@ -42,7 +42,7 @@ const overlay: OverlayProps = reactive({ * @param {string} itemSrc * @return string */ -const setThumbnail = (itemSrc: string): string => { +const getThumbnailURL = (itemSrc: string): string => { if (isEmbedVideo(itemSrc)) { return getThumbnail(itemSrc, props.fallbackThumbnail) } @@ -57,7 +57,7 @@ const setThumbnail = (itemSrc: string): string => { const mapGalleryItem = (item: ItemProps): ItemProps => ({ ...overlay.item, ...item, - thumbnail: item.thumbnail ? item.thumbnail : setThumbnail(item.src) + thumbnail: item.thumbnail ? item.thumbnail : getThumbnailURL(item.src) }) /** * Create gallery with items that alwys contain all necessary information. @@ -65,7 +65,7 @@ const mapGalleryItem = (item: ItemProps): ItemProps => ({ * * @return ItemProps[] */ -const createGallery = (): ItemProps[] => { +const getGalleryItems = (): ItemProps[] => { if (props.gallery && props.gallery.length > 0) { // Show whole gallery return props.gallery.map(mapGalleryItem) @@ -82,18 +82,18 @@ const createGallery = (): ItemProps[] => { * * @return ItemProps[] */ -const getThumbnailGallery = computed(() => { +const getGalleryThumbnails = computed(() => { if (props.previewCount && props.previewCount > 0 && props.gallery) { return props.gallery.slice(0, props.previewCount).map(mapGalleryItem) } - return createGallery() + return getGalleryItems() }) /** * Cache gallery in computed property. * * @return ItemProps[] */ -const getGallery = computed(() => createGallery()) +const getGallery = computed(() => getGalleryItems()) const emit = defineEmits([ 'silentbox-overlay-opened', @@ -162,7 +162,7 @@ defineExpose({ openOverlay }) () * @param {string} url any video URL from YouTube * @return string */ -const parseYouTubeVideo = (url: string): string => { +const getYouTubeVideoURL = (url: string): string => { let videoURL = '' const videoId = getYoutubeVideoId(url) if (videoId) { @@ -36,7 +36,7 @@ const parseYouTubeVideo = (url: string): string => { * @param {string} url any video URL from Vimeo or VimeoPro * @return string */ -const parseVimeoVideo = (url: string): string => { +const getVimeoVideoURL = (url: string): string => { let videoURL = '' const videoId = getVimeoVideoId(url) if (videoId) { @@ -52,11 +52,11 @@ const parseVimeoVideo = (url: string): string => { * @param {string} url * @return {string} */ -const parseURL = (url: string): string => { +const getVideoURL = (url: string): string => { if (/(youtu\.?be)/.test(url)) { - return parseYouTubeVideo(url) + return getYouTubeVideoURL(url) } else if (/(vimeo(pro)?\.com)/.test(url)) { - return parseVimeoVideo(url) + return getVimeoVideoURL(url) } return url } @@ -100,7 +100,7 @@ const handleMovePrev = (): void => { emit('silentbox-internal-get-prev-item') } -const touchData = reactive({ +const touchPosition = reactive({ posX: 0, posY: 0 }) @@ -111,8 +111,8 @@ const touchData = reactive({ */ const touchStart = (event: TouchEvent): void => { const { clientX: x, clientY: y } = event.touches[0] - touchData.posX = x - touchData.posY = y + touchPosition.posX = x + touchPosition.posY = y } /** * Calculate user's touch movement direction, so we can change overlay content @@ -120,17 +120,15 @@ const touchStart = (event: TouchEvent): void => { * * @param {TouchEvent} event */ -const touchMove = (event: TouchEvent): void => { +const handleTouchMove = (event: TouchEvent): void => { const { clientX: x, clientY: y } = event.touches[0] - const { posX, posY } = touchData + const { posX, posY } = touchPosition if (posX === 0 || posY === 0) { // return if user did not moved return } - // calculate difference between start and movement on x-axis const xDiff = posX - x - // calculate difference between start and movement on y-axis const yDiff = posY - y if (Math.abs(xDiff) > Math.abs(yDiff)) { // User moved on x-axis @@ -147,15 +145,15 @@ const touchMove = (event: TouchEvent): void => { } // Reset start position for next event - touchData.posX = 0 - touchData.posY = 0 + touchPosition.posX = 0 + touchPosition.posY = 0 } /** * Register keyboard interaction. * * @param {KeyboardEvent} event */ -const handleKeys = (event: KeyboardEvent): void => { +const handleKeyInteraction = (event: KeyboardEvent): void => { if (event.code === 'Escape') handleClose() if (event.code === 'ArrowRight') handleMoveNext() if (event.code === 'ArrowLeft') handleMovePrev() @@ -165,10 +163,10 @@ onUpdated(() => { // for each instance of silent-box. Other hooks as onBeforeUnmount or // onUnmount does not remove event listner, thus this awkward condition. if (props.visible) { - window.addEventListener('keyup', handleKeys) + window.addEventListener('keyup', handleKeyInteraction) lockScrolling() } else { - window.removeEventListener('keyup', handleKeys) + window.removeEventListener('keyup', handleKeyInteraction) unlockScrolling() } }) @@ -180,7 +178,7 @@ onUpdated(() => { v-if="props.visible" role="overlay" @touchstart="touchStart" - @touchmove="touchMove" + @touchmove="handleTouchMove" >
@@ -195,7 +193,7 @@ onUpdated(() => {