Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/sxzz/rolldown-string. A compatibility layer for magic-string to work with Rolldown and other bundle
Something went wrong. Try again.
2.2 kB · 97 lines
TypeScript
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798import { MagicString } from 'magic-string'import type { RolldownMagicString } from 'rolldown'
type ObjectIntersection<A, B> = { [K in keyof A & keyof B]: A[K]}export type RolldownString = ObjectIntersection< MagicString, RolldownMagicString>
export function rolldownString( code: string, id: string, meta?: any,): RolldownString { return meta?.magicString || new MagicString(code, { filename: id })}
type Awaitable<T> = T | Promise<T>export type HandlerReturn = | string | MagicString | RolldownMagicString | RolldownString | void | undefinedexport type Handler<Args extends any[], This> = ( this: This, s: RolldownString, id: string, ...args: Args) => Awaitable<HandlerReturn>
export function withMagicString<Args extends any[], This>( handler: Handler<Args, This>,): ( this: This, code: string, id: string, ...args: Args) => Awaitable<CodeTransform | undefined> { return function (this: This, code: string, id: string, ...args: Args) { const meta = args.at(-1) const s = rolldownString(code, id, meta) const res = handler.call(this, s, id, ...args) const callback = (res: HandlerReturn) => { if (typeof res === 'string') { return { code: res } } return generateTransform(res || s, id, !!res) }
if (res instanceof Promise) { return res.then(callback) } return callback(res) }}
/** * The result of code transformation. */export interface CodeTransform { code: any map?: any}
/** * Generate an object of code and source map from MagicString. */export function generateTransform( s: MagicString | RolldownMagicString | RolldownString | undefined, id: string, force?: boolean,): CodeTransform | undefined { if ( s && (s.constructor.name === 'BindingMagicString' || ('isRolldownMagicString' in s && s.isRolldownMagicString)) ) { return { code: s } }
if (s && (force || s.hasChanged())) { return { code: s.toString(), get map() { return (s as MagicString).generateMap({ source: id, includeContent: true, hires: 'boundary', }) }, } }}