pure-md5 0.2.0 → 0.2.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.
Files changed (177) hide show
  1. package/README.md +38 -24
  2. package/dist/adapters/ie11.cjs +1 -2
  3. package/dist/adapters/ie11.js +1 -2
  4. package/dist/adapters/node.cjs +1 -2
  5. package/dist/adapters/node.js +1 -2
  6. package/dist/adapters/webcrypto.cjs +1 -2
  7. package/dist/adapters/webcrypto.js +1 -2
  8. package/dist/index.cjs +1 -2
  9. package/dist/index.d.ts +149 -5
  10. package/dist/index.js +3 -2
  11. package/dist/md5.cjs +1 -0
  12. package/dist/md5.d.ts +20 -0
  13. package/dist/md5.js +1 -0
  14. package/dist/stream/md5-stream.cjs +1 -2
  15. package/dist/stream/md5-stream.js +1 -2
  16. package/dist/stream/whatwg-stream.cjs +1 -2
  17. package/dist/stream/whatwg-stream.js +1 -2
  18. package/dist/utils/detect.cjs +1 -2
  19. package/dist/utils/detect.js +3 -2
  20. package/package.json +10 -15
  21. package/pure-md5-0.2.1.tgz +0 -0
  22. package/test-tree-shake.mjs +12 -0
  23. package/.aliases +0 -19
  24. package/.bash_profile +0 -12
  25. package/.bash_prompt +0 -56
  26. package/.changeset/README.md +0 -32
  27. package/.changeset/config.json +0 -16
  28. package/.continue/mcpServers/new-mcp-server.yaml +0 -10
  29. package/.continue/rules +0 -29
  30. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
  31. package/.github/ISSUE_TEMPLATE/documentation.md +0 -20
  32. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  33. package/.github/PULL_REQUEST_TEMPLATE.md +0 -35
  34. package/.github/workflows/npm-publish.yml +0 -33
  35. package/.github/workflows/release.yml +0 -42
  36. package/CHANGELOG.md +0 -9
  37. package/CONTRIBUTING.md +0 -203
  38. package/MIGRATION_GUIDE_STREAMS.md +0 -374
  39. package/STREAM_API.md +0 -582
  40. package/STREAM_BENCHMARKS.md +0 -232
  41. package/STREAM_EXAMPLES.md +0 -669
  42. package/STREAM_OPTIMIZATION_REPORT.md +0 -136
  43. package/STREAM_TROUBLESHOOTING.md +0 -537
  44. package/WEB_CRYPTO_TESTS_SUMMARY.md +0 -140
  45. package/WHATWG_STREAMS.md +0 -191
  46. package/__tests__/adapters/node-crypto.test.ts +0 -167
  47. package/__tests__/adapters/web-crypto-node.test.ts +0 -73
  48. package/__tests__/adapters/web-crypto.test.ts +0 -195
  49. package/__tests__/add32.test.ts +0 -33
  50. package/__tests__/fallback.test.ts +0 -345
  51. package/__tests__/hex.test.ts +0 -38
  52. package/__tests__/hex_chr.test.ts +0 -20
  53. package/__tests__/index.test.ts +0 -87
  54. package/__tests__/integration/fixtures/test-file.txt +0 -1
  55. package/__tests__/integration/md5-stream-file.test.ts +0 -293
  56. package/__tests__/integration/node-crypto-file.test.ts +0 -86
  57. package/__tests__/integration/web-crypto.test.ts +0 -38
  58. package/__tests__/md51.test.ts +0 -73
  59. package/__tests__/md5block.test.ts +0 -61
  60. package/__tests__/md5cycle.test.ts +0 -48
  61. package/__tests__/round-functions.test.ts +0 -87
  62. package/__tests__/stream/fs-utils.test.ts +0 -209
  63. package/__tests__/stream/md5-stream-edge-cases.test.ts +0 -461
  64. package/__tests__/stream/md5-stream.test.ts +0 -418
  65. package/__tests__/stream/whatwg-stream.test.ts +0 -355
  66. package/__tests__/stream/whatwg-stream.test.ts.bak2 +0 -335
  67. package/benchmarks/md5-stream.bench.ts +0 -212
  68. package/benchmarks/whatwg-stream.bench.ts +0 -180
  69. package/dist/adapters/ie11.cjs.map +0 -1
  70. package/dist/adapters/ie11.js.map +0 -1
  71. package/dist/adapters/node.cjs.map +0 -1
  72. package/dist/adapters/node.js.map +0 -1
  73. package/dist/adapters/webcrypto.cjs.map +0 -1
  74. package/dist/adapters/webcrypto.js.map +0 -1
  75. package/dist/chunk-2YXXFGBV.js +0 -2
  76. package/dist/chunk-2YXXFGBV.js.map +0 -1
  77. package/dist/chunk-4KSCMS4Q.js +0 -2
  78. package/dist/chunk-4KSCMS4Q.js.map +0 -1
  79. package/dist/chunk-6P2QV5SR.js +0 -4
  80. package/dist/chunk-6P2QV5SR.js.map +0 -1
  81. package/dist/chunk-G5WHEAIQ.js +0 -2
  82. package/dist/chunk-G5WHEAIQ.js.map +0 -1
  83. package/dist/chunk-H2K353LR.js +0 -2
  84. package/dist/chunk-H2K353LR.js.map +0 -1
  85. package/dist/chunk-JKVD5LHZ.js +0 -2
  86. package/dist/chunk-JKVD5LHZ.js.map +0 -1
  87. package/dist/chunk-NWQ4N5RX.js +0 -2
  88. package/dist/chunk-NWQ4N5RX.js.map +0 -1
  89. package/dist/chunk-PHZ7FTYF.js +0 -2
  90. package/dist/chunk-PHZ7FTYF.js.map +0 -1
  91. package/dist/chunk-PNZTVQA7.js +0 -2
  92. package/dist/chunk-PNZTVQA7.js.map +0 -1
  93. package/dist/chunk-R4JB5MBR.js +0 -2
  94. package/dist/chunk-R4JB5MBR.js.map +0 -1
  95. package/dist/chunk-VFOAY6XI.js +0 -2
  96. package/dist/chunk-VFOAY6XI.js.map +0 -1
  97. package/dist/chunk-XB5BQIEX.js +0 -2
  98. package/dist/chunk-XB5BQIEX.js.map +0 -1
  99. package/dist/core/index.cjs +0 -2
  100. package/dist/core/index.cjs.map +0 -1
  101. package/dist/core/index.d.cts +0 -19
  102. package/dist/core/index.d.ts +0 -19
  103. package/dist/core/index.js +0 -2
  104. package/dist/core/index.js.map +0 -1
  105. package/dist/index.cjs.map +0 -1
  106. package/dist/index.d.cts +0 -84
  107. package/dist/index.js.map +0 -1
  108. package/dist/stream/adapter.cjs +0 -2
  109. package/dist/stream/adapter.cjs.map +0 -1
  110. package/dist/stream/adapter.d.cts +0 -63
  111. package/dist/stream/adapter.d.ts +0 -63
  112. package/dist/stream/adapter.js +0 -2
  113. package/dist/stream/adapter.js.map +0 -1
  114. package/dist/stream/fs-utils.cjs +0 -2
  115. package/dist/stream/fs-utils.cjs.map +0 -1
  116. package/dist/stream/fs-utils.d.cts +0 -137
  117. package/dist/stream/fs-utils.d.ts +0 -137
  118. package/dist/stream/fs-utils.js +0 -2
  119. package/dist/stream/fs-utils.js.map +0 -1
  120. package/dist/stream/index.cjs +0 -2
  121. package/dist/stream/index.cjs.map +0 -1
  122. package/dist/stream/index.d.cts +0 -4
  123. package/dist/stream/index.d.ts +0 -4
  124. package/dist/stream/index.js +0 -2
  125. package/dist/stream/index.js.map +0 -1
  126. package/dist/stream/light/index.cjs +0 -2
  127. package/dist/stream/light/index.cjs.map +0 -1
  128. package/dist/stream/light/index.d.cts +0 -4
  129. package/dist/stream/light/index.d.ts +0 -4
  130. package/dist/stream/light/index.js +0 -2
  131. package/dist/stream/light/index.js.map +0 -1
  132. package/dist/stream/md5-stream.cjs.map +0 -1
  133. package/dist/stream/md5-stream.js.map +0 -1
  134. package/dist/stream/whatwg-stream.cjs.map +0 -1
  135. package/dist/stream/whatwg-stream.js.map +0 -1
  136. package/dist/types-edGoGJ5V.d.cts +0 -42
  137. package/dist/types-edGoGJ5V.d.ts +0 -42
  138. package/dist/utils/detect.cjs.map +0 -1
  139. package/dist/utils/detect.js.map +0 -1
  140. package/planning/03-optimization-size-tree-shaking/01-es-modules-tree-shaking.md +0 -152
  141. package/planning/03-optimization-size-tree-shaking/02-consolidate-modules.md +0 -65
  142. package/planning/03-optimization-size-tree-shaking/03-remove-duplicate-add32.md +0 -93
  143. package/planning/03-optimization-size-tree-shaking/04-remove-runtime-check.md +0 -102
  144. package/planning/03-optimization-size-tree-shaking/05-optimize-loops-performance.md +0 -107
  145. package/planning/03-optimization-size-tree-shaking/06-tsup-formats-configuration.md +0 -227
  146. package/planning/03-optimization-size-tree-shaking/07-multiple-build-formats.md +0 -228
  147. package/planning/03-optimization-size-tree-shaking/08-benchmarks-metrics.md +0 -34
  148. package/planning/03-optimization-size-tree-shaking/MIGRATION_GUIDE.md +0 -260
  149. package/planning/03-optimization-size-tree-shaking/README.md +0 -173
  150. package/planning/03-optimization-size-tree-shaking/SUMMARY.md +0 -168
  151. package/planning/04-adapter-backend/03-backend-web-crypto.md +0 -149
  152. package/planning/04-adapter-backend/04-backend-node-crypto.md +0 -181
  153. package/planning/04-adapter-backend/05-backend-pure-js.md +0 -174
  154. package/planning/04-adapter-backend/06-backend-ie11.md +0 -158
  155. package/planning/04-adapter-backend/07-detection-environment.md +0 -232
  156. package/planning/04-adapter-backend/08-detection-backend.md +0 -210
  157. package/planning/04-adapter-backend/09-adapter-unified.md +0 -255
  158. package/planning/04-adapter-backend/10-fallback-mechanism.md +0 -333
  159. package/planning/04-adapter-backend/11-tests-backend-web-crypto.md +0 -191
  160. package/planning/04-adapter-backend/12-tests-backend-node-crypto.md +0 -222
  161. package/planning/04-adapter-backend/README.md +0 -45
  162. package/planning/05-documentation-publishing/01-README-optimization.md +0 -105
  163. package/planning/05-documentation-publishing/02-VitePress-site-evaluation.md +0 -136
  164. package/planning/05-documentation-publishing/03-Changeset-setup.md +0 -192
  165. package/planning/05-documentation-publishing/04-GitHub-templates.md +0 -252
  166. package/planning/05-documentation-publishing/README.md +0 -22
  167. package/planning/05-documentation-publishing/STATUS.md +0 -222
  168. package/planning/prd.md +0 -405
  169. package/planning/streams/01-create-md5stream-class.md +0 -69
  170. package/planning/streams/02-create-factory-api.md +0 -65
  171. package/planning/streams/03-fs-integration.md +0 -37
  172. package/planning/streams/04-whatwg-streams-support.md +0 -37
  173. package/planning/streams/05-audit-optimization.md +0 -121
  174. package/planning/streams/06-comprehensive-tests-docs.md +0 -137
  175. package/planning/streams/07-architecture-integration.md +0 -38
  176. package/planning/streams/README.md +0 -98
  177. package/tsup.config.ts +0 -24
@@ -1,4 +1,3 @@
1
1
  'use strict';var stream=require('stream');var C=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var N="0123456789abcdef".split(""),U=N;function F(a){let e="";for(let s=0;s<4;s++)e+=U[a>>s*8+4&15]+U[a>>s*8&15];return e}function L(a){let e=a.length,s=new Array(e);for(let r=0;r<e;r++)s[r]=F(a[r]);return s.join("")}var v=L;function I(a,e){return a+e&4294967295}var m=I;function H(a,e,s,r,t){let n=t||m;return e=n(n(e,a),n(s,r)),e}function _(a,e,s,r){var n=(r||m)(a<<e|a>>>32-e,s);return n}function x(a,e,s,r,t,n,i){return e=H(a,e,r,n,i),_(e,t,s,i)}function W(a,e,s,r,t,n,i,c){return x(s&r|~s&t,e,s,n,i,c,a)}function R(a,e,s,r,t,n,i,c){return x(s&t|r&~t,e,s,n,i,c,a)}function T(a,e,s,r,t,n,i,c){return x(s^r^t,e,s,n,i,c,a)}function E(a,e,s,r,t,n,i,c){return x(r^(s|~t),e,s,n,i,c,a)}function G(a,e,s){typeof s>"u"&&(s=m);let r=a[0],t=a[1],n=a[2],i=a[3],c=W.bind(null,s);r=c(r,t,n,i,e[0],7,-680876936),i=c(i,r,t,n,e[1],12,-389564586),n=c(n,i,r,t,e[2],17,606105819),t=c(t,n,i,r,e[3],22,-1044525330),r=c(r,t,n,i,e[4],7,-176418897),i=c(i,r,t,n,e[5],12,1200080426),n=c(n,i,r,t,e[6],17,-1473231341),t=c(t,n,i,r,e[7],22,-45705983),r=c(r,t,n,i,e[8],7,1770035416),i=c(i,r,t,n,e[9],12,-1958414417),n=c(n,i,r,t,e[10],17,-42063),t=c(t,n,i,r,e[11],22,-1990404162),r=c(r,t,n,i,e[12],7,1804603682),i=c(i,r,t,n,e[13],12,-40341101),n=c(n,i,r,t,e[14],17,-1502002290),t=c(t,n,i,r,e[15],22,1236535329);let o=R.bind(null,s);r=o(r,t,n,i,e[1],5,-165796510),i=o(i,r,t,n,e[6],9,-1069501632),n=o(n,i,r,t,e[11],14,643717713),t=o(t,n,i,r,e[0],20,-373897302),r=o(r,t,n,i,e[5],5,-701558691),i=o(i,r,t,n,e[10],9,38016083),n=o(n,i,r,t,e[15],14,-660478335),t=o(t,n,i,r,e[4],20,-405537848),r=o(r,t,n,i,e[9],5,568446438),i=o(i,r,t,n,e[14],9,-1019803690),n=o(n,i,r,t,e[3],14,-187363961),t=o(t,n,i,r,e[8],20,1163531501),r=o(r,t,n,i,e[13],5,-1444681467),i=o(i,r,t,n,e[2],9,-51403784),n=o(n,i,r,t,e[7],14,1735328473),t=o(t,n,i,r,e[12],20,-1926607734);let u=T.bind(null,s);r=u(r,t,n,i,e[5],4,-378558),i=u(i,r,t,n,e[8],11,-2022574463),n=u(n,i,r,t,e[11],16,1839030562),t=u(t,n,i,r,e[14],23,-35309556),r=u(r,t,n,i,e[1],4,-1530992060),i=u(i,r,t,n,e[4],11,1272893353),n=u(n,i,r,t,e[7],16,-155497632),t=u(t,n,i,r,e[10],23,-1094730640),r=u(r,t,n,i,e[13],4,681279174),i=u(i,r,t,n,e[0],11,-358537222),n=u(n,i,r,t,e[3],16,-722521979),t=u(t,n,i,r,e[6],23,76029189),r=u(r,t,n,i,e[9],4,-640364487),i=u(i,r,t,n,e[12],11,-421815835),n=u(n,i,r,t,e[15],16,530742520),t=u(t,n,i,r,e[2],23,-995338651);let f=E.bind(null,s);r=f(r,t,n,i,e[0],6,-198630844),i=f(i,r,t,n,e[7],10,1126891415),n=f(n,i,r,t,e[14],15,-1416354905),t=f(t,n,i,r,e[5],21,-57434055),r=f(r,t,n,i,e[12],6,1700485571),i=f(i,r,t,n,e[3],10,-1894986606),n=f(n,i,r,t,e[10],15,-1051523),t=f(t,n,i,r,e[1],21,-2054922799),r=f(r,t,n,i,e[8],6,1873313359),i=f(i,r,t,n,e[15],10,-30611744),n=f(n,i,r,t,e[6],15,-1560198380),t=f(t,n,i,r,e[13],21,1309151649),r=f(r,t,n,i,e[4],6,-145523070),i=f(i,r,t,n,e[11],10,-1120210379),n=f(n,i,r,t,e[2],15,718787259),t=f(t,n,i,r,e[9],21,-343485551),a[0]=s(r,a[0]),a[1]=s(t,a[1]),a[2]=s(n,a[2]),a[3]=s(i,a[3]);}var l=G;function $(a){let e=[];for(let s=0;s<64;s+=4)e[s>>2]=(a.charCodeAt(s)||0)+((a.charCodeAt(s+1)||0)<<8)+((a.charCodeAt(s+2)||0)<<16)+((a.charCodeAt(s+3)||0)<<24);return e}var O=$;function K(a,e){let s=a.length,r=[1732584193,-271733879,-1732584194,271733878],t;for(t=64;t<=s;t+=64)l(r,O(a.substring(t-64,t)),e);a=a.substring(t-64);var n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],i=a.length;for(t=0;t<i;t++)n[t>>2]|=(a.charCodeAt(t)&255)<<(t%4<<3);if(n[t>>2]|=128<<(t%4<<3),t>55)for(l(r,n,e),t=16;t--;)n[t]=0;return n[14]=s*8,l(r,n,e),r}var j=K;function y(a){return v(j(a,m))}var g=class{constructor(){this.name="webcrypto";this.version="1.0.0";}static isAvailable(){return typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.digest=="function"}async hash(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}update(e){throw new Error("Web Crypto API does not support streaming updates")}digest(e){throw new Error("Web Crypto API does not support streaming")}reset(){}};var w=class{constructor(){this.name="nodecrypto";this.version="1.0.0";}static isAvailable(){try{return typeof C("crypto").createHash=="function"}catch{return false}}hash(e){return C("crypto").createHash("md5").update(e).digest("hex")}async hashBinary(e){let s=C("crypto"),r=e instanceof Uint8Array?e:new Uint8Array(e);return s.createHash("md5").update(r).digest("hex")}update(e){}digest(e){throw new Error("Node crypto streaming not implemented")}reset(){}};var A=class{constructor(){this.name="ie11";this.version="1.0.0";}static isAvailable(){if(typeof window>"u")return false;let e=window;return typeof e.msCrypto<"u"&&typeof e.msCrypto.subtle<"u"&&typeof e.msCrypto.subtle.digest=="function"}async hash(e){let r=new TextEncoder().encode(e);return await this.hashBinary(r)}async hashBinary(e){let s=window,r=e instanceof Uint8Array?e.buffer:e,t=await s.msCrypto.subtle.digest("MD5",r);return this.bufferToHex(t)}bufferToHex(e){return Array.from(new Uint8Array(e)).map(s=>s.toString(16).padStart(2,"0")).join("")}update(e){throw new Error("msCrypto does not support streaming updates")}digest(e){throw new Error("msCrypto does not support streaming")}reset(){}};var P=class{constructor(){this.name="purejs";this.version="0.1.0";this.state={data:"",finished:false};}hash(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}update(e){this.state.finished&&(this.state={data:"",finished:false}),e instanceof ArrayBuffer?this.state.data+=new TextDecoder().decode(e):e instanceof Uint8Array?this.state.data+=new TextDecoder().decode(e):this.state.data+=e;}digest(e){let s=y(this.state.data);return this.state.finished=true,e==="buffer"?this.hexToBuffer(s):s}reset(){this.state={data:"",finished:false};}static isAvailable(){return true}hexToBuffer(e){let s=[];for(let r=0;r<e.length;r+=2)s.push(parseInt(e.substring(r,r+2),16));return new Uint8Array(s)}};var B=class a extends stream.Transform{constructor(s){super({readableObjectMode:false,writableObjectMode:false});this.initialMD5State=[1732584193,-271733879,-1732584194,271733878];this.bufferCapacity=64;this.buffer=new Uint8Array(this.bufferCapacity);this.add32=s?.add32||m,this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer};}_transform(s,r,t){try{let n=s,i=n.length;if(i===0){t();return}if(this.state.bufferLength>0){let u=this.state.bufferLength,f=64-u,b=Math.min(i,f);for(let d=0;d<b;d++)this.buffer[u+d]=n[d];if(this.state.bufferLength+=b,this.state.bufferLength===64&&this._processBufferBlock(),b===i){t();return}let p=i-b;for(let d=0;d<p;d++)n[d]=n[b+d];let h=Buffer.alloc(p);for(let d=0;d<p;d++)h[d]=n[d];n=h;}let c=Math.floor(n.length/64);for(let u=0;u<c;u++){let f=u*64,b=[];for(let p=0;p<16;p++){let h=f+p*4;b[p]=n[h]+(n[h+1]<<8)+(n[h+2]<<16)+(n[h+3]<<24);}l(this.state.state,b,this.add32),this.state.bytesProcessed+=64;}let o=n.length%64;if(o>0){this.buffer.length<o&&(this.buffer=new Uint8Array(o),this.state.buffer=this.buffer);for(let u=0;u<o;u++)this.buffer[u]=n[c*64+u];this.state.bufferLength=o;}t();}catch(n){t(n);}}_processBufferBlock(){let s=this.state.buffer,r=[];for(let t=0;t<16;t++){let n=t*4;r[t]=s[n]+(s[n+1]<<8)+(s[n+2]<<16)+(s[n+3]<<24);}l(this.state.state,r,this.add32),this.state.bytesProcessed+=64,this.state.bufferLength=0;}_flush(s){try{let{state:r,bufferLength:t,buffer:n}=this.state,i=new Array(16).fill(0);for(let o=0;o<t;o++)i[o>>2]|=(n[o]&255)<<(o%4<<3);if(i[t>>2]|=128<<(t%4<<3),t>55){l(r,i,this.add32);for(let o=0;o<16;o++)i[o]=0;}i[14]=(this.state.bytesProcessed+t)*8,i[15]=0,l(r,i,this.add32);let c=v(r);this.emit("md5",{digest:c,bytesProcessed:this.state.bytesProcessed+t}),s();}catch(r){s(r);}}getCurrentState(){return {state:[...this.state.state],bytesProcessed:this.state.bytesProcessed+this.state.bufferLength}}getBytesProcessed(){return this.state.bytesProcessed+this.state.bufferLength}reset(){this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer},this.buffer=new Uint8Array(this.bufferCapacity),this.state.buffer=this.buffer,this.state.bufferLength=0;}static fromStream(s,r){let t=new a(r),n=z.call(t,s);return {stream:t,result:n}}};async function z(a){return new Promise((e,s)=>{let r=[];a.pipe(this).on("md5",t=>{r.push(t);}).on("error",s).on("finish",()=>{e(r[0]);});})}var D=class{constructor(){this.name="stream";this.version="0.1.0";this.state=null;}initNodeStream(e){this.state={stream:e,type:"node"};}initWhatWGStream(e){this.state={stream:e,type:"whatwg"};}async hash(e){let s=new B;return (await new Promise((t,n)=>{s.on("md5",i=>t(i)).on("error",n).end(e);})).digest}async hashBinary(e){let s=new B,r;return e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),(await new Promise((n,i)=>{s.on("md5",c=>n(c)).on("error",i).end(r);})).digest}update(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream,r;typeof e=="string"||e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),s.write(r);}}digest(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream;return s.end(),new Promise((r,t)=>{s.on("md5",n=>{if(e==="buffer"){let i=n.digest,c=[];for(let o=0;o<i.length;o+=2)c.push(parseInt(i.substring(o,o+2),16));r(Buffer.from(c));}else r(n.digest);}).on("error",t);})}else return this.state.stream.getResult().then(r=>r.digest)}reset(){this.state&&this.state.type==="node"&&this.state.stream.reset();}static isAvailable(){return true}};var J=(t=>(t.BROWSER="browser",t.NODE="node",t.WEBWORKER="webworker",t.UNKNOWN="unknown",t))(J||{});function Ne(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof importScripts<"u"?"webworker":typeof window<"u"&&window.document?"browser":"unknown"}function Fe(){return typeof process<"u"&&process.versions!==void 0&&"node"in process.versions}function Le(){return typeof window<"u"&&typeof document<"u"}function Ie(){return typeof importScripts<"u"}async function Y(a){switch(a){case "webcrypto":let e=g.isAvailable();return {backend:"webcrypto",available:e,reason:e?void 0:"Web Crypto API not available"};case "nodecrypto":let s=w.isAvailable();return {backend:"nodecrypto",available:s,reason:s?void 0:"Node.js crypto not available"};case "ie11":let r=A.isAvailable();return {backend:"ie11",available:r,reason:r?void 0:"IE11 msCrypto not available"};case "purejs":return {backend:"purejs",available:true,reason:"Always available"};case "stream":let t=typeof process<"u"&&process.versions&&"node"in process.versions,n=typeof window<"u";return {backend:"stream",available:t||n,reason:t||n?void 0:"Streams not available"};default:return {backend:a||"unknown",available:false,reason:"Unknown backend"}}}async function Q(){let a=["webcrypto","nodecrypto","ie11","purejs","stream"],e=[];for(let s of a){let{available:r}=await Y(s);r&&e.push(s);}return e}var V=[{name:"nodecrypto",priority:1,description:"Node.js native crypto (fastest)"},{name:"webcrypto",priority:2,description:"Web Crypto API (fast, hardware accelerated)"},{name:"ie11",priority:3,description:"IE11 msCrypto (legacy)"},{name:"stream",priority:4,description:"Streaming backend (for large files and memory efficiency)"},{name:"purejs",priority:5,description:"Pure JavaScript (always available, slower)"}];function X(a){let e=[...V].sort((s,r)=>s.priority-r.priority);for(let{name:s}of e)if(a.includes(s))return s;return "purejs"}var M=class a{constructor(){}static getInstance(){return a.instance||(a.instance=new a),a.instance}async createBackendByName(e){switch(e){case "nodecrypto":return new w;case "webcrypto":return new g;case "ie11":return new A;case "stream":return new D;default:return new P}}async createBackend(e){let s=e||X(await Q());return this.createBackendByName(s)}},He=M.getInstance(),S=class{constructor(e=["nodecrypto","webcrypto","stream","ie11","purejs"]){this.detector=M.getInstance(),this.fallbackOrder=e;}async execute(e){let s=[];for(let r of this.fallbackOrder)try{let t=await this.detector.createBackendByName(r),n=await e(t);return {success:!0,backend:r,data:n}}catch(t){if(s.push({backend:r,error:t}),r===this.fallbackOrder[this.fallbackOrder.length-1])return {success:false,backend:r,data:null,errors:s}}return {success:false,backend:"",data:null,errors:s}}async hash(e){return this.execute(async s=>s.hash(e))}async hashBinary(e){return this.execute(async s=>s.hashBinary(e))}async getBestBackend(){let e=await this.getAvailableBackends();return e.length===0?"purejs":e[0]}async getAvailableBackends(){let e=[];for(let s of this.fallbackOrder)try{await this.detector.createBackendByName(s),e.push(s);}catch{}return e}getMetrics(){return {}}},_e=new S;async function Ge(a,e={}){let s=new S;if(e.forceBackend)return (await s.detector.createBackendByName(e.forceBackend)).hash(a);if(e.fallback===false)return (await s.detector.createBackend()).hash(a);let r=await s.hash(a);if(r.success)return e.reportFallback&&r.backend!=="nodecrypto"&&r.backend!=="webcrypto"&&console.info(`MD5 used fallback backend: ${r.backend}`),r.data;let t=r.errors?r.errors.map(n=>`${n.backend}: ${n.error.message}`).join(", "):"All backends failed";throw new Error(`MD5 hash failed after all attempts: ${t}`)}var k=class{constructor(){this.metrics={nodecrypto:{success:0,fail:0},webcrypto:{success:0,fail:0},ie11:{success:0,fail:0},stream:{success:0,fail:0},purejs:{success:0,fail:0}};}recordSuccess(e){this.metrics[e]&&this.metrics[e].success++;}recordFail(e){this.metrics[e]&&this.metrics[e].fail++;}getMetrics(){return this.metrics}getSummary(){return `Total operations: ${Object.values(this.metrics).reduce((s,r)=>s+r.success+r.fail,0)}
2
2
  `+Object.entries(this.metrics).map(([,s])=>`${s.success} success, ${s.fail} fail`).join(`
3
- `)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},$e=new k;exports.BACKEND_PRIORITY=V;exports.BackendDetector=M;exports.FallbackManager=S;exports.MetricsCollector=k;exports.RuntimeEnvironment=J;exports.checkBackendAvailability=Y;exports.detectEnvironment=Ne;exports.detector=He;exports.fallbackManager=_e;exports.getAllAvailableBackends=Q;exports.getBestAvailableBackend=X;exports.isBrowser=Le;exports.isNode=Fe;exports.isWebWorker=Ie;exports.metrics=$e;exports.robustHash=Ge;//# sourceMappingURL=detect.cjs.map
4
- //# sourceMappingURL=detect.cjs.map
3
+ `)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},$e=new k;exports.BACKEND_PRIORITY=V;exports.BackendDetector=M;exports.FallbackManager=S;exports.MetricsCollector=k;exports.RuntimeEnvironment=J;exports.checkBackendAvailability=Y;exports.detectEnvironment=Ne;exports.detector=He;exports.fallbackManager=_e;exports.getAllAvailableBackends=Q;exports.getBestAvailableBackend=X;exports.isBrowser=Le;exports.isNode=Fe;exports.isWebWorker=Ie;exports.metrics=$e;exports.robustHash=Ge;
@@ -1,2 +1,3 @@
1
- export{i as BACKEND_PRIORITY,k as BackendDetector,m as FallbackManager,p as MetricsCollector,b as RuntimeEnvironment,g as checkBackendAvailability,c as detectEnvironment,l as detector,n as fallbackManager,h as getAllAvailableBackends,j as getBestAvailableBackend,e as isBrowser,d as isNode,f as isWebWorker,q as metrics,o as robustHash}from'../chunk-6P2QV5SR.js';import'../chunk-VFOAY6XI.js';import'../chunk-PNZTVQA7.js';import'../chunk-G5WHEAIQ.js';import'../chunk-4KSCMS4Q.js';import'../chunk-NWQ4N5RX.js';import'../chunk-JKVD5LHZ.js';import'../chunk-R4JB5MBR.js';import'../chunk-2YXXFGBV.js';//# sourceMappingURL=detect.js.map
2
- //# sourceMappingURL=detect.js.map
1
+ import {Transform}from'stream';var C=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var N="0123456789abcdef".split(""),U=N;function F(a){let e="";for(let s=0;s<4;s++)e+=U[a>>s*8+4&15]+U[a>>s*8&15];return e}function L(a){let e=a.length,s=new Array(e);for(let r=0;r<e;r++)s[r]=F(a[r]);return s.join("")}var v=L;function I(a,e){return a+e&4294967295}var m=I;function H(a,e,s,r,t){let n=t||m;return e=n(n(e,a),n(s,r)),e}function _(a,e,s,r){var n=(r||m)(a<<e|a>>>32-e,s);return n}function x(a,e,s,r,t,n,i){return e=H(a,e,r,n,i),_(e,t,s,i)}function W(a,e,s,r,t,n,i,c){return x(s&r|~s&t,e,s,n,i,c,a)}function R(a,e,s,r,t,n,i,c){return x(s&t|r&~t,e,s,n,i,c,a)}function T(a,e,s,r,t,n,i,c){return x(s^r^t,e,s,n,i,c,a)}function E(a,e,s,r,t,n,i,c){return x(r^(s|~t),e,s,n,i,c,a)}function G(a,e,s){typeof s>"u"&&(s=m);let r=a[0],t=a[1],n=a[2],i=a[3],c=W.bind(null,s);r=c(r,t,n,i,e[0],7,-680876936),i=c(i,r,t,n,e[1],12,-389564586),n=c(n,i,r,t,e[2],17,606105819),t=c(t,n,i,r,e[3],22,-1044525330),r=c(r,t,n,i,e[4],7,-176418897),i=c(i,r,t,n,e[5],12,1200080426),n=c(n,i,r,t,e[6],17,-1473231341),t=c(t,n,i,r,e[7],22,-45705983),r=c(r,t,n,i,e[8],7,1770035416),i=c(i,r,t,n,e[9],12,-1958414417),n=c(n,i,r,t,e[10],17,-42063),t=c(t,n,i,r,e[11],22,-1990404162),r=c(r,t,n,i,e[12],7,1804603682),i=c(i,r,t,n,e[13],12,-40341101),n=c(n,i,r,t,e[14],17,-1502002290),t=c(t,n,i,r,e[15],22,1236535329);let o=R.bind(null,s);r=o(r,t,n,i,e[1],5,-165796510),i=o(i,r,t,n,e[6],9,-1069501632),n=o(n,i,r,t,e[11],14,643717713),t=o(t,n,i,r,e[0],20,-373897302),r=o(r,t,n,i,e[5],5,-701558691),i=o(i,r,t,n,e[10],9,38016083),n=o(n,i,r,t,e[15],14,-660478335),t=o(t,n,i,r,e[4],20,-405537848),r=o(r,t,n,i,e[9],5,568446438),i=o(i,r,t,n,e[14],9,-1019803690),n=o(n,i,r,t,e[3],14,-187363961),t=o(t,n,i,r,e[8],20,1163531501),r=o(r,t,n,i,e[13],5,-1444681467),i=o(i,r,t,n,e[2],9,-51403784),n=o(n,i,r,t,e[7],14,1735328473),t=o(t,n,i,r,e[12],20,-1926607734);let u=T.bind(null,s);r=u(r,t,n,i,e[5],4,-378558),i=u(i,r,t,n,e[8],11,-2022574463),n=u(n,i,r,t,e[11],16,1839030562),t=u(t,n,i,r,e[14],23,-35309556),r=u(r,t,n,i,e[1],4,-1530992060),i=u(i,r,t,n,e[4],11,1272893353),n=u(n,i,r,t,e[7],16,-155497632),t=u(t,n,i,r,e[10],23,-1094730640),r=u(r,t,n,i,e[13],4,681279174),i=u(i,r,t,n,e[0],11,-358537222),n=u(n,i,r,t,e[3],16,-722521979),t=u(t,n,i,r,e[6],23,76029189),r=u(r,t,n,i,e[9],4,-640364487),i=u(i,r,t,n,e[12],11,-421815835),n=u(n,i,r,t,e[15],16,530742520),t=u(t,n,i,r,e[2],23,-995338651);let f=E.bind(null,s);r=f(r,t,n,i,e[0],6,-198630844),i=f(i,r,t,n,e[7],10,1126891415),n=f(n,i,r,t,e[14],15,-1416354905),t=f(t,n,i,r,e[5],21,-57434055),r=f(r,t,n,i,e[12],6,1700485571),i=f(i,r,t,n,e[3],10,-1894986606),n=f(n,i,r,t,e[10],15,-1051523),t=f(t,n,i,r,e[1],21,-2054922799),r=f(r,t,n,i,e[8],6,1873313359),i=f(i,r,t,n,e[15],10,-30611744),n=f(n,i,r,t,e[6],15,-1560198380),t=f(t,n,i,r,e[13],21,1309151649),r=f(r,t,n,i,e[4],6,-145523070),i=f(i,r,t,n,e[11],10,-1120210379),n=f(n,i,r,t,e[2],15,718787259),t=f(t,n,i,r,e[9],21,-343485551),a[0]=s(r,a[0]),a[1]=s(t,a[1]),a[2]=s(n,a[2]),a[3]=s(i,a[3]);}var l=G;function $(a){let e=[];for(let s=0;s<64;s+=4)e[s>>2]=(a.charCodeAt(s)||0)+((a.charCodeAt(s+1)||0)<<8)+((a.charCodeAt(s+2)||0)<<16)+((a.charCodeAt(s+3)||0)<<24);return e}var O=$;function K(a,e){let s=a.length,r=[1732584193,-271733879,-1732584194,271733878],t;for(t=64;t<=s;t+=64)l(r,O(a.substring(t-64,t)),e);a=a.substring(t-64);var n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],i=a.length;for(t=0;t<i;t++)n[t>>2]|=(a.charCodeAt(t)&255)<<(t%4<<3);if(n[t>>2]|=128<<(t%4<<3),t>55)for(l(r,n,e),t=16;t--;)n[t]=0;return n[14]=s*8,l(r,n,e),r}var j=K;function y(a){return v(j(a,m))}var g=class{constructor(){this.name="webcrypto";this.version="1.0.0";}static isAvailable(){return typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.digest=="function"}async hash(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}update(e){throw new Error("Web Crypto API does not support streaming updates")}digest(e){throw new Error("Web Crypto API does not support streaming")}reset(){}};var w=class{constructor(){this.name="nodecrypto";this.version="1.0.0";}static isAvailable(){try{return typeof C("crypto").createHash=="function"}catch{return false}}hash(e){return C("crypto").createHash("md5").update(e).digest("hex")}async hashBinary(e){let s=C("crypto"),r=e instanceof Uint8Array?e:new Uint8Array(e);return s.createHash("md5").update(r).digest("hex")}update(e){}digest(e){throw new Error("Node crypto streaming not implemented")}reset(){}};var A=class{constructor(){this.name="ie11";this.version="1.0.0";}static isAvailable(){if(typeof window>"u")return false;let e=window;return typeof e.msCrypto<"u"&&typeof e.msCrypto.subtle<"u"&&typeof e.msCrypto.subtle.digest=="function"}async hash(e){let r=new TextEncoder().encode(e);return await this.hashBinary(r)}async hashBinary(e){let s=window,r=e instanceof Uint8Array?e.buffer:e,t=await s.msCrypto.subtle.digest("MD5",r);return this.bufferToHex(t)}bufferToHex(e){return Array.from(new Uint8Array(e)).map(s=>s.toString(16).padStart(2,"0")).join("")}update(e){throw new Error("msCrypto does not support streaming updates")}digest(e){throw new Error("msCrypto does not support streaming")}reset(){}};var P=class{constructor(){this.name="purejs";this.version="0.1.0";this.state={data:"",finished:false};}hash(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}update(e){this.state.finished&&(this.state={data:"",finished:false}),e instanceof ArrayBuffer?this.state.data+=new TextDecoder().decode(e):e instanceof Uint8Array?this.state.data+=new TextDecoder().decode(e):this.state.data+=e;}digest(e){let s=y(this.state.data);return this.state.finished=true,e==="buffer"?this.hexToBuffer(s):s}reset(){this.state={data:"",finished:false};}static isAvailable(){return true}hexToBuffer(e){let s=[];for(let r=0;r<e.length;r+=2)s.push(parseInt(e.substring(r,r+2),16));return new Uint8Array(s)}};var B=class a extends Transform{constructor(s){super({readableObjectMode:false,writableObjectMode:false});this.initialMD5State=[1732584193,-271733879,-1732584194,271733878];this.bufferCapacity=64;this.buffer=new Uint8Array(this.bufferCapacity);this.add32=s?.add32||m,this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer};}_transform(s,r,t){try{let n=s,i=n.length;if(i===0){t();return}if(this.state.bufferLength>0){let u=this.state.bufferLength,f=64-u,b=Math.min(i,f);for(let d=0;d<b;d++)this.buffer[u+d]=n[d];if(this.state.bufferLength+=b,this.state.bufferLength===64&&this._processBufferBlock(),b===i){t();return}let p=i-b;for(let d=0;d<p;d++)n[d]=n[b+d];let h=Buffer.alloc(p);for(let d=0;d<p;d++)h[d]=n[d];n=h;}let c=Math.floor(n.length/64);for(let u=0;u<c;u++){let f=u*64,b=[];for(let p=0;p<16;p++){let h=f+p*4;b[p]=n[h]+(n[h+1]<<8)+(n[h+2]<<16)+(n[h+3]<<24);}l(this.state.state,b,this.add32),this.state.bytesProcessed+=64;}let o=n.length%64;if(o>0){this.buffer.length<o&&(this.buffer=new Uint8Array(o),this.state.buffer=this.buffer);for(let u=0;u<o;u++)this.buffer[u]=n[c*64+u];this.state.bufferLength=o;}t();}catch(n){t(n);}}_processBufferBlock(){let s=this.state.buffer,r=[];for(let t=0;t<16;t++){let n=t*4;r[t]=s[n]+(s[n+1]<<8)+(s[n+2]<<16)+(s[n+3]<<24);}l(this.state.state,r,this.add32),this.state.bytesProcessed+=64,this.state.bufferLength=0;}_flush(s){try{let{state:r,bufferLength:t,buffer:n}=this.state,i=new Array(16).fill(0);for(let o=0;o<t;o++)i[o>>2]|=(n[o]&255)<<(o%4<<3);if(i[t>>2]|=128<<(t%4<<3),t>55){l(r,i,this.add32);for(let o=0;o<16;o++)i[o]=0;}i[14]=(this.state.bytesProcessed+t)*8,i[15]=0,l(r,i,this.add32);let c=v(r);this.emit("md5",{digest:c,bytesProcessed:this.state.bytesProcessed+t}),s();}catch(r){s(r);}}getCurrentState(){return {state:[...this.state.state],bytesProcessed:this.state.bytesProcessed+this.state.bufferLength}}getBytesProcessed(){return this.state.bytesProcessed+this.state.bufferLength}reset(){this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer},this.buffer=new Uint8Array(this.bufferCapacity),this.state.buffer=this.buffer,this.state.bufferLength=0;}static fromStream(s,r){let t=new a(r),n=z.call(t,s);return {stream:t,result:n}}};async function z(a){return new Promise((e,s)=>{let r=[];a.pipe(this).on("md5",t=>{r.push(t);}).on("error",s).on("finish",()=>{e(r[0]);});})}var D=class{constructor(){this.name="stream";this.version="0.1.0";this.state=null;}initNodeStream(e){this.state={stream:e,type:"node"};}initWhatWGStream(e){this.state={stream:e,type:"whatwg"};}async hash(e){let s=new B;return (await new Promise((t,n)=>{s.on("md5",i=>t(i)).on("error",n).end(e);})).digest}async hashBinary(e){let s=new B,r;return e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),(await new Promise((n,i)=>{s.on("md5",c=>n(c)).on("error",i).end(r);})).digest}update(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream,r;typeof e=="string"||e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),s.write(r);}}digest(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream;return s.end(),new Promise((r,t)=>{s.on("md5",n=>{if(e==="buffer"){let i=n.digest,c=[];for(let o=0;o<i.length;o+=2)c.push(parseInt(i.substring(o,o+2),16));r(Buffer.from(c));}else r(n.digest);}).on("error",t);})}else return this.state.stream.getResult().then(r=>r.digest)}reset(){this.state&&this.state.type==="node"&&this.state.stream.reset();}static isAvailable(){return true}};var J=(t=>(t.BROWSER="browser",t.NODE="node",t.WEBWORKER="webworker",t.UNKNOWN="unknown",t))(J||{});function Ne(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof importScripts<"u"?"webworker":typeof window<"u"&&window.document?"browser":"unknown"}function Fe(){return typeof process<"u"&&process.versions!==void 0&&"node"in process.versions}function Le(){return typeof window<"u"&&typeof document<"u"}function Ie(){return typeof importScripts<"u"}async function Y(a){switch(a){case "webcrypto":let e=g.isAvailable();return {backend:"webcrypto",available:e,reason:e?void 0:"Web Crypto API not available"};case "nodecrypto":let s=w.isAvailable();return {backend:"nodecrypto",available:s,reason:s?void 0:"Node.js crypto not available"};case "ie11":let r=A.isAvailable();return {backend:"ie11",available:r,reason:r?void 0:"IE11 msCrypto not available"};case "purejs":return {backend:"purejs",available:true,reason:"Always available"};case "stream":let t=typeof process<"u"&&process.versions&&"node"in process.versions,n=typeof window<"u";return {backend:"stream",available:t||n,reason:t||n?void 0:"Streams not available"};default:return {backend:a||"unknown",available:false,reason:"Unknown backend"}}}async function Q(){let a=["webcrypto","nodecrypto","ie11","purejs","stream"],e=[];for(let s of a){let{available:r}=await Y(s);r&&e.push(s);}return e}var V=[{name:"nodecrypto",priority:1,description:"Node.js native crypto (fastest)"},{name:"webcrypto",priority:2,description:"Web Crypto API (fast, hardware accelerated)"},{name:"ie11",priority:3,description:"IE11 msCrypto (legacy)"},{name:"stream",priority:4,description:"Streaming backend (for large files and memory efficiency)"},{name:"purejs",priority:5,description:"Pure JavaScript (always available, slower)"}];function X(a){let e=[...V].sort((s,r)=>s.priority-r.priority);for(let{name:s}of e)if(a.includes(s))return s;return "purejs"}var M=class a{constructor(){}static getInstance(){return a.instance||(a.instance=new a),a.instance}async createBackendByName(e){switch(e){case "nodecrypto":return new w;case "webcrypto":return new g;case "ie11":return new A;case "stream":return new D;default:return new P}}async createBackend(e){let s=e||X(await Q());return this.createBackendByName(s)}},He=M.getInstance(),S=class{constructor(e=["nodecrypto","webcrypto","stream","ie11","purejs"]){this.detector=M.getInstance(),this.fallbackOrder=e;}async execute(e){let s=[];for(let r of this.fallbackOrder)try{let t=await this.detector.createBackendByName(r),n=await e(t);return {success:!0,backend:r,data:n}}catch(t){if(s.push({backend:r,error:t}),r===this.fallbackOrder[this.fallbackOrder.length-1])return {success:false,backend:r,data:null,errors:s}}return {success:false,backend:"",data:null,errors:s}}async hash(e){return this.execute(async s=>s.hash(e))}async hashBinary(e){return this.execute(async s=>s.hashBinary(e))}async getBestBackend(){let e=await this.getAvailableBackends();return e.length===0?"purejs":e[0]}async getAvailableBackends(){let e=[];for(let s of this.fallbackOrder)try{await this.detector.createBackendByName(s),e.push(s);}catch{}return e}getMetrics(){return {}}},_e=new S;async function Ge(a,e={}){let s=new S;if(e.forceBackend)return (await s.detector.createBackendByName(e.forceBackend)).hash(a);if(e.fallback===false)return (await s.detector.createBackend()).hash(a);let r=await s.hash(a);if(r.success)return e.reportFallback&&r.backend!=="nodecrypto"&&r.backend!=="webcrypto"&&console.info(`MD5 used fallback backend: ${r.backend}`),r.data;let t=r.errors?r.errors.map(n=>`${n.backend}: ${n.error.message}`).join(", "):"All backends failed";throw new Error(`MD5 hash failed after all attempts: ${t}`)}var k=class{constructor(){this.metrics={nodecrypto:{success:0,fail:0},webcrypto:{success:0,fail:0},ie11:{success:0,fail:0},stream:{success:0,fail:0},purejs:{success:0,fail:0}};}recordSuccess(e){this.metrics[e]&&this.metrics[e].success++;}recordFail(e){this.metrics[e]&&this.metrics[e].fail++;}getMetrics(){return this.metrics}getSummary(){return `Total operations: ${Object.values(this.metrics).reduce((s,r)=>s+r.success+r.fail,0)}
2
+ `+Object.entries(this.metrics).map(([,s])=>`${s.success} success, ${s.fail} fail`).join(`
3
+ `)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},$e=new k;export{V as BACKEND_PRIORITY,M as BackendDetector,S as FallbackManager,k as MetricsCollector,J as RuntimeEnvironment,Y as checkBackendAvailability,Ne as detectEnvironment,He as detector,_e as fallbackManager,Q as getAllAvailableBackends,X as getBestAvailableBackend,Le as isBrowser,Fe as isNode,Ie as isWebWorker,$e as metrics,Ge as robustHash};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pure-md5",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "A lightweight JavaScript function for hashing messages by the MD5 algorithm",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -39,21 +39,21 @@
39
39
  "import": "./dist/index.js",
40
40
  "require": "./dist/index.js"
41
41
  },
42
- "./core": {
43
- "types": "./dist/core/index.d.ts",
44
- "import": "./dist/core/index.js",
45
- "require": "./dist/core/index.js"
46
- },
47
- "./adapters/webcrypto": {
48
- "types": "./dist/adapters/webcrypto.d.ts",
49
- "import": "./dist/adapters/webcrypto.js",
50
- "require": "./dist/adapters/webcrypto.js"
42
+ "./md5": {
43
+ "types": "./dist/md5.d.ts",
44
+ "import": "./dist/md5.js",
45
+ "require": "./dist/md5.cjs"
51
46
  },
52
47
  "./adapters/node": {
53
48
  "types": "./dist/adapters/node.d.ts",
54
49
  "import": "./dist/adapters/node.js",
55
50
  "require": "./dist/adapters/node.js"
56
51
  },
52
+ "./adapters/webcrypto": {
53
+ "types": "./dist/adapters/webcrypto.d.ts",
54
+ "import": "./dist/adapters/webcrypto.js",
55
+ "require": "./dist/adapters/webcrypto.js"
56
+ },
57
57
  "./adapters/ie11": {
58
58
  "types": "./dist/adapters/ie11.d.ts",
59
59
  "import": "./dist/adapters/ie11.js",
@@ -79,11 +79,6 @@
79
79
  "import": "./dist/stream/index.js",
80
80
  "require": "./dist/stream/index.js"
81
81
  },
82
- "./stream/light": {
83
- "types": "./dist/stream/light/index.d.ts",
84
- "import": "./dist/stream/light/index.js",
85
- "require": "./dist/stream/light/index.js"
86
- },
87
82
  "./package.json": "./package.json"
88
83
  },
89
84
  "devDependencies": {
Binary file
@@ -0,0 +1,12 @@
1
+ // Тестируем tree-shaking: импортируем только md5
2
+ // Должны увидеть только необходимые части, а не весь бандл
3
+
4
+ const code = `
5
+ import { md5 } from './dist/index.js';
6
+
7
+ console.log(md5('test'));
8
+ `;
9
+
10
+ console.log('Testing tree-shaking with current setup...');
11
+ console.log('If you see all module exports, tree-shaking is not working well.');
12
+ console.log('If you see only md5, tree-shaking is working.');
package/.aliases DELETED
@@ -1,19 +0,0 @@
1
- # Detect which `ls` flavor is in use
2
- if ls --color > /dev/null 2>&1; then # GNU `ls`
3
- colorflag="--color"
4
- else # OS X `ls`
5
- colorflag="-G"
6
- fi
7
-
8
- # List all files colorized in long format
9
- alias ll='ls -lh'
10
-
11
- # List all files colorized in long format, including dot files
12
- alias la="ls -lha"
13
-
14
- # List only directories
15
- alias lsd='ls -l | grep "^d"'
16
-
17
- # Always use color output for `ls`
18
- alias ls="command ls ${colorflag}"
19
- export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:'
package/.bash_profile DELETED
@@ -1,12 +0,0 @@
1
- # Add Homebrew `/usr/local/bin` and User `~/bin` to the `$PATH`
2
- PATH=/usr/local/bin:$PATH
3
- PATH=$HOME/bin:$PATH
4
- export PATH
5
-
6
- # Load the shell dotfiles, and then some:
7
- # * ~/.path can be used to extend `$PATH`.
8
- # * ~/.extra can be used for other settings you don’t want to commit.
9
- for file in ~/.{path,bash_prompt,exports,aliases,functions,extra}; do
10
- [ -r "$file" ] && source "$file"
11
- done
12
- unset file
package/.bash_prompt DELETED
@@ -1,56 +0,0 @@
1
- # @gf3’s Sexy Bash Prompt, inspired by “Extravagant Zsh Prompt”
2
- # Shamelessly copied from https://github.com/gf3/dotfiles
3
- # Screenshot: http://i.imgur.com/s0Blh.png
4
-
5
- if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
6
- export TERM=gnome-256color
7
- elif infocmp xterm-256color >/dev/null 2>&1; then
8
- export TERM=xterm-256color
9
- fi
10
-
11
- if tput setaf 1 &> /dev/null; then
12
- tput sgr0
13
- if [[ $(tput colors) -ge 256 ]] 2>/dev/null; then
14
- # Changed these colors to fit Solarized theme
15
- MAGENTA=$(tput setaf 125)
16
- ORANGE=$(tput setaf 166)
17
- GREEN=$(tput setaf 64)
18
- PURPLE=$(tput setaf 61)
19
- WHITE=$(tput setaf 244)
20
- else
21
- MAGENTA=$(tput setaf 5)
22
- ORANGE=$(tput setaf 4)
23
- GREEN=$(tput setaf 2)
24
- PURPLE=$(tput setaf 1)
25
- WHITE=$(tput setaf 7)
26
- fi
27
- BOLD=$(tput bold)
28
- RESET=$(tput sgr0)
29
- else
30
- MAGENTA="\033[1;31m"
31
- ORANGE="\033[1;33m"
32
- GREEN="\033[1;32m"
33
- PURPLE="\033[1;35m"
34
- WHITE="\033[1;37m"
35
- BOLD=""
36
- RESET="\033[m"
37
- fi
38
-
39
- export MAGENTA
40
- export ORANGE
41
- export GREEN
42
- export PURPLE
43
- export WHITE
44
- export BOLD
45
- export RESET
46
-
47
- function parse_git_dirty() {
48
- [[ $(git status 2> /dev/null | tail -n1) != *"working directory clean"* ]] && echo "*"
49
- }
50
-
51
- function parse_git_branch() {
52
- git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1$(parse_git_dirty)/"
53
- }
54
-
55
- export PS1="\[${BOLD}${MAGENTA}\]\u \[$WHITE\]at \[$ORANGE\]\h \[$WHITE\]in \[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" on \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]\n\$ \[$RESET\]"
56
- export PS2="\[$ORANGE\]→ \[$RESET\]"
@@ -1,32 +0,0 @@
1
- # Changesets
2
-
3
- This is a monorepo using [Changesets](https://github.com/changesets/changesets).
4
-
5
- ## Adding a changeset
6
-
7
- ```bash
8
- npm run changeset
9
- ```
10
-
11
- You will be prompted to:
12
-
13
- 1. Select which packages to include
14
- 2. Select the type of change (major, minor, patch)
15
- 3. Write a summary of the change
16
-
17
- This will create a new file in the `.changeset` directory. Commit this file to your branch.
18
-
19
- ## Versioning and Publishing
20
-
21
- When ready to release:
22
-
23
- 1. Merge changes to `main` branch
24
- 2. GitHub Actions will create a release PR
25
- 3. Review and merge the release PR
26
- 4. GitHub Actions will publish to npm and create GitHub releases
27
-
28
- ## Configuration
29
-
30
- - **Base Branch**: `main`
31
- - **Access**: Public
32
- - **Version Updates**: Patch for internal dependencies
@@ -1,16 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
3
- "changelog": [
4
- "@changesets/changelog-github",
5
- {
6
- "repo": "eustatos/pure-md5"
7
- }
8
- ],
9
- "commit": false,
10
- "fixed": [],
11
- "linked": [],
12
- "access": "public",
13
- "baseBranch": "main",
14
- "updateInternalDependencies": "patch",
15
- "ignore": []
16
- }
@@ -1,10 +0,0 @@
1
- name: ts-language-mcp
2
- version: 0.0.1
3
- schema: v1
4
- mcpServers:
5
- - name: ts-language-mcp
6
- command: node
7
- args:
8
- - /Users/aleksanderastashkin/develop/ts-language-mcp/dist/index.js
9
- - /Users/aleksanderastashkin/develop/pure-md5
10
- env: {}
package/.continue/rules DELETED
@@ -1,29 +0,0 @@
1
- # Project Style Rules
2
-
3
- ## Language Policy
4
-
5
- **All documentation, commits, and comments must be written in English.**
6
-
7
- ### Commit Messages
8
- - Use clear, descriptive commit messages in English
9
- - Follow conventional commit format when applicable:
10
- ```
11
- feat: add streaming support for large files
12
- fix: correct md5 block padding calculation
13
- docs: update installation instructions
14
- test: add coverage for edge cases
15
- ```
16
-
17
- ### Code Comments
18
- - Write all comments in English
19
- - Use clear, descriptive variable and function names
20
- - Include JSDoc/type descriptions in English for all public APIs
21
-
22
- ### Documentation
23
- - Write all documentation in English
24
- - Include English examples showing expected input/output
25
- - Keep README files and guides in English
26
-
27
- ### Pull Requests
28
- - Describe changes in English
29
- - Reference issues using proper syntax (e.g., `Fixes #123`)
@@ -1,35 +0,0 @@
1
- ---
2
- name: Bug Report
3
- about: Create a report to help us improve
4
- title: "[BUG] "
5
- labels: bug
6
- assignees: ""
7
-
8
- ---
9
-
10
- **Describe the bug**
11
- A clear and concise description of what the bug is.
12
-
13
- **To Reproduce**
14
- Steps to reproduce the behavior:
15
- 1. Go to '...'
16
- 2. Click on '....'
17
- 3. Scroll down to '....'
18
- 4. See error
19
-
20
- **Code Example**
21
- ```javascript
22
- // Code that reproduces the issue
23
- ```
24
-
25
- **Expected behavior**
26
- A clear and concise description of what you expected to happen.
27
-
28
- **Environment:**
29
- - OS: [e.g. macOS, Windows, Linux]
30
- - Node.js version: [e.g. 14, 16, 18]
31
- - Package version: [e.g. 0.1.0]
32
- - Browser (if applicable): [e.g. chrome, safari]
33
-
34
- **Additional context**
35
- Add any other context about the problem here.
@@ -1,20 +0,0 @@
1
- ---
2
- name: Documentation Update
3
- about: Improve documentation
4
- title: "[DOCS] "
5
- labels: documentation
6
- assignees: ""
7
-
8
- ---
9
-
10
- **Describe what the documentation should cover:**
11
- A clear and concise description of what topics should be included.
12
-
13
- **Current state:**
14
- What is currently documented?
15
-
16
- **Proposed changes:**
17
- Describe the improvements to the documentation.
18
-
19
- **Additional context:**
20
- Add any other context about the documentation update.
@@ -1,20 +0,0 @@
1
- ---
2
- name: Feature Request
3
- about: Suggest an idea for this project
4
- title: "[FEATURE] "
5
- labels: enhancement
6
- assignees: ""
7
-
8
- ---
9
-
10
- **Is your feature request related to a problem? Please describe.**
11
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
-
13
- **Describe the solution you'd like**
14
- A clear and concise description of what you want to happen.
15
-
16
- **Describe alternatives you've considered**
17
- A clear and concise description of any alternative solutions or features you've considered.
18
-
19
- **Additional context**
20
- Add any other context or screenshots about the feature request here.
@@ -1,35 +0,0 @@
1
- ## Description
2
- Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
3
-
4
- Fixes # (issue)
5
-
6
- ## Type of change
7
- Please delete options that are not relevant.
8
-
9
- - [ ] Bug fix (non-breaking change which fixes an issue)
10
- - [ ] New feature (non-breaking change which adds functionality)
11
- - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
12
- - [ ] This change requires a documentation update
13
-
14
- ## How Has This Been Tested?
15
- Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce.
16
-
17
- ```javascript
18
- // Test code
19
- ```
20
-
21
- **Test Configuration**:
22
- * Node.js version:
23
- * OS:
24
-
25
- ## Checklist:
26
- - [ ] My code follows the style guidelines of this project
27
- - [ ] I have performed a self-review of my own code
28
- - [ ] I have commented my code, particularly in hard-to-understand areas
29
- - [ ] I have made corresponding changes to the documentation
30
- - [ ] My changes generate no new warnings
31
- - [ ] I have added tests that prove my fix is effective or that my feature works
32
- - [ ] New and existing unit tests pass locally with my changes
33
- - [ ] Any dependent changes have been merged and published in downstream modules
34
-
35
- ## Screenshots (if appropriate):
@@ -1,33 +0,0 @@
1
- # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2
- # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
3
-
4
- name: Node.js Package
5
-
6
- on:
7
- release:
8
- types: [created]
9
-
10
- jobs:
11
- build:
12
- runs-on: ubuntu-latest
13
- steps:
14
- - uses: actions/checkout@v3
15
- - uses: actions/setup-node@v3
16
- with:
17
- node-version: 16
18
- - run: npm ci
19
- - run: npm test
20
-
21
- publish-npm:
22
- needs: build
23
- runs-on: ubuntu-latest
24
- steps:
25
- - uses: actions/checkout@v3
26
- - uses: actions/setup-node@v3
27
- with:
28
- node-version: 16
29
- registry-url: https://registry.npmjs.org/
30
- - run: npm ci
31
- - run: npm publish
32
- env:
33
- NODE_AUTH_TOKEN: ${{secrets.npm_token}}
@@ -1,42 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- jobs:
9
- release:
10
- name: Release
11
- runs-on: ubuntu-latest
12
- steps:
13
- - name: Checkout Repo
14
- uses: actions/checkout@v4
15
- with:
16
- fetch-depth: 0
17
-
18
- - name: Setup Node.js
19
- uses: actions/setup-node@v4
20
- with:
21
- node-version: 20
22
-
23
- - name: Install Dependencies
24
- run: npm ci
25
-
26
- - name: Build
27
- run: npm run build
28
-
29
- - name: Test
30
- run: npm test
31
-
32
- - name: Create Release Pull Request
33
- id: changeset
34
- uses: changesets/action@v1
35
- with:
36
- version: npm run ci && npm run changeset:version
37
- publish: npm run ci && npm run changeset:publish
38
- commit: "chore: update versions"
39
- title: "chore: version packages"
40
- env:
41
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
42
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
package/CHANGELOG.md DELETED
@@ -1,9 +0,0 @@
1
- # pure-md5
2
-
3
- ## 0.2.0
4
-
5
- ### Minor Changes
6
-
7
- - add streaming and some optimization
8
-
9
- - add streaming and some optimization