@learnpack/learnpack 2.1.26 → 2.1.28
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 +10 -10
- package/lib/commands/start.js +15 -4
- package/lib/managers/file.d.ts +1 -0
- package/lib/managers/file.js +8 -1
- package/lib/managers/server/routes.js +48 -14
- package/lib/managers/session.d.ts +1 -1
- package/lib/managers/session.js +39 -12
- package/lib/managers/socket.d.ts +1 -1
- package/lib/managers/socket.js +57 -43
- package/lib/models/action.d.ts +1 -1
- package/lib/models/config.d.ts +1 -1
- package/lib/models/exercise-obj.d.ts +3 -0
- package/lib/models/session.d.ts +4 -1
- package/lib/models/socket.d.ts +7 -6
- package/lib/models/status.d.ts +1 -1
- package/lib/utils/api.d.ts +2 -0
- package/lib/utils/api.js +51 -6
- package/oclif.manifest.json +1 -1
- package/package.json +3 -1
- package/src/commands/audit.ts +113 -113
- package/src/commands/clean.ts +10 -10
- package/src/commands/download.ts +18 -18
- package/src/commands/init.ts +39 -39
- package/src/commands/login.ts +13 -13
- package/src/commands/logout.ts +9 -9
- package/src/commands/publish.ts +25 -25
- package/src/commands/start.ts +101 -75
- package/src/commands/test.ts +34 -34
- package/src/managers/config/allowed_files.ts +2 -2
- package/src/managers/config/defaults.ts +2 -2
- package/src/managers/config/exercise.ts +79 -79
- package/src/managers/config/index.ts +145 -145
- package/src/managers/file.ts +74 -65
- package/src/managers/server/index.ts +32 -31
- package/src/managers/server/routes.ts +139 -90
- package/src/managers/session.ts +53 -24
- package/src/managers/socket.ts +92 -79
- package/src/models/action.ts +8 -1
- package/src/models/config-manager.ts +2 -2
- package/src/models/config.ts +7 -2
- package/src/models/exercise-obj.ts +6 -3
- package/src/models/plugin-config.ts +2 -2
- package/src/models/session.ts +5 -2
- package/src/models/socket.ts +12 -6
- package/src/models/status.ts +15 -14
- package/src/plugin/command/compile.ts +10 -10
- package/src/plugin/command/test.ts +14 -14
- package/src/plugin/index.ts +5 -5
- package/src/plugin/plugin.ts +26 -26
- package/src/plugin/utils.ts +23 -23
- package/src/utils/BaseCommand.ts +16 -16
- package/src/utils/api.ts +143 -91
- package/src/utils/audit.ts +93 -96
- package/src/utils/exercisesQueue.ts +15 -15
- package/src/utils/fileQueue.ts +85 -85
- package/src/utils/watcher.ts +14 -14
package/src/managers/socket.ts
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
import {Socket, Server} from
|
2
|
-
import Console from
|
3
|
-
import queue from
|
4
|
-
|
5
|
-
import {ISocket, TPossibleActions} from
|
6
|
-
import {IConfig} from
|
7
|
-
import {ICallback, TAction} from
|
8
|
-
import {IExercise, IExerciseData} from
|
9
|
-
import {TStatus} from
|
10
|
-
import {TSuccessType} from
|
11
|
-
import * as http from
|
1
|
+
import { Socket, Server } from "socket.io"
|
2
|
+
import Console from "../utils/console"
|
3
|
+
import queue from "../utils/fileQueue"
|
4
|
+
|
5
|
+
import { ISocket, TPossibleActions } from "../models/socket"
|
6
|
+
import { IConfig } from "../models/config"
|
7
|
+
import { ICallback, TAction } from "../models/action"
|
8
|
+
import { IExercise, IExerciseData } from "../models/exercise-obj"
|
9
|
+
import { TStatus } from "../models/status"
|
10
|
+
import { TSuccessType } from "../models/success-types"
|
11
|
+
import * as http from "http"
|
12
12
|
|
13
13
|
const SocketManager: ISocket = {
|
14
14
|
socket: null,
|
15
15
|
config: null,
|
16
16
|
allowedActions: [],
|
17
|
-
possibleActions: [
|
17
|
+
possibleActions: ["build", "reset", "test", "tutorial"],
|
18
18
|
isTestingEnvironment: false,
|
19
19
|
actionCallBacks: {
|
20
20
|
clean: (_, s: { logs: Array<string> }) => {
|
@@ -22,86 +22,91 @@ const SocketManager: ISocket = {
|
|
22
22
|
},
|
23
23
|
},
|
24
24
|
addAllowed: function (actions: Array<TPossibleActions> | TPossibleActions) {
|
25
|
-
if (!Array.isArray(actions))
|
26
|
-
|
25
|
+
if (!Array.isArray(actions))
|
26
|
+
actions = [actions]
|
27
27
|
|
28
28
|
// avoid adding the "test" action if grading is disabled
|
29
29
|
if (
|
30
|
-
actions.includes(
|
31
|
-
this.config?.disabledActions?.includes(
|
30
|
+
actions.includes("test") &&
|
31
|
+
this.config?.disabledActions?.includes("test")
|
32
32
|
) {
|
33
|
-
actions = actions.filter((a: TPossibleActions) => a !==
|
33
|
+
actions = actions.filter((a: TPossibleActions) => a !== "test")
|
34
34
|
}
|
35
35
|
|
36
36
|
this.allowedActions = [
|
37
37
|
...(this.allowedActions || []).filter(
|
38
|
-
(a: TPossibleActions) => !actions.includes(a)
|
38
|
+
(a: TPossibleActions) => !actions.includes(a)
|
39
39
|
),
|
40
40
|
...actions,
|
41
41
|
]
|
42
42
|
},
|
43
43
|
removeAllowed: function (
|
44
|
-
actions: Array<TPossibleActions> | TPossibleActions
|
44
|
+
actions: Array<TPossibleActions> | TPossibleActions
|
45
45
|
) {
|
46
46
|
if (!Array.isArray(actions)) {
|
47
47
|
actions = [actions]
|
48
48
|
}
|
49
49
|
|
50
50
|
this.allowedActions = (this.allowedActions || []).filter(
|
51
|
-
(a: TPossibleActions) => !actions.includes(a)
|
51
|
+
(a: TPossibleActions) => !actions.includes(a)
|
52
52
|
)
|
53
53
|
},
|
54
54
|
start: function (
|
55
55
|
config: IConfig,
|
56
56
|
server: http.Server,
|
57
|
-
isTestingEnvironment = false
|
57
|
+
isTestingEnvironment = false
|
58
58
|
) {
|
59
59
|
this.config = config
|
60
60
|
this.isTestingEnvironment = isTestingEnvironment
|
61
|
+
this.socket = new Server(server, {
|
62
|
+
allowEIO3: true,
|
63
|
+
cors: {
|
64
|
+
origin: "http://localhost:5173",
|
65
|
+
methods: ["GET", "POST"],
|
66
|
+
},
|
67
|
+
})
|
61
68
|
|
62
|
-
this.
|
69
|
+
this.allowedActions =
|
70
|
+
this.config?.disabledActions?.includes("test") ||
|
71
|
+
this.config?.disableGrading ?
|
72
|
+
this.possibleActions.filter(
|
73
|
+
a => !this.config?.disabledActions?.includes(a) && a !== "test"
|
74
|
+
) :
|
75
|
+
this.possibleActions.filter(a => !this.allowedActions?.includes(a))
|
63
76
|
|
64
|
-
|
65
|
-
this.
|
66
|
-
a => !this.config?.disabledActions?.includes(a) && a !== 'test',
|
67
|
-
) : this.possibleActions.filter(
|
68
|
-
a => !this.allowedActions?.includes(a),
|
69
|
-
)
|
70
|
-
|
71
|
-
if (this.config?.grading === 'incremental') {
|
72
|
-
this.removeAllowed('reset')
|
77
|
+
if (this.config?.grading === "incremental") {
|
78
|
+
this.removeAllowed("reset")
|
73
79
|
}
|
74
80
|
|
75
81
|
if (this.socket) {
|
76
|
-
this.socket.on(
|
82
|
+
this.socket.on("connection", (socket: Socket) => {
|
77
83
|
Console.debug(
|
78
|
-
|
79
|
-
this.allowedActions
|
84
|
+
"Connection with client successfully established",
|
85
|
+
this.allowedActions
|
80
86
|
)
|
81
87
|
if (!this.isTestingEnvironment) {
|
82
|
-
this.log(
|
88
|
+
this.log("ready", ["Ready to compile or test..."])
|
83
89
|
}
|
84
90
|
|
85
91
|
socket.on(
|
86
|
-
|
87
|
-
({action, data}: { action: string; data: IExerciseData }) => {
|
88
|
-
this.emit(
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
Console.error('No exercise slug especified')
|
92
|
+
"compiler",
|
93
|
+
({ action, data }: { action: string; data: IExerciseData }) => {
|
94
|
+
this.emit("clean", "pending", ["Working..."])
|
95
|
+
if (typeof data.exerciseSlug === "undefined") {
|
96
|
+
this.log("internal-error", ["No exercise slug specified"])
|
97
|
+
Console.error("No exercise slug especified")
|
93
98
|
return
|
94
99
|
}
|
95
100
|
|
96
101
|
if (
|
97
102
|
this.actionCallBacks &&
|
98
|
-
typeof this.actionCallBacks[action] ===
|
103
|
+
typeof this.actionCallBacks[action] === "function"
|
99
104
|
) {
|
100
105
|
this.actionCallBacks[action](data)
|
101
106
|
} else {
|
102
|
-
this.log(
|
107
|
+
this.log("internal-error", ["Uknown action " + action])
|
103
108
|
}
|
104
|
-
}
|
109
|
+
}
|
105
110
|
)
|
106
111
|
})
|
107
112
|
}
|
@@ -111,14 +116,18 @@ const SocketManager: ISocket = {
|
|
111
116
|
this.actionCallBacks[action] = callBack
|
112
117
|
}
|
113
118
|
},
|
114
|
-
clean: function (_ =
|
115
|
-
this.emit(
|
119
|
+
clean: function (_ = "pending", logs = []) {
|
120
|
+
this.emit("clean", "pending", logs)
|
116
121
|
},
|
117
122
|
ask: function (questions = []) {
|
118
123
|
return new Promise((resolve, _) => {
|
119
|
-
this.emit(
|
120
|
-
|
124
|
+
this.emit("ask", "pending", ["Waiting for input..."], questions)
|
125
|
+
console.log("Setting up listeners")
|
126
|
+
this.on("input", ({ inputs }: any) => {
|
121
127
|
// Workaround to fix issue because null inputs
|
128
|
+
|
129
|
+
console.log("inputs", inputs)
|
130
|
+
|
122
131
|
let isNull = false
|
123
132
|
// eslint-disable-next-line
|
124
133
|
inputs.forEach((input: any) => {
|
@@ -135,62 +144,62 @@ const SocketManager: ISocket = {
|
|
135
144
|
},
|
136
145
|
reload: function (
|
137
146
|
files: Array<string> | null = null,
|
138
|
-
exercises: Array<string> | null = null
|
147
|
+
exercises: Array<string> | null = null
|
139
148
|
) {
|
140
149
|
this.emit(
|
141
|
-
|
142
|
-
files?.join(
|
143
|
-
exercises
|
150
|
+
"reload",
|
151
|
+
files?.join("") || "" /* TODO: Check it out this */,
|
152
|
+
exercises!
|
144
153
|
)
|
145
154
|
},
|
146
|
-
openWindow: function (url =
|
155
|
+
openWindow: function (url = "") {
|
147
156
|
queue.dispatcher().enqueue(queue.events.OPEN_WINDOW, url)
|
148
157
|
this.emit(
|
149
158
|
queue.events.OPEN_WINDOW as TAction,
|
150
|
-
|
159
|
+
"ready",
|
151
160
|
[`Opening ${url}`],
|
152
161
|
[],
|
153
162
|
[],
|
154
|
-
url
|
163
|
+
url
|
155
164
|
)
|
156
165
|
},
|
157
166
|
log: function (
|
158
167
|
status: TStatus,
|
159
168
|
messages: string | Array<string> = [],
|
160
169
|
report: Array<string> = [],
|
161
|
-
data: any = null
|
170
|
+
data: any = null
|
162
171
|
) {
|
163
|
-
this.emit(
|
172
|
+
this.emit("log", status, messages, [], report, data)
|
164
173
|
Console.log(messages)
|
165
174
|
},
|
166
175
|
emit: function (
|
167
176
|
action: TAction,
|
168
|
-
status: TStatus | string =
|
177
|
+
status: TStatus | string = "ready",
|
169
178
|
logs: string | Array<string> = [],
|
170
179
|
inputs: Array<string> = [],
|
171
180
|
report: Array<string> = [],
|
172
|
-
data: any = null
|
181
|
+
data: any = null
|
173
182
|
) {
|
174
183
|
if (
|
175
184
|
this.config?.compiler &&
|
176
|
-
[
|
177
|
-
this.config?.compiler
|
185
|
+
["webpack", "vanillajs", "vue", "react", "css", "html"].includes(
|
186
|
+
this.config?.compiler
|
178
187
|
)
|
179
188
|
) {
|
180
|
-
if ([
|
181
|
-
this.addAllowed(
|
182
|
-
if ([
|
183
|
-
this.removeAllowed(
|
189
|
+
if (["compiler-success", "compiler-warning"].includes(status))
|
190
|
+
this.addAllowed("preview")
|
191
|
+
if (["compiler-error"].includes(status) || action === "ready")
|
192
|
+
this.removeAllowed("preview")
|
184
193
|
}
|
185
194
|
|
186
|
-
if (this.config?.grading ===
|
187
|
-
this.removeAllowed(
|
195
|
+
if (this.config?.grading === "incremental") {
|
196
|
+
this.removeAllowed("reset")
|
188
197
|
}
|
189
198
|
|
190
199
|
// eslint-disable-next-line
|
191
200
|
this.config?.disabledActions?.forEach((a) => this.removeAllowed(a));
|
192
201
|
|
193
|
-
this.socket?.emit(
|
202
|
+
this.socket?.emit("compiler", {
|
194
203
|
action,
|
195
204
|
status,
|
196
205
|
logs,
|
@@ -202,31 +211,35 @@ const SocketManager: ISocket = {
|
|
202
211
|
},
|
203
212
|
|
204
213
|
ready: function (message: string) {
|
205
|
-
this.log(
|
214
|
+
this.log("ready", [message])
|
206
215
|
},
|
207
216
|
success: function (type: TSuccessType, stdout: string) {
|
208
|
-
const types = [
|
217
|
+
const types = ["compiler", "testing"]
|
209
218
|
if (!types.includes(type))
|
210
219
|
this.fatal(`Invalid socket success type "${type}" on socket`)
|
211
|
-
else if (stdout ===
|
212
|
-
this.log((type +
|
213
|
-
|
220
|
+
else if (stdout === "")
|
221
|
+
this.log((type + "-success") as TSuccessType, [
|
222
|
+
"No stdout to display on the console",
|
214
223
|
])
|
215
|
-
else
|
216
|
-
|
224
|
+
else
|
225
|
+
this.log((type + "-success") as TSuccessType, [stdout])
|
217
226
|
},
|
218
227
|
error: function (type: TStatus, stdout: string) {
|
219
|
-
console.error(
|
228
|
+
console.error("Socket error: " + type, stdout)
|
220
229
|
this.log(type, [stdout])
|
221
230
|
|
222
231
|
if (this.isTestingEnvironment) {
|
223
232
|
this.onTestingFinished({
|
224
|
-
result:
|
233
|
+
result: "failed",
|
225
234
|
})
|
226
235
|
}
|
227
236
|
},
|
237
|
+
complete: function () {
|
238
|
+
console.log("complete")
|
239
|
+
},
|
240
|
+
|
228
241
|
fatal: function (msg: string) {
|
229
|
-
this.log(
|
242
|
+
this.log("internal-error", [msg])
|
230
243
|
throw msg
|
231
244
|
},
|
232
245
|
onTestingFinished: function (result: any) {
|
package/src/models/action.ts
CHANGED
package/src/models/config.ts
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
import { IExercise } from "./exercise-obj"
|
1
|
+
import { IExercise } from "./exercise-obj"
|
2
2
|
|
3
3
|
export type TGrading = "isolated" | "incremental" | "no-grading";
|
4
4
|
|
5
5
|
export type TMode = "preview" | "standalone";
|
6
6
|
|
7
|
-
export type TConfigAction =
|
7
|
+
export type TConfigAction =
|
8
|
+
| "test"
|
9
|
+
| "build"
|
10
|
+
| "tutorial"
|
11
|
+
| "reset"
|
12
|
+
| "generate";
|
8
13
|
|
9
14
|
export type TConfigObjAttributes = "config" | "exercises" | "grading";
|
10
15
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { IFile } from "./file"
|
2
|
-
import { IConfig } from "./config"
|
3
|
-
import { ISocket } from "./socket"
|
1
|
+
import { IFile } from "./file"
|
2
|
+
import { IConfig } from "./config"
|
3
|
+
import { ISocket } from "./socket"
|
4
4
|
|
5
5
|
export interface IExercise {
|
6
6
|
position?: number;
|
@@ -21,6 +21,9 @@ export interface IExercise {
|
|
21
21
|
}
|
22
22
|
|
23
23
|
export interface IExerciseData {
|
24
|
+
lastMessages?: any;
|
25
|
+
userMessage?: string;
|
24
26
|
exerciseSlug: string;
|
27
|
+
entryPoint?: string;
|
25
28
|
files: string[];
|
26
29
|
}
|
package/src/models/session.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import {IConfig, IConfigObj} from
|
1
|
+
import { IConfig, IConfigObj } from "./config"
|
2
2
|
|
3
3
|
export interface IPayload {
|
4
4
|
email: string;
|
@@ -15,12 +15,15 @@ export interface ISession {
|
|
15
15
|
config: IConfig | null;
|
16
16
|
currentCohort: null;
|
17
17
|
initialize: () => Promise<boolean>;
|
18
|
+
getOpenAIToken: () => Promise<string | null>;
|
19
|
+
setOpenAIToken: (token: string) => Promise<boolean>;
|
18
20
|
setPayload: (value: IPayload) => Promise<boolean>;
|
19
21
|
getPayload: () => Promise<any>;
|
20
22
|
isActive: () => boolean;
|
21
23
|
get: (config?: IConfigObj) => Promise<any>;
|
22
24
|
login: () => Promise<void>;
|
25
|
+
loginWeb: (email: string, password: string) => Promise<void>;
|
23
26
|
sync: () => Promise<void>;
|
24
|
-
start: ({token, payload}: IStartProps) => Promise<void>;
|
27
|
+
start: ({ token, payload }: IStartProps) => Promise<void>;
|
25
28
|
destroy: () => Promise<void>;
|
26
29
|
}
|
package/src/models/socket.ts
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
import {IConfig} from
|
2
|
-
import {Server} from
|
3
|
-
import {DefaultEventsMap} from
|
4
|
-
import {TAction, ICallback} from
|
5
|
-
import {TStatus} from
|
1
|
+
import { IConfig } from "./config"
|
2
|
+
import { Server } from "socket.io"
|
3
|
+
import { DefaultEventsMap } from "socket.io/dist/typed-events"
|
4
|
+
import { TAction, ICallback } from "./action"
|
5
|
+
import { TStatus } from "./status"
|
6
6
|
|
7
|
-
export type TPossibleActions =
|
7
|
+
export type TPossibleActions =
|
8
|
+
| "build"
|
9
|
+
| "test"
|
10
|
+
| "reset"
|
11
|
+
| "tutorial"
|
12
|
+
| "generate";
|
8
13
|
|
9
14
|
export interface ISocket {
|
10
15
|
socket: Server<
|
@@ -23,6 +28,7 @@ export interface ISocket {
|
|
23
28
|
start: (config: IConfig, server: any, isTestingEnvironment: boolean) => void;
|
24
29
|
on: (action: any, callBack: any) => void;
|
25
30
|
clean: (_: string, logs: Array<any>) => void;
|
31
|
+
complete: () => void;
|
26
32
|
ask: (questions: Array<string>) => void;
|
27
33
|
reload: (files: Array<string> | null, exercises: Array<string>) => void;
|
28
34
|
openWindow: (id: string) => void;
|
package/src/models/status.ts
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
export type TStatus =
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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,17 +1,17 @@
|
|
1
|
-
import { IError } from "../../models/errors"
|
1
|
+
import { IError } from "../../models/errors"
|
2
2
|
|
3
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
|
-
}
|
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
10
|
|
11
11
|
export default {
|
12
12
|
CompilationError,
|
13
13
|
default: async ({ action, ...rest }: any) => {
|
14
|
-
const stdout = await action.run(rest)
|
15
|
-
return stdout
|
14
|
+
const stdout = await action.run(rest)
|
15
|
+
return stdout
|
16
16
|
},
|
17
|
-
}
|
17
|
+
}
|
@@ -1,30 +1,30 @@
|
|
1
|
-
import * as fs from "fs"
|
2
|
-
import { IError } from "../../models/errors"
|
1
|
+
import * as fs from "fs"
|
2
|
+
import { IError } from "../../models/errors"
|
3
3
|
|
4
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
|
-
}
|
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
11
|
|
12
12
|
export default {
|
13
13
|
TestingError,
|
14
14
|
default: async function (args: any) {
|
15
|
-
const { action, configuration, socket, exercise } = args
|
15
|
+
const { action, configuration, socket, exercise } = args
|
16
16
|
|
17
17
|
if (!fs.existsSync(`${configuration.dirPath}/reports`)) {
|
18
18
|
// reports directory
|
19
|
-
fs.mkdirSync(`${configuration.dirPath}/reports`)
|
19
|
+
fs.mkdirSync(`${configuration.dirPath}/reports`)
|
20
20
|
}
|
21
21
|
|
22
22
|
// compile
|
23
|
-
const stdout = await action.run(args)
|
23
|
+
const stdout = await action.run(args)
|
24
24
|
|
25
25
|
// mark exercise as done
|
26
|
-
exercise.done = true
|
26
|
+
exercise.done = true
|
27
27
|
|
28
|
-
return stdout
|
28
|
+
return stdout
|
29
29
|
},
|
30
|
-
}
|
30
|
+
}
|
package/src/plugin/index.ts
CHANGED
@@ -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"
|
1
|
+
import CompilationError from "./command/compile"
|
2
|
+
import TestingError from "./command/test"
|
3
|
+
import utils from "./utils"
|
4
|
+
import plugin from "./plugin"
|
5
5
|
|
6
|
-
export default { CompilationError, TestingError, Utils: utils, plugin }
|
6
|
+
export default { CompilationError, TestingError, Utils: utils, plugin }
|