@uploadista/flow-videos-av-node 0.1.4-beta.1 → 0.2.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/.turbo/turbo-build.log +11 -11
- package/dist/index.cjs +1 -1
- package/package.json +7 -7
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
|
|
2
|
-
> @uploadista/flow-videos-av-node@0.
|
|
2
|
+
> @uploadista/flow-videos-av-node@0.2.0 build /home/runner/work/uploadista-sdk/uploadista-sdk/packages/flow/videos/av-node
|
|
3
3
|
> tsc --noEmit && tsdown
|
|
4
4
|
|
|
5
|
-
[34mℹ[39m tsdown [2mv0.20.
|
|
5
|
+
[34mℹ[39m tsdown [2mv0.20.3[22m powered by rolldown [2mv1.0.0-rc.3[22m
|
|
6
6
|
[34mℹ[39m config file: [4m/home/runner/work/uploadista-sdk/uploadista-sdk/packages/flow/videos/av-node/tsdown.config.ts[24m
|
|
7
7
|
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
8
8
|
[34mℹ[39m target: [34mes2022[39m
|
|
9
9
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
10
|
[34mℹ[39m Build start
|
|
11
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m16.
|
|
12
|
-
[34mℹ[39m [33m[CJS][39m 1 files, total: 16.
|
|
11
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m16.53 kB[22m [2m│ gzip: 3.95 kB[22m
|
|
12
|
+
[34mℹ[39m [33m[CJS][39m 1 files, total: 16.53 kB
|
|
13
13
|
[33m[PLUGIN_TIMINGS] Warning:[0m Your build spent significant time in plugin `tsdown:external`. See https://rolldown.rs/options/checks#plugintimings for more details.
|
|
14
14
|
|
|
15
15
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex.d.cts.map [2m0.71 kB[22m [2m│ gzip: 0.35 kB[22m
|
|
16
16
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m3.37 kB[22m [2m│ gzip: 1.05 kB[22m
|
|
17
17
|
[34mℹ[39m [33m[CJS][39m 2 files, total: 4.08 kB
|
|
18
|
+
[33m[PLUGIN_TIMINGS] Warning:[0m Your build spent significant time in plugins. Here is a breakdown:
|
|
19
|
+
- rolldown-plugin-dts:generate (78%)
|
|
20
|
+
- rolldown-plugin-dts:resolver (21%)
|
|
21
|
+
See https://rolldown.rs/options/checks#plugintimings for more details.
|
|
22
|
+
|
|
23
|
+
[32m✔[39m Build complete in [32m15120ms[39m
|
|
18
24
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m15.79 kB[22m [2m│ gzip: 4.01 kB[22m
|
|
19
25
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.mjs.map [2m61.77 kB[22m [2m│ gzip: 9.88 kB[22m
|
|
20
26
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.d.mts.map [2m 0.71 kB[22m [2m│ gzip: 0.35 kB[22m
|
|
21
|
-
[33m[PLUGIN_TIMINGS] Warning:[0m Your build spent significant time in plugins. Here is a breakdown:
|
|
22
27
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m 3.37 kB[22m [2m│ gzip: 1.05 kB[22m
|
|
23
28
|
[34mℹ[39m [34m[ESM][39m 4 files, total: 81.64 kB
|
|
24
|
-
- rolldown-plugin-dts:generate (77%)
|
|
25
|
-
- rolldown-plugin-dts:resolver (20%)
|
|
26
|
-
See https://rolldown.rs/options/checks#plugintimings for more details.
|
|
27
|
-
|
|
28
29
|
[33m[PLUGIN_TIMINGS] Warning:[0m Your build spent significant time in plugin `rolldown-plugin-dts:generate`. See https://rolldown.rs/options/checks#plugintimings for more details.
|
|
29
30
|
|
|
30
|
-
[32m✔[39m Build complete in [
|
|
31
|
-
[32m✔[39m Build complete in [32m14707ms[39m
|
|
31
|
+
[32m✔[39m Build complete in [32m15131ms[39m
|
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
let e=require(`node-av/constants`),t=require(`@uploadista/core/errors`),n=require(`@uploadista/observability`),r=require(`effect`),i=require(`node-av/api`),a=require(`@uploadista/core/flow`);async function o(){try{return await import(`node-av`),{available:!0,version:`4.x`}}catch(e){return{available:!1,error:e instanceof Error?e.message:String(e)}}}const s={mp4:`video/mp4`,webm:`video/webm`,mov:`video/quicktime`,avi:`video/x-msvideo`},c={mp4:`mp4`,webm:`webm`,mov:`mov`,avi:`avi`},l={h264:e.FF_ENCODER_LIBX264,h265:e.FF_ENCODER_LIBX265,vp9:e.FF_ENCODER_LIBVPX_VP9,av1:e.FF_ENCODER_LIBAOM_AV1},u={aac:e.FF_ENCODER_AAC,mp3:e.FF_ENCODER_LIBMP3LAME,opus:e.FF_ENCODER_LIBOPUS,vorbis:e.FF_ENCODER_LIBVORBIS},d={jpeg:e.FF_ENCODER_MJPEG,mjpeg:e.FF_ENCODER_MJPEG,png:e.FF_ENCODER_PNG};function f(){let e=[],t=0n;return{callbacks:{write:n=>(e.push(n),t+=BigInt(n.length),n.length),seek:(e,n)=>{switch(n){case 0:t=e;break;case 1:t+=e;break;case 2:t=e;break}return t}},getOutput:()=>{let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}}}function p(){let e=[],n=!1,i=null,a=0n;return{callbacks:{write:t=>{let n=new Uint8Array(t);if(e.push(n),a+=BigInt(t.length),i){let e=i;i=null,e()}return t.length},seek:(e,t)=>{switch(t){case 0:a=e;break;case 1:a+=e;break;case 2:a=e;break}return a}},stream:r.Stream.async(a=>((async()=>{for(;;){for(;e.length>0;){let t=e.shift();t&&a.single(t)}if(n&&e.length===0){a.end();return}await new Promise(t=>{i=t,(e.length>0||n)&&(i=null,t())})}})().catch(e=>{a.fail(t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming output failed: ${e instanceof Error?e.message:String(e)}`,cause:e}))}),r.Effect.void)),finalize:()=>{if(n=!0,i){let e=i;i=null,e()}}}}function m(e){return r.Effect.gen(function*(){let t=[];yield*r.Stream.runForEach(e,e=>r.Effect.sync(()=>{t.push(e)}));let n=t.reduce((e,t)=>e+t.byteLength,0),i=new Uint8Array(n),a=0;for(let e of t)i.set(e,a),a+=e.byteLength;return i})}function h(e){if(!e)return!1;let t=e.toLowerCase();return t===`video/mp2t`||t===`video/mpeg-ts`||t===`video/mpegts`||t===`application/x-mpegts`}function g(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}function _(e){return typeof e==`object`&&!!e&&`pipe`in e&&typeof e.pipe==`function`}function v(){return{describe:e=>r.Effect.tryPromise({try:async()=>{try{var t=g();let n=Buffer.from(e),r=t.a(await i.Demuxer.open(n)),a=r.video(),o=r.audio();if(!a)throw Error(`No video stream found`);let s=a.codecpar,c=0;if(a.rFrameRate){let{num:e,den:t}=a.rFrameRate;c=t?e/t:e}let l=`unknown`;if(a.sampleAspectRatio){let{num:e,den:t}=a.sampleAspectRatio;l=`${e}:${t}`}return{duration:r.duration||0,width:s.width||0,height:s.height||0,codec:String(s.codecId)||`unknown`,format:r.formatName||`unknown`,bitrate:r.bitRate||0,frameRate:c,aspectRatio:l,hasAudio:!!o,audioCodec:o?.codecpar.codecId?String(o.codecpar.codecId):void 0,audioBitrate:o?.codecpar.bitRate?Number(o.codecpar.bitRate):void 0,size:e.byteLength}}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_METADATA_EXTRACTION_FAILED`,{body:`Failed to extract video metadata: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`describe`,{"video.input_size":e.byteLength})),transcode:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:a.format})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h)),v=a.codec?l[a.codec]:l.h264,y=t.u(await i.Encoder.create(v,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),b=m.addStream(y);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await y.encode(t);let r=await y.receive();for(;r;)await m.writePacket(r,b),r.free(),r=await y.receive()}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),s=m.addStream(n);for await(let t of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await m.writePacket(r,s),r.free(),r=await n.receive()}catch(e){o.e=e}finally{o.d()}await n.flush();let c=await n.receive();for(;c;)await m.writePacket(c,s),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`transcode`,{"video.format":a.format,"video.codec":a.codec,"video.video_bitrate":a.videoBitrate,"video.audio_codec":a.audioCodec,"video.audio_bitrate":a.audioBitrate,"video.input_size":e.byteLength})),resize:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h));if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let v=t.u(await i.Encoder.create(l.h264)),y=m.addStream(v);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await v.encode(t);let r=await v.receive();for(;r;)await m.writePacket(r,y),r.free(),r=await v.receive()}catch(e){n.e=e}finally{n.d()}await v.flush();let b=await v.receive();for(;b;)await m.writePacket(b,y),b.free(),b=await v.receive();let x=p.audio();if(x)try{var r=g();let e=r.u(await i.Decoder.create(x)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(x.index)))try{var o=g();let e=o.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await m.writePacket(i,n),i.free(),i=await t.receive()}catch(e){o.e=e}finally{o.d()}await t.flush();let a=await t.receive();for(;a;)await m.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`resize`,{"video.width":a.width,"video.height":a.height,"video.input_size":e.byteLength})),trim:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _;_=a.duration===void 0?a.endTime===void 0?p.duration||1/0:a.endTime:a.startTime+a.duration;let v=t.u(await i.Decoder.create(h)),y=t.u(await i.Encoder.create(l.h264)),b=m.addStream(y);for await(let e of v.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;let r=t.pts||0n,i=h.timeBase?h.timeBase.num/h.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<_){await y.encode(t);let e=await y.receive();for(;e;)await m.writePacket(e,b),e.free(),e=await y.receive()}if(o>=_)break}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(r);if(!e)continue;let i=e.pts||0n,s=S.timeBase?S.timeBase.num/S.timeBase.den:1,c=Number(i)*s;if(c>=a.startTime&&c<_){await t.encode(e);let r=await t.receive();for(;r;)await m.writePacket(r,n),r.free(),r=await t.receive()}if(c>=_)break}catch(e){o.e=e}finally{o.d()}await t.flush();let s=await t.receive();for(;s;)await m.writePacket(s,n),s.free(),s=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`trim`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.input_size":e.byteLength})),extractFrame:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let o=Buffer.from(e),s=a.format||`jpeg`,c=t.a(await i.Demuxer.open(o)),l=c.video();if(!l)throw Error(`No video stream found`);let u=t.u(await i.Decoder.create(l)),f=null,p=a.timestamp;for await(let e of u.frames(c.packets(l.index)))try{var n=g();let t=n.u(e);if(!t)continue;let a=t.pts||0n,o=l.timeBase?l.timeBase.num/l.timeBase.den:1;if(Number(a)*o>=p)try{var r=g();let e=d[s]||d.jpeg,n=r.u(await i.Encoder.create(e));await n.encode(t);let a=await n.receive();if(a?.data){f=new Uint8Array(a.data),a.free();break}}catch(e){r.e=e}finally{r.d()}}catch(e){n.e=e}finally{n.d()}if(!f)throw Error(`No frame found at timestamp ${p}`);return f}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Frame extraction failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`extract-frame`,{"video.timestamp":a.timestamp,"video.format":a.format??`jpeg`,"video.input_size":e.byteLength})),supportsStreaming:!0,transcodeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:a.format})),p=d.video();if(!p)throw Error(`No video stream found`);let m=e.u(await i.Decoder.create(p)),h=a.codec?l[a.codec]:l.h264,_=e.u(await i.Encoder.create(h,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),v=f.addStream(_);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await _.encode(n);let r=await _.receive();for(;r;)await f.writePacket(r,v),r.free(),r=await _.receive()}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),o=f.addStream(n);for await(let t of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await f.writePacket(r,o),r.free(),r=await n.receive()}catch(e){s.e=e}finally{s.d()}await n.flush();let c=await n.receive();for(;c;)await f.writePacket(c,o),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`transcode-stream`,{"video.format":a.format,"video.codec":a.codec,"video.streaming_input":h(o?.inputFormat)})),resizeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let m=e.u(await i.Decoder.create(p)),h=e.u(await i.Encoder.create(l.h264)),_=f.addStream(h);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await h.encode(n);let r=await h.receive();for(;r;)await f.writePacket(r,_),r.free(),r=await h.receive()}catch(e){t.e=e}finally{t.d()}await h.flush();let v=await h.receive();for(;v;)await f.writePacket(v,_),v.free(),v=await h.receive();let y=d.audio();if(y)try{var r=g();let e=r.u(await i.Decoder.create(y)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(y.index)))try{var s=g();let e=s.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await f.writePacket(i,n),i.free(),i=await t.receive()}catch(e){s.e=e}finally{s.d()}await t.flush();let a=await t.receive();for(;a;)await f.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`resize-stream`,{"video.width":a.width,"video.height":a.height,"video.streaming_input":h(o?.inputFormat)})),trimStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);let m;m=a.duration===void 0?a.endTime===void 0?d.duration||1/0:a.endTime:a.startTime+a.duration;let h=e.u(await i.Decoder.create(p)),_=e.u(await i.Encoder.create(l.h264)),v=f.addStream(_);for await(let e of h.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;let r=n.pts||0n,i=p.timeBase?p.timeBase.num/p.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<m){await _.encode(n);let e=await _.receive();for(;e;)await f.writePacket(e,v),e.free(),e=await _.receive()}if(o>=m)break}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(r);if(!e)continue;let i=e.pts||0n,o=b.timeBase?b.timeBase.num/b.timeBase.den:1,c=Number(i)*o;if(c>=a.startTime&&c<m){await t.encode(e);let r=await t.receive();for(;r;)await f.writePacket(r,n),r.free(),r=await t.receive()}if(c>=m)break}catch(e){s.e=e}finally{s.d()}await t.flush();let o=await t.receive();for(;o;)await f.writePacket(o,n),o.free(),o=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`trim-stream`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.streaming_input":h(o?.inputFormat)}))}}const y=()=>r.Layer.succeed(a.VideoPlugin,v()),b=()=>r.Layer.effectDiscard(r.Effect.gen(function*(){let e=yield*r.Effect.promise(()=>o());e.available?console.log(`✓ node-av ${e.version} detected`):console.warn(`⚠️ node-av is not installed or not available.`,`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`node-av/constants`),t=require(`@uploadista/core/errors`),n=require(`@uploadista/observability`),r=require(`effect`),i=require(`node-av/api`),a=require(`@uploadista/core/flow`);async function o(){try{return await import(`node-av`),{available:!0,version:`4.x`}}catch(e){return{available:!1,error:e instanceof Error?e.message:String(e)}}}const s={mp4:`video/mp4`,webm:`video/webm`,mov:`video/quicktime`,avi:`video/x-msvideo`},c={mp4:`mp4`,webm:`webm`,mov:`mov`,avi:`avi`},l={h264:e.FF_ENCODER_LIBX264,h265:e.FF_ENCODER_LIBX265,vp9:e.FF_ENCODER_LIBVPX_VP9,av1:e.FF_ENCODER_LIBAOM_AV1},u={aac:e.FF_ENCODER_AAC,mp3:e.FF_ENCODER_LIBMP3LAME,opus:e.FF_ENCODER_LIBOPUS,vorbis:e.FF_ENCODER_LIBVORBIS},d={jpeg:e.FF_ENCODER_MJPEG,mjpeg:e.FF_ENCODER_MJPEG,png:e.FF_ENCODER_PNG};function f(){let e=[],t=0n;return{callbacks:{write:n=>(e.push(n),t+=BigInt(n.length),n.length),seek:(e,n)=>{switch(n){case 0:t=e;break;case 1:t+=e;break;case 2:t=e;break}return t}},getOutput:()=>{let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}}}function p(){let e=[],n=!1,i=null,a=0n;return{callbacks:{write:t=>{let n=new Uint8Array(t);if(e.push(n),a+=BigInt(t.length),i){let e=i;i=null,e()}return t.length},seek:(e,t)=>{switch(t){case 0:a=e;break;case 1:a+=e;break;case 2:a=e;break}return a}},stream:r.Stream.async(a=>((async()=>{for(;;){for(;e.length>0;){let t=e.shift();t&&a.single(t)}if(n&&e.length===0){a.end();return}await new Promise(t=>{i=t,(e.length>0||n)&&(i=null,t())})}})().catch(e=>{a.fail(t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming output failed: ${e instanceof Error?e.message:String(e)}`,cause:e}))}),r.Effect.void)),finalize:()=>{if(n=!0,i){let e=i;i=null,e()}}}}function m(e){return r.Effect.gen(function*(){let t=[];yield*r.Stream.runForEach(e,e=>r.Effect.sync(()=>{t.push(e)}));let n=t.reduce((e,t)=>e+t.byteLength,0),i=new Uint8Array(n),a=0;for(let e of t)i.set(e,a),a+=e.byteLength;return i})}function h(e){if(!e)return!1;let t=e.toLowerCase();return t===`video/mp2t`||t===`video/mpeg-ts`||t===`video/mpegts`||t===`application/x-mpegts`}function g(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}function _(e){return typeof e==`object`&&!!e&&`pipe`in e&&typeof e.pipe==`function`}function v(){return{describe:e=>r.Effect.tryPromise({try:async()=>{try{var t=g();let n=Buffer.from(e),r=t.a(await i.Demuxer.open(n)),a=r.video(),o=r.audio();if(!a)throw Error(`No video stream found`);let s=a.codecpar,c=0;if(a.rFrameRate){let{num:e,den:t}=a.rFrameRate;c=t?e/t:e}let l=`unknown`;if(a.sampleAspectRatio){let{num:e,den:t}=a.sampleAspectRatio;l=`${e}:${t}`}return{duration:r.duration||0,width:s.width||0,height:s.height||0,codec:String(s.codecId)||`unknown`,format:r.formatName||`unknown`,bitrate:r.bitRate||0,frameRate:c,aspectRatio:l,hasAudio:!!o,audioCodec:o?.codecpar.codecId?String(o.codecpar.codecId):void 0,audioBitrate:o?.codecpar.bitRate?Number(o.codecpar.bitRate):void 0,size:e.byteLength}}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_METADATA_EXTRACTION_FAILED`,{body:`Failed to extract video metadata: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`describe`,{"video.input_size":e.byteLength})),transcode:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:a.format})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h)),v=a.codec?l[a.codec]:l.h264,y=t.u(await i.Encoder.create(v,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),b=m.addStream(y);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await y.encode(t);let r=await y.receive();for(;r;)await m.writePacket(r,b),r.free(),r=await y.receive()}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),s=m.addStream(n);for await(let t of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await m.writePacket(r,s),r.free(),r=await n.receive()}catch(e){o.e=e}finally{o.d()}await n.flush();let c=await n.receive();for(;c;)await m.writePacket(c,s),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`transcode`,{"video.format":a.format,"video.codec":a.codec,"video.video_bitrate":a.videoBitrate,"video.audio_codec":a.audioCodec,"video.audio_bitrate":a.audioBitrate,"video.input_size":e.byteLength})),resize:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h));if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let v=t.u(await i.Encoder.create(l.h264)),y=m.addStream(v);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await v.encode(t);let r=await v.receive();for(;r;)await m.writePacket(r,y),r.free(),r=await v.receive()}catch(e){n.e=e}finally{n.d()}await v.flush();let b=await v.receive();for(;b;)await m.writePacket(b,y),b.free(),b=await v.receive();let x=p.audio();if(x)try{var r=g();let e=r.u(await i.Decoder.create(x)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(x.index)))try{var o=g();let e=o.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await m.writePacket(i,n),i.free(),i=await t.receive()}catch(e){o.e=e}finally{o.d()}await t.flush();let a=await t.receive();for(;a;)await m.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`resize`,{"video.width":a.width,"video.height":a.height,"video.input_size":e.byteLength})),trim:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _;_=a.duration===void 0?a.endTime===void 0?p.duration||1/0:a.endTime:a.startTime+a.duration;let v=t.u(await i.Decoder.create(h)),y=t.u(await i.Encoder.create(l.h264)),b=m.addStream(y);for await(let e of v.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;let r=t.pts||0n,i=h.timeBase?h.timeBase.num/h.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<_){await y.encode(t);let e=await y.receive();for(;e;)await m.writePacket(e,b),e.free(),e=await y.receive()}if(o>=_)break}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(r);if(!e)continue;let i=e.pts||0n,s=S.timeBase?S.timeBase.num/S.timeBase.den:1,c=Number(i)*s;if(c>=a.startTime&&c<_){await t.encode(e);let r=await t.receive();for(;r;)await m.writePacket(r,n),r.free(),r=await t.receive()}if(c>=_)break}catch(e){o.e=e}finally{o.d()}await t.flush();let s=await t.receive();for(;s;)await m.writePacket(s,n),s.free(),s=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`trim`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.input_size":e.byteLength})),extractFrame:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let o=Buffer.from(e),s=a.format||`jpeg`,c=t.a(await i.Demuxer.open(o)),l=c.video();if(!l)throw Error(`No video stream found`);let u=t.u(await i.Decoder.create(l)),f=null,p=a.timestamp;for await(let e of u.frames(c.packets(l.index)))try{var n=g();let t=n.u(e);if(!t)continue;let a=t.pts||0n,o=l.timeBase?l.timeBase.num/l.timeBase.den:1;if(Number(a)*o>=p)try{var r=g();let e=d[s]||d.jpeg,n=r.u(await i.Encoder.create(e));await n.encode(t);let a=await n.receive();if(a?.data){f=new Uint8Array(a.data),a.free();break}}catch(e){r.e=e}finally{r.d()}}catch(e){n.e=e}finally{n.d()}if(!f)throw Error(`No frame found at timestamp ${p}`);return f}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Frame extraction failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`extract-frame`,{"video.timestamp":a.timestamp,"video.format":a.format??`jpeg`,"video.input_size":e.byteLength})),supportsStreaming:!0,transcodeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:a.format})),p=d.video();if(!p)throw Error(`No video stream found`);let m=e.u(await i.Decoder.create(p)),h=a.codec?l[a.codec]:l.h264,_=e.u(await i.Encoder.create(h,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),v=f.addStream(_);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await _.encode(n);let r=await _.receive();for(;r;)await f.writePacket(r,v),r.free(),r=await _.receive()}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),o=f.addStream(n);for await(let t of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await f.writePacket(r,o),r.free(),r=await n.receive()}catch(e){s.e=e}finally{s.d()}await n.flush();let c=await n.receive();for(;c;)await f.writePacket(c,o),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`transcode-stream`,{"video.format":a.format,"video.codec":a.codec,"video.streaming_input":h(o?.inputFormat)})),resizeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let m=e.u(await i.Decoder.create(p)),h=e.u(await i.Encoder.create(l.h264)),_=f.addStream(h);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await h.encode(n);let r=await h.receive();for(;r;)await f.writePacket(r,_),r.free(),r=await h.receive()}catch(e){t.e=e}finally{t.d()}await h.flush();let v=await h.receive();for(;v;)await f.writePacket(v,_),v.free(),v=await h.receive();let y=d.audio();if(y)try{var r=g();let e=r.u(await i.Decoder.create(y)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(y.index)))try{var s=g();let e=s.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await f.writePacket(i,n),i.free(),i=await t.receive()}catch(e){s.e=e}finally{s.d()}await t.flush();let a=await t.receive();for(;a;)await f.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`resize-stream`,{"video.width":a.width,"video.height":a.height,"video.streaming_input":h(o?.inputFormat)})),trimStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);let m;m=a.duration===void 0?a.endTime===void 0?d.duration||1/0:a.endTime:a.startTime+a.duration;let h=e.u(await i.Decoder.create(p)),_=e.u(await i.Encoder.create(l.h264)),v=f.addStream(_);for await(let e of h.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;let r=n.pts||0n,i=p.timeBase?p.timeBase.num/p.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<m){await _.encode(n);let e=await _.receive();for(;e;)await f.writePacket(e,v),e.free(),e=await _.receive()}if(o>=m)break}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(r);if(!e)continue;let i=e.pts||0n,o=b.timeBase?b.timeBase.num/b.timeBase.den:1,c=Number(i)*o;if(c>=a.startTime&&c<m){await t.encode(e);let r=await t.receive();for(;r;)await f.writePacket(r,n),r.free(),r=await t.receive()}if(c>=m)break}catch(e){s.e=e}finally{s.d()}await t.flush();let o=await t.receive();for(;o;)await f.writePacket(o,n),o.free(),o=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`trim-stream`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.streaming_input":h(o?.inputFormat)}))}}const y=()=>r.Layer.succeed(a.VideoPlugin,v()),b=()=>r.Layer.effectDiscard(r.Effect.gen(function*(){let e=yield*r.Effect.promise(()=>o());e.available?console.log(`✓ node-av ${e.version} detected`):console.warn(`⚠️ node-av is not installed or not available.`,`
|
|
2
2
|
Video processing operations will fail.`,`
|
|
3
3
|
Install node-av: npm install node-av`)})).pipe(r.Layer.provideMerge(y()));exports.audioCodecToAVName=u,exports.checkAVAvailable=o,exports.codecToAVName=l,exports.createVideoPlugin=v,exports.formatToExtension=c,exports.formatToMimeType=s,exports.imageFormatToEncoder=d,exports.videoPlugin=y,exports.videoPluginWithCheck=b;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uploadista/flow-videos-av-node",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"description": "FFmpeg video processing plugin for Uploadista Flow with av-node",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Uploadista",
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"node-av": "5.
|
|
18
|
-
"@uploadista/
|
|
19
|
-
"@uploadista/
|
|
17
|
+
"node-av": "5.2.2",
|
|
18
|
+
"@uploadista/core": "0.2.0",
|
|
19
|
+
"@uploadista/observability": "0.2.0"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"effect": "^3.0.0",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@effect/vitest": "0.27.0",
|
|
27
27
|
"@types/node": "24.10.9",
|
|
28
|
-
"effect": "3.19.
|
|
29
|
-
"tsdown": "0.20.
|
|
28
|
+
"effect": "3.19.17",
|
|
29
|
+
"tsdown": "0.20.3",
|
|
30
30
|
"vitest": "4.0.18",
|
|
31
31
|
"zod": "4.3.6",
|
|
32
|
-
"@uploadista/typescript-config": "0.
|
|
32
|
+
"@uploadista/typescript-config": "0.2.0"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "tsc --noEmit && tsdown",
|