@learnpack/learnpack 2.1.39 → 2.1.40

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.
Files changed (196) hide show
  1. package/README.md +370 -35
  2. package/bin/run +17 -17
  3. package/bin/run.cmd +3 -3
  4. package/lib/commands/audit.d.ts +6 -6
  5. package/lib/commands/audit.js +342 -342
  6. package/lib/commands/clean.d.ts +8 -8
  7. package/lib/commands/clean.js +25 -25
  8. package/lib/commands/download.d.ts +13 -13
  9. package/lib/commands/download.js +55 -55
  10. package/lib/commands/init.d.ts +9 -9
  11. package/lib/commands/init.js +123 -123
  12. package/lib/commands/login.d.ts +14 -14
  13. package/lib/commands/login.js +37 -37
  14. package/lib/commands/logout.d.ts +14 -14
  15. package/lib/commands/logout.js +37 -37
  16. package/lib/commands/publish.d.ts +14 -14
  17. package/lib/commands/publish.js +82 -82
  18. package/lib/commands/start.d.ts +7 -7
  19. package/lib/commands/start.js +239 -208
  20. package/lib/commands/test.d.ts +6 -6
  21. package/lib/commands/test.js +62 -62
  22. package/lib/index.d.ts +1 -1
  23. package/lib/index.js +4 -4
  24. package/lib/managers/config/allowed_files.d.ts +5 -5
  25. package/lib/managers/config/allowed_files.js +30 -30
  26. package/lib/managers/config/defaults.d.ts +41 -41
  27. package/lib/managers/config/defaults.js +44 -44
  28. package/lib/managers/config/exercise.d.ts +36 -36
  29. package/lib/managers/config/exercise.js +236 -236
  30. package/lib/managers/config/index.d.ts +3 -3
  31. package/lib/managers/config/index.js +337 -337
  32. package/lib/managers/file.d.ts +14 -14
  33. package/lib/managers/file.js +153 -153
  34. package/lib/managers/gitpod.d.ts +3 -3
  35. package/lib/managers/gitpod.js +67 -67
  36. package/lib/managers/server/index.d.ts +6 -6
  37. package/lib/managers/server/index.js +58 -58
  38. package/lib/managers/server/routes.d.ts +4 -4
  39. package/lib/managers/server/routes.js +219 -219
  40. package/lib/managers/session.d.ts +3 -3
  41. package/lib/managers/session.js +125 -125
  42. package/lib/managers/socket.d.ts +3 -3
  43. package/lib/managers/socket.js +176 -176
  44. package/lib/managers/telemetry.d.ts +74 -74
  45. package/lib/managers/telemetry.js +206 -206
  46. package/lib/managers/test.js +84 -84
  47. package/lib/models/action.d.ts +2 -2
  48. package/lib/models/action.js +2 -2
  49. package/lib/models/audit.d.ts +15 -15
  50. package/lib/models/audit.js +2 -2
  51. package/lib/models/config-manager.d.ts +21 -21
  52. package/lib/models/config-manager.js +2 -2
  53. package/lib/models/config.d.ts +68 -67
  54. package/lib/models/config.js +2 -2
  55. package/lib/models/counter.d.ts +11 -11
  56. package/lib/models/counter.js +2 -2
  57. package/lib/models/errors.d.ts +15 -15
  58. package/lib/models/errors.js +2 -2
  59. package/lib/models/exercise-obj.d.ts +30 -30
  60. package/lib/models/exercise-obj.js +2 -2
  61. package/lib/models/file.d.ts +5 -5
  62. package/lib/models/file.js +2 -2
  63. package/lib/models/findings.d.ts +17 -17
  64. package/lib/models/findings.js +2 -2
  65. package/lib/models/flags.d.ts +10 -10
  66. package/lib/models/flags.js +2 -2
  67. package/lib/models/front-matter.d.ts +11 -11
  68. package/lib/models/front-matter.js +2 -2
  69. package/lib/models/gitpod-data.d.ts +16 -16
  70. package/lib/models/gitpod-data.js +2 -2
  71. package/lib/models/language.d.ts +4 -4
  72. package/lib/models/language.js +2 -2
  73. package/lib/models/package.d.ts +7 -7
  74. package/lib/models/package.js +2 -2
  75. package/lib/models/plugin-config.d.ts +16 -16
  76. package/lib/models/plugin-config.js +2 -2
  77. package/lib/models/session.d.ts +31 -31
  78. package/lib/models/session.js +2 -2
  79. package/lib/models/socket.d.ts +36 -32
  80. package/lib/models/socket.js +2 -2
  81. package/lib/models/status.d.ts +1 -1
  82. package/lib/models/status.js +2 -2
  83. package/lib/models/success-types.d.ts +1 -1
  84. package/lib/models/success-types.js +2 -2
  85. package/lib/plugin/command/compile.d.ts +6 -6
  86. package/lib/plugin/command/compile.js +18 -18
  87. package/lib/plugin/command/test.d.ts +6 -6
  88. package/lib/plugin/command/test.js +25 -25
  89. package/lib/plugin/index.d.ts +27 -27
  90. package/lib/plugin/index.js +7 -7
  91. package/lib/plugin/plugin.d.ts +8 -8
  92. package/lib/plugin/plugin.js +68 -68
  93. package/lib/plugin/utils.d.ts +16 -16
  94. package/lib/plugin/utils.js +58 -58
  95. package/lib/ui/download.d.ts +5 -5
  96. package/lib/ui/download.js +61 -61
  97. package/lib/utils/BaseCommand.d.ts +8 -8
  98. package/lib/utils/BaseCommand.js +41 -41
  99. package/lib/utils/SessionCommand.d.ts +10 -10
  100. package/lib/utils/SessionCommand.js +43 -43
  101. package/lib/utils/api.d.ts +14 -14
  102. package/lib/utils/api.js +255 -255
  103. package/lib/utils/audit.d.ts +16 -16
  104. package/lib/utils/audit.js +303 -303
  105. package/lib/utils/checkNotInstalled.d.ts +2 -0
  106. package/lib/utils/checkNotInstalled.js +36 -0
  107. package/lib/utils/console.d.ts +12 -12
  108. package/lib/utils/console.js +19 -19
  109. package/lib/utils/errors.d.ts +17 -17
  110. package/lib/utils/errors.js +100 -100
  111. package/lib/utils/exercisesQueue.d.ts +9 -9
  112. package/lib/utils/exercisesQueue.js +38 -38
  113. package/lib/utils/fileQueue.d.ts +40 -40
  114. package/lib/utils/fileQueue.js +168 -168
  115. package/lib/utils/misc.d.ts +1 -1
  116. package/lib/utils/misc.js +23 -23
  117. package/lib/utils/osOperations.d.ts +5 -5
  118. package/lib/utils/osOperations.js +72 -72
  119. package/lib/utils/validators.d.ts +5 -5
  120. package/lib/utils/validators.js +17 -17
  121. package/lib/utils/watcher.d.ts +2 -2
  122. package/lib/utils/watcher.js +25 -25
  123. package/oclif.manifest.json +1 -1
  124. package/package.json +139 -139
  125. package/src/commands/audit.ts +443 -443
  126. package/src/commands/clean.ts +29 -29
  127. package/src/commands/download.ts +61 -61
  128. package/src/commands/init.ts +170 -170
  129. package/src/commands/login.ts +42 -42
  130. package/src/commands/logout.ts +43 -43
  131. package/src/commands/publish.ts +107 -107
  132. package/src/commands/start.ts +53 -23
  133. package/src/commands/test.ts +85 -85
  134. package/src/index.ts +1 -1
  135. package/src/managers/config/allowed_files.ts +29 -29
  136. package/src/managers/config/defaults.ts +42 -42
  137. package/src/managers/config/exercise.ts +311 -311
  138. package/src/managers/config/index.ts +455 -455
  139. package/src/managers/file.ts +196 -196
  140. package/src/managers/gitpod.ts +84 -84
  141. package/src/managers/server/index.ts +78 -78
  142. package/src/managers/server/routes.ts +330 -330
  143. package/src/managers/session.ts +145 -145
  144. package/src/managers/socket.ts +250 -250
  145. package/src/managers/telemetry.ts +346 -346
  146. package/src/managers/test.ts +83 -83
  147. package/src/models/action.ts +10 -10
  148. package/src/models/audit.ts +16 -16
  149. package/src/models/config-manager.ts +23 -23
  150. package/src/models/config.ts +5 -3
  151. package/src/models/counter.ts +11 -11
  152. package/src/models/errors.ts +22 -22
  153. package/src/models/exercise-obj.ts +29 -29
  154. package/src/models/file.ts +5 -5
  155. package/src/models/findings.ts +18 -18
  156. package/src/models/flags.ts +10 -10
  157. package/src/models/front-matter.ts +11 -11
  158. package/src/models/gitpod-data.ts +19 -19
  159. package/src/models/language.ts +4 -4
  160. package/src/models/package.ts +7 -7
  161. package/src/models/plugin-config.ts +17 -17
  162. package/src/models/session.ts +34 -34
  163. package/src/models/socket.ts +5 -0
  164. package/src/models/status.ts +16 -16
  165. package/src/models/success-types.ts +1 -1
  166. package/src/plugin/command/compile.ts +17 -17
  167. package/src/plugin/command/test.ts +30 -30
  168. package/src/plugin/index.ts +6 -6
  169. package/src/plugin/plugin.ts +94 -94
  170. package/src/plugin/utils.ts +87 -87
  171. package/src/types/node-fetch.d.ts +1 -1
  172. package/src/ui/download.ts +71 -71
  173. package/src/utils/BaseCommand.ts +48 -48
  174. package/src/utils/SessionCommand.ts +43 -43
  175. package/src/utils/api.ts +303 -303
  176. package/src/utils/audit.ts +393 -393
  177. package/src/utils/checkNotInstalled.ts +46 -0
  178. package/src/utils/console.ts +24 -24
  179. package/src/utils/errors.ts +117 -117
  180. package/src/utils/exercisesQueue.ts +51 -51
  181. package/src/utils/fileQueue.ts +198 -198
  182. package/src/utils/misc.ts +23 -23
  183. package/src/utils/osOperations.ts +79 -79
  184. package/src/utils/templates/gitignore.txt +19 -19
  185. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  186. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  187. package/src/utils/templates/incremental/README.ejs +4 -4
  188. package/src/utils/templates/incremental/README.es.ejs +4 -4
  189. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  190. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  191. package/src/utils/templates/isolated/README.ejs +4 -4
  192. package/src/utils/templates/isolated/README.es.ejs +4 -4
  193. package/src/utils/templates/no-grading/README.ejs +4 -4
  194. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  195. package/src/utils/validators.ts +18 -18
  196. package/src/utils/watcher.ts +27 -27
@@ -1,34 +1,34 @@
1
- import { IConfig, IConfigObj } from "./config"
2
-
3
- export interface IPayload {
4
- email: string;
5
- }
6
-
7
- export interface IStartProps {
8
- token: string;
9
- payload: IPayload | null;
10
- }
11
-
12
- type TLoginResponse = {
13
- token: string;
14
- user_id: string;
15
- email: string;
16
- };
17
-
18
- export interface ISession {
19
- sessionStarted: boolean;
20
- token: string | null;
21
- config: IConfig | null;
22
- currentCohort: null;
23
- initialize: () => Promise<boolean>;
24
- setRigoToken: (token: string) => Promise<boolean>;
25
- setPayload: (value: IPayload) => Promise<boolean>;
26
- getPayload: () => Promise<any>;
27
- isActive: () => boolean;
28
- get: (config?: IConfigObj) => Promise<any>;
29
- login: () => Promise<void>;
30
- loginWeb: (email: string, password: string) => Promise<TLoginResponse>;
31
- sync: () => Promise<void>;
32
- start: ({ token, payload }: IStartProps) => Promise<void>;
33
- destroy: () => Promise<void>;
34
- }
1
+ import { IConfig, IConfigObj } from "./config"
2
+
3
+ export interface IPayload {
4
+ email: string;
5
+ }
6
+
7
+ export interface IStartProps {
8
+ token: string;
9
+ payload: IPayload | null;
10
+ }
11
+
12
+ type TLoginResponse = {
13
+ token: string;
14
+ user_id: string;
15
+ email: string;
16
+ };
17
+
18
+ export interface ISession {
19
+ sessionStarted: boolean;
20
+ token: string | null;
21
+ config: IConfig | null;
22
+ currentCohort: null;
23
+ initialize: () => Promise<boolean>;
24
+ setRigoToken: (token: string) => Promise<boolean>;
25
+ setPayload: (value: IPayload) => Promise<boolean>;
26
+ getPayload: () => Promise<any>;
27
+ isActive: () => boolean;
28
+ get: (config?: IConfigObj) => Promise<any>;
29
+ login: () => Promise<void>;
30
+ loginWeb: (email: string, password: string) => Promise<TLoginResponse>;
31
+ sync: () => Promise<void>;
32
+ start: ({ token, payload }: IStartProps) => Promise<void>;
33
+ destroy: () => Promise<void>;
34
+ }
@@ -52,3 +52,8 @@ export interface ISocket {
52
52
  success: (type: any, stdout: string) => void;
53
53
  onTestingFinished: (obj: any) => void;
54
54
  }
55
+
56
+ export type TOpenWindowData = {
57
+ url: string;
58
+ exerciseSlug: string;
59
+ };
@@ -1,16 +1,16 @@
1
- export type TStatus =
2
- | "ready"
3
- | "internal-error"
4
- | "compiler-success"
5
- | "testing-success"
6
- | "compiling"
7
- | "testing"
8
- | "start_exercise"
9
- | "initializing"
10
- | "configuration_loaded"
11
- | "connection_ended"
12
- | "reset_exercise"
13
- | "open_files"
14
- | "open_window"
15
- | "instructions_closed"
16
- | "completed";
1
+ export type TStatus =
2
+ | "ready"
3
+ | "internal-error"
4
+ | "compiler-success"
5
+ | "testing-success"
6
+ | "compiling"
7
+ | "testing"
8
+ | "start_exercise"
9
+ | "initializing"
10
+ | "configuration_loaded"
11
+ | "connection_ended"
12
+ | "reset_exercise"
13
+ | "open_files"
14
+ | "open_window"
15
+ | "instructions_closed"
16
+ | "completed";
@@ -1 +1 @@
1
- export type TSuccessType = 'compiler-success' | 'testing-success';
1
+ export type TSuccessType = 'compiler-success' | 'testing-success';
@@ -1,17 +1,17 @@
1
- import { IError } from "../../models/errors"
2
-
3
- const CompilationError = (messages: string) => {
4
- const _err: IError = new Error(messages)
5
- _err.status = 400
6
- _err.stdout = messages
7
- _err.type = "compiler-error"
8
- return _err
9
- }
10
-
11
- export default {
12
- CompilationError,
13
- default: async ({ action, ...rest }: any) => {
14
- const stdout = await action.run(rest)
15
- return stdout
16
- },
17
- }
1
+ import { IError } from "../../models/errors"
2
+
3
+ const CompilationError = (messages: string) => {
4
+ const _err: IError = new Error(messages)
5
+ _err.status = 400
6
+ _err.stdout = messages
7
+ _err.type = "compiler-error"
8
+ return _err
9
+ }
10
+
11
+ export default {
12
+ CompilationError,
13
+ default: async ({ action, ...rest }: any) => {
14
+ const stdout = await action.run(rest)
15
+ return stdout
16
+ },
17
+ }
@@ -1,30 +1,30 @@
1
- import * as fs from "fs"
2
- import { IError } from "../../models/errors"
3
-
4
- const TestingError = (messages: string) => {
5
- const _err: IError = new Error(messages)
6
- _err.status = 400
7
- _err.stdout = messages
8
- _err.type = "testing-error"
9
- return _err
10
- }
11
-
12
- export default {
13
- TestingError,
14
- default: async function (args: any) {
15
- const { action, configuration, socket, exercise } = args
16
-
17
- if (!fs.existsSync(`${configuration.dirPath}/reports`)) {
18
- // reports directory
19
- fs.mkdirSync(`${configuration.dirPath}/reports`)
20
- }
21
-
22
- // compile
23
- const stdout = await action.run(args)
24
-
25
- // mark exercise as done
26
- exercise.done = true
27
-
28
- return stdout
29
- },
30
- }
1
+ import * as fs from "fs"
2
+ import { IError } from "../../models/errors"
3
+
4
+ const TestingError = (messages: string) => {
5
+ const _err: IError = new Error(messages)
6
+ _err.status = 400
7
+ _err.stdout = messages
8
+ _err.type = "testing-error"
9
+ return _err
10
+ }
11
+
12
+ export default {
13
+ TestingError,
14
+ default: async function (args: any) {
15
+ const { action, configuration, socket, exercise } = args
16
+
17
+ if (!fs.existsSync(`${configuration.dirPath}/reports`)) {
18
+ // reports directory
19
+ fs.mkdirSync(`${configuration.dirPath}/reports`)
20
+ }
21
+
22
+ // compile
23
+ const stdout = await action.run(args)
24
+
25
+ // mark exercise as done
26
+ exercise.done = true
27
+
28
+ return stdout
29
+ },
30
+ }
@@ -1,6 +1,6 @@
1
- import CompilationError from "./command/compile"
2
- import TestingError from "./command/test"
3
- import utils from "./utils"
4
- import plugin from "./plugin"
5
-
6
- export default { CompilationError, TestingError, Utils: utils, plugin }
1
+ import CompilationError from "./command/compile"
2
+ import TestingError from "./command/test"
3
+ import utils from "./utils"
4
+ import plugin from "./plugin"
5
+
6
+ export default { CompilationError, TestingError, Utils: utils, plugin }
@@ -1,94 +1,94 @@
1
- import * as shell from "shelljs"
2
- import { IPluginConfig } from "../models/plugin-config"
3
- /**
4
- * Main Plugin Runner, it defines the behavior of a learnpack plugin
5
- * dividing it in "actions" like: Compile, test, etc.
6
- * @param {object} pluginConfig Configuration object that must defined language and each possible action.
7
- */
8
- export default (pluginConfig: IPluginConfig) => {
9
- return async (args: any) => {
10
- const { action, exercise, socket, configuration } = args
11
-
12
- if (pluginConfig.language === undefined)
13
- throw new Error(`Missing language on the plugin configuration object`)
14
-
15
- if (typeof action !== "string") {
16
- throw new TypeError("Missing action property on hook details")
17
- }
18
-
19
- if (!exercise || exercise === undefined) {
20
- throw new Error("Missing exercise information")
21
- }
22
-
23
- type actionType = "compile" | "test";
24
-
25
- // if the action does not exist I don't do anything
26
- if (pluginConfig[action as actionType] === undefined) {
27
- console.log(`Ignoring ${action}`)
28
- return () => null
29
- }
30
-
31
- // ignore if the plugin language its not the same as the exercise language
32
- if (exercise.language !== pluginConfig.language) {
33
- return () => null
34
- }
35
-
36
- if (!exercise.files || exercise.files.length === 0) {
37
- throw new Error(`No files to process`)
38
- }
39
-
40
- try {
41
- const _action = pluginConfig[action as actionType]
42
-
43
- if (_action === null || typeof _action !== "object")
44
- throw new Error(
45
- `The ${pluginConfig.language} ${action} module must export an object configuration`
46
- )
47
- if (_action.validate === undefined)
48
- throw new Error(
49
- `Missing validate method for ${pluginConfig.language} ${action}`
50
- )
51
- if (_action.run === undefined)
52
- throw new Error(
53
- `Missing run method for ${pluginConfig.language} ${action}`
54
- )
55
- if (_action.dependencies !== undefined) {
56
- if (!Array.isArray(_action.dependencies))
57
- throw new Error(
58
- `${action}.dependencies must be an array of package names`
59
- )
60
-
61
- for (const packageName of _action.dependencies) {
62
- if (!shell.which(packageName)) {
63
- throw new Error(
64
- `🚫 You need to have ${packageName} installed to run test the exercises`
65
- )
66
- }
67
- }
68
- }
69
-
70
- const valid = await _action.validate({ exercise, configuration })
71
- if (valid) {
72
- // look for the command standard implementation and execute it
73
- const execute = require("./command/" + action + ".js").default
74
- // no matter the command, the response must always be a stdout
75
- const stdout = await execute({
76
- ...args,
77
- action: _action,
78
- configuration,
79
- })
80
-
81
- // Map the action names to socket messaging standards
82
- const actionToSuccessMapper = { compile: "compiler", test: "testing" }
83
-
84
- socket.success(actionToSuccessMapper[action as actionType], stdout)
85
- return stdout
86
- }
87
- } catch (error: any) {
88
- if (error.type === undefined)
89
- socket.fatal(error)
90
- else
91
- socket.error(error.type, error.stdout)
92
- }
93
- }
94
- }
1
+ import * as shell from "shelljs"
2
+ import { IPluginConfig } from "../models/plugin-config"
3
+ /**
4
+ * Main Plugin Runner, it defines the behavior of a learnpack plugin
5
+ * dividing it in "actions" like: Compile, test, etc.
6
+ * @param {object} pluginConfig Configuration object that must defined language and each possible action.
7
+ */
8
+ export default (pluginConfig: IPluginConfig) => {
9
+ return async (args: any) => {
10
+ const { action, exercise, socket, configuration } = args
11
+
12
+ if (pluginConfig.language === undefined)
13
+ throw new Error(`Missing language on the plugin configuration object`)
14
+
15
+ if (typeof action !== "string") {
16
+ throw new TypeError("Missing action property on hook details")
17
+ }
18
+
19
+ if (!exercise || exercise === undefined) {
20
+ throw new Error("Missing exercise information")
21
+ }
22
+
23
+ type actionType = "compile" | "test";
24
+
25
+ // if the action does not exist I don't do anything
26
+ if (pluginConfig[action as actionType] === undefined) {
27
+ console.log(`Ignoring ${action}`)
28
+ return () => null
29
+ }
30
+
31
+ // ignore if the plugin language its not the same as the exercise language
32
+ if (exercise.language !== pluginConfig.language) {
33
+ return () => null
34
+ }
35
+
36
+ if (!exercise.files || exercise.files.length === 0) {
37
+ throw new Error(`No files to process`)
38
+ }
39
+
40
+ try {
41
+ const _action = pluginConfig[action as actionType]
42
+
43
+ if (_action === null || typeof _action !== "object")
44
+ throw new Error(
45
+ `The ${pluginConfig.language} ${action} module must export an object configuration`
46
+ )
47
+ if (_action.validate === undefined)
48
+ throw new Error(
49
+ `Missing validate method for ${pluginConfig.language} ${action}`
50
+ )
51
+ if (_action.run === undefined)
52
+ throw new Error(
53
+ `Missing run method for ${pluginConfig.language} ${action}`
54
+ )
55
+ if (_action.dependencies !== undefined) {
56
+ if (!Array.isArray(_action.dependencies))
57
+ throw new Error(
58
+ `${action}.dependencies must be an array of package names`
59
+ )
60
+
61
+ for (const packageName of _action.dependencies) {
62
+ if (!shell.which(packageName)) {
63
+ throw new Error(
64
+ `🚫 You need to have ${packageName} installed to run test the exercises`
65
+ )
66
+ }
67
+ }
68
+ }
69
+
70
+ const valid = await _action.validate({ exercise, configuration })
71
+ if (valid) {
72
+ // look for the command standard implementation and execute it
73
+ const execute = require("./command/" + action + ".js").default
74
+ // no matter the command, the response must always be a stdout
75
+ const stdout = await execute({
76
+ ...args,
77
+ action: _action,
78
+ configuration,
79
+ })
80
+
81
+ // Map the action names to socket messaging standards
82
+ const actionToSuccessMapper = { compile: "compiler", test: "testing" }
83
+
84
+ socket.success(actionToSuccessMapper[action as actionType], stdout)
85
+ return stdout
86
+ }
87
+ } catch (error: any) {
88
+ if (error.type === undefined)
89
+ socket.fatal(error)
90
+ else
91
+ socket.error(error.type, error.stdout)
92
+ }
93
+ }
94
+ }
@@ -1,87 +1,87 @@
1
- import * as chalk from "chalk"
2
-
3
- const getMatches = (reg: RegExp, content: string) => {
4
- const inputs = []
5
- let m
6
- while ((m = reg.exec(content)) !== null) {
7
- // This is necessary to avoid infinite loops with zero-width matches
8
- if (m.index === reg.lastIndex)
9
- reg.lastIndex++
10
-
11
- // The result can be accessed through the `m`-variable.
12
- inputs.push(m[1] || null)
13
- }
14
-
15
- return inputs
16
- }
17
-
18
- const cleanStdout = (buffer: string, inputs: string[]) => {
19
- if (Array.isArray(inputs))
20
- for (let i = 0; i < inputs.length; i++)
21
- if (inputs[i])
22
- buffer = buffer.replace(inputs[i], "")
23
-
24
- return buffer
25
- }
26
-
27
- const indent = (string: string, options: any, count = 1) => {
28
- options = {
29
- indent: " ",
30
- includeEmptyLines: false,
31
- ...options,
32
- }
33
-
34
- if (typeof string !== "string") {
35
- throw new TypeError(
36
- `Expected \`input\` to be a \`string\`, got \`${typeof string}\``
37
- )
38
- }
39
-
40
- if (typeof count !== "number") {
41
- throw new TypeError(
42
- `Expected \`count\` to be a \`number\`, got \`${typeof count}\``
43
- )
44
- }
45
-
46
- if (count < 0) {
47
- throw new RangeError(
48
- `Expected \`count\` to be at least 0, got \`${count}\``
49
- )
50
- }
51
-
52
- if (typeof options.indent !== "string") {
53
- throw new TypeError(
54
- `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\``
55
- )
56
- }
57
-
58
- if (count === 0) {
59
- return string
60
- }
61
-
62
- const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm
63
-
64
- return string.replace(regex, options.indent.repeat(count))
65
- }
66
-
67
- const Console = {
68
- // _debug: true,
69
- _debug: process.env.DEBUG === "true",
70
- startDebug: function () {
71
- this._debug = true
72
- },
73
- log: (msg: string, ...args: any[]) => console.log(chalk.gray(msg), ...args),
74
- error: (msg: string, ...args: any[]) =>
75
- console.log(chalk.red("⨉ " + msg), ...args),
76
- success: (msg: string, ...args: any[]) =>
77
- console.log(chalk.green("✓ " + msg), ...args),
78
- info: (msg: string, ...args: any[]) =>
79
- console.log(chalk.blue("ⓘ " + msg), ...args),
80
- help: (msg: string) =>
81
- console.log(`${chalk.white.bold("⚠ help:")} ${chalk.white(msg)}`),
82
- debug(...args: any[]) {
83
- this._debug && console.log(chalk.magentaBright(`⚠ debug: `), args)
84
- },
85
- }
86
-
87
- export default { getMatches, cleanStdout, indent, Console }
1
+ import * as chalk from "chalk"
2
+
3
+ const getMatches = (reg: RegExp, content: string) => {
4
+ const inputs = []
5
+ let m
6
+ while ((m = reg.exec(content)) !== null) {
7
+ // This is necessary to avoid infinite loops with zero-width matches
8
+ if (m.index === reg.lastIndex)
9
+ reg.lastIndex++
10
+
11
+ // The result can be accessed through the `m`-variable.
12
+ inputs.push(m[1] || null)
13
+ }
14
+
15
+ return inputs
16
+ }
17
+
18
+ const cleanStdout = (buffer: string, inputs: string[]) => {
19
+ if (Array.isArray(inputs))
20
+ for (let i = 0; i < inputs.length; i++)
21
+ if (inputs[i])
22
+ buffer = buffer.replace(inputs[i], "")
23
+
24
+ return buffer
25
+ }
26
+
27
+ const indent = (string: string, options: any, count = 1) => {
28
+ options = {
29
+ indent: " ",
30
+ includeEmptyLines: false,
31
+ ...options,
32
+ }
33
+
34
+ if (typeof string !== "string") {
35
+ throw new TypeError(
36
+ `Expected \`input\` to be a \`string\`, got \`${typeof string}\``
37
+ )
38
+ }
39
+
40
+ if (typeof count !== "number") {
41
+ throw new TypeError(
42
+ `Expected \`count\` to be a \`number\`, got \`${typeof count}\``
43
+ )
44
+ }
45
+
46
+ if (count < 0) {
47
+ throw new RangeError(
48
+ `Expected \`count\` to be at least 0, got \`${count}\``
49
+ )
50
+ }
51
+
52
+ if (typeof options.indent !== "string") {
53
+ throw new TypeError(
54
+ `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\``
55
+ )
56
+ }
57
+
58
+ if (count === 0) {
59
+ return string
60
+ }
61
+
62
+ const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm
63
+
64
+ return string.replace(regex, options.indent.repeat(count))
65
+ }
66
+
67
+ const Console = {
68
+ // _debug: true,
69
+ _debug: process.env.DEBUG === "true",
70
+ startDebug: function () {
71
+ this._debug = true
72
+ },
73
+ log: (msg: string, ...args: any[]) => console.log(chalk.gray(msg), ...args),
74
+ error: (msg: string, ...args: any[]) =>
75
+ console.log(chalk.red("⨉ " + msg), ...args),
76
+ success: (msg: string, ...args: any[]) =>
77
+ console.log(chalk.green("✓ " + msg), ...args),
78
+ info: (msg: string, ...args: any[]) =>
79
+ console.log(chalk.blue("ⓘ " + msg), ...args),
80
+ help: (msg: string) =>
81
+ console.log(`${chalk.white.bold("⚠ help:")} ${chalk.white(msg)}`),
82
+ debug(...args: any[]) {
83
+ this._debug && console.log(chalk.magentaBright(`⚠ debug: `), args)
84
+ },
85
+ }
86
+
87
+ export default { getMatches, cleanStdout, indent, Console }
@@ -1 +1 @@
1
- declare module '*';
1
+ declare module '*';