Skip to content
On this page

Mario API

Mario is simple manipulate system based on gulp, has similar syntax like github workflow.

Create a generator

Create a empty generator.yaml file, add the following codes. This generator will add ci:version script into package.json.

jobs:
  Setup Pkg:
    paths: package.json
    name: Setup Pkg
    steps:
      - name: Add CI Scripts
        uses: json-editor
        with:
          pairs:
            - path: "scripts.ci:version"
              value: "pnpm changeset version"

Feel free to add more steps after Add CI Scripts, or more jobs Setup Pkg. mario will run jobs and steps sequential.

You can also publish it as a npm package, create you first preset with command create in follow steps:

Use @aiou/mario-template as template:

neo create @aiou/mario-template my-mario-app

A empty preset project structure is probably like this:

.
├── CHANGELOG.md
├── README.md
├── index.yaml
└── package.json

If mario run with neo, neo will try to resolve generator definition from main field, please make sure setup index.yaml at package.json main field:

{
  "main": "index.yaml"
}

Built in Actions

mario built in some useful actions. Action receive params from property with.

Action - json-editor

Edit json content with key-value pairs.

Options:

content

Modify json content with key-value pairs.

Example:

jobs:
  Setup Pkg:
    paths: package.json
    name: Setup Pkg
    steps:
      - name: Modify version
        uses: json-editor
        with:
          content:
            version: "1.0.0"

pairs

Batch modify json content deeply with property path. path value take . as sperator. e.g. scripts.ci:version mean script named ci:version in package scripts field.

Example:

jobs:
  Setup Pkg:
    paths: package.json
    name: Setup Pkg
    steps:
      - name: Add CI Scripts
        uses: json-editor
        with:
          pairs:
            - path: "scripts.ci:version"
              value: "pnpm changeset version"

Action - copy

Copy files or folder from source to destination.

Options:

output

Copy files matched by paths to output.

Example:

jobs:
  COPY:
    paths: "assets.ts"
    steps:
      - name: COPY
      - uses: copy
        with:
          output: output

Action - replace

Replace match with replacement.

Options:

match&replace

Replace match value with defined value in property replace.

Example:

jobs:
  REPLACE:
    paths: "output/**/*.ts"
    steps:
      - name: Replace Action
      - uses: replace
        with:
          match: one
          replacement: target

pairs

Batch replace match value with defined value in property replace.

Example:

jobs:
  REPLACE:
    paths: "output/**/*.ts"
    steps:
      - name: Replace Action
      - uses: replace
        with:
          pairs:
            - match: one
              replacement: target

clean

Remove files matched by paths. job.paths is required to filter valid files.

Options:

paths

Example:

jobs:
  CLEAN:
    paths: "*.ts"
    steps:
      - name: Clean Action
      - uses: clean
        with:
          paths:
            - "output/*"

Action - run

Exec shell command defined in steps.run.

quiet

Sient all message display during exec command.

Example:

jobs:
  RUN:
    paths: "output/*"
    steps:
      - name: Run Shell
        run: echo hello
        with:
          quiet: false

Common options

Job and step receive some common options.

job.paths

  • Type: string|undefined glob pattern is supported, e.g. templates/**

By default, will be all files under process.cwd(), auto ignore node_modules. If job specific paths but not match any files, will skip job.

steps.continue-on-error

  • Type: boolean continue or exit job if throw error.

By default, will exit if any error happen.

Variables

neo support access variable with $.

Default variable

Under neo context, mario generator will receive some global variables, useful to replace package basic info.

Example:

jobs:
  Replace template name:
    name: Replace outdated
    steps:
      - name: Replace org
      - uses: replace
        with:
          pairs:
            - match: spring-catponents
              replacement: ${{ inputs.user.name }}

inputs.user

  • Type: { name: string } current user github info

inputs.project

  • Type: string side project name

Used as a library

Currently it already published as a npm package. Checkout @aiou/mario for documentation about using it as a library.