diff --git a/.gitignore b/.gitignore index 85cf0b2..644d9e4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules/ npm-debug.log yarn-error.log demo/dist +/dist \ No newline at end of file diff --git a/dist/types/cache.d.ts b/dist/types/cache.d.ts deleted file mode 100644 index 9b5dcb6..0000000 --- a/dist/types/cache.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare class Cache { - private seed; - private data; - private id; - add(value: Function, id?: string): string; - get(id: string): Function | undefined; - delete(id: string): void; -} diff --git a/dist/types/clipboard.d.ts b/dist/types/clipboard.d.ts deleted file mode 100644 index d8f7786..0000000 --- a/dist/types/clipboard.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -export declare const Clipboard: { - /** - * Requests Navigator API persmission to clipboard. - */ - requestClipboardPermission(): Promise; - /** - * Writes to cliboard using Navigator API. - */ - writeClipboard(value: string): Promise; - /** - * Writes to clipboard using old-school execCommand('copy'). - */ - writeClipboardExecCommand(value: string): boolean; - /** - * Maes an attempt to copy data to the clipboard. - */ - copy(input: any): Promise; -}; diff --git a/dist/types/convert.d.ts b/dist/types/convert.d.ts deleted file mode 100644 index 3a4206f..0000000 --- a/dist/types/convert.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare const Convert: { - asString(value: any): string; -}; diff --git a/dist/types/index.d.ts b/dist/types/index.d.ts deleted file mode 100644 index 87c1f51..0000000 --- a/dist/types/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ClipboardPlugin } from './plugin'; -export * from './clipboard'; -export default ClipboardPlugin; diff --git a/dist/types/plugin.d.ts b/dist/types/plugin.d.ts deleted file mode 100644 index 77ed895..0000000 --- a/dist/types/plugin.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { Plugin } from 'vue'; -export declare const ClipboardPlugin: Plugin; diff --git a/dist/types/textarea.d.ts b/dist/types/textarea.d.ts deleted file mode 100644 index f1fdffe..0000000 --- a/dist/types/textarea.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare const Textarea: { - createTextarea(value: string): HTMLTextAreaElement; -}; diff --git a/dist/v-clipboard.es.js b/dist/v-clipboard.es.js deleted file mode 100644 index cb2893b..0000000 --- a/dist/v-clipboard.es.js +++ /dev/null @@ -1,114 +0,0 @@ -var g = Object.defineProperty; -var m = (t, e, r) => e in t ? g(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r; -var d = (t, e, r) => (m(t, typeof e != "symbol" ? e + "" : e, r), r); -class f { - constructor() { - d(this, "seed", 0); - d(this, "data", /* @__PURE__ */ new Map()); - } - id() { - return Date.now().toString(26) + this.seed++; - } - add(e, r = this.id()) { - return this.data.set(r, e), r; - } - get(e) { - return this.data.get(e); - } - delete(e) { - this.delete(e); - } -} -const y = "Failed to copy value to clipboard. Unknown type.", C = { - asString(t) { - if (t == null) - return console.warn("Clipboard input is empty"), ""; - if (typeof t != "string") - try { - return JSON.stringify(t); - } catch (e) { - return console.warn(y, e), ""; - } - return t; - } -}, w = "position:fixed; pointer-events:none; z-index:-9999; opacity:0;", x = { - createTextarea(t) { - const e = document.createElement("textarea"); - return e.addEventListener("focusin", (r) => { - r.stopPropagation(); - }), e.value = t, e.setAttribute("readonly", ""), e.style.cssText = w, e; - } -}, c = { - async requestClipboardPermission() { - return navigator.permissions.query({ - name: "clipboard-write" - }); - }, - async writeClipboard(t) { - return (await c.requestClipboardPermission()).state === "granted" ? (await navigator.clipboard.writeText(t), !0) : !1; - }, - writeClipboardExecCommand(t) { - const e = x.createTextarea(t); - if (document.body.appendChild(e), navigator.userAgent.match(/ipad|ipod|iphone/i)) { - e.contentEditable = "true", e.readOnly = !0; - const n = document.createRange(); - n.selectNodeContents(e); - const o = window.getSelection(); - o && (o.removeAllRanges(), o.addRange(n), e.setSelectionRange(0, 999999)); - } else - e.select(); - const r = document.execCommand("copy"); - return document.body.removeChild(e), r; - }, - async copy(t) { - const e = typeof t == "function" ? t() : t, r = C.asString(e); - if (c.writeClipboardExecCommand(r)) - return !0; - await c.writeClipboard(r); - } -}, i = new f(), E = { - install(t) { - const e = t.version[0] === "3" ? t.config.globalProperties : t.prototype; - e.$clipboard = c.copy, t.directive("clipboard", { - beforeMount(r, n) { - const o = n.arg, a = n.value, s = typeof a == "function"; - if (o === "error" && s) { - r.dataset.clipboardError = i.add(a); - return; - } - if (o === "error" && s) { - r.dataset.clipboardSuccess = i.add(a); - return; - } - const l = async (p) => { - var u; - const b = await c.copy(a) ? r.dataset.clipboardSuccess : r.dataset.clipboardError; - (u = i.get(b)) == null || u({ value: a, event: p }); - }; - r.dataset.clipboardClick = i.add(l), r.addEventListener("click", l); - }, - unmounted(r) { - const { - clipboardSuccessHandler: n, - clipboardErrorHandler: o, - clipboardClickHandler: a - } = r.dataset; - if (n && i.delete(n), o && i.delete(o), a) { - const s = i.get(a); - s && (r.removeEventListener("click", s), i.delete(a)); - } - }, - get bind() { - return this.beforeMount; - }, - get unbind() { - return this.unmounted; - } - }); - } -}; -export { - c as Clipboard, - E as default -}; -//# sourceMappingURL=v-clipboard.es.js.map diff --git a/dist/v-clipboard.es.js.map b/dist/v-clipboard.es.js.map deleted file mode 100644 index faab973..0000000 --- a/dist/v-clipboard.es.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"v-clipboard.es.js","sources":["../src/cache.ts","../src/convert.ts","../src/textarea.ts","../src/clipboard.ts","../src/plugin.ts"],"sourcesContent":["export class Cache {\n private seed = 0\n private data: Map = new Map()\n\n private id() {\n return Date.now().toString(26) + this.seed++\n }\n\n add(value: Function, id: string = this.id()) {\n this.data.set(id, value)\n\n return id\n }\n\n get(id: string) {\n return this.data.get(id)\n }\n\n delete(id: string) {\n this.delete(id)\n }\n}\n","const message = 'Failed to copy value to clipboard. Unknown type.'\n\nexport const Convert = {\n asString(value: any): string {\n if (value == null) {\n console.warn('Clipboard input is empty')\n return ''\n }\n\n if (typeof value !== 'string') {\n try {\n return JSON.stringify(value)\n } catch (error) {\n console.warn(message, error)\n\n return ''\n }\n }\n\n return value\n }\n}\n","const cssText = 'position:fixed; pointer-events:none; z-index:-9999; opacity:0;'\n\nexport const Textarea = {\n createTextarea(value: string) {\n const textarea = document.createElement('textarea')\n\n textarea.addEventListener('focusin', (event) => {\n event.stopPropagation()\n })\n\n textarea.value = value\n textarea.setAttribute('readonly', '')\n textarea.style.cssText = cssText\n\n return textarea\n }\n}\n","import { Convert } from './convert'\nimport { Textarea } from './textarea'\n\nexport const Clipboard = {\n /**\n * Requests Navigator API persmission to clipboard.\n */\n async requestClipboardPermission() {\n return navigator.permissions.query({\n name: 'clipboard-write' as PermissionName\n })\n },\n /**\n * Writes to cliboard using Navigator API.\n */\n async writeClipboard(value: string) {\n const permissions = await Clipboard.requestClipboardPermission()\n\n if (permissions.state === 'granted') {\n await navigator.clipboard.writeText(value)\n return true\n }\n\n return false\n },\n /**\n * Writes to clipboard using old-school execCommand('copy').\n */\n writeClipboardExecCommand(value: string) {\n const textarea = Textarea.createTextarea(value)\n\n document.body.appendChild(textarea)\n\n if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {\n textarea.contentEditable = 'true'\n textarea.readOnly = true\n\n const range = document.createRange()\n\n range.selectNodeContents(textarea)\n\n const selection = window.getSelection()\n\n if (selection) {\n selection.removeAllRanges()\n selection.addRange(range)\n textarea.setSelectionRange(0, 999999)\n }\n } else {\n textarea.select()\n }\n\n const result = document.execCommand('copy')\n document.body.removeChild(textarea)\n\n return result\n },\n /**\n * Maes an attempt to copy data to the clipboard.\n */\n async copy(input: any) {\n const data = typeof input === 'function' ? input() : input\n const value = Convert.asString(data)\n\n const copied = Clipboard.writeClipboardExecCommand(value)\n\n if (copied) {\n return true\n }\n\n await Clipboard.writeClipboard(value)\n }\n}\n","import { Directive, Plugin } from 'vue'\nimport { Cache } from './cache'\nimport { Clipboard } from './clipboard'\n\ntype ClipboardDirective = Function | string | object | null | undefined\n\nconst cache = new Cache()\n\nexport const ClipboardPlugin: Plugin = {\n install(app) {\n const context =\n // @ts-ignore\n app.version[0] === '3' ? app.config.globalProperties : app.prototype\n\n context.$clipboard = Clipboard.copy\n\n app.directive('clipboard', >{\n beforeMount(el, binding) {\n const arg = binding.arg\n const value = binding.value\n const isFn = typeof value === 'function'\n\n if (arg === 'error' && isFn) {\n el.dataset.clipboardError = cache.add(value)\n return\n }\n\n if (arg === 'error' && isFn) {\n el.dataset.clipboardSuccess = cache.add(value)\n return\n }\n\n const onClick = async (event: MouseEvent) => {\n const success = await Clipboard.copy(value)\n\n const callbackId = success\n ? el.dataset.clipboardSuccess\n : el.dataset.clipboardError\n\n cache.get(callbackId!)?.({ value, event })\n }\n\n el.dataset.clipboardClick = cache.add(onClick)\n el.addEventListener('click', onClick)\n },\n\n unmounted(el) {\n const {\n clipboardSuccessHandler,\n clipboardErrorHandler,\n clipboardClickHandler\n } = el.dataset\n\n if (clipboardSuccessHandler) {\n cache.delete(clipboardSuccessHandler)\n }\n\n if (clipboardErrorHandler) {\n cache.delete(clipboardErrorHandler)\n }\n\n if (clipboardClickHandler) {\n const handler = cache.get(clipboardClickHandler)\n\n if (handler) {\n el.removeEventListener('click', handler as () => {})\n cache.delete(clipboardClickHandler)\n }\n }\n },\n /**\n * Vue 2 compatability\n */\n get bind() {\n // @ts-ignore\n return this.beforeMount\n },\n\n get unbind() {\n // @ts-ignore\n return this.unmounted\n }\n })\n }\n}\n"],"names":["Cache","__publicField","value","id","message","Convert","error","cssText","Textarea","textarea","event","Clipboard","range","selection","result","input","data","cache","ClipboardPlugin","app","context","el","binding","arg","isFn","onClick","_a","callbackId","clipboardSuccessHandler","clipboardErrorHandler","clipboardClickHandler","handler"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v-clipboard.umd.js b/dist/v-clipboard.umd.js deleted file mode 100644 index 018395d..0000000 --- a/dist/v-clipboard.umd.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(r,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(r=typeof globalThis<"u"?globalThis:r||self,o(r["v-clipboard"]={}))})(this,function(r){"use strict";var w=Object.defineProperty;var x=(r,o,d)=>o in r?w(r,o,{enumerable:!0,configurable:!0,writable:!0,value:d}):r[o]=d;var p=(r,o,d)=>(x(r,typeof o!="symbol"?o+"":o,d),d);class o{constructor(){p(this,"seed",0);p(this,"data",new Map)}id(){return Date.now().toString(26)+this.seed++}add(e,n=this.id()){return this.data.set(n,e),n}get(e){return this.data.get(e)}delete(e){this.delete(e)}}const d="Failed to copy value to clipboard. Unknown type.",g={asString(t){if(t==null)return console.warn("Clipboard input is empty"),"";if(typeof t!="string")try{return JSON.stringify(t)}catch(e){return console.warn(d,e),""}return t}},m="position:fixed; pointer-events:none; z-index:-9999; opacity:0;",y={createTextarea(t){const e=document.createElement("textarea");return e.addEventListener("focusin",n=>{n.stopPropagation()}),e.value=t,e.setAttribute("readonly",""),e.style.cssText=m,e}},l={async requestClipboardPermission(){return navigator.permissions.query({name:"clipboard-write"})},async writeClipboard(t){return(await l.requestClipboardPermission()).state==="granted"?(await navigator.clipboard.writeText(t),!0):!1},writeClipboardExecCommand(t){const e=y.createTextarea(t);if(document.body.appendChild(e),navigator.userAgent.match(/ipad|ipod|iphone/i)){e.contentEditable="true",e.readOnly=!0;const a=document.createRange();a.selectNodeContents(e);const i=window.getSelection();i&&(i.removeAllRanges(),i.addRange(a),e.setSelectionRange(0,999999))}else e.select();const n=document.execCommand("copy");return document.body.removeChild(e),n},async copy(t){const e=typeof t=="function"?t():t,n=g.asString(e);if(l.writeClipboardExecCommand(n))return!0;await l.writeClipboard(n)}},c=new o,C={install(t){const e=t.version[0]==="3"?t.config.globalProperties:t.prototype;e.$clipboard=l.copy,t.directive("clipboard",{beforeMount(n,a){const i=a.arg,s=a.value,u=typeof s=="function";if(i==="error"&&u){n.dataset.clipboardError=c.add(s);return}if(i==="error"&&u){n.dataset.clipboardSuccess=c.add(s);return}const f=async h=>{var b;const v=await l.copy(s)?n.dataset.clipboardSuccess:n.dataset.clipboardError;(b=c.get(v))==null||b({value:s,event:h})};n.dataset.clipboardClick=c.add(f),n.addEventListener("click",f)},unmounted(n){const{clipboardSuccessHandler:a,clipboardErrorHandler:i,clipboardClickHandler:s}=n.dataset;if(a&&c.delete(a),i&&c.delete(i),s){const u=c.get(s);u&&(n.removeEventListener("click",u),c.delete(s))}},get bind(){return this.beforeMount},get unbind(){return this.unmounted}})}};r.Clipboard=l,r.default=C,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}); -//# sourceMappingURL=v-clipboard.umd.js.map diff --git a/dist/v-clipboard.umd.js.map b/dist/v-clipboard.umd.js.map deleted file mode 100644 index 560d787..0000000 --- a/dist/v-clipboard.umd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"v-clipboard.umd.js","sources":["../src/cache.ts","../src/convert.ts","../src/textarea.ts","../src/clipboard.ts","../src/plugin.ts"],"sourcesContent":["export class Cache {\n private seed = 0\n private data: Map = new Map()\n\n private id() {\n return Date.now().toString(26) + this.seed++\n }\n\n add(value: Function, id: string = this.id()) {\n this.data.set(id, value)\n\n return id\n }\n\n get(id: string) {\n return this.data.get(id)\n }\n\n delete(id: string) {\n this.delete(id)\n }\n}\n","const message = 'Failed to copy value to clipboard. Unknown type.'\n\nexport const Convert = {\n asString(value: any): string {\n if (value == null) {\n console.warn('Clipboard input is empty')\n return ''\n }\n\n if (typeof value !== 'string') {\n try {\n return JSON.stringify(value)\n } catch (error) {\n console.warn(message, error)\n\n return ''\n }\n }\n\n return value\n }\n}\n","const cssText = 'position:fixed; pointer-events:none; z-index:-9999; opacity:0;'\n\nexport const Textarea = {\n createTextarea(value: string) {\n const textarea = document.createElement('textarea')\n\n textarea.addEventListener('focusin', (event) => {\n event.stopPropagation()\n })\n\n textarea.value = value\n textarea.setAttribute('readonly', '')\n textarea.style.cssText = cssText\n\n return textarea\n }\n}\n","import { Convert } from './convert'\nimport { Textarea } from './textarea'\n\nexport const Clipboard = {\n /**\n * Requests Navigator API persmission to clipboard.\n */\n async requestClipboardPermission() {\n return navigator.permissions.query({\n name: 'clipboard-write' as PermissionName\n })\n },\n /**\n * Writes to cliboard using Navigator API.\n */\n async writeClipboard(value: string) {\n const permissions = await Clipboard.requestClipboardPermission()\n\n if (permissions.state === 'granted') {\n await navigator.clipboard.writeText(value)\n return true\n }\n\n return false\n },\n /**\n * Writes to clipboard using old-school execCommand('copy').\n */\n writeClipboardExecCommand(value: string) {\n const textarea = Textarea.createTextarea(value)\n\n document.body.appendChild(textarea)\n\n if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {\n textarea.contentEditable = 'true'\n textarea.readOnly = true\n\n const range = document.createRange()\n\n range.selectNodeContents(textarea)\n\n const selection = window.getSelection()\n\n if (selection) {\n selection.removeAllRanges()\n selection.addRange(range)\n textarea.setSelectionRange(0, 999999)\n }\n } else {\n textarea.select()\n }\n\n const result = document.execCommand('copy')\n document.body.removeChild(textarea)\n\n return result\n },\n /**\n * Maes an attempt to copy data to the clipboard.\n */\n async copy(input: any) {\n const data = typeof input === 'function' ? input() : input\n const value = Convert.asString(data)\n\n const copied = Clipboard.writeClipboardExecCommand(value)\n\n if (copied) {\n return true\n }\n\n await Clipboard.writeClipboard(value)\n }\n}\n","import { Directive, Plugin } from 'vue'\nimport { Cache } from './cache'\nimport { Clipboard } from './clipboard'\n\ntype ClipboardDirective = Function | string | object | null | undefined\n\nconst cache = new Cache()\n\nexport const ClipboardPlugin: Plugin = {\n install(app) {\n const context =\n // @ts-ignore\n app.version[0] === '3' ? app.config.globalProperties : app.prototype\n\n context.$clipboard = Clipboard.copy\n\n app.directive('clipboard', >{\n beforeMount(el, binding) {\n const arg = binding.arg\n const value = binding.value\n const isFn = typeof value === 'function'\n\n if (arg === 'error' && isFn) {\n el.dataset.clipboardError = cache.add(value)\n return\n }\n\n if (arg === 'error' && isFn) {\n el.dataset.clipboardSuccess = cache.add(value)\n return\n }\n\n const onClick = async (event: MouseEvent) => {\n const success = await Clipboard.copy(value)\n\n const callbackId = success\n ? el.dataset.clipboardSuccess\n : el.dataset.clipboardError\n\n cache.get(callbackId!)?.({ value, event })\n }\n\n el.dataset.clipboardClick = cache.add(onClick)\n el.addEventListener('click', onClick)\n },\n\n unmounted(el) {\n const {\n clipboardSuccessHandler,\n clipboardErrorHandler,\n clipboardClickHandler\n } = el.dataset\n\n if (clipboardSuccessHandler) {\n cache.delete(clipboardSuccessHandler)\n }\n\n if (clipboardErrorHandler) {\n cache.delete(clipboardErrorHandler)\n }\n\n if (clipboardClickHandler) {\n const handler = cache.get(clipboardClickHandler)\n\n if (handler) {\n el.removeEventListener('click', handler as () => {})\n cache.delete(clipboardClickHandler)\n }\n }\n },\n /**\n * Vue 2 compatability\n */\n get bind() {\n // @ts-ignore\n return this.beforeMount\n },\n\n get unbind() {\n // @ts-ignore\n return this.unmounted\n }\n })\n }\n}\n"],"names":["Cache","__publicField","value","id","message","Convert","error","cssText","Textarea","textarea","event","Clipboard","range","selection","result","input","data","cache","ClipboardPlugin","app","context","el","binding","arg","isFn","onClick","callbackId","_a","clipboardSuccessHandler","clipboardErrorHandler","clipboardClickHandler","handler"],"mappings":"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"} \ No newline at end of file