@stigmer/react 3.8.0 → 3.9.0
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/attachment/AttachmentChipList.d.ts.map +1 -1
- package/attachment/AttachmentChipList.js +30 -1
- package/attachment/AttachmentChipList.js.map +1 -1
- package/attachment/attachment-utils.d.ts +11 -0
- package/attachment/attachment-utils.d.ts.map +1 -1
- package/attachment/attachment-utils.js +23 -0
- package/attachment/attachment-utils.js.map +1 -1
- package/attachment/clipboard.d.ts +51 -0
- package/attachment/clipboard.d.ts.map +1 -0
- package/attachment/clipboard.js +89 -0
- package/attachment/clipboard.js.map +1 -0
- package/attachment/index.d.ts +6 -1
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js +4 -1
- package/attachment/index.js.map +1 -1
- package/attachment/prepare-image.d.ts +43 -0
- package/attachment/prepare-image.d.ts.map +1 -0
- package/attachment/prepare-image.js +162 -0
- package/attachment/prepare-image.js.map +1 -0
- package/attachment/useAttachments.d.ts.map +1 -1
- package/attachment/useAttachments.js +23 -3
- package/attachment/useAttachments.js.map +1 -1
- package/attachment/vision-fit.d.ts +50 -0
- package/attachment/vision-fit.d.ts.map +1 -0
- package/attachment/vision-fit.js +76 -0
- package/attachment/vision-fit.js.map +1 -0
- package/composer/SessionComposer.d.ts +3 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +50 -4
- package/composer/SessionComposer.js.map +1 -1
- package/index.d.ts +2 -2
- package/index.d.ts.map +1 -1
- package/index.js +3 -2
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/src/attachment/AttachmentChipList.tsx +45 -1
- package/src/attachment/__tests__/AttachmentChipList.test.tsx +103 -0
- package/src/attachment/__tests__/attachment-utils.test.ts +54 -0
- package/src/attachment/__tests__/clipboard.test.ts +110 -0
- package/src/attachment/__tests__/prepare-image.browser.test.ts +166 -0
- package/src/attachment/__tests__/prepare-image.test.ts +32 -0
- package/src/attachment/__tests__/vision-fit.test.ts +93 -0
- package/src/attachment/attachment-utils.ts +27 -0
- package/src/attachment/clipboard.ts +102 -0
- package/src/attachment/index.ts +13 -0
- package/src/attachment/prepare-image.ts +179 -0
- package/src/attachment/useAttachments.ts +26 -2
- package/src/attachment/vision-fit.ts +90 -0
- package/src/composer/SessionComposer.tsx +73 -4
- package/src/composer/__tests__/SessionComposer-paste.test.tsx +263 -0
- package/src/composer/__tests__/SessionComposer-uploadGate.test.tsx +239 -0
- package/src/index.ts +11 -1
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAA6B,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,iBAAiB;AACjB,OAAO,EAAsB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,8EAA8E;AAC9E,qEAAqE;AACrE,OAAO,EAAyB,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE1E,cAAc;AACd,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGtE,QAAQ;AACR,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGjE,mBAAmB;AACnB,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,4CAA4C;AAC5C,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAuB,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAgC,MAAM,kCAAkC,CAAC;AAEpG,2DAA2D;AAC3D,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAc3B,mDAAmD;AACnD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AA0C9B,+FAA+F;AAC/F,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,6BAA6B,EAC7B,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAkD5B,sEAAsE;AACtE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAU7B,0FAA0F;AAC1F,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,4BAA4B,EAC5B,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,0BAA0B,EAC1B,eAAe,EACf,6BAA6B,EAC7B,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAyG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8DAA8D,CAAC;AAErG,8DAA8D;AAC9D,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAS/B,+EAA+E;AAC/E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,+EAA+E;AAC/E,OAAO,EACL,WAAW,EACX,eAAe,EACf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAW7B,+JAA+J;AAC/J,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AA0C/B,yDAAyD;AACzD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AA0B1B,iEAAiE;AACjE,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAc3B,iKAAiK;AACjK,OAAO,EACL,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,OAAO,EACP,aAAa,EACb,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,EACZ,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AA6B1B,qEAAqE;AACrE,uEAAuE;AACvE,qEAAqE;AACrE,sEAAsE;AACtE,wEAAwE;AACxE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAsC9B,uEAAuE;AACvE,wEAAwE;AACxE,kEAAkE;AAClE,oEAAoE;AACpE,uEAAuE;AACvE,mEAAmE;AACnE,mEAAmE;AACnE,uEAAuE;AACvE,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AA0B7B,2JAA2J;AAC3J,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,6BAA6B,EAC7B,6BAA6B,EAC7B,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAyBhC,mGAAmG;AACnG,OAAO,EACL,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAMrC,sGAAsG;AACtG,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,cAAc,GACf,MAAM,uBAAuB,CAAC;AA6B/B,2EAA2E;AAC3E,0DAA0D;AAC1D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAW3B,mHAAmH;AACnH,OAAO,EACL,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAcjC,2EAA2E;AAC3E,oCAAoC;AACpC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAsB5B,yEAAyE;AACzE,8EAA8E;AAC9E,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,6BAA6B,EAC7B,sBAAsB,EACtB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAoBvC,yEAAyE;AACzE,qEAAqE;AACrE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AAepC,gFAAgF;AAChF,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,6BAA6B;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,0EAA0E;AAC1E,0EAA0E;AAC1E,0EAA0E;AAC1E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUvE,oFAAoF;AACpF,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAU5B,oGAAoG;AACpG,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AAcpC,yFAAyF;AACzF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAW9B,yEAAyE;AACzE,6DAA6D;AAC7D,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAYhC,qIAAqI;AACrI,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,sBAAsB,EACtB,2BAA2B,EAC3B,cAAc,GACf,MAAM,8BAA8B,CAAC;AAmBtC,uFAAuF;AACvF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAY/B,8EAA8E;AAC9E,mFAAmF;AACnF,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAkB5B,+EAA+E;AAC/E,oEAAoE;AACpE,sBAAsB;AACtB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAyB5B,yEAAyE;AACzE,oEAAoE;AACpE,yEAAyE;AACzE,oEAAoE;AACpE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,+BAA+B,EAC/B,YAAY,EACZ,mBAAmB,EACnB,+BAA+B,EAC/B,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,EACb,eAAe,EACf,mCAAmC,EACnC,oCAAoC,EACpC,kCAAkC,GACnC,MAAM,yBAAyB,CAAC;AA2BjC,yEAAyE;AACzE,mEAAmE;AACnE,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,uEAAuE,CAAC;AAM/E,uFAAuF;AACvF,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGzF,8GAA8G;AAC9G,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAuB5B,oEAAoE;AACpE,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAe7B,6DAA6D;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUpD,uDAAuD;AACvD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG5D,sEAAsE;AACtE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAenE,iFAAiF;AACjF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAc1B,wFAAwF;AACxF,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAgBnC,2CAA2C;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,wEAAwE;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,6EAA6E;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,6FAA6F;AAC7F,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,OAAO,EACP,aAAa,GACd,MAAM,4BAA4B,CAAC;AAiBpC,iFAAiF;AACjF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAqBtC,yFAAyF;AACzF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAUlF,kFAAkF;AAClF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAgBpC,8EAA8E;AAC9E,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAehC,8GAA8G;AAC9G,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,+BAA+B,CAAC;AAoCvC,+DAA+D;AAC/D,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,6BAA6B,EAC7B,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,EAC/B,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB;AAClB,yBAAyB;AACzB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB;AACxB,+BAA+B;AAC/B,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,4CAA4C,EAC5C,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,EACpB,4BAA4B,EAC5B,2BAA2B,EAC3B,oBAAoB;AACpB,iCAAiC;AACjC,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB;AACvB,uEAAuE;AACvE,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB;AAChB,uDAAuD;AACvD,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB;AAClB,mEAAmE;AACnE,0CAA0C;AAC1C,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB;AACxB,sEAAsE;AACtE,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAuK7B,8EAA8E;AAC9E,OAAO;AAIL,aAAa;AACb,wBAAwB,EACxB,+BAA+B,EAG/B,mBAAmB,EAGnB,sBAAsB;AAEtB,oBAAoB;AACpB,iBAAiB,EAEjB,mBAAmB,EAEnB,oBAAoB,GAErB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigmer/react",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"description": "React provider and client hook for the Stigmer platform SDK",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@bufbuild/protovalidate": "^1.1.1",
|
|
39
39
|
"@dagrejs/dagre": "^1.1.4",
|
|
40
|
-
"@stigmer/theme": "3.
|
|
40
|
+
"@stigmer/theme": "3.9.0",
|
|
41
41
|
"diff": "^8.0.3",
|
|
42
42
|
"fflate": "^0.8.2",
|
|
43
43
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"@codemirror/state": "^6.0.0",
|
|
61
61
|
"@codemirror/view": "^6.0.0",
|
|
62
62
|
"@lezer/highlight": "^1.0.0",
|
|
63
|
-
"@stigmer/protos": "3.
|
|
64
|
-
"@stigmer/sdk": "3.
|
|
63
|
+
"@stigmer/protos": "3.9.0",
|
|
64
|
+
"@stigmer/sdk": "3.9.0",
|
|
65
65
|
"@tanstack/react-table": "^8.20.0",
|
|
66
66
|
"@xyflow/react": "^12.0.0",
|
|
67
67
|
"elkjs": "^0.9.0",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
3
4
|
import { cn } from "@stigmer/theme";
|
|
4
5
|
import type { AttachmentEntry } from "./useAttachments.js";
|
|
5
6
|
import { formatFileSize } from "./attachment-utils.js";
|
|
@@ -103,7 +104,12 @@ function AttachmentChip({
|
|
|
103
104
|
>
|
|
104
105
|
{isUploading && <ChipSpinner />}
|
|
105
106
|
{isError && <ErrorDot />}
|
|
106
|
-
{!isUploading && !isError &&
|
|
107
|
+
{!isUploading && !isError &&
|
|
108
|
+
(entry.contentType.startsWith("image/") ? (
|
|
109
|
+
<ChipThumbnail file={entry.file} />
|
|
110
|
+
) : (
|
|
111
|
+
<FileIcon />
|
|
112
|
+
))}
|
|
107
113
|
|
|
108
114
|
<span className="truncate">{entry.file.name}</span>
|
|
109
115
|
|
|
@@ -136,6 +142,44 @@ function AttachmentChip({
|
|
|
136
142
|
);
|
|
137
143
|
}
|
|
138
144
|
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Image thumbnail — a #284 ask: a pasted screenshot's chip shows the image,
|
|
147
|
+
// not a generic file glyph
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Tiny preview of an image attachment, driven by an object URL over the
|
|
152
|
+
* locally-held `File` (no fetch — the bytes are already in memory).
|
|
153
|
+
*
|
|
154
|
+
* The URL is created in an effect, not a memo: StrictMode double-invokes
|
|
155
|
+
* memos and would leak the first URL without a revoke. The effect cleanup
|
|
156
|
+
* revokes on removal, unmount, and file change. Until the effect runs (or
|
|
157
|
+
* if it never gets a URL) the generic icon renders instead.
|
|
158
|
+
*
|
|
159
|
+
* `aria-hidden`: the chip's own `aria-label` already names the file; a
|
|
160
|
+
* 16px thumbnail adds nothing for screen readers.
|
|
161
|
+
*/
|
|
162
|
+
function ChipThumbnail({ file }: { readonly file: File }) {
|
|
163
|
+
const [url, setUrl] = useState<string | null>(null);
|
|
164
|
+
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
const objectUrl = URL.createObjectURL(file);
|
|
167
|
+
setUrl(objectUrl);
|
|
168
|
+
return () => URL.revokeObjectURL(objectUrl);
|
|
169
|
+
}, [file]);
|
|
170
|
+
|
|
171
|
+
if (!url) return <FileIcon />;
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<img
|
|
175
|
+
src={url}
|
|
176
|
+
alt=""
|
|
177
|
+
aria-hidden="true"
|
|
178
|
+
className="h-4 w-4 shrink-0 rounded-sm object-cover"
|
|
179
|
+
/>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
139
183
|
// ---------------------------------------------------------------------------
|
|
140
184
|
// Inline SVG icons — kept minimal and consistent with SessionComposer icons
|
|
141
185
|
// ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { render, cleanup, waitFor } from "@testing-library/react";
|
|
3
|
+
import { AttachmentChipList } from "../AttachmentChipList.js";
|
|
4
|
+
import type { AttachmentEntry } from "../useAttachments.js";
|
|
5
|
+
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
function entry(overrides: Partial<AttachmentEntry> = {}): AttachmentEntry {
|
|
11
|
+
return {
|
|
12
|
+
id: overrides.id ?? "entry-1",
|
|
13
|
+
file:
|
|
14
|
+
overrides.file ??
|
|
15
|
+
new File([new Uint8Array([0x89, 0x50, 0x4e, 0x47])], "shot.png", {
|
|
16
|
+
type: "image/png",
|
|
17
|
+
}),
|
|
18
|
+
phase: overrides.phase ?? "ready",
|
|
19
|
+
contentType: overrides.contentType ?? "image/png",
|
|
20
|
+
storageKey: overrides.storageKey ?? "attachments/test/shot.png",
|
|
21
|
+
error: overrides.error ?? null,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function renderChips(entries: AttachmentEntry[]) {
|
|
26
|
+
return render(
|
|
27
|
+
<AttachmentChipList entries={entries} onRemove={vi.fn()} onRetry={vi.fn()} />,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
cleanup();
|
|
33
|
+
vi.restoreAllMocks();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Tests
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
describe("AttachmentChipList — image thumbnails", () => {
|
|
41
|
+
it("renders an object-URL thumbnail for a ready image entry", async () => {
|
|
42
|
+
const { container } = renderChips([entry()]);
|
|
43
|
+
|
|
44
|
+
await waitFor(() => {
|
|
45
|
+
const img = container.querySelector("img");
|
|
46
|
+
expect(img).toBeTruthy();
|
|
47
|
+
expect(img!.getAttribute("src")).toContain("blob:");
|
|
48
|
+
expect(img!.getAttribute("aria-hidden")).toBe("true");
|
|
49
|
+
expect(img!.getAttribute("alt")).toBe("");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("keeps the generic file icon for non-image entries", () => {
|
|
54
|
+
const md = entry({
|
|
55
|
+
file: new File(["# notes"], "notes.md", { type: "text/markdown" }),
|
|
56
|
+
contentType: "text/markdown",
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const { container } = renderChips([md]);
|
|
60
|
+
|
|
61
|
+
expect(container.querySelector("img")).toBeNull();
|
|
62
|
+
expect(container.querySelector("svg")).toBeTruthy();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("shows no thumbnail while uploading or errored (spinner / error dot own the slot)", () => {
|
|
66
|
+
const uploading = entry({ id: "up", phase: "uploading", storageKey: null });
|
|
67
|
+
const errored = entry({ id: "err", phase: "error", error: "boom", storageKey: null });
|
|
68
|
+
|
|
69
|
+
const { container } = renderChips([uploading, errored]);
|
|
70
|
+
|
|
71
|
+
expect(container.querySelector("img")).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("revokes the object URL on unmount", async () => {
|
|
75
|
+
const revokeSpy = vi.spyOn(URL, "revokeObjectURL");
|
|
76
|
+
const { container, unmount } = renderChips([entry()]);
|
|
77
|
+
|
|
78
|
+
await waitFor(() => expect(container.querySelector("img")).toBeTruthy());
|
|
79
|
+
const src = container.querySelector("img")!.getAttribute("src")!;
|
|
80
|
+
|
|
81
|
+
unmount();
|
|
82
|
+
|
|
83
|
+
expect(revokeSpy).toHaveBeenCalledWith(src);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("revokes the object URL when the entry is removed from the list", async () => {
|
|
87
|
+
const revokeSpy = vi.spyOn(URL, "revokeObjectURL");
|
|
88
|
+
const image = entry();
|
|
89
|
+
const { container, rerender } = render(
|
|
90
|
+
<AttachmentChipList entries={[image]} onRemove={vi.fn()} onRetry={vi.fn()} />,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
await waitFor(() => expect(container.querySelector("img")).toBeTruthy());
|
|
94
|
+
const src = container.querySelector("img")!.getAttribute("src")!;
|
|
95
|
+
|
|
96
|
+
rerender(
|
|
97
|
+
<AttachmentChipList entries={[]} onRemove={vi.fn()} onRetry={vi.fn()} />,
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
expect(container.querySelector("img")).toBeNull();
|
|
101
|
+
expect(revokeSpy).toHaveBeenCalledWith(src);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { uniquifyFilename } from "../attachment-utils.js";
|
|
3
|
+
|
|
4
|
+
describe("uniquifyFilename", () => {
|
|
5
|
+
const cases: Array<{
|
|
6
|
+
scenario: string;
|
|
7
|
+
name: string;
|
|
8
|
+
taken: string[];
|
|
9
|
+
expected: string;
|
|
10
|
+
}> = [
|
|
11
|
+
{
|
|
12
|
+
scenario: "returns the name unchanged when nothing collides",
|
|
13
|
+
name: "report.pdf",
|
|
14
|
+
taken: [],
|
|
15
|
+
expected: "report.pdf",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
scenario: "suffixes -2 before the extension on first collision",
|
|
19
|
+
name: "report.pdf",
|
|
20
|
+
taken: ["report.pdf"],
|
|
21
|
+
expected: "report-2.pdf",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
scenario: "walks past already-taken suffixes",
|
|
25
|
+
name: "report.pdf",
|
|
26
|
+
taken: ["report.pdf", "report-2.pdf", "report-3.pdf"],
|
|
27
|
+
expected: "report-4.pdf",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
scenario: "handles names without an extension",
|
|
31
|
+
name: "Makefile",
|
|
32
|
+
taken: ["Makefile"],
|
|
33
|
+
expected: "Makefile-2",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
scenario: "treats a leading dot as a hidden-file prefix, not an extension",
|
|
37
|
+
name: ".env",
|
|
38
|
+
taken: [".env"],
|
|
39
|
+
expected: ".env-2",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
scenario: "only splits on the last dot of a multi-dot name",
|
|
43
|
+
name: "backup.tar.gz",
|
|
44
|
+
taken: ["backup.tar.gz"],
|
|
45
|
+
expected: "backup.tar-2.gz",
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
for (const { scenario, name, taken, expected } of cases) {
|
|
50
|
+
it(scenario, () => {
|
|
51
|
+
expect(uniquifyFilename(name, new Set(taken))).toBe(expected);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { extractClipboardFiles } from "../clipboard.js";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Helpers
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The function only reads `clipboardData.files` as an array-like, so a
|
|
10
|
+
* plain array cast to FileList is a faithful stand-in (same pattern as the
|
|
11
|
+
* composer fileref tests).
|
|
12
|
+
*/
|
|
13
|
+
function clipboardEventWith(files: File[]): { clipboardData: { files: FileList } } {
|
|
14
|
+
return { clipboardData: { files: files as unknown as FileList } };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function imageFile(name: string, type = "image/png"): File {
|
|
18
|
+
return new File([new Uint8Array([0x89, 0x50, 0x4e, 0x47])], name, { type });
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const SYNTHESIZED_NAME = /^pasted-image-\d{6}-\d+\.[a-z]+$/;
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Tests
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
describe("extractClipboardFiles", () => {
|
|
28
|
+
it("returns an empty array for a text-only paste (null clipboardData)", () => {
|
|
29
|
+
expect(extractClipboardFiles({ clipboardData: null })).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("returns an empty array when the clipboard carries no files", () => {
|
|
33
|
+
expect(extractClipboardFiles(clipboardEventWith([]))).toEqual([]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("renames the browser's generic image.png to a synthesized name", () => {
|
|
37
|
+
const [file] = extractClipboardFiles(clipboardEventWith([imageFile("image.png")]));
|
|
38
|
+
|
|
39
|
+
expect(file.name).toMatch(SYNTHESIZED_NAME);
|
|
40
|
+
expect(file.name.endsWith(".png")).toBe(true);
|
|
41
|
+
expect(file.type).toBe("image/png");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("renames generic names for every image flavor browsers produce", () => {
|
|
45
|
+
const cases: Array<[string, string, string]> = [
|
|
46
|
+
["image.jpg", "image/jpeg", ".jpg"],
|
|
47
|
+
["image.jpeg", "image/jpeg", ".jpg"],
|
|
48
|
+
["image.gif", "image/gif", ".gif"],
|
|
49
|
+
["image.webp", "image/webp", ".webp"],
|
|
50
|
+
["image.tiff", "image/tiff", ".tiff"],
|
|
51
|
+
["IMAGE.PNG", "image/png", ".png"],
|
|
52
|
+
// Empty name with an image MIME (some WebKit paste payloads).
|
|
53
|
+
["", "image/png", ".png"],
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
for (const [name, type, expectedExt] of cases) {
|
|
57
|
+
const [file] = extractClipboardFiles(clipboardEventWith([imageFile(name, type)]));
|
|
58
|
+
expect(file.name, `input name '${name}'`).toMatch(SYNTHESIZED_NAME);
|
|
59
|
+
expect(file.name.endsWith(expectedExt), `'${file.name}' should end with ${expectedExt}`).toBe(true);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("gives two images pasted together distinct names", () => {
|
|
64
|
+
const files = extractClipboardFiles(
|
|
65
|
+
clipboardEventWith([imageFile("image.png"), imageFile("image.png")]),
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
expect(files).toHaveLength(2);
|
|
69
|
+
expect(files[0].name).not.toBe(files[1].name);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("gives images from separate pastes distinct names (session inputs/ dir accumulates)", () => {
|
|
73
|
+
const [first] = extractClipboardFiles(clipboardEventWith([imageFile("image.png")]));
|
|
74
|
+
const [second] = extractClipboardFiles(clipboardEventWith([imageFile("image.png")]));
|
|
75
|
+
|
|
76
|
+
expect(first.name).not.toBe(second.name);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("keeps the real name of a file pasted from a file manager", () => {
|
|
80
|
+
const [file] = extractClipboardFiles(
|
|
81
|
+
clipboardEventWith([imageFile("architecture-sketch.png")]),
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
expect(file.name).toBe("architecture-sketch.png");
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("does not rename a non-image file even when named image.png", () => {
|
|
88
|
+
const pdf = new File([new Uint8Array([0x25, 0x50])], "image.png", {
|
|
89
|
+
type: "application/pdf",
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const [file] = extractClipboardFiles(clipboardEventWith([pdf]));
|
|
93
|
+
expect(file.name).toBe("image.png");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("preserves bytes and metadata across a rename", async () => {
|
|
97
|
+
const original = new File([new Uint8Array([1, 2, 3, 4])], "image.png", {
|
|
98
|
+
type: "image/png",
|
|
99
|
+
lastModified: 1723200000000,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const [renamed] = extractClipboardFiles(clipboardEventWith([original]));
|
|
103
|
+
|
|
104
|
+
expect(renamed.type).toBe("image/png");
|
|
105
|
+
expect(renamed.lastModified).toBe(1723200000000);
|
|
106
|
+
expect(new Uint8Array(await renamed.arrayBuffer())).toEqual(
|
|
107
|
+
new Uint8Array([1, 2, 3, 4]),
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { prepareImageForVision } from "../prepare-image.js";
|
|
3
|
+
import { fitToVisionResolution } from "../vision-fit.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Real-Chromium half of the prepare-image coverage: decode, resize, and
|
|
7
|
+
* encode against an actual rendering engine (happy-dom has no canvas 2D
|
|
8
|
+
* or createImageBitmap — see prepare-image.test.ts for the guard rails).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Helpers
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
function makeCanvas(width: number, height: number): [HTMLCanvasElement, CanvasRenderingContext2D] {
|
|
16
|
+
const canvas = document.createElement("canvas");
|
|
17
|
+
canvas.width = width;
|
|
18
|
+
canvas.height = height;
|
|
19
|
+
const ctx = canvas.getContext("2d");
|
|
20
|
+
if (!ctx) throw new Error("test environment must provide a 2D context");
|
|
21
|
+
return [canvas, ctx];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Flat fills and text — the compressible content of a UI screenshot. */
|
|
25
|
+
function drawUiLike(ctx: CanvasRenderingContext2D, width: number, height: number) {
|
|
26
|
+
ctx.fillStyle = "#f5f5f5";
|
|
27
|
+
ctx.fillRect(0, 0, width, height);
|
|
28
|
+
ctx.fillStyle = "#3355aa";
|
|
29
|
+
ctx.fillRect(40, 40, width / 2, 120);
|
|
30
|
+
ctx.fillStyle = "#111111";
|
|
31
|
+
ctx.font = "24px sans-serif";
|
|
32
|
+
for (let y = 220; y < height - 40; y += 48) {
|
|
33
|
+
ctx.fillText("Error: connection refused at line 42 — retry failed", 48, y);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Per-pixel noise — the least-compressible content a photo can approach. */
|
|
38
|
+
function drawNoise(ctx: CanvasRenderingContext2D, width: number, height: number) {
|
|
39
|
+
const imageData = ctx.createImageData(width, height);
|
|
40
|
+
const data = imageData.data;
|
|
41
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
42
|
+
data[i] = Math.floor(Math.random() * 256);
|
|
43
|
+
data[i + 1] = Math.floor(Math.random() * 256);
|
|
44
|
+
data[i + 2] = Math.floor(Math.random() * 256);
|
|
45
|
+
data[i + 3] = 255;
|
|
46
|
+
}
|
|
47
|
+
ctx.putImageData(imageData, 0, 0);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function fileFromCanvas(
|
|
51
|
+
canvas: HTMLCanvasElement,
|
|
52
|
+
name: string,
|
|
53
|
+
type: string,
|
|
54
|
+
): Promise<File> {
|
|
55
|
+
const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, type));
|
|
56
|
+
if (!blob) throw new Error(`canvas could not encode ${type}`);
|
|
57
|
+
return new File([blob], name, { type });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function imageFile(
|
|
61
|
+
width: number,
|
|
62
|
+
height: number,
|
|
63
|
+
name: string,
|
|
64
|
+
type: string,
|
|
65
|
+
draw: (ctx: CanvasRenderingContext2D, w: number, h: number) => void = drawUiLike,
|
|
66
|
+
): Promise<File> {
|
|
67
|
+
const [canvas, ctx] = makeCanvas(width, height);
|
|
68
|
+
draw(ctx, width, height);
|
|
69
|
+
return fileFromCanvas(canvas, name, type);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function decodedSize(file: File): Promise<{ width: number; height: number }> {
|
|
73
|
+
const bitmap = await createImageBitmap(file);
|
|
74
|
+
const size = { width: bitmap.width, height: bitmap.height };
|
|
75
|
+
bitmap.close();
|
|
76
|
+
return size;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Tests
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
describe("prepareImageForVision — real pixel pipeline", () => {
|
|
84
|
+
it("resizes an oversized PNG screenshot to the fitted resolution, staying PNG", async () => {
|
|
85
|
+
const input = await imageFile(3000, 2000, "screenshot.png", "image/png");
|
|
86
|
+
const expected = fitToVisionResolution(3000, 2000);
|
|
87
|
+
|
|
88
|
+
const prepared = await prepareImageForVision(input);
|
|
89
|
+
|
|
90
|
+
expect(prepared).not.toBe(input);
|
|
91
|
+
expect(prepared.type).toBe("image/png");
|
|
92
|
+
expect(prepared.name).toBe("screenshot.png");
|
|
93
|
+
expect(prepared.size).toBeLessThan(input.size);
|
|
94
|
+
expect(prepared.lastModified).toBe(input.lastModified);
|
|
95
|
+
await expect(decodedSize(prepared)).resolves.toEqual(expected);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("passes a within-limits PNG through byte-identical (no generation loss on re-edit)", async () => {
|
|
99
|
+
const input = await imageFile(400, 300, "small.png", "image/png");
|
|
100
|
+
|
|
101
|
+
const prepared = await prepareImageForVision(input);
|
|
102
|
+
|
|
103
|
+
expect(prepared).toBe(input);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("passes a within-limits JPEG through byte-identical", async () => {
|
|
107
|
+
const input = await imageFile(640, 480, "photo.jpg", "image/jpeg");
|
|
108
|
+
|
|
109
|
+
const prepared = await prepareImageForVision(input);
|
|
110
|
+
|
|
111
|
+
expect(prepared).toBe(input);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("keeps JPEG format when resizing a JPEG source", async () => {
|
|
115
|
+
const input = await imageFile(4000, 3000, "camera.jpg", "image/jpeg");
|
|
116
|
+
const expected = fitToVisionResolution(4000, 3000);
|
|
117
|
+
|
|
118
|
+
const prepared = await prepareImageForVision(input);
|
|
119
|
+
|
|
120
|
+
expect(prepared.type).toBe("image/jpeg");
|
|
121
|
+
expect(prepared.name).toBe("camera.jpg");
|
|
122
|
+
await expect(decodedSize(prepared)).resolves.toEqual(expected);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("re-encodes a within-limits WebP to PNG so the Cursor harness can display it", async () => {
|
|
126
|
+
const input = await imageFile(800, 600, "clip.webp", "image/webp");
|
|
127
|
+
|
|
128
|
+
const prepared = await prepareImageForVision(input);
|
|
129
|
+
|
|
130
|
+
expect(prepared).not.toBe(input);
|
|
131
|
+
expect(prepared.type).toBe("image/png");
|
|
132
|
+
expect(prepared.name).toBe("clip.png");
|
|
133
|
+
// Format normalization only — the dimensions stay untouched.
|
|
134
|
+
await expect(decodedSize(prepared)).resolves.toEqual({ width: 800, height: 600 });
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("keeps worst-case photographic content under the runner's inline byte cap", async () => {
|
|
138
|
+
// Evidence gate from the T05 plan. Pure noise is the least-compressible
|
|
139
|
+
// content an image can carry; at the fitted resolution a noise PNG
|
|
140
|
+
// encodes to ~3.4 MB — over the runner's per-image inline cap — which
|
|
141
|
+
// is exactly what the PNG-density JPEG fallback exists to catch.
|
|
142
|
+
// The cap constant mirrors MAX_VISION_IMAGE_BYTES in the runner's
|
|
143
|
+
// shared/attachment-vision.ts (a measurement bound in a test, never a
|
|
144
|
+
// production dependency).
|
|
145
|
+
const RUNNER_INLINE_IMAGE_CAP = 3 * 1024 * 1024;
|
|
146
|
+
|
|
147
|
+
const input = await imageFile(3000, 2000, "photo.png", "image/png", drawNoise);
|
|
148
|
+
|
|
149
|
+
const prepared = await prepareImageForVision(input);
|
|
150
|
+
|
|
151
|
+
expect(prepared.size).toBeLessThan(RUNNER_INLINE_IMAGE_CAP);
|
|
152
|
+
// Noise defeats PNG, so the ratio rule must have picked JPEG.
|
|
153
|
+
expect(prepared.type).toBe("image/jpeg");
|
|
154
|
+
expect(prepared.name).toBe("photo.jpg");
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("prefers PNG for UI-like content even though JPEG is available", async () => {
|
|
158
|
+
const input = await imageFile(3000, 2000, "dialog.png", "image/png", drawUiLike);
|
|
159
|
+
|
|
160
|
+
const prepared = await prepareImageForVision(input);
|
|
161
|
+
|
|
162
|
+
// Flat fills and text compress better in PNG than JPEG-at-half-size,
|
|
163
|
+
// and PNG keeps UI text crisp — the ratio rule must keep PNG here.
|
|
164
|
+
expect(prepared.type).toBe("image/png");
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { prepareImageForVision } from "../prepare-image.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* happy-dom half of the prepare-image coverage: the guard rails that make
|
|
6
|
+
* the function safe to call from any environment. The actual pixel work
|
|
7
|
+
* (decode, resize, encode) runs in real Chromium — see
|
|
8
|
+
* prepare-image.browser.test.ts.
|
|
9
|
+
*/
|
|
10
|
+
describe("prepareImageForVision — environment guard rails", () => {
|
|
11
|
+
it("returns a non-image file untouched (same instance)", async () => {
|
|
12
|
+
const pdf = new File([new Uint8Array([0x25, 0x50, 0x44, 0x46])], "brief.pdf", {
|
|
13
|
+
type: "application/pdf",
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
await expect(prepareImageForVision(pdf)).resolves.toBe(pdf);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("returns an image untouched when the canvas pipeline is unavailable", async () => {
|
|
20
|
+
// happy-dom has no createImageBitmap — the exact situation of an old
|
|
21
|
+
// browser or a privacy extension that blocks canvas. The paste must
|
|
22
|
+
// still work end to end with the original bytes; it merely degrades
|
|
23
|
+
// at the runner with the standard disclosure.
|
|
24
|
+
expect(typeof createImageBitmap).toBe("undefined");
|
|
25
|
+
|
|
26
|
+
const png = new File([new Uint8Array([0x89, 0x50, 0x4e, 0x47])], "shot.png", {
|
|
27
|
+
type: "image/png",
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
await expect(prepareImageForVision(png)).resolves.toBe(png);
|
|
31
|
+
});
|
|
32
|
+
});
|