open-index/open-npm huggingface dataset:
npm package: @nowa/module-file
Description: the nowa file module
Author: Tommy Troy Lin
Latest version: 0.3.2

# nowa-module-file

## Module Config

```ts
export interface IBaseAction {
  type: 'copy' | 'move' | 'remove' | 'empty' | 'ensure';
  from: string;
}
export interface ISingleArgAction extends IBaseAction {
  type: 'remove' | 'empty' | 'ensure';
}
export interface IDoubleArgAction extends IBaseAction {
  type: 'copy' | 'move';
  to: string;
}
export type SingleAction = ISingleArgAction | IDoubleArgAction;

export type Config = ['file', SingleAction | SingleAction[]];
```

## Usage

```js
const config1 = ['file', { type: 'copy', from: './src/lib/', to: './dist/' }]; // copy files
const config2 = ['file', { type: 'copy', from: './src/lib/*.js', to: './dist/' }]; // support glob
const config3 = ['file', { type: 'empty', from: './build/' }]; // empty a folder
const config4 = ['file', { type: 'ensure', from: './build/assets/js/' }]; // ensure a path
const config5 = ['file', { type: 'move', from: './build/index.js', to: './build/entry.js' }]; // move (rename) a file
const config6 = ['file', [{ type: 'remove', from: './build/' }, { type: 'remove', from: './dist/' }]]; // multiple actions
```

## Actions

`module-file` provides 5 kinds of actions

* `copy` copy files or folders
* `move` move files or folders
* `remove` delete files or folders
* `empty` empty folders
* `ensure` ensure a path is valid, create any folder if needed

some actions can have `to` property.

## Action.from

`from` can be a normal path or path with glob patterns, `module-webpack` uses [globby](https://www.npmjs.com/package/globby) to resolve them;

relative paths will be treated from `project root` (actually `context` in `nowa2`).

## Action.to

`to` can only be used in action `copy` & `move`.

**Caution, If you want to specify a folder, always add a slash `/` to the end. Or it will be treaded as a file**

### Example

if you have a project with a file `file.js`

```
└── file.js
```

with config `{ type: 'copy', from: './file.js', to: './dist' }`, it will be

```
├── dist          ---- file, content same as file.js
└── file.js
```

with config `{ type: 'copy', from: './file.js', to: './dist/' }`, it will be

```
├── dist          ---- folder
│   └── file.js   ---- file
└── file.js
```
npm package: @nowa/module-script
Description: the nowa script module
Author: Tommy Troy Lin
Latest version: 0.3.2

# nowa-module-script

## Module Config

```ts
export type SingleScript = string | (() => void | Promise<void>);
export interface IOptions {
  // all default false
  parallel?: boolean;
  noWait?: boolean;
  noRetrigger?: boolean;
}
export type Config = ['script', SingleScript | SingleScript[], IOptions];
```

## Usage

```js
const config1 = ['script', 'echo start'];
const config2 = ['script', ['rm -rf dist', 'mkdir dist']]; // multiple scripts
const config3 = ['script', ['rm -rf dist', 'rm -rf build'], { parallel: true }]; // with options
// no guarantee on script running orders , but less time-consuming probably

// be careful, shell scripts are not cross-platform
// you'd better perform file system operations with @nowa/module-file

const config4 = [
  'script',
  () => {
    // js script
    console.log('done');
  },
];
```

## noWait noRetrigger

consider this workflow

1. script `start`: [`echo start`, `<some time-consuming script>`]
1. webpack watch
1. script `end`: [`echo end`]

the first-run output should be something like

1. 'start'
1. `<running time-consuming script>`
1. `<webpack related output>`
1. 'end'

and when you trigger a recompile (change source file), these are append to the output

1. `<webpack recompile output>`
1. 'end'

### noWait: true

with `noWait` option on `start` script, the first output should be

1. 'start' + `<running time-consuming script>` + `<webpack output>`
1. 'end'

the next module `module-webpack` won't wait for the script to finish

### noRetrigger: true

with `noRetrigger` option on `end` script the recompile output should be

1. `<webpack recompile output>`

no 'end' output since it won't `retrigger`