xpm
Version:
The xPack project manager command line tool
219 lines (153 loc) • 6.21 kB
Markdown
[](https://github.com/xpack/xpm-liquid-ts/blob/mater/package.json)
[](https://github.com/xpack/xpm-liquid-ts/blob/xpack/LICENSE)
[](https://www.npmjs.com/package/@xpack/xpm-liquid/)
# A Node.js CommonJS/ES6 module with the Liquid substitutions code used by xpm & relatives
This project provides a **TypeScript** Node.js **CommonJS**/**ES6** module
with the code used to perform the Liquid substitutions when parsing
the xpm `package.json` file.
Note: Compatibility with legacy CommonJS is required until VS Code extensions
will be updated to import ES6 modules.
The project is open-source and hosted on GitHub as
[xpack/xpm-liquid-ts](https://github.com/xpack/xpm-liquid-ts.git).
## Maintainer & developer info
This page documents how to use this module in an user application.
For maintainer information, see the separate
[README-MAINTAINER](https://github.com/xpack/xpm-liquid-ts/blob/master/README-MAINTAINER.md)
page.
## Prerequisites
A recent [Node.js](https://nodejs.org) (>=16.0.0), since the TypeScript code
is compiled into ECMAScript 2020 code, and the tests use ES6 modules.
## Install
The module is available as
[`@xpack/xpm-liquid-ts`](https://www.npmjs.com/package/@xpack/xpm-liquid-ts)
from the public [`npmjs`](https://www.npmjs.com) repository;
it can be added as a dependency to any TypeScript or JavaScript
project with `npm install`:
```console
npm install --save @xpack/xpm-liquid-ts@latest
```
The module does not provide any executables, and generally there are no
reasons to install it globally.
## User info
This section is intended for those who want to use this module in their
own projects.
The `@xpack/xpm-liquid` module can be imported into both TypeScript
and JavaScript Node.js code.
In TypeScript and ECMAScript modules, use `import`:
```typescript
import { XpmLiquid } from '@xpack/xpm-liquid'
```
In JavaScript with CommonJS, use `require()`:
```javascript
const { XpmLiquid } = require('@xpack/xpm-liquid')
```
To use the `XpmLiquid` class, create an instance of the engine, provide the
`package.json` object, possibly the name of the configuration, and
call `performSubstitutions()`:
```js
const xpmLiquid = new XpmLiquid(log)
const xpmLiquidMap = xpmLiquid.prepareMap(packageJson, 'Debug')
const str = await xpmLiquid.performSubstitutions(
'{{ "build" | path_join: configuration.name | to_filename }}',
xpmLiquidMap)
```
### Available variables
The entire project `package.json` is available as the `package` variable:
- `package`
All user defined properties (project and configuration) are grouped
below the `properties` variable:
- `properties`
If the substitution refers to a certain build configuration, the configuration
name and the entire configuration content are available separately below
the `configuration` variable. Configuration properties are added to the
`properties` variables, possibly overriding project properties.
- `configuration.name`
- `configuration.*`
Variables based on the Node.js process
[environment](https://nodejs.org/dist/latest-v18.x/docs/api/process.html#process_process_env):
- `env`
Variables based on the Node.js
[os](https://nodejs.org/dist/latest-v16.x/docs/api/os.html) definitions:
- `os.EOL`
- `os.arch` (like 'arm', 'arm64', 'ia32', 'x64')
- `os.constants`
- `os.cpus`
- `os.endianness`
- `os.homedir`
- `os.hostname`
- `os.platform` (like 'darwin', 'linux', 'win32')
- `os.release`
- `os.tmpdir`
- `os.type`
- `os.version` (available since Node 12)
Variables based on the Node.js
[path](https://nodejs.org/dist/latest-v16.x/docs/api/path.html) definitions:
- `path.delimiter` (`;` for Windows, `:` for POSIX)
- `path.sep` (`\` on Windows, `/` on POSIX)
- `path.win32.delimiter` (`;`)
- `path.win32.sep` (`\`)
- `path.posix.delimiter` (`:`)
- `path.posix.sep` (`/`)
Examples:
- `"buildFolderRelativePath": "build{{ path.sep }}{{ configuration.name | to_filename }}"`
### Custom filters
Filters based on Node.js
[path](https://nodejs.org/dist/latest-v16.x/docs/api/path.html) functions:
- `path_basename`
- `path_dirname`
- `path_normalize`
- `path_join`
- `path_relative`
- `path_posix_basename`
- `path_posix_dirname`
- `path_posix_normalize`
- `path_posix_join`
- `path_posix_relative`
- `path_win32_basename`
- `path_win32_dirname`
- `path_win32_normalize`
- `path_win32_join`
- `path_win32_relative`
Filters based on Node.js
[utils](https://nodejs.org/dist/latest-v16.x/docs/api/util.html) functions:
- `util_format`
Custom filter to convert generic names to names accepted
as file names (letters, digits, dash):
- `to_filename`
- `to_posix_filename`
- `to_win32_filename`
Examples:
- `"buildFolderRelativePath": "{{ "build" | path_join: configuration.name | to_filename | downcase }"`
### Lenient if's
The undefined variables in tests do not trigger `undefined variable` messages
and allow to use defaults, like:
```
{{ env.OPTIMIZATION | default: '-O2' }}
```
### Reference
For more details on the available class definitions, including all methods,
accessors, properties, etc,
please see the TypeDoc
[reference pages](https://xpack.github.io/xpm-liquid-ts).
## Known problems
- none
## Status
The `@xpack/xpm-liquid-ts` module is fully functional and stable.
The main clients for this module is the `xpm` CLI application and the
[VS Code xPack C/C++ Managed Build](https://github.com/xpack/vscode-xpack-extension-ts/)
extension.
## Tests
The module is tested
with 100% coverage and CI tested on every push via GitHub
[Actions](https://github.com/xpack/xpm-liquid-ts/actions).
## Compatibility notices
According to [semver](https://semver.org) rules:
> Major version X (X.y.z | X > 0) MUST be incremented if any
backwards incompatible changes are introduced to the public API.
### v2.0.0
The project was updated to dual ESM & CJS.
## License
The original content is released under the
[MIT License](https://opensource.org/license/mit/),
with all rights reserved to
[Liviu Ionescu](https://github.com/ilg-ul).