3.5.1 • Published 1 year ago

@nuintun/bundler v3.5.1

Weekly downloads
4
License
MIT
Repository
github
Last release
1 year ago

bundler

An async file dependency bundle parser

NPM Version Download Status Node Version License

interface

interface ParsedMeta<T> {
  contents?: T;
  dependencies?: string[];
}

interface Parse<T> {
  (path: string): ParsedMeta<T> | void;
  (path: string): Promise<ParsedMeta<T> | void>;
}

interface OnCycle {
  (path: string, referrer: string): void | never;
}

interface Resolve {
  (src: string, referrer?: string): string;
  (src: string, referrer?: string): Promise<string>;
}

export interface File<T> {
  path: string;
  contents: T | null;
  dependencies: string[];
}

export interface Options<T> {
  parse: Parse<T>;
  resolve: Resolve;
  oncycle?: OnCycle;
}

export declare class Bundler<T> {
  constructor(options: Options<T>);
  /**
   * @public
   * @method parse
   * @param {string} input
   * @description Get the list of dependent files of input file.
   */
  parse(input: string): Promise<File<T>[]>;
}

API

new Bundler\<T>(options: Options) => Bundler\<T>

options?.oncycle: (path: string, referrer: string) => void

  • found circularly dependency callback function

options.resolve(path: string, referrer: string) => string

options.resolve(path: string, referrer: string) => Promise\<string>

  • path resolve function, support async function

options.parse(path: string) => { contents?: T, dependencies?: string[] }

options.parse(path: string) => Promise\<{ contents?: T, dependencies?: string[] }>

  • file dependencies parse function, support async function

new Bundler(options: Options).parse(input: string) => Promise\<File[]>

input: string

  • path of input file

Examples

import { Bundler } from '@nuintun/bundler';

const files = {
  '/src/1.js': { contents: 'file 1', dependencies: ['2.js', '4.js'] },
  '/src/2.js': { contents: 'file 2', dependencies: ['./3.js', './5.js'] },
  '/src/3.js': { contents: 'file 3', dependencies: ['/src/4.js', '/src/6.js'] },
  '/src/4.js': { contents: 'file 4', dependencies: ['5.js', './7.js'] },
  '/src/5.js': { contents: 'file 5', dependencies: ['6.js', '/src/8.js'] },
  '/src/6.js': { contents: 'file 6', dependencies: ['./7.js', '/src/9.js'] },
  '/src/7.js': { contents: 'file 7', dependencies: ['8.js'] },
  '/src/8.js': { contents: 'file 8', dependencies: ['./9.js'] },
  '/src/9.js': { contents: 'file 9', dependencies: [] }
};

const bunder = new Bundler({
  resolve(path, referrer) {
    if (/^\//.test(path)) return path;

    const dirname = referrer.replace(/\/[^\/]+$/, '');

    return `${dirname}/${path}`.replace(/(\.\/)+/g, '');
  },
  parse(path) {
    return new Promise(resolve => {
      const delay = 20;

      setTimeout(() => resolve(files[path]), delay);

      console.log(`Read: %o, Waiting: %oms`, path, delay);
    });
  }
});

async function parse(input) {
  try {
    console.log(await bunder.parse(input));
  } catch (error) {
    console.error(error);
  }
}

parse('/src/1.js');

// Output: [
//  {
//    path: '/src/9.js',
//    contents: 'file 9',
//    dependencies: []
//  },
//  {
//    path: '/src/8.js',
//    contents: 'file 8',
//    dependencies: ['./9.js']
//  },
//  {
//    path: '/src/7.js',
//    contents: 'file 7',
//    dependencies: ['8.js']
//  },
//  {
//    path: '/src/6.js',
//    contents: 'file 6',
//    dependencies: ['./7.js', '/src/9.js']
//  },
//  {
//    path: '/src/5.js',
//    contents: 'file 5',
//    dependencies: ['6.js', '/src/8.js']
//  },
//  {
//    path: '/src/4.js',
//    contents: 'file 4',
//    dependencies: ['5.js', './7.js']
//  },
//  {
//    path: '/src/3.js',
//    contents: 'file 3',
//    dependencies: ['/src/4.js', '/src/6.js']
//  },
//  {
//    path: '/src/2.js',
//    contents: 'file 2',
//    dependencies: ['./3.js', './5.js']
//  },
//  {
//    path: '/src/1.js',
//    contents: 'file 1',
//    dependencies: ['2.js', '4.js']
//  }
//]
4.0.5

8 months ago

4.0.4

9 months ago

4.0.1

12 months ago

4.0.0

12 months ago

4.0.3

10 months ago

4.0.2

12 months ago

3.5.2

1 year ago

3.5.1

1 year ago

3.5.0

1 year ago

3.4.0

1 year ago

3.3.1

1 year ago

3.3.0

4 years ago

3.2.0

4 years ago

3.0.2

4 years ago

3.0.1

4 years ago

3.0.0

6 years ago

2.0.1

6 years ago

2.0.0

6 years ago

1.0.3

6 years ago

1.0.2

7 years ago

1.0.1

7 years ago

1.0.0

7 years ago

0.3.9

7 years ago

0.3.8

7 years ago

0.3.7

7 years ago

0.3.6

7 years ago

0.3.5

7 years ago

0.3.4

7 years ago

0.3.3

8 years ago

0.3.2

8 years ago

0.3.1

8 years ago

0.3.0

8 years ago

0.2.3

8 years ago

0.2.2

8 years ago

0.2.1

8 years ago

0.2.0

8 years ago

0.1.2

8 years ago

0.1.1

8 years ago

0.1.0

8 years ago

0.0.9

8 years ago

0.0.8

8 years ago

0.0.7

8 years ago

0.0.6

8 years ago

0.0.5

8 years ago

0.0.4

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago

0.0.1

8 years ago