@mindbowser_inc/ui-feedback-plugin 0.2.0 → 0.3.1

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.
Files changed (32) hide show
  1. package/README.md +310 -61
  2. package/dist/aws-CkWYvUhs.mjs +134 -0
  3. package/dist/aws-CkWYvUhs.mjs.map +1 -0
  4. package/dist/html2canvas-pro.esm-QETbiPYt.mjs +7587 -0
  5. package/dist/html2canvas-pro.esm-QETbiPYt.mjs.map +1 -0
  6. package/dist/index-B-1NC_TX.mjs +12047 -0
  7. package/dist/index-B-1NC_TX.mjs.map +1 -0
  8. package/dist/index-ClYqXfVs.mjs +183 -0
  9. package/dist/index-ClYqXfVs.mjs.map +1 -0
  10. package/dist/{index-BcqBbswO.mjs → index-D6dCjvzy.mjs} +147 -181
  11. package/dist/index-D6dCjvzy.mjs.map +1 -0
  12. package/dist/index.browser-CKeO7JYa.mjs +190 -0
  13. package/dist/index.browser-CKeO7JYa.mjs.map +1 -0
  14. package/dist/index.d.ts +27 -23
  15. package/dist/loadCognitoIdentity-V6H3EoBY.mjs +957 -0
  16. package/dist/loadCognitoIdentity-V6H3EoBY.mjs.map +1 -0
  17. package/dist/stream-collector-mh16BUWl.mjs +4032 -0
  18. package/dist/stream-collector-mh16BUWl.mjs.map +1 -0
  19. package/dist/{supabase-BUHP2OkK.mjs → supabase-CbB80UVb.mjs} +2 -2
  20. package/dist/{supabase-BUHP2OkK.mjs.map → supabase-CbB80UVb.mjs.map} +1 -1
  21. package/dist/tslib.es6-BNkLP3y-.mjs +112 -0
  22. package/dist/tslib.es6-BNkLP3y-.mjs.map +1 -0
  23. package/dist/ui-feedback-plugin.es.js +4 -4
  24. package/dist/ui-feedback-plugin.es.js.map +1 -1
  25. package/dist/ui-feedback-plugin.umd.js +253 -243
  26. package/dist/ui-feedback-plugin.umd.js.map +1 -1
  27. package/package.json +9 -5
  28. package/dist/html2canvas.esm-d2sM-0Wm.mjs +0 -4871
  29. package/dist/html2canvas.esm-d2sM-0Wm.mjs.map +0 -1
  30. package/dist/index-BcqBbswO.mjs.map +0 -1
  31. package/dist/s3-4V57aJiZ.mjs +0 -66
  32. package/dist/s3-4V57aJiZ.mjs.map +0 -1
@@ -1,66 +0,0 @@
1
- var c = Object.defineProperty;
2
- var l = (r, e, t) => e in r ? c(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
- var n = (r, e, t) => l(r, typeof e != "symbol" ? e + "" : e, t);
4
- class d {
5
- constructor(e, t = {}, s = 5e3) {
6
- n(this, "base");
7
- n(this, "headers");
8
- n(this, "pollInterval");
9
- this.base = e.replace(/\/$/, ""), this.headers = t, this.pollInterval = s;
10
- }
11
- async req(e, t, s) {
12
- const a = await fetch(`${this.base}${t}`, {
13
- method: e,
14
- headers: { "Content-Type": "application/json", ...this.headers },
15
- body: s !== void 0 ? JSON.stringify(s) : void 0
16
- });
17
- if (!a.ok)
18
- throw new Error(`[ui-feedback-plugin] S3 API ${e} ${t} → ${a.status} ${a.statusText}`);
19
- if (e !== "DELETE")
20
- return a.json();
21
- }
22
- async addComment(e) {
23
- return (await this.req("POST", "/comments", e)).id;
24
- }
25
- async getComments(e, t) {
26
- const s = new URLSearchParams({ pageUrl: e, projectKey: t });
27
- return this.req("GET", `/comments?${s}`);
28
- }
29
- async updateComment(e, t) {
30
- await this.req("PUT", `/comments/${e}`, t);
31
- }
32
- async deleteComment(e) {
33
- await this.req("DELETE", `/comments/${e}`);
34
- }
35
- async addReply(e) {
36
- return (await this.req("POST", "/replies", e)).id;
37
- }
38
- async getReplies(e) {
39
- return this.req("GET", `/replies?commentId=${encodeURIComponent(e)}`);
40
- }
41
- subscribeToComments(e, t, s) {
42
- let a = !0;
43
- const o = async () => {
44
- if (a) {
45
- try {
46
- const i = await this.getComments(e, t);
47
- a && s(i);
48
- } catch (i) {
49
- console.error("[ui-feedback-plugin] S3 poll error:", i);
50
- }
51
- a && setTimeout(o, this.pollInterval);
52
- }
53
- };
54
- return o(), () => {
55
- a = !1;
56
- };
57
- }
58
- async uploadScreenshot(e, t) {
59
- const s = t.includes(",") ? t.split(",")[1] : t;
60
- return (await this.req("POST", "/screenshots", { commentId: e, imageData: s })).url;
61
- }
62
- }
63
- export {
64
- d as S3Adapter
65
- };
66
- //# sourceMappingURL=s3-4V57aJiZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"s3-4V57aJiZ.mjs","sources":["../src/adapters/s3.ts"],"sourcesContent":["/**\n * AWS S3 adapter — stores everything (comments, replies, screenshots) via your backend API.\n * AWS credentials live on YOUR server; this adapter only calls HTTP endpoints.\n *\n * ── Required API contract ─────────────────────────────────────────────────────\n *\n * GET {apiUrl}/comments?pageUrl=...&projectKey=... → FeedbackComment[]\n * POST {apiUrl}/comments → { id: string }\n * PUT {apiUrl}/comments/:id → 200\n * DELETE {apiUrl}/comments/:id → 200\n *\n * GET {apiUrl}/replies?commentId=... → Reply[]\n * POST {apiUrl}/replies → { id: string }\n *\n * POST {apiUrl}/screenshots → { url: string }\n * body: { commentId: string, imageData: string (base64) }\n *\n * ── Minimal Node.js / Express reference server ────────────────────────────────\n *\n * const express = require('express')\n * const { S3Client, PutObjectCommand, GetObjectCommand,\n * DeleteObjectCommand, ListObjectsV2Command } = require('@aws-sdk/client-s3')\n * const { v4: uuidv4 } = require('uuid')\n * const crypto = require('crypto')\n *\n * const s3 = new S3Client({ region: process.env.AWS_REGION })\n * const BUCKET = process.env.S3_BUCKET\n * const app = express()\n * app.use(express.json({ limit: '10mb' }))\n *\n * const hashUrl = (url) => crypto.createHash('md5').update(url).digest('hex')\n *\n * async function s3Get(key) {\n * const r = await s3.send(new GetObjectCommand({ Bucket: BUCKET, Key: key }))\n * return JSON.parse(await r.Body.transformToString())\n * }\n * async function s3Put(key, data, contentType = 'application/json') {\n * const body = typeof data === 'string' ? data : JSON.stringify(data)\n * await s3.send(new PutObjectCommand({ Bucket: BUCKET, Key: key, Body: body, ContentType: contentType }))\n * }\n * async function s3List(prefix) {\n * const r = await s3.send(new ListObjectsV2Command({ Bucket: BUCKET, Prefix: prefix }))\n * return r.Contents ?? []\n * }\n *\n * // Comments\n * app.get('/ufp/comments', async (req, res) => {\n * const { pageUrl, projectKey } = req.query\n * const prefix = `comments/${projectKey}/${hashUrl(pageUrl)}/`\n * const items = await s3List(prefix)\n * const comments = await Promise.all(items.map(i => s3Get(i.Key)))\n * res.json(comments.sort((a, b) => b.createdAt - a.createdAt))\n * })\n *\n * app.post('/ufp/comments', async (req, res) => {\n * const comment = req.body\n * const id = uuidv4()\n * const key = `comments/${comment.projectKey}/${hashUrl(comment.pageUrl)}/${id}.json`\n * await s3Put(key, { id, ...comment })\n * res.json({ id })\n * })\n *\n * app.put('/ufp/comments/:id', async (req, res) => {\n * // Requires you to store a separate index: id → s3 key\n * // Simplest: scan prefix and find matching id\n * const { id } = req.params\n * const allPrefixes = await s3List('comments/')\n * const match = allPrefixes.find(i => i.Key.endsWith(`/${id}.json`))\n * if (!match) return res.status(404).end()\n * const existing = await s3Get(match.Key)\n * await s3Put(match.Key, { ...existing, ...req.body })\n * res.status(200).end()\n * })\n *\n * app.delete('/ufp/comments/:id', async (req, res) => {\n * const { id } = req.params\n * const allItems = await s3List('comments/')\n * const match = allItems.find(i => i.Key.endsWith(`/${id}.json`))\n * if (match) await s3.send(new DeleteObjectCommand({ Bucket: BUCKET, Key: match.Key }))\n * // Also delete replies\n * const replies = await s3List(`replies/${id}/`)\n * await Promise.all(replies.map(i => s3.send(new DeleteObjectCommand({ Bucket: BUCKET, Key: i.Key }))))\n * res.status(200).end()\n * })\n *\n * // Replies\n * app.get('/ufp/replies', async (req, res) => {\n * const { commentId } = req.query\n * const items = await s3List(`replies/${commentId}/`)\n * const replies = await Promise.all(items.map(i => s3Get(i.Key)))\n * res.json(replies.sort((a, b) => a.createdAt - b.createdAt))\n * })\n *\n * app.post('/ufp/replies', async (req, res) => {\n * const reply = req.body\n * const id = uuidv4()\n * await s3Put(`replies/${reply.commentId}/${id}.json`, { id, ...reply })\n * res.json({ id })\n * })\n *\n * // Screenshots\n * app.post('/ufp/screenshots', async (req, res) => {\n * const { commentId, imageData } = req.body\n * const buffer = Buffer.from(imageData, 'base64')\n * const key = `screenshots/${commentId}.png`\n * await s3.send(new PutObjectCommand({\n * Bucket: BUCKET, Key: key, Body: buffer,\n * ContentType: 'image/png',\n * }))\n * res.json({ url: `https://${BUCKET}.s3.${process.env.AWS_REGION}.amazonaws.com/${key}` })\n * })\n *\n * app.listen(3001, () => console.log('UFP S3 API running on :3001'))\n */\nimport type { FeedbackComment, Reply, DatabaseAdapter, ScreenshotAdapter } from '../core/types'\n\nexport class S3Adapter implements DatabaseAdapter, ScreenshotAdapter {\n private base: string\n private headers: Record<string, string>\n private pollInterval: number\n\n constructor(apiUrl: string, headers: Record<string, string> = {}, pollInterval = 5000) {\n this.base = apiUrl.replace(/\\/$/, '')\n this.headers = headers\n this.pollInterval = pollInterval\n }\n\n private async req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${this.base}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json', ...this.headers },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n if (!res.ok) {\n throw new Error(`[ui-feedback-plugin] S3 API ${method} ${path} → ${res.status} ${res.statusText}`)\n }\n // DELETE returns 200 with no body\n if (method === 'DELETE') return undefined as T\n return res.json() as Promise<T>\n }\n\n async addComment(comment: Omit<FeedbackComment, 'id'>): Promise<string> {\n const data = await this.req<{ id: string }>('POST', '/comments', comment)\n return data.id\n }\n\n async getComments(pageUrl: string, projectKey: string): Promise<FeedbackComment[]> {\n const params = new URLSearchParams({ pageUrl, projectKey })\n return this.req<FeedbackComment[]>('GET', `/comments?${params}`)\n }\n\n async updateComment(id: string, data: Partial<FeedbackComment>): Promise<void> {\n await this.req('PUT', `/comments/${id}`, data)\n }\n\n async deleteComment(id: string): Promise<void> {\n await this.req('DELETE', `/comments/${id}`)\n }\n\n async addReply(reply: Omit<Reply, 'id'>): Promise<string> {\n const data = await this.req<{ id: string }>('POST', '/replies', reply)\n return data.id\n }\n\n async getReplies(commentId: string): Promise<Reply[]> {\n return this.req<Reply[]>('GET', `/replies?commentId=${encodeURIComponent(commentId)}`)\n }\n\n subscribeToComments(\n pageUrl: string,\n projectKey: string,\n callback: (comments: FeedbackComment[]) => void\n ): () => void {\n let active = true\n\n const poll = async () => {\n if (!active) return\n try {\n const comments = await this.getComments(pageUrl, projectKey)\n if (active) callback(comments)\n } catch (err) {\n console.error('[ui-feedback-plugin] S3 poll error:', err)\n }\n if (active) setTimeout(poll, this.pollInterval)\n }\n\n poll()\n return () => { active = false }\n }\n\n async uploadScreenshot(commentId: string, dataUrl: string): Promise<string> {\n const imageData = dataUrl.includes(',') ? dataUrl.split(',')[1] : dataUrl\n const data = await this.req<{ url: string }>('POST', '/screenshots', { commentId, imageData })\n return data.url\n }\n}\n"],"names":["S3Adapter","apiUrl","headers","pollInterval","__publicField","method","path","body","res","comment","pageUrl","projectKey","params","id","data","reply","commentId","callback","active","poll","comments","err","dataUrl","imageData"],"mappings":";;;AAoHO,MAAMA,EAAwD;AAAA,EAKnE,YAAYC,GAAgBC,IAAkC,CAAA,GAAIC,IAAe,KAAM;AAJ/E,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,OAAOH,EAAO,QAAQ,OAAO,EAAE,GACpC,KAAK,UAAUC,GACf,KAAK,eAAeC;AAAA,EACtB;AAAA,EAEA,MAAc,IAAOE,GAAgBC,GAAcC,GAA4B;AAC7E,UAAMC,IAAM,MAAM,MAAM,GAAG,KAAK,IAAI,GAAGF,CAAI,IAAI;AAAA,MAC7C,QAAAD;AAAA,MACA,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,QAAA;AAAA,MACvD,MAAME,MAAS,SAAY,KAAK,UAAUA,CAAI,IAAI;AAAA,IAAA,CACnD;AACD,QAAI,CAACC,EAAI;AACP,YAAM,IAAI,MAAM,+BAA+BH,CAAM,IAAIC,CAAI,MAAME,EAAI,MAAM,IAAIA,EAAI,UAAU,EAAE;AAGnG,QAAIH,MAAW;AACf,aAAOG,EAAI,KAAA;AAAA,EACb;AAAA,EAEA,MAAM,WAAWC,GAAuD;AAEtE,YADa,MAAM,KAAK,IAAoB,QAAQ,aAAaA,CAAO,GAC5D;AAAA,EACd;AAAA,EAEA,MAAM,YAAYC,GAAiBC,GAAgD;AACjF,UAAMC,IAAS,IAAI,gBAAgB,EAAE,SAAAF,GAAS,YAAAC,GAAY;AAC1D,WAAO,KAAK,IAAuB,OAAO,aAAaC,CAAM,EAAE;AAAA,EACjE;AAAA,EAEA,MAAM,cAAcC,GAAYC,GAA+C;AAC7E,UAAM,KAAK,IAAI,OAAO,aAAaD,CAAE,IAAIC,CAAI;AAAA,EAC/C;AAAA,EAEA,MAAM,cAAcD,GAA2B;AAC7C,UAAM,KAAK,IAAI,UAAU,aAAaA,CAAE,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAM,SAASE,GAA2C;AAExD,YADa,MAAM,KAAK,IAAoB,QAAQ,YAAYA,CAAK,GACzD;AAAA,EACd;AAAA,EAEA,MAAM,WAAWC,GAAqC;AACpD,WAAO,KAAK,IAAa,OAAO,sBAAsB,mBAAmBA,CAAS,CAAC,EAAE;AAAA,EACvF;AAAA,EAEA,oBACEN,GACAC,GACAM,GACY;AACZ,QAAIC,IAAS;AAEb,UAAMC,IAAO,YAAY;AACvB,UAAKD,GACL;AAAA,YAAI;AACF,gBAAME,IAAW,MAAM,KAAK,YAAYV,GAASC,CAAU;AAC3D,UAAIO,OAAiBE,CAAQ;AAAA,QAC/B,SAASC,GAAK;AACZ,kBAAQ,MAAM,uCAAuCA,CAAG;AAAA,QAC1D;AACA,QAAIH,KAAQ,WAAWC,GAAM,KAAK,YAAY;AAAA;AAAA,IAChD;AAEA,WAAAA,EAAA,GACO,MAAM;AAAE,MAAAD,IAAS;AAAA,IAAM;AAAA,EAChC;AAAA,EAEA,MAAM,iBAAiBF,GAAmBM,GAAkC;AAC1E,UAAMC,IAAYD,EAAQ,SAAS,GAAG,IAAIA,EAAQ,MAAM,GAAG,EAAE,CAAC,IAAIA;AAElE,YADa,MAAM,KAAK,IAAqB,QAAQ,gBAAgB,EAAE,WAAAN,GAAW,WAAAO,GAAW,GACjF;AAAA,EACd;AACF;"}