@ucdjs/pipelines-server 0.0.1-beta.2 → 0.0.1-beta.5

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.
@@ -0,0 +1,18 @@
1
+ import type { Database } from "#server/db";
2
+ import type { PipelineSource } from "@ucdjs/pipelines-loader";
3
+ import { H3 } from "h3";
4
+ export interface AppOptions {
5
+ sources?: PipelineSource[];
6
+ db?: Database;
7
+ }
8
+ export interface ServerOptions extends AppOptions {
9
+ port?: number;
10
+ }
11
+ declare module "h3" {
12
+ interface H3EventContext {
13
+ sources: PipelineSource[];
14
+ db: Database;
15
+ }
16
+ }
17
+ export declare function createApp(options?: AppOptions): H3;
18
+ export declare function startServer(options?: ServerOptions): Promise<void>;
@@ -0,0 +1,5 @@
1
+ interface ExportTarget {
2
+ exportName: string;
3
+ }
4
+ export declare function extractDefinePipelineCode(source: string, { exportName }: ExportTarget): string;
5
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { LibSQLDatabase } from "drizzle-orm/libsql";
2
+ import * as schema from "./schema";
3
+ export type Database = LibSQLDatabase<typeof schema>;
4
+ interface CreateDatabaseOptions {
5
+ url?: string;
6
+ authToken?: string;
7
+ }
8
+ export declare function createDatabase(options?: CreateDatabaseOptions): Database;
9
+ export declare function runMigrations(db: Database): Promise<void>;
10
+ export { schema };
@@ -0,0 +1,426 @@
1
+ import type { PipelineEvent, PipelineEventType, PipelineGraph } from "@ucdjs/pipelines-core";
2
+ import type { ExecutionStatus, PipelineSummary } from "@ucdjs/pipelines-executor";
3
+ export type ExecutionLogStream = "stdout" | "stderr";
4
+ export interface ExecutionLogPayload {
5
+ message: string;
6
+ stream: ExecutionLogStream;
7
+ args?: unknown[];
8
+ truncated?: boolean;
9
+ originalSize?: number;
10
+ event?: PipelineEvent;
11
+ }
12
+ export declare const executions: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
13
+ name: "executions";
14
+ schema: undefined;
15
+ columns: {
16
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
17
+ name: "id";
18
+ tableName: "executions";
19
+ dataType: "string";
20
+ columnType: "SQLiteText";
21
+ data: string;
22
+ driverParam: string;
23
+ notNull: true;
24
+ hasDefault: false;
25
+ isPrimaryKey: true;
26
+ isAutoincrement: false;
27
+ hasRuntimeDefault: false;
28
+ enumValues: [string, ...string[]];
29
+ baseColumn: never;
30
+ identity: undefined;
31
+ generated: undefined;
32
+ }, {}, {
33
+ length: number | undefined;
34
+ }>;
35
+ pipelineId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
36
+ name: "pipeline_id";
37
+ tableName: "executions";
38
+ dataType: "string";
39
+ columnType: "SQLiteText";
40
+ data: string;
41
+ driverParam: string;
42
+ notNull: true;
43
+ hasDefault: false;
44
+ isPrimaryKey: false;
45
+ isAutoincrement: false;
46
+ hasRuntimeDefault: false;
47
+ enumValues: [string, ...string[]];
48
+ baseColumn: never;
49
+ identity: undefined;
50
+ generated: undefined;
51
+ }, {}, {
52
+ length: number | undefined;
53
+ }>;
54
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
55
+ name: "status";
56
+ tableName: "executions";
57
+ dataType: "string";
58
+ columnType: "SQLiteText";
59
+ data: ExecutionStatus;
60
+ driverParam: string;
61
+ notNull: true;
62
+ hasDefault: false;
63
+ isPrimaryKey: false;
64
+ isAutoincrement: false;
65
+ hasRuntimeDefault: false;
66
+ enumValues: [string, ...string[]];
67
+ baseColumn: never;
68
+ identity: undefined;
69
+ generated: undefined;
70
+ }, {}, {
71
+ length: number | undefined;
72
+ $type: ExecutionStatus;
73
+ }>;
74
+ startedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
75
+ name: "started_at";
76
+ tableName: "executions";
77
+ dataType: "date";
78
+ columnType: "SQLiteTimestamp";
79
+ data: Date;
80
+ driverParam: number;
81
+ notNull: true;
82
+ hasDefault: false;
83
+ isPrimaryKey: false;
84
+ isAutoincrement: false;
85
+ hasRuntimeDefault: false;
86
+ enumValues: undefined;
87
+ baseColumn: never;
88
+ identity: undefined;
89
+ generated: undefined;
90
+ }, {}, {}>;
91
+ completedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
92
+ name: "completed_at";
93
+ tableName: "executions";
94
+ dataType: "date";
95
+ columnType: "SQLiteTimestamp";
96
+ data: Date;
97
+ driverParam: number;
98
+ notNull: false;
99
+ hasDefault: false;
100
+ isPrimaryKey: false;
101
+ isAutoincrement: false;
102
+ hasRuntimeDefault: false;
103
+ enumValues: undefined;
104
+ baseColumn: never;
105
+ identity: undefined;
106
+ generated: undefined;
107
+ }, {}, {}>;
108
+ versions: import("drizzle-orm/sqlite-core").SQLiteColumn<{
109
+ name: "versions";
110
+ tableName: "executions";
111
+ dataType: "json";
112
+ columnType: "SQLiteTextJson";
113
+ data: string[];
114
+ driverParam: string;
115
+ notNull: false;
116
+ hasDefault: false;
117
+ isPrimaryKey: false;
118
+ isAutoincrement: false;
119
+ hasRuntimeDefault: false;
120
+ enumValues: undefined;
121
+ baseColumn: never;
122
+ identity: undefined;
123
+ generated: undefined;
124
+ }, {}, {
125
+ $type: string[];
126
+ }>;
127
+ summary: import("drizzle-orm/sqlite-core").SQLiteColumn<{
128
+ name: "summary";
129
+ tableName: "executions";
130
+ dataType: "json";
131
+ columnType: "SQLiteTextJson";
132
+ data: PipelineSummary;
133
+ driverParam: string;
134
+ notNull: false;
135
+ hasDefault: false;
136
+ isPrimaryKey: false;
137
+ isAutoincrement: false;
138
+ hasRuntimeDefault: false;
139
+ enumValues: undefined;
140
+ baseColumn: never;
141
+ identity: undefined;
142
+ generated: undefined;
143
+ }, {}, {
144
+ $type: PipelineSummary;
145
+ }>;
146
+ graph: import("drizzle-orm/sqlite-core").SQLiteColumn<{
147
+ name: "graph";
148
+ tableName: "executions";
149
+ dataType: "json";
150
+ columnType: "SQLiteTextJson";
151
+ data: PipelineGraph;
152
+ driverParam: string;
153
+ notNull: false;
154
+ hasDefault: false;
155
+ isPrimaryKey: false;
156
+ isAutoincrement: false;
157
+ hasRuntimeDefault: false;
158
+ enumValues: undefined;
159
+ baseColumn: never;
160
+ identity: undefined;
161
+ generated: undefined;
162
+ }, {}, {
163
+ $type: PipelineGraph;
164
+ }>;
165
+ error: import("drizzle-orm/sqlite-core").SQLiteColumn<{
166
+ name: "error";
167
+ tableName: "executions";
168
+ dataType: "string";
169
+ columnType: "SQLiteText";
170
+ data: string;
171
+ driverParam: string;
172
+ notNull: false;
173
+ hasDefault: false;
174
+ isPrimaryKey: false;
175
+ isAutoincrement: false;
176
+ hasRuntimeDefault: false;
177
+ enumValues: [string, ...string[]];
178
+ baseColumn: never;
179
+ identity: undefined;
180
+ generated: undefined;
181
+ }, {}, {
182
+ length: number | undefined;
183
+ }>;
184
+ };
185
+ dialect: "sqlite";
186
+ }>;
187
+ export declare const events: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
188
+ name: "events";
189
+ schema: undefined;
190
+ columns: {
191
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
192
+ name: "id";
193
+ tableName: "events";
194
+ dataType: "string";
195
+ columnType: "SQLiteText";
196
+ data: string;
197
+ driverParam: string;
198
+ notNull: true;
199
+ hasDefault: false;
200
+ isPrimaryKey: true;
201
+ isAutoincrement: false;
202
+ hasRuntimeDefault: false;
203
+ enumValues: [string, ...string[]];
204
+ baseColumn: never;
205
+ identity: undefined;
206
+ generated: undefined;
207
+ }, {}, {
208
+ length: number | undefined;
209
+ }>;
210
+ executionId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
211
+ name: "execution_id";
212
+ tableName: "events";
213
+ dataType: "string";
214
+ columnType: "SQLiteText";
215
+ data: string;
216
+ driverParam: string;
217
+ notNull: true;
218
+ hasDefault: false;
219
+ isPrimaryKey: false;
220
+ isAutoincrement: false;
221
+ hasRuntimeDefault: false;
222
+ enumValues: [string, ...string[]];
223
+ baseColumn: never;
224
+ identity: undefined;
225
+ generated: undefined;
226
+ }, {}, {
227
+ length: number | undefined;
228
+ }>;
229
+ type: import("drizzle-orm/sqlite-core").SQLiteColumn<{
230
+ name: "type";
231
+ tableName: "events";
232
+ dataType: "string";
233
+ columnType: "SQLiteText";
234
+ data: PipelineEventType;
235
+ driverParam: string;
236
+ notNull: true;
237
+ hasDefault: false;
238
+ isPrimaryKey: false;
239
+ isAutoincrement: false;
240
+ hasRuntimeDefault: false;
241
+ enumValues: [string, ...string[]];
242
+ baseColumn: never;
243
+ identity: undefined;
244
+ generated: undefined;
245
+ }, {}, {
246
+ length: number | undefined;
247
+ $type: PipelineEventType;
248
+ }>;
249
+ timestamp: import("drizzle-orm/sqlite-core").SQLiteColumn<{
250
+ name: "timestamp";
251
+ tableName: "events";
252
+ dataType: "date";
253
+ columnType: "SQLiteTimestamp";
254
+ data: Date;
255
+ driverParam: number;
256
+ notNull: true;
257
+ hasDefault: false;
258
+ isPrimaryKey: false;
259
+ isAutoincrement: false;
260
+ hasRuntimeDefault: false;
261
+ enumValues: undefined;
262
+ baseColumn: never;
263
+ identity: undefined;
264
+ generated: undefined;
265
+ }, {}, {}>;
266
+ data: import("drizzle-orm/sqlite-core").SQLiteColumn<{
267
+ name: "data";
268
+ tableName: "events";
269
+ dataType: "json";
270
+ columnType: "SQLiteTextJson";
271
+ data: PipelineEvent;
272
+ driverParam: string;
273
+ notNull: false;
274
+ hasDefault: false;
275
+ isPrimaryKey: false;
276
+ isAutoincrement: false;
277
+ hasRuntimeDefault: false;
278
+ enumValues: undefined;
279
+ baseColumn: never;
280
+ identity: undefined;
281
+ generated: undefined;
282
+ }, {}, {
283
+ $type: PipelineEvent;
284
+ }>;
285
+ };
286
+ dialect: "sqlite";
287
+ }>;
288
+ export declare const executionLogs: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
289
+ name: "execution_logs";
290
+ schema: undefined;
291
+ columns: {
292
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
293
+ name: "id";
294
+ tableName: "execution_logs";
295
+ dataType: "string";
296
+ columnType: "SQLiteText";
297
+ data: string;
298
+ driverParam: string;
299
+ notNull: true;
300
+ hasDefault: false;
301
+ isPrimaryKey: true;
302
+ isAutoincrement: false;
303
+ hasRuntimeDefault: false;
304
+ enumValues: [string, ...string[]];
305
+ baseColumn: never;
306
+ identity: undefined;
307
+ generated: undefined;
308
+ }, {}, {
309
+ length: number | undefined;
310
+ }>;
311
+ executionId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
312
+ name: "execution_id";
313
+ tableName: "execution_logs";
314
+ dataType: "string";
315
+ columnType: "SQLiteText";
316
+ data: string;
317
+ driverParam: string;
318
+ notNull: true;
319
+ hasDefault: false;
320
+ isPrimaryKey: false;
321
+ isAutoincrement: false;
322
+ hasRuntimeDefault: false;
323
+ enumValues: [string, ...string[]];
324
+ baseColumn: never;
325
+ identity: undefined;
326
+ generated: undefined;
327
+ }, {}, {
328
+ length: number | undefined;
329
+ }>;
330
+ spanId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
331
+ name: "span_id";
332
+ tableName: "execution_logs";
333
+ dataType: "string";
334
+ columnType: "SQLiteText";
335
+ data: string;
336
+ driverParam: string;
337
+ notNull: false;
338
+ hasDefault: false;
339
+ isPrimaryKey: false;
340
+ isAutoincrement: false;
341
+ hasRuntimeDefault: false;
342
+ enumValues: [string, ...string[]];
343
+ baseColumn: never;
344
+ identity: undefined;
345
+ generated: undefined;
346
+ }, {}, {
347
+ length: number | undefined;
348
+ }>;
349
+ stream: import("drizzle-orm/sqlite-core").SQLiteColumn<{
350
+ name: "stream";
351
+ tableName: "execution_logs";
352
+ dataType: "string";
353
+ columnType: "SQLiteText";
354
+ data: ExecutionLogStream;
355
+ driverParam: string;
356
+ notNull: true;
357
+ hasDefault: false;
358
+ isPrimaryKey: false;
359
+ isAutoincrement: false;
360
+ hasRuntimeDefault: false;
361
+ enumValues: [string, ...string[]];
362
+ baseColumn: never;
363
+ identity: undefined;
364
+ generated: undefined;
365
+ }, {}, {
366
+ length: number | undefined;
367
+ $type: ExecutionLogStream;
368
+ }>;
369
+ message: import("drizzle-orm/sqlite-core").SQLiteColumn<{
370
+ name: "message";
371
+ tableName: "execution_logs";
372
+ dataType: "string";
373
+ columnType: "SQLiteText";
374
+ data: string;
375
+ driverParam: string;
376
+ notNull: true;
377
+ hasDefault: false;
378
+ isPrimaryKey: false;
379
+ isAutoincrement: false;
380
+ hasRuntimeDefault: false;
381
+ enumValues: [string, ...string[]];
382
+ baseColumn: never;
383
+ identity: undefined;
384
+ generated: undefined;
385
+ }, {}, {
386
+ length: number | undefined;
387
+ }>;
388
+ timestamp: import("drizzle-orm/sqlite-core").SQLiteColumn<{
389
+ name: "timestamp";
390
+ tableName: "execution_logs";
391
+ dataType: "date";
392
+ columnType: "SQLiteTimestamp";
393
+ data: Date;
394
+ driverParam: number;
395
+ notNull: true;
396
+ hasDefault: false;
397
+ isPrimaryKey: false;
398
+ isAutoincrement: false;
399
+ hasRuntimeDefault: false;
400
+ enumValues: undefined;
401
+ baseColumn: never;
402
+ identity: undefined;
403
+ generated: undefined;
404
+ }, {}, {}>;
405
+ payload: import("drizzle-orm/sqlite-core").SQLiteColumn<{
406
+ name: "payload";
407
+ tableName: "execution_logs";
408
+ dataType: "json";
409
+ columnType: "SQLiteTextJson";
410
+ data: ExecutionLogPayload;
411
+ driverParam: string;
412
+ notNull: false;
413
+ hasDefault: false;
414
+ isPrimaryKey: false;
415
+ isAutoincrement: false;
416
+ hasRuntimeDefault: false;
417
+ enumValues: undefined;
418
+ baseColumn: never;
419
+ identity: undefined;
420
+ generated: undefined;
421
+ }, {}, {
422
+ $type: ExecutionLogPayload;
423
+ }>;
424
+ };
425
+ dialect: "sqlite";
426
+ }>;
@@ -0,0 +1,26 @@
1
+ import type { Database } from "#server/db";
2
+ import type { ExecutionLogPayload, ExecutionLogStream } from "#server/db/schema";
3
+ export interface ExecutionLogState {
4
+ capturedBytes: number;
5
+ truncated: boolean;
6
+ originalBytes: number;
7
+ }
8
+ export interface LogCaptureResult {
9
+ stored: boolean;
10
+ truncated: boolean;
11
+ bytes: number;
12
+ originalBytes: number;
13
+ limitReached: boolean;
14
+ }
15
+ export interface ExecutionLogOptions {
16
+ executionId: string;
17
+ spanId?: string;
18
+ stream: ExecutionLogStream;
19
+ message: string;
20
+ payload: ExecutionLogPayload;
21
+ timestamp?: Date;
22
+ force?: boolean;
23
+ }
24
+ export declare function storeExecutionLog(db: Database, state: ExecutionLogState, options: ExecutionLogOptions): Promise<LogCaptureResult>;
25
+ export declare function createExecutionLogState(): ExecutionLogState;
26
+ export declare function buildTruncationBanner(state: ExecutionLogState, stream: ExecutionLogStream): ExecutionLogPayload;
@@ -0,0 +1,38 @@
1
+ import type { PipelineDefinition } from "@ucdjs/pipelines-core";
2
+ import type { PipelineSource } from "@ucdjs/pipelines-loader";
3
+ import type { PipelineInfo } from "@ucdjs/pipelines-ui";
4
+ export interface FilePipelineEntry {
5
+ pipeline: PipelineDefinition;
6
+ exportName: string;
7
+ }
8
+ export interface PipelineFileGroup {
9
+ fileId: string;
10
+ filePath: string;
11
+ fileLabel: string;
12
+ sourceId: string;
13
+ pipelines: PipelineInfo[];
14
+ entries: FilePipelineEntry[];
15
+ }
16
+ export interface PipelineLoadErrorInfo {
17
+ filePath: string;
18
+ message: string;
19
+ sourceId: string;
20
+ }
21
+ export interface PipelineSourceGroup {
22
+ sourceId: string;
23
+ source: PipelineSource;
24
+ fileGroups: PipelineFileGroup[];
25
+ errors: PipelineLoadErrorInfo[];
26
+ }
27
+ export declare function buildFileGroups(sourceId: string, files: Array<{
28
+ filePath: string;
29
+ pipelines: PipelineDefinition[];
30
+ exportNames: string[];
31
+ }>): PipelineFileGroup[];
32
+ export declare function applySearchFilter(groups: PipelineFileGroup[], search: string): PipelineFileGroup[];
33
+ export declare function findFileGroup(fileId: string, fileGroups: PipelineFileGroup[]): PipelineFileGroup | null;
34
+ export declare function findPipelineByFileId(fileId: string, fileGroups: PipelineFileGroup[], pipelineId: string): {
35
+ fileGroup: PipelineFileGroup;
36
+ entry: FilePipelineEntry;
37
+ } | null;
38
+ export declare function loadPipelineFileGroups(sources: PipelineSource[]): Promise<PipelineSourceGroup[]>;
@@ -0,0 +1,5 @@
1
+ export declare const PIPELINE_FILE_SUFFIXES: readonly [".ucd-pipeline.ts", ".ts"];
2
+ export declare function stripSuffixes(fileName: string, suffixes?: readonly string[]): string;
3
+ export declare function sanitizeSegment(segment: string): string;
4
+ export declare function fileIdFromPath(filePath: string, suffixes?: readonly string[]): string;
5
+ export declare function fileLabelFromPath(filePath: string, suffixes?: readonly string[]): string;
@@ -0,0 +1,2 @@
1
+ import type { LoadPipelinesResult, PipelineSource } from "@ucdjs/pipelines-loader";
2
+ export declare function getPipelines(source: PipelineSource): Promise<LoadPipelinesResult>;
@@ -0,0 +1,6 @@
1
+ import type { Database } from "#server/db";
2
+ export interface LogCaptureController {
3
+ start: () => void;
4
+ stop: () => Promise<void>;
5
+ }
6
+ export declare function createExecutionLogCapture(db: Database): LogCaptureController;
@@ -0,0 +1 @@
1
+ export declare function resolveLocalFilePath(cwd: string, filePath: string): string;
@@ -0,0 +1,7 @@
1
+ export { pipelinesEventsRouter } from "./pipelines.events";
2
+ export { pipelinesExecutionRouter } from "./pipelines.execution";
3
+ export { pipelinesFileRouter } from "./pipelines.file";
4
+ export { pipelinesGraphRouter } from "./pipelines.graph";
5
+ export { pipelinesIndexRouter } from "./pipelines.index";
6
+ export { pipelinesLogsRouter } from "./pipelines.logs";
7
+ export { pipelinesPipelineRouter } from "./pipelines.pipeline";
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesEventsRouter: H3;
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesExecutionRouter: H3;
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesFileRouter: H3;
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesGraphRouter: H3;
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesIndexRouter: H3;
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesLogsRouter: H3;
@@ -0,0 +1,2 @@
1
+ import { H3 } from "h3";
2
+ export declare const pipelinesPipelineRouter: H3;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ucdjs/pipelines-server",
3
- "version": "0.0.1-beta.2",
3
+ "version": "0.0.1-beta.5",
4
4
  "type": "module",
5
5
  "author": {
6
6
  "name": "Lucas Nørgård",
@@ -28,7 +28,10 @@
28
28
  "#server/routes": "./src/server/routes/index.ts"
29
29
  },
30
30
  "exports": {
31
- ".": "./dist/server/app.js",
31
+ ".": {
32
+ "types": "./dist/server/app.d.ts",
33
+ "default": "./dist/server/app.js"
34
+ },
32
35
  "./package.json": "./package.json"
33
36
  },
34
37
  "files": [
@@ -48,11 +51,11 @@
48
51
  "oxc-parser": "0.112.0",
49
52
  "pathe": "2.0.3",
50
53
  "zod": "4.3.6",
51
- "@ucdjs-internal/shared-ui": "0.1.1",
52
- "@ucdjs/pipelines-executor": "0.0.1-beta.2",
53
- "@ucdjs/pipelines-ui": "0.0.1-beta.2",
54
- "@ucdjs/pipelines-loader": "0.0.1-beta.2",
55
- "@ucdjs/pipelines-core": "0.0.1-beta.2"
54
+ "@ucdjs-internal/shared-ui": "0.1.4",
55
+ "@ucdjs/pipelines-core": "0.0.1-beta.5",
56
+ "@ucdjs/pipelines-executor": "0.0.1-beta.5",
57
+ "@ucdjs/pipelines-loader": "0.0.1-beta.5",
58
+ "@ucdjs/pipelines-ui": "0.0.1-beta.5"
56
59
  },
57
60
  "devDependencies": {
58
61
  "@eslint-react/eslint-plugin": "2.12.4",
@@ -88,7 +91,8 @@
88
91
  "access": "public"
89
92
  },
90
93
  "scripts": {
91
- "build": "vite build",
94
+ "build": "vite build && pnpm build:dts",
95
+ "build:dts": "tsc --project tsconfig.dts.json",
92
96
  "dev": "vite dev --port 3031",
93
97
  "clean": "git clean -xdf dist node_modules",
94
98
  "lint": "eslint .",