@nzz/q-cli 1.7.0 → 1.8.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/README.md CHANGED
@@ -164,6 +164,24 @@ Q new-custom-code my-project-name
164
164
  Q new-custom-code my-project-name -d my-project-directory
165
165
  ```
166
166
 
167
+ ### Creating new ed-tech utility package project
168
+
169
+ Once `Q` cli is installed one can create the skeleton of a new ed-tech utility package project by executing
170
+
171
+ ```bash
172
+ Q new-et-utils-package package-name package-author package-description
173
+ ```
174
+
175
+ - The directory name where the new ed-tech utility package project is being created defaults to the project name and can be overwritten by using option `-d` or `--dir`
176
+
177
+ ```bash
178
+ Q new-et-utils-package package-name -d my-project-directory
179
+ ```
180
+
181
+ #### Notes
182
+
183
+ New utility package projects should only be created inside the [ed-tech-utilities](https://github.com/nzzdev/ed-tech-utilities) repository.
184
+
167
185
  ### Q item actions
168
186
 
169
187
  The `Q` cli can copy and/or update existing Q items.
@@ -2,11 +2,19 @@ const fs = require("fs-extra");
2
2
  const path = require("path");
3
3
  const replaceInFile = require("replace-in-file");
4
4
  const chalk = require("chalk");
5
+ const { replace } = require("nunjucks/src/filters");
5
6
  const errorColor = chalk.red;
6
7
  const successColor = chalk.green;
7
8
  const warningColor = chalk.yellow;
8
9
 
9
- module.exports = async function (type, name, basedir) {
10
+ /**
11
+ *
12
+ * @param {string} type - Skeleton type
13
+ * @param {string} name - Name of the project
14
+ * @param {string} basedir - Base directory name to be created
15
+ * @param {Array.<{regex: RegExp, replaceWith: string}>} textReplacements
16
+ */
17
+ module.exports = async function (type, basedir, textReplacements) {
10
18
  if (fs.existsSync(basedir)) {
11
19
  console.error(
12
20
  errorColor(`directory ${basedir} already exists or is not writable`)
@@ -16,34 +24,46 @@ module.exports = async function (type, name, basedir) {
16
24
  fs.mkdirSync(basedir);
17
25
  }
18
26
 
19
- const replaceOptions = {
20
- files: `${basedir}/**`,
21
- from: new RegExp(`${type}-skeleton`, "g"),
22
- to: name,
23
- glob: {
24
- dot: true, // Include file names starting with a dot
25
- },
26
- };
27
-
28
27
  try {
29
28
  await fs.copySync(
30
29
  path.join(__dirname, `../../skeletons/${type}-skeleton`),
31
30
  basedir
32
31
  );
33
- await replaceInFile(replaceOptions);
32
+
33
+ if (textReplacements) {
34
+ for (const txtRe of textReplacements) {
35
+ await replaceText(txtRe.regex, txtRe.replaceWith, basedir);
36
+ }
37
+ }
38
+
34
39
  console.log(successColor(`Q ${type} is now bootstrapped in ${basedir}`));
35
40
 
36
- if (type === "tool")
41
+ if (type === "tool" || type === "et-utils-package")
37
42
  console.log(
38
- warningColor("Search for 'TODO:' inside the new tool to get started!")
43
+ warningColor(
44
+ "Search for 'TODO' inside the new tool/package to get started!"
45
+ )
39
46
  );
40
47
  } catch (error) {
41
48
  console.error(
42
49
  errorColor(
43
- `An unexpected error occured. Please check the entered information and try again. ${JSON.stringify(
50
+ `An unexpected error occurred. Please check the entered information and try again. ${JSON.stringify(
44
51
  error
45
52
  )}`
46
53
  )
47
54
  );
48
55
  }
49
56
  };
57
+
58
+ async function replaceText(regex, replaceWith, basedir) {
59
+ const replaceOptions = {
60
+ files: `${basedir}/**`, // Replace in all files
61
+ from: regex,
62
+ to: replaceWith,
63
+ glob: {
64
+ dot: true, // Include file names starting with a dot
65
+ },
66
+ };
67
+
68
+ return await replaceInFile(replaceOptions);
69
+ }
package/bin/q.js CHANGED
@@ -46,7 +46,11 @@ async function main() {
46
46
  process.exit(1);
47
47
  }
48
48
  const baseDir = program.dir || name;
49
- await bootstrap("server", name, baseDir);
49
+ const textReplacements = [
50
+ { regex: new RegExp(`${type}-skeleton`, "g"), replaceWith: name },
51
+ ];
52
+
53
+ await bootstrap("server", baseDir, textReplacements);
50
54
  });
51
55
 
52
56
  program
@@ -63,7 +67,11 @@ async function main() {
63
67
  process.exit(1);
64
68
  }
65
69
  const baseDir = program.dir || name;
66
- await bootstrap("tool", name, baseDir);
70
+ const textReplacements = [
71
+ { regex: new RegExp(`${type}-skeleton`, "g"), replaceWith: name },
72
+ ];
73
+
74
+ await bootstrap("tool", baseDir, textReplacements);
67
75
  });
68
76
 
69
77
  program
@@ -80,7 +88,42 @@ async function main() {
80
88
  process.exit(1);
81
89
  }
82
90
  const baseDir = program.dir || name;
83
- await bootstrap("custom-code", name, baseDir);
91
+ const textReplacements = [
92
+ { regex: new RegExp(`${type}-skeleton`, "g"), replaceWith: name },
93
+ ];
94
+
95
+ await bootstrap("custom-code", baseDir, textReplacements);
96
+ });
97
+
98
+ program
99
+ .command("new-et-utils-package")
100
+ .option(
101
+ "-d, --dir <path>",
102
+ "the base directory to bootstrap the new tool in, defaults to the tools name"
103
+ )
104
+ .description("bootstrap a new ed-tech utility package")
105
+ .action(async () => {
106
+ const name = program.args[1];
107
+ const author = program.args[2] || "TODO: Set package author name";
108
+ const description =
109
+ program.args[3] || "TODO: Write a package description";
110
+
111
+ if (!name) {
112
+ console.error(errorColor("no package name given"));
113
+ process.exit(1);
114
+ }
115
+
116
+ const baseDir = program.dir || name;
117
+ const textReplacements = [
118
+ { regex: new RegExp("<package-name>", "g"), replaceWith: name },
119
+ { regex: new RegExp("<author-name>", "g"), replaceWith: author },
120
+ {
121
+ regex: new RegExp("<package-description>", "g"),
122
+ replaceWith: description,
123
+ },
124
+ ];
125
+
126
+ await bootstrap("et-utils-package", baseDir, textReplacements);
84
127
  });
85
128
 
86
129
  program
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nzz/q-cli",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Cli tool to setup new Q tools, new Q server implementations and start Q dev server to test developing Q tools",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,15 +1,15 @@
1
1
  {
2
- "extends": "@tsconfig/svelte/tsconfig.json",
3
- "include": ["src/**/*"],
4
- "exclude": ["node_modules/*", "__sapper__/*", "public/*"],
5
- "compilerOptions": {
6
- "lib": ["es2015", "DOM"],
7
- "types": ["svelte"],
8
- "outDir": "public",
9
- "declaration": false,
10
- "paths": {
11
- "@src": ["./src/"],
12
- "@interfaces": ["./src/interfaces.ts"]
13
- }
2
+ "extends": "@tsconfig/svelte/tsconfig.json",
3
+ "include": ["src/**/*"],
4
+ "exclude": ["node_modules/*", "__sapper__/*", "public/*"],
5
+ "compilerOptions": {
6
+ "lib": ["es2015", "DOM"],
7
+ "types": ["svelte"],
8
+ "outDir": "public",
9
+ "declaration": false,
10
+ "paths": {
11
+ "@src": ["./src/"],
12
+ "@interfaces": ["./src/interfaces.ts"]
14
13
  }
14
+ }
15
15
  }
@@ -0,0 +1,7 @@
1
+ # @nzz/et-utils-<package-name>
2
+
3
+ <package-description>
4
+
5
+ ## Content
6
+
7
+ TODO: Package documentation