presetter 3.1.1 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/run.js CHANGED
@@ -1,134 +1,66 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.run = run;
7
-
8
- var _execa = _interopRequireDefault(require("execa"));
9
-
10
- var _fsExtra = require("fs-extra");
11
-
12
- var _lodash = require("lodash");
13
-
14
- var _path = require("path");
15
-
16
- var _error = require("./error");
17
-
18
- var _package = require("./package");
19
-
20
- var _preset = require("./preset");
21
-
22
- var _scripts = require("./scripts");
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- /*
27
- * *** MIT LICENSE ***
28
- * -------------------------------------------------------------------------
29
- * This code may be modified and distributed under the MIT license.
30
- * See the LICENSE file for details.
31
- * -------------------------------------------------------------------------
32
- *
33
- * @summary Run a task
34
- *
35
- * @author Alvis HT Tang <alvis@hilbert.space>
36
- * @license MIT
37
- * @copyright Copyright (c) 2019 - All Rights Reserved.
38
- * -------------------------------------------------------------------------
39
- */
40
-
41
- /** manage ~package.json */
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.run = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const fs_extra_1 = require("fs-extra");
9
+ const lodash_1 = require("lodash");
10
+ const path_1 = require("path");
11
+ const error_1 = require("./error");
12
+ const package_1 = require("./package");
13
+ const preset_1 = require("./preset");
14
+ const scripts_1 = require("./scripts");
42
15
  class TemporaryPackageJSONManager {
43
- /**
44
- * create a temporary package.json manager
45
- * @param packageDetail the content of the target project's package.json
46
- */
47
- constructor(packageDetail) {
48
- this.package = void 0;
49
- this.path = void 0;
50
- this.shouldRestore = void 0;
51
- this.path = (0, _path.resolve)((0, _path.dirname)(packageDetail.path), '~' + (0, _path.basename)(packageDetail.path));
52
- this.package = packageDetail;
53
- this.shouldRestore = !(0, _fsExtra.pathExistsSync)(this.path);
54
- }
55
- /**
56
- * setup an environment for running a task with presetter
57
- * @param task name of the task to be replaced by the template
58
- */
59
-
60
-
61
- async replace(task) {
62
- // delete the current task to avoid duplicated task running
63
- delete this.package.json.scripts[task]; // get the merged script definitions
64
-
65
- const template = await (0, _preset.getScripts)(await (0, _preset.getContext)());
66
- this.package.json.scripts = (0, _scripts.composeScripts)({
67
- template,
68
- target: { ...this.package.json.scripts
69
- }
70
- }); // move the existing package.json to a safe place
71
-
72
- if (this.shouldRestore) {
73
- await (0, _error.wrap)((0, _fsExtra.move)(this.package.path, this.path), `failed to backup package.json`);
74
- } // generate a temporary package.json in order to let npm to see all the definitions
75
-
76
-
77
- const PADDING = 2;
78
- const content = JSON.stringify(this.package.json, null, PADDING);
79
- await (0, _error.wrap)((0, _fsExtra.writeFile)(this.package.path, content), 'failed to write to package.json');
80
- }
81
- /**
82
- * clean up the temporary artifacts
83
- */
84
-
85
-
86
- async restore() {
87
- if (this.shouldRestore) {
88
- await (0, _error.wrap)((0, _fsExtra.unlink)(this.package.path).then(async () => (0, _fsExtra.move)(this.path, this.package.path)), `failed to restore package.json`);
16
+ constructor(packageDetail) {
17
+ this.path = (0, path_1.resolve)((0, path_1.dirname)(packageDetail.path), '~' + (0, path_1.basename)(packageDetail.path));
18
+ this.package = packageDetail;
19
+ this.shouldRestore = !(0, fs_extra_1.pathExistsSync)(this.path);
20
+ }
21
+ async replace(task) {
22
+ delete this.package.json.scripts[task];
23
+ const template = await (0, preset_1.getScripts)();
24
+ this.package.json.scripts = (0, scripts_1.composeScripts)({
25
+ template,
26
+ target: Object.assign({}, this.package.json.scripts),
27
+ });
28
+ if (this.shouldRestore) {
29
+ await (0, error_1.wrap)((0, fs_extra_1.move)(this.package.path, this.path), `failed to backup package.json`);
30
+ }
31
+ const PADDING = 2;
32
+ const content = JSON.stringify(this.package.json, null, PADDING);
33
+ await (0, error_1.wrap)((0, fs_extra_1.writeFile)(this.package.path, content), 'failed to write to package.json');
34
+ }
35
+ async restore() {
36
+ if (this.shouldRestore) {
37
+ await (0, error_1.wrap)((0, fs_extra_1.unlink)(this.package.path).then(async () => (0, fs_extra_1.move)(this.path, this.package.path)), `failed to restore package.json`);
38
+ }
89
39
  }
90
- }
91
-
92
40
  }
93
- /**
94
- * run a task defined in the combined script definitions
95
- * @param task the name of the task to be run
96
- * @param argv parameters supplied for the task
97
- */
98
-
99
-
100
41
  async function run(task, argv = []) {
101
- // try to find the target project's package.json
102
- const packageDetail = await (0, _package.getPackage)();
103
- const manager = new TemporaryPackageJSONManager(packageDetail); // setup
104
-
105
- await manager.replace(task);
106
- const restore = (0, _lodash.once)(async isInterrupted => {
107
- // stop listening to SIGINT in order to avoid double handling during the restoration process
108
- process.removeListener('SIGINT', restore); // restore package.json
109
-
110
- await manager.restore();
111
-
112
- if (isInterrupted) {
113
- const SIGINT = 130;
114
- process.exit(SIGINT);
42
+ const packageDetail = await (0, package_1.getPackage)();
43
+ const manager = new TemporaryPackageJSONManager(packageDetail);
44
+ await manager.replace(task);
45
+ const restore = (0, lodash_1.once)(async (isInterrupted) => {
46
+ process.removeListener('SIGINT', restore);
47
+ await manager.restore();
48
+ if (isInterrupted) {
49
+ const SIGINT = 130;
50
+ process.exit(SIGINT);
51
+ }
52
+ });
53
+ process.on('SIGINT', restore.bind(run, true));
54
+ const { exitCode } = await (0, execa_1.default)('npm', ['run', task, '--', ...argv], {
55
+ cwd: (0, path_1.dirname)(packageDetail.path),
56
+ stdio: 'inherit',
57
+ reject: false,
58
+ shell: true,
59
+ });
60
+ await restore(false);
61
+ if (exitCode > 0) {
62
+ process.exit(exitCode);
115
63
  }
116
- });
117
- process.on('SIGINT', restore.bind(run, true)); // run the task
118
-
119
- const {
120
- exitCode
121
- } = await (0, _execa.default)('npm', ['run', task, '--', ...argv], {
122
- cwd: (0, _path.dirname)(packageDetail.path),
123
- stdio: 'inherit',
124
- reject: false,
125
- shell: true
126
- }); // restore package.json
127
-
128
- await restore(false); // set the exit code as the same as the returned
129
-
130
- if (exitCode > 0) {
131
- process.exit(exitCode);
132
- }
133
64
  }
134
- //# sourceMappingURL=run.js.map
65
+ exports.run = run;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFlQSxrREFBMEI7QUFDMUIsdUNBQW1FO0FBQ25FLG1DQUE4QjtBQUM5QiwrQkFBa0Q7QUFFbEQsbUNBQStCO0FBQy9CLHVDQUF1QztBQUN2QyxxQ0FBc0M7QUFDdEMsdUNBQTJDO0FBSzNDLE1BQU0sMkJBQTJCO0lBVS9CLFlBQVksYUFBc0I7UUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFBLGNBQU8sRUFDakIsSUFBQSxjQUFPLEVBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUMzQixHQUFHLEdBQUcsSUFBQSxlQUFRLEVBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQU1NLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBWTtRQUUvQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUd2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsbUJBQVUsR0FBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLHdCQUFjLEVBQUM7WUFDekMsUUFBUTtZQUNSLE1BQU0sb0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUM3QjtTQUNGLENBQUMsQ0FBQztRQUdILElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixNQUFNLElBQUEsWUFBSSxFQUNSLElBQUEsZUFBSSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDbEMsK0JBQStCLENBQ2hDLENBQUM7U0FDSDtRQUdELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUEsWUFBSSxFQUNSLElBQUEsb0JBQVMsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFDckMsaUNBQWlDLENBQ2xDLENBQUM7SUFDSixDQUFDO0lBS00sS0FBSyxDQUFDLE9BQU87UUFDbEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE1BQU0sSUFBQSxZQUFJLEVBQ1IsSUFBQSxpQkFBTSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQ3hDLElBQUEsZUFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FDbkMsRUFDRCxnQ0FBZ0MsQ0FDakMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztDQUNGO0FBT00sS0FBSyxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsT0FBaUIsRUFBRTtJQUV6RCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUEsb0JBQVUsR0FBRSxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQTJCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFHL0QsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUEsYUFBSSxFQUFDLEtBQUssRUFBRSxhQUFzQixFQUFpQixFQUFFO1FBRW5FLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRzFDLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXhCLElBQUksYUFBYSxFQUFFO1lBQ2pCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRzlDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUEsZUFBSyxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDcEUsR0FBRyxFQUFFLElBQUEsY0FBTyxFQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDaEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsTUFBTSxFQUFFLEtBQUs7UUFDYixLQUFLLEVBQUUsSUFBSTtLQUNaLENBQUMsQ0FBQztJQUdILE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBR3JCLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3hCO0FBQ0gsQ0FBQztBQXBDRCxrQkFvQ0MifQ==
package/lib/scripts.js CHANGED
@@ -1,138 +1,62 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.composeScripts = composeScripts;
7
-
8
- var _lodash = require("lodash");
9
-
10
- var _mvdanSh = require("mvdan-sh");
11
-
12
- var _path = require("path");
13
-
14
- /*
15
- * *** MIT LICENSE ***
16
- * -------------------------------------------------------------------------
17
- * This code may be modified and distributed under the MIT license.
18
- * See the LICENSE file for details.
19
- * -------------------------------------------------------------------------
20
- *
21
- * @summary Handle script merging
22
- *
23
- * @author Alvis HT Tang <alvis@hilbert.space>
24
- * @license MIT
25
- * @copyright Copyright (c) 2019 - All Rights Reserved.
26
- * -------------------------------------------------------------------------
27
- */
28
- // shell command parser
29
- const parser = _mvdanSh.syntax.NewParser(); // shell command generator
30
-
31
-
32
- const printer = _mvdanSh.syntax.NewPrinter();
33
- /** resource context to be passed for processing */
34
-
35
-
36
- /**
37
- * merge the script definitions from the template and the target package.json
38
- * @param args template and customised scripts to be merged
39
- * @param args.template scripts defined from the template
40
- * @param args.target scripts defined from target's package.json
41
- * @returns a dictionary of merged definitions
42
- */
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.composeScripts = void 0;
4
+ const lodash_1 = require("lodash");
5
+ const mvdan_sh_1 = require("mvdan-sh");
6
+ const path_1 = require("path");
7
+ const parser = mvdan_sh_1.syntax.NewParser();
8
+ const printer = mvdan_sh_1.syntax.NewPrinter();
43
9
  function composeScripts(args) {
44
- const {
45
- template,
46
- target
47
- } = args;
48
- return (0, _lodash.mapValues)({ ...template,
49
- ...target
50
- }, command => {
51
- try {
52
- // parse the shell command into its ast
53
- const ast = parser.Parse(command); // walk through the tree and replace any call to the runner e.g. preset task1 task2 -- --help
54
-
55
- _mvdanSh.syntax.Walk(ast, node => replaceRunnerNode(node, {
56
- template,
57
- target
58
- })); // remove any unnecessary subshell
59
-
60
-
61
- const [statement] = ast.Stmts;
62
-
63
- if (isNodeType(statement.Cmd, 'Subshell')) {
64
- statement.Cmd = statement.Cmd.Stmts[0].Cmd;
65
- } // generate the code from ast
66
-
67
-
68
- return printer.Print(ast).trim();
69
- } catch (error) {
70
- if (error instanceof Error) {
71
- throw error;
72
- } else {
73
- // parser.Parse may throw an empty object as an error, catch here
74
- throw new Error(`failed to parse command: ${command}`);
75
- }
76
- }
77
- });
10
+ const { template, target } = args;
11
+ return (0, lodash_1.mapValues)(Object.assign(Object.assign({}, template), target), (command) => {
12
+ try {
13
+ const ast = parser.Parse(command);
14
+ mvdan_sh_1.syntax.Walk(ast, (node) => replaceRunnerNode(node, { template, target }));
15
+ const [statement] = ast.Stmts;
16
+ if (isNodeType(statement.Cmd, 'Subshell')) {
17
+ statement.Cmd = statement.Cmd.Stmts[0].Cmd;
18
+ }
19
+ return printer.Print(ast).trim();
20
+ }
21
+ catch (error) {
22
+ if (error instanceof Error) {
23
+ throw error;
24
+ }
25
+ else {
26
+ throw new Error(`failed to parse command: ${command}`);
27
+ }
28
+ }
29
+ });
78
30
  }
79
- /**
80
- * typeguard helper for different node type
81
- * @param node a node to be tested
82
- * @param type node type
83
- * @returns true if the node is the specified type
84
- */
85
-
86
-
31
+ exports.composeScripts = composeScripts;
87
32
  function isNodeType(node, type) {
88
- return _mvdanSh.syntax.NodeType(node) === type;
33
+ return mvdan_sh_1.syntax.NodeType(node) === type;
89
34
  }
90
- /**
91
- * resolve a runner command
92
- * @param command the command to be replaced
93
- * @param context resource context
94
- * @returns the resolved command
95
- */
96
-
97
-
98
35
  function resolveRunner(command, context) {
99
- const parts = command.split(' '); // extract tasks and their arguments
100
-
101
- const destinations = parts.slice(1).filter(task => !task.startsWith('-'));
102
- const destinationArgs = parts.filter(part => part !== '--' && part.startsWith('-')); // resolve tasks into its full form e.g. task1 task2
103
-
104
- return destinations.map(destination => {
105
- const expandedCommand = context.template[destination] || (context.target[destination] === command ? undefined : context.target[destination]);
106
-
107
- if (expandedCommand === undefined) {
108
- throw new Error(`"${destination}" cannot be resolved in "${command}"`);
109
- }
110
-
111
- return [expandedCommand, ...destinationArgs].join(' ');
112
- }).join(' && ');
36
+ const parts = command.split(' ');
37
+ const destinations = parts.slice(1).filter((task) => !task.startsWith('-'));
38
+ const destinationArgs = parts.filter((part) => part !== '--' && part.startsWith('-'));
39
+ return destinations
40
+ .map((destination) => {
41
+ const expandedCommand = context.template[destination] ||
42
+ (context.target[destination] === command
43
+ ? undefined
44
+ : context.target[destination]);
45
+ if (expandedCommand === undefined) {
46
+ throw new Error(`"${destination}" cannot be resolved in "${command}"`);
47
+ }
48
+ return [expandedCommand, ...destinationArgs].join(' ');
49
+ })
50
+ .join(' && ');
113
51
  }
114
- /**
115
- * replace a runner node with the actual command
116
- * @param node an expression node
117
- * @param context resource context
118
- * @returns boolean true for no error
119
- */
120
-
121
-
122
52
  function replaceRunnerNode(node, context) {
123
- // replace only it's a runner call, not anything else
124
- if (isNodeType(node, 'Stmt') && isNodeType(node.Cmd, 'CallExpr')) {
125
- // parse assigned arguments e.g. task1 args --help
126
- const parts = node.Cmd.Args.map(part => part.Parts[0].Value); // only resolve if the `run` cli shipped in this package is invoke
127
-
128
- if ((0, _path.basename)(parts[0]) === 'run') {
129
- // resolve tasks into its full form e.g. task1 task2
130
- const resolvedCommand = resolveRunner(parts.join(' '), context); // replace the task definition with its expanded statement
131
-
132
- node.Cmd = parser.Parse(`(${resolvedCommand})`).Stmts[0].Cmd;
53
+ if (isNodeType(node, 'Stmt') && isNodeType(node.Cmd, 'CallExpr')) {
54
+ const parts = node.Cmd.Args.map((part) => part.Parts[0].Value);
55
+ if ((0, path_1.basename)(parts[0]) === 'run') {
56
+ const resolvedCommand = resolveRunner(parts.join(' '), context);
57
+ node.Cmd = parser.Parse(`(${resolvedCommand})`).Stmts[0].Cmd;
58
+ }
133
59
  }
134
- }
135
-
136
- return true;
60
+ return true;
137
61
  }
138
- //# sourceMappingURL=scripts.js.map
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9zY3JpcHRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLG1DQUFtQztBQUNuQyx1Q0FBa0M7QUFDbEMsK0JBQWdDO0FBY2hDLE1BQU0sTUFBTSxHQUFHLGlCQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFHbEMsTUFBTSxPQUFPLEdBQUcsaUJBQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQWlCcEMsU0FBZ0IsY0FBYyxDQUFDLElBSzlCO0lBQ0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFbEMsT0FBTyxJQUFBLGtCQUFTLGtDQUFNLFFBQVEsR0FBSyxNQUFNLEdBQUksQ0FBQyxPQUFPLEVBQVUsRUFBRTtRQUMvRCxJQUFJO1lBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUdsQyxpQkFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFHMUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDOUIsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtnQkFDekMsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7YUFDNUM7WUFHRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEM7UUFBQyxPQUFPLEtBQWMsRUFBRTtZQUN2QixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7Z0JBQzFCLE1B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
package/lib/template.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import type { IgnoreRule } from './types';
2
+ export declare type MergeMode = 'addition' | 'overwrite';
2
3
  export declare function filter<C extends Record<string, unknown>>(subject: C, ...ignores: IgnoreRule[]): C;
3
4
  export declare function filter(subject: unknown[], ...ignores: IgnoreRule[]): unknown[];
4
5
  export declare function isJSON(subject: unknown): subject is Record<string, any>;
5
- export declare function merge<Source extends Record<string, any> | unknown[]>(source: Source, replacement?: Record<string, any> | unknown[]): Source;
6
+ export declare function merge<S extends string | Record<string, any> | unknown[]>(source: S, replacement?: string | Record<string, any> | unknown[], options?: {
7
+ mode?: MergeMode;
8
+ }): S;
6
9
  export declare function template(content: string, parameter: Record<string, string>): string;
7
10
  export declare function template<Content extends Record<string, unknown> | unknown[]>(content: Content, parameter: Record<string, string>): Content;
8
11
  export declare function template(content: unknown, parameter: Record<string, string>): unknown;