simple-file-templater 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- package/.DS_Store +0 -0
- package/.gitignore +38 -0
- package/LICENSE +0 -0
- package/dist/templater.d.ts +34 -0
- package/dist/templater.js +154 -0
- package/dist/templater.js.map +1 -0
- package/package.json +14 -3
- package/{templater.js → templater.ts} +47 -39
- package/tsconfig.json +32 -0
package/.DS_Store
ADDED
Binary file
|
package/.gitignore
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
2
|
+
|
3
|
+
# compiled output
|
4
|
+
/dist
|
5
|
+
tmp/
|
6
|
+
cache/
|
7
|
+
|
8
|
+
# dependencies
|
9
|
+
node_modules
|
10
|
+
|
11
|
+
# IDEs and editors
|
12
|
+
/.idea
|
13
|
+
.project
|
14
|
+
.classpath
|
15
|
+
*.launch
|
16
|
+
.settings/
|
17
|
+
|
18
|
+
# misc
|
19
|
+
/.sass-cache
|
20
|
+
/connect.lock
|
21
|
+
/coverage/*
|
22
|
+
/libpeerconnection.log
|
23
|
+
npm-debug.log
|
24
|
+
testem.log
|
25
|
+
/typings
|
26
|
+
tests/env.json
|
27
|
+
env.json
|
28
|
+
|
29
|
+
# e2e
|
30
|
+
/e2e/*.js
|
31
|
+
/e2e/*.map
|
32
|
+
|
33
|
+
#System Files
|
34
|
+
.DS_Store
|
35
|
+
Thumbs.db
|
36
|
+
|
37
|
+
#visual studio history
|
38
|
+
/.history
|
package/LICENSE
CHANGED
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/** Get the content of a folder and move it with option to replace in files or in fileNames as you go */
|
2
|
+
export declare function templater(
|
3
|
+
/** absolute url of template (it can be a folder) */
|
4
|
+
from: string,
|
5
|
+
/** absolute url of folder/file to be copied (it can be a folder) */
|
6
|
+
to: string,
|
7
|
+
/** list of variables to interpolates
|
8
|
+
* * {myVar : myReplacement}
|
9
|
+
* * OR [[/myRegExp/g, 'myString'], ['myString1', 'myString2']...]
|
10
|
+
* * DON'T forget the g flag when using regexps
|
11
|
+
*/
|
12
|
+
replaceInFiles?: any[],
|
13
|
+
/** same as above but for fileNames (only valid when copying folders) */
|
14
|
+
replaceInFileNames?: any[],
|
15
|
+
/** regexp array to check against path. Eg: /node_module/ <= file paths that includes the word node_module will not be taken in account */
|
16
|
+
ignorePaths?: any[]): string[];
|
17
|
+
/** Inject content into a file at specified place */
|
18
|
+
export declare function injector(
|
19
|
+
/** url of the file where the content will be injected */
|
20
|
+
filePath: string, data: string,
|
21
|
+
/** Number == lineNumber || RegExp == will replace the first matching group || String == will place content after the string
|
22
|
+
* NOTE: don't forget **the g flag** for regexp if you want to match all occurences
|
23
|
+
*/
|
24
|
+
after: number | string | RegExp): boolean;
|
25
|
+
/** Turns a file content into a list of lines */
|
26
|
+
export declare function fileToLines(
|
27
|
+
/** absolute path of file */
|
28
|
+
filePath: string,
|
29
|
+
/** get only lines from the first matching group */
|
30
|
+
regexp: any,
|
31
|
+
/** still count as a line; avoid conflicting with regexp, for ex if regexp match all inside \(.*\), and a comment with "// 1] blah" is found is in the middle */
|
32
|
+
ignoreInlineComments?: boolean,
|
33
|
+
/** Will trime each line */
|
34
|
+
trim?: boolean): [lineNumber: number, content: string][];
|
@@ -0,0 +1,154 @@
|
|
1
|
+
"use strict";
|
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.fileToLines = exports.injector = exports.templater = void 0;
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
8
|
+
const path_1 = __importDefault(require("path"));
|
9
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
10
|
+
/** Get the content of a folder and move it with option to replace in files or in fileNames as you go */
|
11
|
+
function templater(
|
12
|
+
/** absolute url of template (it can be a folder) */
|
13
|
+
from,
|
14
|
+
/** absolute url of folder/file to be copied (it can be a folder) */
|
15
|
+
to,
|
16
|
+
/** list of variables to interpolates
|
17
|
+
* * {myVar : myReplacement}
|
18
|
+
* * OR [[/myRegExp/g, 'myString'], ['myString1', 'myString2']...]
|
19
|
+
* * DON'T forget the g flag when using regexps
|
20
|
+
*/
|
21
|
+
replaceInFiles = [],
|
22
|
+
/** same as above but for fileNames (only valid when copying folders) */
|
23
|
+
replaceInFileNames = [],
|
24
|
+
/** regexp array to check against path. Eg: /node_module/ <= file paths that includes the word node_module will not be taken in account */
|
25
|
+
ignorePaths = []) {
|
26
|
+
try {
|
27
|
+
err500IfNotSet({ from, to, varz: replaceInFiles });
|
28
|
+
// convert all replacement data to array [ [regExpToReplace, replacer], ... ]
|
29
|
+
if (isObject(replaceInFiles))
|
30
|
+
replaceInFiles = Object.entries(replaceInFiles);
|
31
|
+
replaceInFiles.forEach(([toReplace, replacer], i, arr) => toReplace instanceof RegExp || (arr[i] = [new RegExp(toReplace, 'g'), replacer]));
|
32
|
+
if (isObject(replaceInFileNames))
|
33
|
+
replaceInFileNames = Object.entries(replaceInFileNames);
|
34
|
+
replaceInFileNames.forEach(([toReplace, replacer], i, arr) => toReplace instanceof RegExp || (arr[i] = [new RegExp(toReplace, 'g'), replacer]));
|
35
|
+
const createdPath = [];
|
36
|
+
let files = [from];
|
37
|
+
const templateIsDirectory = fs_extra_1.default.statSync(from).isDirectory();
|
38
|
+
// get directory structure
|
39
|
+
if (templateIsDirectory) {
|
40
|
+
if (fs_extra_1.default.existsSync(to) && !fs_extra_1.default.statSync(to).isDirectory())
|
41
|
+
throw '"from" argument is a directory but "to" arg is a file';
|
42
|
+
files = fast_glob_1.default.sync(`${from}/**/*`, { dot: true });
|
43
|
+
}
|
44
|
+
else if (fs_extra_1.default.existsSync(to) && fs_extra_1.default.statSync(to).isDirectory())
|
45
|
+
throw '"to" argument is a directory but "from" arg is a file';
|
46
|
+
for (const fileFullPath of files) {
|
47
|
+
if (ignorePaths.some(reg => reg.test(fileFullPath)))
|
48
|
+
continue;
|
49
|
+
let newFileFullPath = to;
|
50
|
+
if (templateIsDirectory) {
|
51
|
+
const [, filePath, fileName] = fileFullPath.match(/(.*)\/(.*)$/) || [];
|
52
|
+
const newFilePath = filePath.replace(from, to);
|
53
|
+
const newFileName = replaceInFileNames.reduce((str, [toReplace, replacer]) => str.replace(toReplace, replacer), fileName);
|
54
|
+
newFileFullPath = path_1.default.join(newFilePath, newFileName);
|
55
|
+
}
|
56
|
+
const oldFileContent = fs_extra_1.default.readFileSync(fileFullPath, 'utf-8');
|
57
|
+
const newFileContent = replaceInFiles.reduce((str, [toReplace, replacer]) => str.replace(toReplace, replacer), oldFileContent);
|
58
|
+
fs_extra_1.default.outputFileSync(newFileFullPath, newFileContent);
|
59
|
+
createdPath.push(newFileFullPath);
|
60
|
+
}
|
61
|
+
return createdPath;
|
62
|
+
}
|
63
|
+
catch (err) {
|
64
|
+
console.error(err);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
exports.templater = templater;
|
68
|
+
/** Inject content into a file at specified place */
|
69
|
+
function injector(
|
70
|
+
/** url of the file where the content will be injected */
|
71
|
+
filePath, data,
|
72
|
+
/** Number == lineNumber || RegExp == will replace the first matching group || String == will place content after the string
|
73
|
+
* NOTE: don't forget **the g flag** for regexp if you want to match all occurences
|
74
|
+
*/
|
75
|
+
after) {
|
76
|
+
try {
|
77
|
+
err500IfNotSet({ filePath, data, after });
|
78
|
+
if (!fs_extra_1.default.existsSync(filePath))
|
79
|
+
throw 'file for injection do not exist';
|
80
|
+
const fileContent = fs_extra_1.default.readFileSync(filePath, 'utf-8');
|
81
|
+
let newFileContent;
|
82
|
+
if (after instanceof RegExp) {
|
83
|
+
newFileContent = fileContent.replace(after, (f, m1) => f.replace(m1, data));
|
84
|
+
}
|
85
|
+
else if (typeof after === 'number') {
|
86
|
+
newFileContent = fileContent.split('\n');
|
87
|
+
newFileContent.splice(after, 0, data);
|
88
|
+
newFileContent = newFileContent.join('\n');
|
89
|
+
}
|
90
|
+
else if (typeof after === 'string') {
|
91
|
+
newFileContent = fileContent.split(after).join(after + data);
|
92
|
+
}
|
93
|
+
else
|
94
|
+
throw 'Wrong type for after argument';
|
95
|
+
fs_extra_1.default.writeFileSync(filePath, newFileContent);
|
96
|
+
return true;
|
97
|
+
}
|
98
|
+
catch (err) {
|
99
|
+
console.error(err);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
exports.injector = injector;
|
103
|
+
/** Turns a file content into a list of lines */
|
104
|
+
function fileToLines(
|
105
|
+
/** absolute path of file */
|
106
|
+
filePath,
|
107
|
+
/** get only lines from the first matching group */
|
108
|
+
regexp,
|
109
|
+
/** still count as a line; avoid conflicting with regexp, for ex if regexp match all inside \(.*\), and a comment with "// 1] blah" is found is in the middle */
|
110
|
+
ignoreInlineComments = true,
|
111
|
+
/** Will trime each line */
|
112
|
+
trim = true) {
|
113
|
+
try {
|
114
|
+
err500IfNotSet({ filePath });
|
115
|
+
if (!fs_extra_1.default.existsSync(filePath))
|
116
|
+
throw 'file for injection do not exist';
|
117
|
+
let fileContent = fs_extra_1.default.readFileSync(filePath, 'utf-8');
|
118
|
+
if (ignoreInlineComments)
|
119
|
+
fileContent = fileContent.replace(/\/\/.*/g, '<$COMMENT$>');
|
120
|
+
let lines, lineBegin = 0;
|
121
|
+
if (isset(regexp) && regexp instanceof RegExp) {
|
122
|
+
fileContent.replace(regexp, (f, m1, index, chain) => {
|
123
|
+
const linesBefore = chain.substring(0, index).split('\n');
|
124
|
+
lineBegin = linesBefore.length;
|
125
|
+
lines = m1.split('\n');
|
126
|
+
});
|
127
|
+
if (!isset(lines))
|
128
|
+
throw `regexp doesn't match the subject string`;
|
129
|
+
}
|
130
|
+
else {
|
131
|
+
lines = fileContent.split('\n');
|
132
|
+
}
|
133
|
+
if (lines[0] === '')
|
134
|
+
lines[0] = 'First line';
|
135
|
+
return lines
|
136
|
+
.map((lineContent, i) => [lineBegin + i, trim ? lineContent.trim() : lineContent])
|
137
|
+
.filter(([, content]) => content && !content.includes('<$COMMENT$>'));
|
138
|
+
}
|
139
|
+
catch (err) {
|
140
|
+
console.error(err);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
exports.fileToLines = fileToLines;
|
144
|
+
function isset(...elms) {
|
145
|
+
return elms.every(elm => typeof elm !== 'undefined' && elm !== null);
|
146
|
+
}
|
147
|
+
function isObject(obj) { return isset(obj) && typeof obj === 'object' && Object.getPrototypeOf(obj) === Object.prototype; }
|
148
|
+
function err500IfNotSet(objectWithVarDescription) {
|
149
|
+
Object.entries(objectWithVarDescription).forEach(([name, value], i) => {
|
150
|
+
if (!isset(value))
|
151
|
+
throw new Error(`Param number ${i} (${name}) is not set in templater function.`);
|
152
|
+
});
|
153
|
+
}
|
154
|
+
//# sourceMappingURL=templater.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"templater.js","sourceRoot":"","sources":["../templater.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
{
|
2
2
|
"name": "simple-file-templater",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.3",
|
4
4
|
"description": "Simple templating system for file. Pattern replacer, file name replacer...",
|
5
|
-
"main": "templater.js",
|
5
|
+
"main": "./dist/templater.js",
|
6
6
|
"scripts": {
|
7
|
+
"build": "tsc",
|
7
8
|
"bump:major": "node node_modules/bump-simple/bump-simple.js --major",
|
8
9
|
"bump:minor": "node node_modules/bump-simple/bump-simple.js --minor",
|
9
10
|
"bump:patch": "node node_modules/bump-simple/bump-simple.js --patch"
|
@@ -23,6 +24,16 @@
|
|
23
24
|
"fs-extra": "^8.1.0"
|
24
25
|
},
|
25
26
|
"devDependencies": {
|
27
|
+
"@types/node": "^22.10.1",
|
26
28
|
"bump-simple": "^1.0.0"
|
27
|
-
}
|
29
|
+
},
|
30
|
+
"publishConfig": {
|
31
|
+
"access": "public"
|
32
|
+
},
|
33
|
+
"files": [
|
34
|
+
"*.ts",
|
35
|
+
"model-types/*.ts",
|
36
|
+
"constants/*.ts",
|
37
|
+
"*"
|
38
|
+
]
|
28
39
|
}
|
@@ -1,25 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
*
|
14
|
-
*
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
1
|
+
import fs from 'fs-extra'
|
2
|
+
import path from 'path'
|
3
|
+
import fg from 'fast-glob'
|
4
|
+
|
5
|
+
|
6
|
+
/** Get the content of a folder and move it with option to replace in files or in fileNames as you go */
|
7
|
+
export function templater(
|
8
|
+
/** absolute url of template (it can be a folder) */
|
9
|
+
from: string,
|
10
|
+
/** absolute url of folder/file to be copied (it can be a folder) */
|
11
|
+
to: string,
|
12
|
+
/** list of variables to interpolates
|
13
|
+
* * {myVar : myReplacement}
|
14
|
+
* * OR [[/myRegExp/g, 'myString'], ['myString1', 'myString2']...]
|
15
|
+
* * DON'T forget the g flag when using regexps
|
16
|
+
*/
|
17
|
+
replaceInFiles = [],
|
18
|
+
/** same as above but for fileNames (only valid when copying folders) */
|
19
|
+
replaceInFileNames = [],
|
20
|
+
/** regexp array to check against path. Eg: /node_module/ <= file paths that includes the word node_module will not be taken in account */
|
21
|
+
ignorePaths = []
|
22
|
+
) {
|
23
23
|
try {
|
24
24
|
err500IfNotSet({ from, to, varz: replaceInFiles })
|
25
25
|
|
@@ -29,8 +29,9 @@ function templater(from, to, replaceInFiles = [], replaceInFileNames = [], ignor
|
|
29
29
|
if (isObject(replaceInFileNames)) replaceInFileNames = Object.entries(replaceInFileNames);
|
30
30
|
replaceInFileNames.forEach(([toReplace, replacer], i, arr) => toReplace instanceof RegExp || (arr[i] = [new RegExp(toReplace, 'g'), replacer]));
|
31
31
|
|
32
|
-
const createdPath = []
|
33
|
-
|
32
|
+
const createdPath = [] as string[]
|
33
|
+
|
34
|
+
let files = [from]
|
34
35
|
const templateIsDirectory = fs.statSync(from).isDirectory();
|
35
36
|
// get directory structure
|
36
37
|
if (templateIsDirectory) {
|
@@ -55,17 +56,20 @@ function templater(from, to, replaceInFiles = [], replaceInFileNames = [], ignor
|
|
55
56
|
createdPath.push(newFileFullPath);
|
56
57
|
}
|
57
58
|
|
58
|
-
return createdPath
|
59
|
+
return createdPath
|
59
60
|
} catch (err) { console.error(err); }
|
60
61
|
}
|
61
62
|
|
62
|
-
/** Inject content into a file at specified place
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
63
|
+
/** Inject content into a file at specified place */
|
64
|
+
export function injector(
|
65
|
+
/** url of the file where the content will be injected */
|
66
|
+
filePath: string,
|
67
|
+
data: string,
|
68
|
+
/** Number == lineNumber || RegExp == will replace the first matching group || String == will place content after the string
|
69
|
+
* NOTE: don't forget **the g flag** for regexp if you want to match all occurences
|
70
|
+
*/
|
71
|
+
after: number | string | RegExp
|
72
|
+
) {
|
69
73
|
try {
|
70
74
|
err500IfNotSet({ filePath, data, after });
|
71
75
|
if (!fs.existsSync(filePath)) throw 'file for injection do not exist';
|
@@ -89,13 +93,17 @@ function injector(filePath, data, after) {
|
|
89
93
|
} catch (err) { console.error(err); }
|
90
94
|
}
|
91
95
|
|
92
|
-
/** Turns a file content into a list of lines
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
/** Turns a file content into a list of lines */
|
97
|
+
export function fileToLines(
|
98
|
+
/** absolute path of file */
|
99
|
+
filePath: string,
|
100
|
+
/** get only lines from the first matching group */
|
101
|
+
regexp,
|
102
|
+
/** still count as a line; avoid conflicting with regexp, for ex if regexp match all inside \(.*\), and a comment with "// 1] blah" is found is in the middle */
|
103
|
+
ignoreInlineComments = true,
|
104
|
+
/** Will trime each line */
|
105
|
+
trim = true
|
106
|
+
): [lineNumber: number, content: string][] {
|
99
107
|
try {
|
100
108
|
err500IfNotSet({ filePath });
|
101
109
|
if (!fs.existsSync(filePath)) throw 'file for injection do not exist';
|
package/tsconfig.json
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
{
|
2
|
+
"compilerOptions": {
|
3
|
+
"target": "ES2021",
|
4
|
+
"module": "CommonJS",
|
5
|
+
"lib": [
|
6
|
+
"es2021"
|
7
|
+
],
|
8
|
+
"esModuleInterop": true,
|
9
|
+
"allowSyntheticDefaultImports": true,
|
10
|
+
"allowJs": false,
|
11
|
+
"skipLibCheck": true,
|
12
|
+
"resolveJsonModule": true,
|
13
|
+
"noImplicitAny": false,
|
14
|
+
"noImplicitThis": true,
|
15
|
+
"declaration": true,
|
16
|
+
"moduleResolution": "node",
|
17
|
+
"sourceMap": true,
|
18
|
+
"outDir": "dist",
|
19
|
+
// "baseUrl": "./",
|
20
|
+
"paths": {
|
21
|
+
"*": [
|
22
|
+
"./node_modules/*"
|
23
|
+
],
|
24
|
+
"src/*": [
|
25
|
+
"./src/*"
|
26
|
+
]
|
27
|
+
},
|
28
|
+
"types": [
|
29
|
+
"node"
|
30
|
+
]
|
31
|
+
},
|
32
|
+
}
|