diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 831b29a..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -build/* linguist-generated \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..6af42ba --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: Vanilagy +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: vanilagy +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..2a58d23 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,47 @@ +name: Release + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + release: + name: Release + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'npm' + registry-url: https://registry.npmjs.org + + - name: Get package.json version + id: package-json-version + run: echo "version=v$(cat package.json | jq '.version' --raw-output)" >> $GITHUB_OUTPUT + + - name: Check package.json version against tag name + if: steps.package-json-version.outputs.version != github.event.release.tag_name + uses: actions/github-script@v3 + with: + script: core.setFailed('Release tag does not match package.json version!') + + - name: Install dependencies + run: npm ci + + - name: Run build + run: npm run build + + - name: Create Publish to npm + run: npm publish --provenance + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/README.md b/README.md index f87f5c1..152ad62 100644 --- a/README.md +++ b/README.md @@ -1 +1,166 @@ -# TODO \ No newline at end of file +# Mediabunny - JavaScript media toolkit + +[![](https://img.shields.io/npm/v/mediabunny)](https://www.npmjs.com/package/mediabunny) +[![](https://img.shields.io/bundlephobia/minzip/mediabunny)](https://bundlephobia.com/package/mediabunny) +[![](https://img.shields.io/npm/dm/mediabunny)](https://www.npmjs.com/package/mediabunny) + +
+ +
+ +Mediabunny is a JavaScript library for reading, writing, and converting media files (like MP4 or WebM), directly in the browser. It aims to be a complete toolkit for high-performance media operations on the web. It's written from scratch in pure TypeScript, has zero dependencies, is very performant, and is extremely tree-shakable, meaning you only include what you use. You can think of it a bit like [FFmpeg](https://ffmpeg.org/), but built from the ground up for the web. + +[Documentation](https://mediabunny.dev) | [Examples](https://mediabunny.dev/examples) | [Sponsoring](#sponsoring) | [License](#license) | [Discord](https://discord.gg/hmpkyYuS4U) + +### Gold sponsors + +
+ + Gling AI + +      + + Diffusion Studio + +
+ +[Get featured](https://github.com/sponsors/Vanilagy) + +## Features + +Core features include: + +- **Wide format support**: Read and write MP4, WebM, WAVE, MP3, Ogg, and more +- **Built-in encoding & decoding**: Supports 25+ video, audio, and subtitle codecs, hardware-accelerated using the WebCodecs API +- **High precision**: Fine-grained, microsecond-accurate reading and writing operations +- **Conversion API**: Easy-to-use API with features such as transmuxing, transcoding, resizing, rotation, resampling, trimming, and more +- **Streaming I/O**: Handle reading & writing files of any size with memory-efficient streaming +- **Tree-shakable**: Only bundle what you use (as small as 5 kB gzipped) +- **Zero dependencies**: Implemented in highly performant TypeScript +- **Cross-platform**: Works in browsers and Node.js + +[See full feature list](https://mediabunny.dev/guide/introduction#features) + +## Quick start + +### Installation + +```bash +npm install mediabunny +``` + +### Read file metadata + +```js +import { Input, ALL_FORMATS, BlobSource } from 'mediabunny'; + +const input = new Input({ + source: new BlobSource(file), // Reading from disk + formats: ALL_FORMATS, +}); + +const duration = await input.computeDuration(); // in seconds +const videoTrack = await input.getPrimaryVideoTrack(); +const audioTrack = await input.getPrimaryAudioTrack(); +const { displayWidth, displayHeight, rotation } = videoTrack; +const { sampleRate, numberOfChannels } = audioTrack; +``` + +### Create new media files + +```js +import { Output, Mp4OutputFormat, BufferTarget, CanvasSource, QUALITY_HIGH } from 'mediabunny'; + +const output = new Output({ + format: new Mp4OutputFormat(), + target: new BufferTarget(), // Writing to memory +}); + +// Add a video track backed by a canvas element +const videoSource = new CanvasSource(canvas, { + codec: 'avc', + bitrate: QUALITY_HIGH, +}); +output.addVideoTrack(videoSource); + +await output.start(); +// Add frames... +await output.finalize(); + +const buffer = output.target.buffer; // Final MP4 file +``` + +### Convert files + +```js +import { Input, Output, Conversion, ALL_FORMATS, BlobSource, WebMOutputFormat } from 'mediabunny'; + +const input = new Input({ + source: new BlobSource(file), + formats: ALL_FORMATS, +}); + +const output = new Output({ + format: new WebMOutputFormat(), // Convert to WebM + target: new BufferTarget(), +}); + +const conversion = await Conversion.init({ input, output }); +await conversion.execute(); +``` + +[See more code snippets](https://mediabunny.dev/guide/quick-start) + +## Documentation + +Visit the [Docs](https://mediabunny.dev/guide/introduction) for comprehensive guides, examples and API documentation. + +## Sponsoring + +[See all sponsors](https://mediabunny.dev/#sponsors) + +Mediabunny is an open-source project released under the MPL-2.0 and is therefore free to use for any purpose, including closed-source commercial use. A permissive license is essential for a foundational library like this to truly thrive. That said, this project requires an immense amount of work and care to maintain and expand. This is made possible by the generous financial backing of the sponsors of this project. + +If you have derived considerable value from this project, please consider [sponsoring it](https://github.com/sponsors/Vanilagy) or providing a one-time donation. Thank you! 🩷 + +## License + +This project is licensed under the [Mozilla Public License 2.0](https://choosealicense.com/licenses/mpl-2.0/). This is a very permissive weak copyleft license, not much different from the MIT License, allowing you to: +- Use Mediabunny for any purpose, commercial or non-commercial, without royalties +- Use Mediabunny in open- and closed-source projects +- Freely distribute projects built with Mediabunny +- Inspect and modify Mediabunny's source code + +However, you have the following obligation: +- If you modify Mediabunny's licensed source code (e.g. in a fork) and then distribute it, you must publicly publish your modifications under the Mozilla Public License 2.0. + +This ensures that library usage remains permissive for everybody, while any improvements to Mediabunny remain in the open, benefiting everyone. + +You are not allowed to: +- Remove the license and copyright headers from any Mediabunny source file +- Claim the "Mediabunny" trademark + +And finally, Mediabunny - like any other library - comes with no warranty of any kind and is not liable for any direct or indirect damages. + +> This is not legal advice. Refer to the full text of the [Mozilla Public License 2.0](https://choosealicense.com/licenses/mpl-2.0/) for the binding license agreement. + +## Implementation & development + +Mediabunny is implemented from scratch in pure TypeScript with zero dependencies. At its core, the library is a collection of multiplexers and demultiplexers (one for every container format), which are then connected together via abstractions around the WebCodecs API. The logic is heavily pipelined and lazy, keeping performance high and memory usage low. If this stuff interests you, refer to the [Technical overview](https://mediabunny.dev/guide/introduction#technical-overview) for more. + +For development, clone this repository and install it using a modern version of Node.js and npm. The build system uses TypeScript, esbuild, API Extractor, Vite, and VitePress. + +```bash +npm install # Install dependencies +npm run watch # Development build with watch mode + +npm run build # Production build with type definitions + +npm run check # Type checking +npm run lint # ESLint + +npm run docs:dev # Start docs development server +npm run dev # Start examples development server + +npm run docs:build # Build docs and examples +``` \ No newline at end of file diff --git a/assets/mediabunny-logo.svg b/assets/mediabunny-logo.svg deleted file mode 100644 index 458fbad..0000000 --- a/assets/mediabunny-logo.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index ebff5c7..5f174c3 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,14 +1,21 @@ import { withMermaid } from 'vitepress-plugin-mermaid'; import footnote from 'markdown-it-footnote'; import tailwindcss from '@tailwindcss/vite'; +import llmstxt from 'vitepress-plugin-llms'; +import { HeadConfig } from 'vitepress'; // https://vitepress.dev/reference/site-config export default withMermaid({ title: 'Mediabunny', - description: 'A VitePress Site', + description: 'A JavaScript library for reading, writing, and converting media files. Directly in the browser, and' + + ' faster than anybunny else.', cleanUrls: true, head: [ - ['link', { rel: 'icon', href: '/mediabunny-logo.svg' }], + ['link', { rel: 'icon', type: 'image/svg+xml', href: '/mediabunny-logo.svg' }], + ['link', { rel: 'icon', type: 'image/png', href: '/mediabunny-logo.png' }], + ['meta', { property: 'og:type', content: 'website' }], + ['meta', { property: 'og:site_name', content: 'Mediabunny' }], + ['meta', { property: 'og:image', content: '/mediabunny-og-image.png' }], ], themeConfig: { logo: '/mediabunny-logo.svg', @@ -17,6 +24,8 @@ export default withMermaid({ nav: [ { text: 'Guide', link: '/guide/introduction', activeMatch: '/guide' }, { text: 'Examples', link: '/examples', activeMatch: '/examples' }, + { text: 'Sponsors', link: '/#sponsors', activeMatch: '/#sponsors' }, + { text: 'License', link: 'https://github.com/Vanilagy/mediabunny#license' }, ], sidebar: [ @@ -61,6 +70,8 @@ export default withMermaid({ socialLinks: [ { icon: 'github', link: 'https://github.com/Vanilagy/mediabunny' }, + { icon: 'discord', link: 'https://discord.gg/hmpkyYuS4U' }, + { icon: 'x', link: 'https://x.com/vanilagy' }, ], search: { @@ -84,8 +95,21 @@ export default withMermaid({ }, }, vite: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - plugins: [tailwindcss() as any], + plugins: [ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tailwindcss() as any, + llmstxt(), + ], }, outDir: '../dist-docs', + transformPageData(pageData) { + let title = pageData.title; + if (title !== 'Mediabunny') { + title += ' | Mediabunny'; + } + + ((pageData.frontmatter['head'] ??= []) as HeadConfig[]).push( + ['meta', { property: 'og:title', content: title }], + ); + }, }); diff --git a/docs/.vitepress/theme/theme.css b/docs/.vitepress/theme/theme.css index a1d495e..4cb7499 100644 --- a/docs/.vitepress/theme/theme.css +++ b/docs/.vitepress/theme/theme.css @@ -47,6 +47,6 @@ color: hsl(345, 100%, 85%); } -body { - overflow-x: hidden; +html, body { + overflow-x: hidden !important; } \ No newline at end of file diff --git a/assets/big-buck-bunny-trimmed.mp4 b/docs/assets/big-buck-bunny-trimmed.mp4 similarity index 100% rename from assets/big-buck-bunny-trimmed.mp4 rename to docs/assets/big-buck-bunny-trimmed.mp4 diff --git a/docs/codec-soup.svg b/docs/assets/codec-soup.svg similarity index 100% rename from docs/codec-soup.svg rename to docs/assets/codec-soup.svg diff --git a/assets/download-icon.svg b/docs/assets/download-icon.svg similarity index 100% rename from assets/download-icon.svg rename to docs/assets/download-icon.svg diff --git a/docs/assets/fluent-emoji--heart-suit.svg b/docs/assets/fluent-emoji--heart-suit.svg new file mode 100644 index 0000000..7284a48 --- /dev/null +++ b/docs/assets/fluent-emoji--heart-suit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/fullscreen-icon.svg b/docs/assets/fullscreen-icon.svg similarity index 100% rename from assets/fullscreen-icon.svg rename to docs/assets/fullscreen-icon.svg diff --git a/assets/github-mark.svg b/docs/assets/github-mark.svg similarity index 100% rename from assets/github-mark.svg rename to docs/assets/github-mark.svg diff --git a/docs/inspiring-io.svg b/docs/assets/inspiring-io.svg similarity index 100% rename from docs/inspiring-io.svg rename to docs/assets/inspiring-io.svg diff --git a/assets/pause-icon.svg b/docs/assets/pause-icon.svg similarity index 100% rename from assets/pause-icon.svg rename to docs/assets/pause-icon.svg diff --git a/docs/guide/planar_interleaved.svg b/docs/assets/planar_interleaved.svg similarity index 100% rename from docs/guide/planar_interleaved.svg rename to docs/assets/planar_interleaved.svg diff --git a/assets/play-icon.svg b/docs/assets/play-icon.svg similarity index 100% rename from assets/play-icon.svg rename to docs/assets/play-icon.svg diff --git a/docs/assets/ri--heart-add-fill.svg b/docs/assets/ri--heart-add-fill.svg new file mode 100644 index 0000000..9309b3e --- /dev/null +++ b/docs/assets/ri--heart-add-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/volume-0-icon.svg b/docs/assets/volume-0-icon.svg similarity index 100% rename from assets/volume-0-icon.svg rename to docs/assets/volume-0-icon.svg diff --git a/assets/volume-1-icon.svg b/docs/assets/volume-1-icon.svg similarity index 100% rename from assets/volume-1-icon.svg rename to docs/assets/volume-1-icon.svg diff --git a/assets/volume-2-icon.svg b/docs/assets/volume-2-icon.svg similarity index 100% rename from assets/volume-2-icon.svg rename to docs/assets/volume-2-icon.svg diff --git a/assets/volume-off-icon.svg b/docs/assets/volume-off-icon.svg similarity index 100% rename from assets/volume-off-icon.svg rename to docs/assets/volume-off-icon.svg diff --git a/assets/volume-x-icon.svg b/docs/assets/volume-x-icon.svg similarity index 100% rename from assets/volume-x-icon.svg rename to docs/assets/volume-x-icon.svg diff --git a/docs/examples.md b/docs/examples.md index 5597b6f..2df3cb7 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -11,24 +11,36 @@ features: details: Extract various metadata from an input media file. link: /examples/metadata-extraction target: _self + icon: + src: /mingcute--file-info-line.svg - title: Thumbnail generation details: Generate multiple small thumbnails for a video track. link: /examples/thumbnail-generation target: _self + icon: + src: /mingcute--photo-album-line.svg - title: Media player (advanced) details: "A full video & audio media player, implemented from scratch with Mediabunny, with microsecond playback accuracy." link: /examples/media-player target: _self + icon: + src: /mingcute--video-line.svg - title: File compression details: Convert an input file to a highly-compressed MP4 file. link: /examples/file-compression target: _self + icon: + src: /mingcute--file-zip-line.svg - title: Procedural video generation details: Generate a video file as fast as the hardware allows. link: /examples/procedural-generation target: _self + icon: + src: /mingcute--magic-3-line.svg - title: Live recording details: Record a video from live sources and stream it to a video element. link: /examples/live-recording target: _self + icon: + src: /mingcute--microphone-line.svg --- diff --git a/docs/guide/input-formats.md b/docs/guide/input-formats.md index a61fb88..352283a 100644 --- a/docs/guide/input-formats.md +++ b/docs/guide/input-formats.md @@ -47,7 +47,7 @@ You can also use them for checking the actual format of an `Input`: ```ts import { MP3 } from 'mediabunny'; -const isMp3 = input.getFormat() === MP3; +const isMp3 = (await input.getFormat()) === MP3; ``` There is a special `ALL_FORMATS` constant exported by Mediabunny which contains every input format singleton. Use this constant if you want to support as many formats as possible: @@ -82,13 +82,13 @@ This means you can also perform input format checks using `instanceof` instead o import { Mp3InputFormat } from 'mediabunny'; // Check if the file is MP3: -input.getFormat() instanceof Mp3InputFormat; +(await input.getFormat()) instanceof Mp3InputFormat; // Check if the file is Matroska (MKV + WebM): -input.getFormat() instanceof MatroskaInputFormat; +(await input.getFormat()) instanceof MatroskaInputFormat; // Check if the file is MP4 or QuickTime: -input.getFormat() instanceof IsobmffInputFormat; +(await input.getFormat()) instanceof IsobmffInputFormat; ``` ::: info diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md index 930600e..7aa8b37 100644 --- a/docs/guide/introduction.md +++ b/docs/guide/introduction.md @@ -1,6 +1,6 @@ # Introduction -Mediabunny is a JavaScript library for reading, writing, and converting media files (like MP4 or WebM), directly in the browser. It aims to be a complete toolkit for doing high-performance media operations on the web. It's written from scratch in pure TypeScript, has zero dependencies, and is extremely tree-shakable, meaning you only include what you use. You can think of it kind of like [FFmpeg](https://ffmpeg.org/), but built for the web's needs. +Mediabunny is a JavaScript library for reading, writing, and converting media files (like MP4 or WebM), directly in the browser. It aims to be a complete toolkit for high-performance media operations on the web. It's written from scratch in pure TypeScript, has zero dependencies, and is extremely tree-shakable, meaning you only include what you use. You can think of it a bit like [FFmpeg](https://ffmpeg.org/), but built for the web's needs. ## Features @@ -12,7 +12,7 @@ Here's a long list of stuff this library does: - Converting media files - Hardware-accelerated decoding & encoding (via the WebCodecs API) - Support for multiple video, audio and subtitle tracks -- Support for many container formats (.mp4, .mov, .webm, .mkv, .mp3, .wav, .ogg) +- Read & write support for many container formats (.mp4, .mov, .webm, .mkv, .mp3, .wav, .ogg), including variations such as MP4 with Fast Start, fragmented MP4, or streamable Matroska - Support for 25 different codecs - Lazy, optimized, on-demand file reading - Input and output streaming, arbitrary file size support diff --git a/docs/guide/media-sinks.md b/docs/guide/media-sinks.md index 67cb295..5465275 100644 --- a/docs/guide/media-sinks.md +++ b/docs/guide/media-sinks.md @@ -437,9 +437,9 @@ let sumOfSquares = 0; let totalSampleCount = 0; for await (const sample of sink.samples()) { - const bytesNeeded = sample.allocationSize({ format: 'f32' }); + const bytesNeeded = sample.allocationSize({ format: 'f32', planeIndex: 0 }); const floats = new Float32Array(bytesNeeded / 4); - sample.copyTo(floats, { format: 'f32' }); + sample.copyTo(floats, { format: 'f32', planeIndex: 0 }); for (let i = 0; i < floats.length; i++) { sumOfSquares += floats[i] ** 2; diff --git a/docs/guide/media-sources.md b/docs/guide/media-sources.md index 0314e38..723e7a1 100644 --- a/docs/guide/media-sources.md +++ b/docs/guide/media-sources.md @@ -56,7 +56,7 @@ type VideoEncodingConfig = { meta: EncodedVideoChunkMetadata | undefined ) => unknown; onEncoderConfig?: ( - config: AudioEncoderConfig + config: VideoEncoderConfig ) => unknown; }; ``` diff --git a/docs/guide/output-formats.md b/docs/guide/output-formats.md index ef7f83a..cd871ec 100644 --- a/docs/guide/output-formats.md +++ b/docs/guide/output-formats.md @@ -119,10 +119,10 @@ The available options are the same `IsobmffOutputFormatOptions` used by [MP4](#m This output format creates WebM files. ```ts -import { Output, WebmOutputFormat } from 'mediabunny'; +import { Output, WebMOutputFormat } from 'mediabunny'; const output = new Output({ - format: new WebmOutputFormat(options), + format: new WebMOutputFormat(options), // ... }); ``` diff --git a/docs/guide/packets-and-samples.md b/docs/guide/packets-and-samples.md index 549948c..2371bb4 100644 --- a/docs/guide/packets-and-samples.md +++ b/docs/guide/packets-and-samples.md @@ -409,7 +409,7 @@ The following audio sample formats are supported: Planar formats store each channel's data contiguously, while interleaved formats store the channels' data interleaved together: -![Planar vs. interleaved formats](./planar_interleaved.svg) +![Planar vs. interleaved formats](../assets/planar_interleaved.svg) ### Inspecting audio samples diff --git a/docs/guide/quick-start.md b/docs/guide/quick-start.md index 05bd247..dec220f 100644 --- a/docs/guide/quick-start.md +++ b/docs/guide/quick-start.md @@ -255,7 +255,7 @@ await audioSource.add(audioBuffer2); await output.finalize(); -const buffer = output.target.buffer; // Uint8Array containing the final MP4 file +const buffer = output.target.buffer; // ArrayBuffer containing the final MP4 file ``` ::: info @@ -442,7 +442,7 @@ conversion.onProgress = (progress) => { await conversion.execute(); // Conversion is complete -const buffer = output.target.buffer; // Uint8Array containing the final MP4 file +const buffer = output.target.buffer; // ArrayBuffer containing the final MP4 file ``` ::: info diff --git a/docs/guide/reading-media-files.md b/docs/guide/reading-media-files.md index d9e00c8..4fa9b5a 100644 --- a/docs/guide/reading-media-files.md +++ b/docs/guide/reading-media-files.md @@ -362,7 +362,7 @@ const decoder = new VideoDecoder({ decoder.configure(await videoTrack.getDecoderConfig()); // Let's crank through all packets from timestamp 37s to 50s: -let currentPacket = sink.getKeyPacket(37); +let currentPacket = await sink.getKeyPacket(37); while (currentPacket && currentPacket.timestamp < 50) { decoder.decode(currentPacket.toEncodedVideoChunk()); currentPacket = await sink.getNextPacket(currentPacket); diff --git a/docs/guide/supported-formats-and-codecs.md b/docs/guide/supported-formats-and-codecs.md index 28b890c..f5275a4 100644 --- a/docs/guide/supported-formats-and-codecs.md +++ b/docs/guide/supported-formats-and-codecs.md @@ -156,7 +156,7 @@ import { getFirstEncodableVideoCodec(['avc', 'vp9', 'av1']); // => Promise getFirstEncodableAudioCodec(['opus', 'aac']); // => Promise -getEncodableVideoCodecs( +getFirstEncodableVideoCodec( ['avc', 'hevc', 'vp8'], { width: 1920, height: 1080, bitrate: 1e7 }, ); // => Promise diff --git a/docs/guide/writing-media-files.md b/docs/guide/writing-media-files.md index f34db98..00fa8e8 100644 --- a/docs/guide/writing-media-files.md +++ b/docs/guide/writing-media-files.md @@ -213,7 +213,7 @@ const output = new Output({ output.target.buffer; // => null await output.finalize(); -output.target.buffer; // => Uint8Array +output.target.buffer; // => ArrayBuffer ``` This target is a great choice for small-ish files (< 100 MB), but since all data will be kept in memory, using it for large files is suboptimal. If the output gets very large, the page might crash due to memory exhaustion. For these cases, using `StreamTarget` is recommended. diff --git a/docs/index.md b/docs/index.md index 620547f..96d8a83 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,9 +17,110 @@ hero: - theme: alt text: Examples link: /examples + - theme: alt + text: Sponsors + link: "#sponsors" + - theme: alt + text: License + link: https://github.com/Vanilagy/mediabunny#license --- -
+ + +
+
+ +

{{ quote.quote }}

+
+ + Author image + +

{{ quote.author }}

+
+
+
+ +
+ +```bash +npm install mediabunny +``` + +
+ +

Read any media file, efficiently

@@ -45,11 +146,11 @@ const videoTrack = await input.getPrimaryVideoTrack(); const { displayWidth, displayHeight, rotation } = videoTrack; const audioTrack = await input.getPrimaryAudioTrack(); -const { sampleRate, channelCount } = audioTrack; +const { sampleRate, numberOfChannels } = audioTrack; // Get the frame halfway through the video const sink = new VideoSampleSink(videoTrack); -const { canvas } = await sink.getSample(duration / 2); +const frame = await sink.getSample(duration / 2); // Loop over all frames of the video for await (const frame of sink.samples()) { @@ -89,7 +190,7 @@ await output.start(); // Add media data here... -await output.finalize; +await output.finalize(); const { buffer } = output.target; // Contains the final file ``` @@ -139,7 +240,7 @@ await conversion.execute();
- +

Universal I/O

@@ -158,64 +259,17 @@ await conversion.execute();
- +
- -

{{ benchmark.name }}

{{ result.name }}

-
+

{{ result.value < 100 ? result.value.toPrecision(3) : Math.floor(result.value) }} {{ benchmark.unit }}

@@ -236,7 +290,7 @@ const bundleSizes = [

Bundle size, minified + gzipped

{{ result.name }}

-
+

{{ result.size < 100 ? result.size.toPrecision(3) : Math.floor(result.size) }} kB

@@ -249,4 +303,44 @@ const bundleSizes = [
+ + +
+ +
+ +
+

+ Made possible by you + +

+

Mediabunny is an open-source project released under the MPL-2.0 and is therefore free to use for any purpose, including closed-source commercial use. A permissive license is essential for a foundational library like this to truly thrive. That said, this project requires an immense amount of work and care. This is made possible by the generous financial backing of these awesome sponsors:

+ + + + +

And you

+
+
\ No newline at end of file diff --git a/docs/public/avatars/konstantin.png b/docs/public/avatars/konstantin.png new file mode 100644 index 0000000..49ba326 Binary files /dev/null and b/docs/public/avatars/konstantin.png differ diff --git a/docs/public/avatars/yonatan.jpeg b/docs/public/avatars/yonatan.jpeg new file mode 100644 index 0000000..84aeca5 Binary files /dev/null and b/docs/public/avatars/yonatan.jpeg differ diff --git a/docs/public/mediabunny-logo.png b/docs/public/mediabunny-logo.png new file mode 100644 index 0000000..f63b585 Binary files /dev/null and b/docs/public/mediabunny-logo.png differ diff --git a/docs/public/mediabunny-og-image.png b/docs/public/mediabunny-og-image.png new file mode 100644 index 0000000..9f1f35e Binary files /dev/null and b/docs/public/mediabunny-og-image.png differ diff --git a/docs/public/mingcute--file-info-line.svg b/docs/public/mingcute--file-info-line.svg new file mode 100644 index 0000000..ad90e0f --- /dev/null +++ b/docs/public/mingcute--file-info-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/mingcute--file-zip-line.svg b/docs/public/mingcute--file-zip-line.svg new file mode 100644 index 0000000..3307918 --- /dev/null +++ b/docs/public/mingcute--file-zip-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/mingcute--magic-3-line.svg b/docs/public/mingcute--magic-3-line.svg new file mode 100644 index 0000000..4335d7f --- /dev/null +++ b/docs/public/mingcute--magic-3-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/mingcute--microphone-line.svg b/docs/public/mingcute--microphone-line.svg new file mode 100644 index 0000000..90668c4 --- /dev/null +++ b/docs/public/mingcute--microphone-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/mingcute--photo-album-line.svg b/docs/public/mingcute--photo-album-line.svg new file mode 100644 index 0000000..2387bfc --- /dev/null +++ b/docs/public/mingcute--photo-album-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/mingcute--video-line.svg b/docs/public/mingcute--video-line.svg new file mode 100644 index 0000000..47632ca --- /dev/null +++ b/docs/public/mingcute--video-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/sponsors/diffusionstudio.png b/docs/public/sponsors/diffusionstudio.png new file mode 100644 index 0000000..b957466 Binary files /dev/null and b/docs/public/sponsors/diffusionstudio.png differ diff --git a/docs/public/sponsors/gling.svg b/docs/public/sponsors/gling.svg new file mode 100644 index 0000000..3a86f18 --- /dev/null +++ b/docs/public/sponsors/gling.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/examples/file-compression/file-compression.ts b/examples/file-compression/file-compression.ts index cbf048f..5b9ed57 100644 --- a/examples/file-compression/file-compression.ts +++ b/examples/file-compression/file-compression.ts @@ -9,7 +9,7 @@ import { QUALITY_VERY_LOW, } from 'mediabunny'; -import SampleFileUrl from '../../assets/big-buck-bunny-trimmed.mp4'; +import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4'; (document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl; const selectMediaButton = document.querySelector('button') as HTMLButtonElement; diff --git a/examples/file-compression/index.html b/examples/file-compression/index.html index 79fc087..6ec1051 100644 --- a/examples/file-compression/index.html +++ b/examples/file-compression/index.html @@ -12,7 +12,7 @@ -

File compression example

+

File compression example

Select or drop a media file, and Mediabunny will convert it to a heavily-compressed MP4 file.

@@ -21,7 +21,7 @@ - +

@@ -48,7 +48,7 @@ target="_blank" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" > - +

View source code

diff --git a/examples/live-recording/index.html b/examples/live-recording/index.html index fb00813..92aa8bf 100644 --- a/examples/live-recording/index.html +++ b/examples/live-recording/index.html @@ -12,7 +12,7 @@ -

Live recording example

+

Live recording example

The live canvas state and your microphone input will be written into a fragmented MP4 file and live-streamed to a <video> element.

- +

@@ -35,18 +35,18 @@
@@ -68,7 +68,7 @@
@@ -84,7 +84,7 @@ target="_blank" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" > - +

View source code

diff --git a/examples/media-player/media-player.ts b/examples/media-player/media-player.ts index b1e9844..978c246 100644 --- a/examples/media-player/media-player.ts +++ b/examples/media-player/media-player.ts @@ -8,7 +8,7 @@ import { WrappedCanvas, } from 'mediabunny'; -import SampleFileUrl from '../../assets/big-buck-bunny-trimmed.mp4'; +import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4'; (document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl; const selectMediaButton = document.querySelector('button') as HTMLButtonElement; diff --git a/examples/metadata-extraction/index.html b/examples/metadata-extraction/index.html index 08724fa..35d45d8 100644 --- a/examples/metadata-extraction/index.html +++ b/examples/metadata-extraction/index.html @@ -12,7 +12,7 @@ -

Metadata extraction example

+

Metadata extraction example

Select or drop a media file, and Mediabunny will start extracting various metadata about that file.

@@ -21,7 +21,7 @@ - +

@@ -41,7 +41,7 @@ target="_blank" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" > - +

View source code

diff --git a/examples/metadata-extraction/metadata-extraction.ts b/examples/metadata-extraction/metadata-extraction.ts index ff9b569..9273493 100644 --- a/examples/metadata-extraction/metadata-extraction.ts +++ b/examples/metadata-extraction/metadata-extraction.ts @@ -1,6 +1,6 @@ import { Input, ALL_FORMATS, BlobSource } from 'mediabunny'; -import SampleFileUrl from '../../assets/big-buck-bunny-trimmed.mp4'; +import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4'; (document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl; const selectMediaButton = document.querySelector('button') as HTMLButtonElement; diff --git a/examples/procedural-generation/index.html b/examples/procedural-generation/index.html index 2e80da7..06c43ce 100644 --- a/examples/procedural-generation/index.html +++ b/examples/procedural-generation/index.html @@ -12,7 +12,7 @@ -

Procedural generation example

+

Procedural generation example

Using Mediabunny, this page will procedurally generate a video of musical bouncing balls as fast as possible.

@@ -38,7 +38,7 @@

@@ -55,7 +55,7 @@ target="_blank" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-zinc-200 dark:bg-zinc-750 hover:bg-zinc-300 dark:hover:bg-zinc-700 rounded-bl-xl" > - +

View source code

diff --git a/examples/thumbnail-generation/index.html b/examples/thumbnail-generation/index.html index fd3ce0e..dcda928 100644 --- a/examples/thumbnail-generation/index.html +++ b/examples/thumbnail-generation/index.html @@ -12,7 +12,7 @@ -

Thumbnail generation example

+

Thumbnail generation example

Select or drop a media file, and Mediabunny will extract video thumbnails for it.

@@ -21,7 +21,7 @@ - +

@@ -41,7 +41,7 @@ target="_blank" class="flex items-center gap-2 fixed top-0 right-0 py-2 px-5 bg-gray-200 dark:bg-zinc-750 hover:bg-gray-300 dark:hover:bg-zinc-700 rounded-bl-xl" > - +

View source code

diff --git a/examples/thumbnail-generation/thumbnail-generation.ts b/examples/thumbnail-generation/thumbnail-generation.ts index 802e451..c88bc6a 100644 --- a/examples/thumbnail-generation/thumbnail-generation.ts +++ b/examples/thumbnail-generation/thumbnail-generation.ts @@ -1,6 +1,6 @@ import { Input, ALL_FORMATS, BlobSource, CanvasSink } from 'mediabunny'; -import SampleFileUrl from '../../assets/big-buck-bunny-trimmed.mp4'; +import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4'; (document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl; const selectMediaButton = document.querySelector('button') as HTMLButtonElement; diff --git a/package-lock.json b/package-lock.json index af3b8e5..5cd72df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,10 @@ "": { "name": "mediabunny", "version": "0.1.0", - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.10", - "@types/dom-webcodecs": "^0.1.13" + "@types/dom-mediacapture-transform": "^0.1.11", + "@types/dom-webcodecs": "^0.1.15" }, "devDependencies": { "@eslint/js": "^9.22.0", @@ -32,7 +32,12 @@ "typescript-eslint": "^8.26.1", "vite": "^6.3.5", "vitepress": "^1.6.3", + "vitepress-plugin-llms": "^1.5.1", "vitepress-plugin-mermaid": "^2.0.17" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" } }, "node_modules/@algolia/autocomplete-core": { @@ -1196,6 +1201,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -2409,18 +2437,30 @@ "@types/d3-selection": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.10.tgz", - "integrity": "sha512-zUxMN2iShu7p3Fz5sqfvLp93qW/3sLs+RwXWWOkMb969hsuoVqUUokqrENjXqTMNmEEcVXKoHuMMbIGcWyrVVA==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.11.tgz", + "integrity": "sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==", + "license": "MIT", "dependencies": { "@types/dom-webcodecs": "*" } }, "node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==" + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.15.tgz", + "integrity": "sha512-omOlCPvTWyPm4ZE5bZUhlSvnHM2ZWM2U+1cPiYFL/e8aV5O9MouELp+L4dMKNTON0nTeHqEg+KWDfFQMY5Wkaw==", + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.6", @@ -2495,6 +2535,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.13.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", @@ -3122,6 +3169,16 @@ "node": ">=6" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3147,6 +3204,17 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3192,6 +3260,24 @@ "node": ">=8" } }, + "node_modules/byte-size": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-9.0.1.tgz", + "integrity": "sha512-YLe9x3rabBrcI0cueCdLS2l5ONUKywcRpTs02B8KP9/Cimhj7o3ZccGrPnRvcbyHMbb7W79/3MUJl7iGgTXKEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + }, + "peerDependencies": { + "@75lb/nature": "latest" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3241,6 +3327,17 @@ "node": ">=8" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", @@ -3336,6 +3433,21 @@ "node": ">=18" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3991,6 +4103,20 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4113,6 +4239,13 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex-xs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", @@ -4188,6 +4321,16 @@ "@esbuild/win32-x64": "0.25.1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-goat": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", @@ -4362,6 +4505,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -4418,6 +4575,26 @@ "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4476,6 +4653,20 @@ "reusify": "^1.0.4" } }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -4546,6 +4737,15 @@ "tabbable": "^6.2.0" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/fs-extra": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", @@ -4585,6 +4785,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-tsconfig": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", @@ -4637,6 +4847,36 @@ "dev": true, "license": "MIT" }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/hachure-fill": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", @@ -4829,6 +5069,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4838,6 +5088,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4860,6 +5120,19 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", @@ -5007,6 +5280,16 @@ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", "dev": true }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", @@ -5337,6 +5620,17 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5384,6 +5678,16 @@ "mathjax-full": "^3.2.0" } }, + "node_modules/markdown-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-title/-/markdown-title-1.0.2.tgz", + "integrity": "sha512-MqIQVVkz+uGEHi3TsHx/czcxxCbRIL7sv5K5DnYw/tI+apY54IbPefV/cmgxp6LoJSEx/TqcHdLs/298afG5QQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/marked": { "version": "15.0.8", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.8.tgz", @@ -5408,6 +5712,78 @@ "speech-rule-engine": "^4.0.6" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-hast": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", @@ -5430,6 +5806,42 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mensch": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", @@ -5480,6 +5892,206 @@ "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==", "dev": true }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", @@ -5501,6 +6113,112 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, "node_modules/micromark-util-encode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", @@ -5518,6 +6236,63 @@ ], "license": "MIT" }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", @@ -5540,6 +6315,29 @@ "micromark-util-symbol": "^2.0.0" } }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", @@ -5588,6 +6386,19 @@ "node": ">=8.6" } }, + "node_modules/millify": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/millify/-/millify-6.1.0.tgz", + "integrity": "sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "yargs": "^17.0.1" + }, + "bin": { + "millify": "bin/millify" + } + }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -5896,6 +6707,16 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -6089,6 +6910,83 @@ "dev": true, "license": "MIT" }, + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6256,6 +7154,20 @@ "license": "MIT", "peer": true }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -6399,6 +7311,21 @@ "node": ">=0.6.19" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -6414,6 +7341,29 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6589,6 +7539,13 @@ "node": ">=8.0" } }, + "node_modules/tokenx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tokenx/-/tokenx-1.1.0.tgz", + "integrity": "sha512-KCjtiC2niPwTSuz4ktM82Ki5bjqBwYpssiHDsGr5BpejN/B3ksacRvrsdoxljdMIh2nCX78alnDkeemBmYUmTA==", + "dev": true, + "license": "MIT" + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -6606,6 +7563,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", @@ -6716,6 +7684,26 @@ "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -6744,6 +7732,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-remove": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-4.0.0.tgz", + "integrity": "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -7005,6 +8009,46 @@ } } }, + "node_modules/vitepress-plugin-llms": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/vitepress-plugin-llms/-/vitepress-plugin-llms-1.5.1.tgz", + "integrity": "sha512-dEofHjDDiudwFZCvU6MxmKe9HV6KeBvA9Mz9gnZAYTSwg7AVr6PRreURQRYAvCAxzLEgaJ1WRef/OwtNqvNOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "byte-size": "^9.0.1", + "gray-matter": "^4.0.3", + "markdown-title": "^1.0.2", + "millify": "^6.1.0", + "minimatch": "^10.0.1", + "path-to-regexp": "^8.2.0", + "picocolors": "^1.1.1", + "remark": "^15.0.1", + "remark-frontmatter": "^5.0.0", + "tokenx": "^1.0.0", + "unist-util-remove": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "url": "https://github.com/okineadev/vitepress-plugin-llms?sponsor=1" + } + }, + "node_modules/vitepress-plugin-llms/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/vitepress-plugin-mermaid": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/vitepress-plugin-mermaid/-/vitepress-plugin-mermaid-2.0.17.tgz", @@ -7681,6 +8725,24 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/xmldom-sre": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", @@ -7690,6 +8752,16 @@ "node": ">=0.1" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -7697,6 +8769,35 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 519a910..66031b4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "mediabunny", - "version": "0.1.0", - "description": "TODO", + "author": "Vanilagy", + "version": "1.0.0", + "description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.", "type": "module", "main": "./dist/mediabunny.js", "module": "./dist/mediabunny.mjs", @@ -29,11 +30,22 @@ "dev": "vite", "examples:build": "vite build" }, - "author": "Vanilagy", "license": "MPL-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/Vanilagy/mediabunny.git" + }, + "bugs": { + "url": "https://github.com/Vanilagy/mediabunny/issues" + }, + "homepage": "https://mediabunny.dev/", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" + }, "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.10", - "@types/dom-webcodecs": "^0.1.13" + "@types/dom-mediacapture-transform": "^0.1.11", + "@types/dom-webcodecs": "^0.1.15" }, "devDependencies": { "@eslint/js": "^9.22.0", @@ -55,6 +67,30 @@ "typescript-eslint": "^8.26.1", "vite": "^6.3.5", "vitepress": "^1.6.3", + "vitepress-plugin-llms": "^1.5.1", "vitepress-plugin-mermaid": "^2.0.17" - } + }, + "keywords": [ + "media", + "parsing", + "reading", + "writing", + "muxer", + "demuxer", + "multiplexer", + "demultiplxer", + "encoder", + "decoder", + "convert", + "mp4", + "fmp4", + "webm", + "wav", + "mp3", + "ogg", + "video", + "audio", + "subtitles", + "webcodecs" + ] } diff --git a/src/tsconfig.json b/src/tsconfig.json index bc6694d..177f829 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -3,6 +3,8 @@ "compilerOptions": { "outDir": "../build", "declaration": true, + "sourceMap": true, + "declarationMap": true, "stripInternal": true, "noEmit": false }, diff --git a/todo.txt b/todo.txt deleted file mode 100644 index 8a689ef..0000000 --- a/todo.txt +++ /dev/null @@ -1,10 +0,0 @@ -- https://github.com/Vanilagy/mp4-muxer/issues/83 tell him it's possible now -- textsubtitlesource, chunked piping -- More efficient MP3 loading when reading sequentially -- Redo readers: I think better to have a single reader with ephemeral/non-ephemeral loading methods than to have multiple readers. This way, they can still share data. -- Readers: Does it make more sense to have `pos` handled outside? Otherwise it's ripe for async race conditions. - -For release: -- Write README -- Migration guides on old repos & deprecation -- llms.txt??? \ No newline at end of file