@pristy/pristy-libvue 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{upload.worker-Du93awOI.js.map → upload.worker-BNuCRfpQ.js.map} +1 -1
- package/dist/pristy-libvue.css +1 -1
- package/dist/pristy-libvue.es.js +6659 -39989
- package/dist/pristy-libvue.es.js.map +1 -1
- package/dist/pristy-libvue.umd.js +4 -149
- package/dist/pristy-libvue.umd.js.map +1 -1
- package/package.json +18 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.worker-Du93awOI.js","sources":["../node_modules/yocto-queue/index.js","../node_modules/p-limit/index.js","../src/workers/upload.worker.js"],"sourcesContent":["/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","/**\n * Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\nimport pLimit from \"p-limit\";\n\nconst limit = pLimit(3);\n\n/**\n * Le worker écoute l'événement 'message' du thread principal.\n * Son rôle est d'orchestrer, pas d'exécuter l'upload.\n */\nself.onmessage = async (event) => {\n // Note: on attend un objet { type: 'start', payload: { files, nodeId } }\n const { type, payload } = event.data;\n\n if (type !== \"start\" || !payload.files || !payload.nodeId) {\n return;\n }\n\n const uploadItems = payload.files;\n const nodeId = payload.nodeId;\n const totalFiles = uploadItems.length;\n let completedCount = 0;\n\n const uploadTasks = uploadItems.map((item) => {\n return limit(() => {\n self.postMessage({\n type: \"requestUpload\",\n payload: { item: item, nodeId: nodeId },\n });\n\n return new Promise((resolve) => {\n const listener = (messageEvent) => {\n const { type: responseType, payload: responsePayload } =\n messageEvent.data;\n if (\n responseType === \"uploadResult\" &&\n responsePayload.fileName === item.file.name\n ) {\n self.removeEventListener(\"message\", listener);\n completedCount++;\n self.postMessage({\n type: \"progress\",\n payload: { completed: completedCount, total: totalFiles },\n });\n resolve(responsePayload);\n }\n };\n self.addEventListener(\"message\", listener);\n });\n });\n });\n\n const results = await Promise.all(uploadTasks);\n self.postMessage({ type: \"complete\", payload: results });\n};\n"],"names":["Node","value","__publicField","Queue","__privateAdd","_head","_tail","_size","node","__privateGet","__privateSet","__privateWrapper","current","pLimit","concurrency","validateConcurrency","queue","activeCount","resumeNext","next","run","function_","resolve","arguments_","result","enqueue","internalResolve","generator","newConcurrency","limit","event","type","payload","uploadItems","nodeId","totalFiles","completedCount","uploadTasks","item","listener","messageEvent","responseType","responsePayload","results"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"upload.worker-BNuCRfpQ.js","sources":["../node_modules/yocto-queue/index.js","../node_modules/p-limit/index.js","../src/workers/upload.worker.js"],"sourcesContent":["/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","/**\n * Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\nimport pLimit from \"p-limit\";\n\nconst limit = pLimit(3);\n\n/**\n * Le worker écoute l'événement 'message' du thread principal.\n * Son rôle est d'orchestrer, pas d'exécuter l'upload.\n */\nself.onmessage = async (event) => {\n // Note: on attend un objet { type: 'start', payload: { files, nodeId } }\n const { type, payload } = event.data;\n\n if (type !== \"start\" || !payload.files || !payload.nodeId) {\n return;\n }\n\n const uploadItems = payload.files;\n const nodeId = payload.nodeId;\n const totalFiles = uploadItems.length;\n let completedCount = 0;\n\n const uploadTasks = uploadItems.map((item) => {\n return limit(() => {\n self.postMessage({\n type: \"requestUpload\",\n payload: { item: item, nodeId: nodeId },\n });\n\n return new Promise((resolve) => {\n const listener = (messageEvent) => {\n const { type: responseType, payload: responsePayload } =\n messageEvent.data;\n if (\n responseType === \"uploadResult\" &&\n responsePayload.fileName === item.file.name\n ) {\n self.removeEventListener(\"message\", listener);\n completedCount++;\n self.postMessage({\n type: \"progress\",\n payload: { completed: completedCount, total: totalFiles },\n });\n resolve(responsePayload);\n }\n };\n self.addEventListener(\"message\", listener);\n });\n });\n });\n\n const results = await Promise.all(uploadTasks);\n self.postMessage({ type: \"complete\", payload: results });\n};\n"],"names":["Node","value","Queue","#head","#tail","#size","node","current","pLimit","concurrency","validateConcurrency","queue","activeCount","resumeNext","next","run","function_","resolve","arguments_","result","enqueue","internalResolve","generator","newConcurrency","limit","event","type","payload","uploadItems","nodeId","totalFiles","completedCount","uploadTasks","item","listener","messageEvent","responseType","responsePayload","results"],"mappings":"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","x_google_ignoreList":[0,1]}
|