Code Monkey home page Code Monkey logo

magic-string-rs's Introduction


magic-string-rs

CI crates NPM version

MagicString port for Node and modern browsers, also, for rust, of course.


🔧 Installation

Rust

Add it as a dependency in a Cargo project.

# Cargo.toml

[dependency]
magic_string = "x.x.x"

Node

$ npm install @napi-rs/magic-string

Note: Web-Assembly is currently not supported, but it's on the plan.

Performance

Hardware info

Model Name:	MacBook Pro
Model Identifier:	MacBookPro17,1
Chip:	Apple M1
Total Number of Cores:	8 (4 performance and 4 efficiency)
Memory:	16 GB

Benchmark

Running "overwrite" suite...
Progress: 100%

  MagicString:
    238 584 ops/s, ±0.34%   | slowest, 50.7% slower

  MagicStringRust:
    483 950 ops/s, ±2.13%   | fastest

Finished 2 cases!
  Fastest: MagicStringRust
  Slowest: MagicString

Running "prepend|append" suite...
Progress: 100%

  MagicString:
    290 244 ops/s, ±1.35%   | slowest, 48.35% slower

  MagicStringRust:
    561 981 ops/s, ±6.71%   | fastest

Finished 2 cases!
  Fastest: MagicStringRust
  Slowest: MagicString

Running "add banner#toString" suite...
Progress: 100%

  MagicString:
    301 467 ops/s, ±0.29%   | slowest, 37.66% slower

  MagicStringRust:
    483 586 ops/s, ±5.50%   | fastest

Finished 2 cases!
  Fastest: MagicStringRust
  Slowest: MagicString

Running "add banner#generateDecodedMap" suite...
Progress: 100%

  MagicString:
    233 702 ops/s, ±0.76%   | fastest

  MagicStringRust:
    229 899 ops/s, ±2.68%   | slowest, 1.63% slower

Finished 2 cases!
  Fastest: MagicString
  Slowest: MagicStringRust

Running "add banner#generateMapHires" suite...
Progress: 100%

  MagicString:
    177 783 ops/s, ±1.84%   | fastest

  MagicStringRust:
    90 780 ops/s, ±1.00%    | slowest, 48.94% slower

Finished 2 cases!
  Fastest: MagicString
  Slowest: MagicStringRust

Running "add banner#generateMap" suite...
Progress: 100%

  MagicString:
    227 594 ops/s, ±0.68%   | slowest, 0.42% slow
er

  MagicStringRust:
    228 545 ops/s, ±0.82%   | fastest

Finished 2 cases!
  Fastest: MagicStringRust
  Slowest: MagicString

Running "add banner#generateMap.toString" suite...
Progress: 100%

  MagicString:
    201 272 ops/s, ±0.47%   | slowest, 21.86% slower

  MagicStringRust:
    257 577 ops/s, ±2.38%   | fastest

Finished 2 cases!
  Fastest: MagicStringRust
  Slowest: MagicString

Running "add banner#generateMapHires.toString" suite...
Progress: 100%

  MagicString:
    157 685 ops/s, ±0.18%   | fastest

  MagicStringRust:
    95 510 ops/s, ±1.00%    | slowest, 39.43% slower

Finished 2 cases!
  Fastest: MagicString
  Slowest: MagicStringRust

Running "add banner#generateMap.toUrl" suite...
Progress: 100%

  MagicString:
    182 161 ops/s, ±0.65%   | slowest, 25.04% slower

  MagicStringRust:
    243 019 ops/s, ±0.98%   | fastest

Finished 2 cases!
  Fastest: MagicStringRust
  Slowest: MagicString

📃 Documentation

doc.rs

Supported APIs

  • generateMap: Note that there is a huge overhead for rust for implementing the same API in Node, for more detail please refer to this
  • generateDecodedMap
  • toString
  • prepend
  • append
  • prependLeft
  • prependRight
  • appendLeft
  • appendRight
  • overwrite
  • trim
  • trimStart
  • trimEnd
  • trimLines
  • isEmpty
  • remove
  • move
  • indent
  • addSourcemapLocation
  • clone
  • slice
  • snip

Credits

The original project magic-string is really awesome, you should check it out and we made this project even furthur for better performance.

License

MIT

magic-string-rs's People

Contributors

brooooooklyn avatar faga295 avatar h-a-n-a avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

magic-string-rs's Issues

Error: ENOENT: no such file or directory, open '/usr/bin/ldd'

this is on nixos linux, where there is no /usr/bin/ldd

the only FHS binaries in nixos are /usr/bin/env and /bin/sh

both files are symlinks

stat /usr/bin/env /bin/sh  | grep File

  File: /usr/bin/env -> /nix/store/xq4g38m5ppg78z7bzfxyy2s8ii693k74-coreutils-9.1/bin/env
  File: /bin/sh -> /nix/store/rcr0k2c7yl708k264k2jb9f6zdzglbz7-bash-interactive-5.1-p16/bin/sh

support for `.hasChanged`

I'm not sure if it's needed in this library, but .hasChanged in magic-string allows for an early return (skipping returning code and sourcemap) if nothing has changed, which is a significant performance optimisation in the vite pipelin.

see Rich-Harris/magic-string#202

Missing `Bundle` type

I tried to convert rollup to use magic-string-rs, but got the error:

Module '"@napi-rs/magic-string"' has no exported member 'Bundle'

Here's the type as provided by magic-string:

export class Bundle {
  constructor(options?: BundleOptions);
  addSource(source: MagicString | { filename?: string, content: MagicString }): Bundle;
  append(str: string, options?: BundleOptions): Bundle;
  clone(): Bundle;
  generateMap(options?: SourceMapOptions): SourceMap;
  generateDecodedMap(options?: SourceMapOptions): DecodedSourceMap;
  getIndentString(): string;
  indent(indentStr?: string): Bundle;
  indentExclusionRanges: ExclusionRange | Array<ExclusionRange>;
  prepend(str: string): Bundle;
  toString(): string;
  trimLines(): Bundle;
  trim(charType?: string): Bundle;
  trimStart(charType?: string): Bundle;
  trimEnd(charType?: string): Bundle;
  isEmpty(): boolean;
  length(): number;
}

Benchmarks?

It would be really interesting to see the difference in speed between the standard magic-string and this rust-based implementation.

`generateMap` doc clarification

The readme says:

generateMap: Note that there is a huge overhead for rust for implementing the same API in Node, for more detail please refer to this

If I follow the "this" link, I'm just taken to a type definition file. I'm not sure how it explains what overhead might exist. Is that the correct link or perhaps I'm missing something?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.