@newmo/graphql-fake-server 0.1.1 → 0.3.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/LICENSE +1 -2
- package/README.md +60 -2
- package/dist/esm/bin.d.ts +3 -0
- package/dist/esm/bin.d.ts.map +1 -0
- package/dist/esm/bin.js +13 -0
- package/dist/esm/bin.js.map +1 -0
- package/dist/esm/cli.d.ts +13 -1
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +76 -74
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index.d.ts +20 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +64 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logger.d.ts +14 -0
- package/dist/esm/logger.d.ts.map +1 -0
- package/dist/esm/logger.js +23 -0
- package/dist/esm/logger.js.map +1 -0
- package/package.json +80 -95
- package/src/bin.ts +13 -0
- package/src/cli.ts +84 -85
- package/src/index.ts +85 -13
- package/src/logger.ts +30 -0
- package/dist/esm/code-generator.d.ts +0 -4
- package/dist/esm/code-generator.d.ts.map +0 -1
- package/dist/esm/code-generator.js +0 -75
- package/dist/esm/code-generator.js.map +0 -1
- package/dist/esm/config.d.ts +0 -46
- package/dist/esm/config.d.ts.map +0 -1
- package/dist/esm/config.js +0 -57
- package/dist/esm/config.js.map +0 -1
- package/dist/esm/schema-scanner.d.ts +0 -32
- package/dist/esm/schema-scanner.d.ts.map +0 -1
- package/dist/esm/schema-scanner.js +0 -221
- package/dist/esm/schema-scanner.js.map +0 -1
- package/src/code-generator.ts +0 -82
- package/src/config.ts +0 -96
- package/src/schema-scanner.ts +0 -297
package/LICENSE
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
4
|
-
Copyright (c) 2022 Yosuke Kurami
|
|
3
|
+
Copyright (c) 2024 newmo, Inc.
|
|
5
4
|
|
|
6
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -11,11 +11,69 @@ GraphQL Fake Server.
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
1. Add `@exampleID`, `@exampleString`, `@exampleInt`, `@exampleFloat`, `@exampleBoolean` directive to your schema.
|
|
15
|
+
|
|
16
|
+
```graphql
|
|
17
|
+
"""
|
|
18
|
+
@exampleID directive specifies an example value for a ID field.
|
|
19
|
+
This example value is used in the fake data.
|
|
20
|
+
ID value will be unique between all ID fake data.
|
|
21
|
+
"""
|
|
22
|
+
directive @exampleID(
|
|
23
|
+
"""
|
|
24
|
+
The value of the ID field.
|
|
25
|
+
@exampleID(value: "id")
|
|
26
|
+
"""
|
|
27
|
+
value: ID!
|
|
28
|
+
) on FIELD_DEFINITION
|
|
29
|
+
"""
|
|
30
|
+
@exampleString directive specifies an example value for a String field.
|
|
31
|
+
This example value is used in the fake data.
|
|
32
|
+
"""
|
|
33
|
+
directive @exampleString(
|
|
34
|
+
"""
|
|
35
|
+
The value of the String field.
|
|
36
|
+
@exampleString(value: "example")
|
|
37
|
+
"""
|
|
38
|
+
value: String!
|
|
39
|
+
) on FIELD_DEFINITION
|
|
40
|
+
"""
|
|
41
|
+
@exampleInt directive specifies an example value for a Inf field.
|
|
42
|
+
This example value is used in the fake data.
|
|
43
|
+
"""
|
|
44
|
+
directive @exampleInt(
|
|
45
|
+
"""
|
|
46
|
+
The value of the Int field.
|
|
47
|
+
@exampleInt(value: 1)
|
|
48
|
+
"""
|
|
49
|
+
value: Int!
|
|
50
|
+
) on FIELD_DEFINITION
|
|
51
|
+
"""
|
|
52
|
+
@exampleFloat directive specifies an example value for a Float field.
|
|
53
|
+
This example value is used in the fake data.
|
|
54
|
+
"""
|
|
55
|
+
directive @exampleFloat(
|
|
56
|
+
"""
|
|
57
|
+
The value of the Float field.
|
|
58
|
+
@exampleFloat(value: 1.0)
|
|
59
|
+
"""
|
|
60
|
+
value: Float!
|
|
61
|
+
) on FIELD_DEFINITION
|
|
62
|
+
"""
|
|
63
|
+
@exampleBoolean directive specifies an example value for a Boolean field.
|
|
64
|
+
This example value is used in the fake data.
|
|
65
|
+
"""
|
|
66
|
+
directive @exampleBoolean(
|
|
67
|
+
"""
|
|
68
|
+
The value of the Boolean field.
|
|
69
|
+
@exampleBoolean(value: true)
|
|
70
|
+
"""
|
|
71
|
+
value: Boolean!
|
|
72
|
+
) on FIELD_DEFINITION
|
|
73
|
+
```
|
|
15
74
|
|
|
16
75
|
## Usage
|
|
17
76
|
|
|
18
|
-
- [ ] Write usage instructions
|
|
19
77
|
|
|
20
78
|
## Tests
|
|
21
79
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/esm/bin.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { run } from "./cli.js";
|
|
3
|
+
const ret = await run();
|
|
4
|
+
if (typeof ret !== "function") {
|
|
5
|
+
if (ret.stdout) {
|
|
6
|
+
console.log(ret.stdout);
|
|
7
|
+
}
|
|
8
|
+
if (ret.stderr) {
|
|
9
|
+
console.error(ret.stderr);
|
|
10
|
+
}
|
|
11
|
+
process.exit(ret.exitCode);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,GAAG,GAAG,MAAM,GAAG,EAAE,CAAC;AACxB,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;IAC5B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
|
package/dist/esm/cli.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export {
|
|
2
|
+
export declare const cli: {
|
|
3
|
+
values: {
|
|
4
|
+
schema: string | undefined;
|
|
5
|
+
port: string | undefined;
|
|
6
|
+
logLevel: string | undefined;
|
|
7
|
+
};
|
|
8
|
+
positionals: [];
|
|
9
|
+
};
|
|
10
|
+
export declare const run: ({ values, }?: typeof cli) => Promise<{
|
|
11
|
+
stdout: string;
|
|
12
|
+
stderr: string | Error;
|
|
13
|
+
exitCode: number;
|
|
14
|
+
} | (() => void)>;
|
|
3
15
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/esm/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAkBA,eAAO,MAAM,GAAG;;;;;;;CAoBd,CAAC;AACH,eAAO,MAAM,GAAG,iBAEb,UAAU,KAAS,QAChB;IACI,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CACpB,GACD,CAAC,MAAM,IAAI,CAAC,CAoDjB,CAAC"}
|
package/dist/esm/cli.js
CHANGED
|
@@ -1,90 +1,92 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import fs from "node:fs/promises";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
3
|
import { parseArgs } from "node:util";
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { addMocksToSchema } from '@graphql-tools/mock';
|
|
8
|
-
import { makeExecutableSchema } from '@graphql-tools/schema';
|
|
9
|
-
import { buildSchema } from "graphql";
|
|
10
|
-
import { generateCode } from "./code-generator.js";
|
|
11
|
-
import { normalizeConfig } from "./config.js";
|
|
12
|
-
import { getTypeInfos } from "./schema-scanner.js";
|
|
4
|
+
import { buildSchema } from "graphql/utilities/index.js";
|
|
5
|
+
import { createMock, startFakeServer } from "./index.js";
|
|
6
|
+
import { createLogger } from "./logger.js";
|
|
13
7
|
const HELP = `
|
|
14
|
-
Usage:
|
|
8
|
+
Usage: npx @newmo/graphql-fake-server --schema <path> [options]
|
|
9
|
+
|
|
10
|
+
Options:
|
|
11
|
+
|
|
12
|
+
--schema <path> Path to the schema file. e.g. schema.graphql
|
|
13
|
+
--port <port> Port to run the server on
|
|
14
|
+
--logLevel <logLevel> log level: debug, info, warn, error
|
|
15
|
+
|
|
15
16
|
`;
|
|
16
17
|
// cli foo.graphql
|
|
17
|
-
const
|
|
18
|
-
args: process.argv.slice(2),
|
|
18
|
+
export const cli = parseArgs({
|
|
19
|
+
args: process.argv.slice(2),
|
|
19
20
|
options: {
|
|
21
|
+
// --schema
|
|
22
|
+
schema: {
|
|
23
|
+
type: "string",
|
|
24
|
+
description: "Path to the schema file. e.g. schema.graphql",
|
|
25
|
+
},
|
|
20
26
|
// --port
|
|
21
27
|
port: {
|
|
22
28
|
type: "string",
|
|
23
29
|
description: "Port to run the server on",
|
|
24
30
|
default: "4000",
|
|
25
31
|
},
|
|
26
|
-
|
|
27
|
-
type: "
|
|
28
|
-
description: "
|
|
29
|
-
default:
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
+
logLevel: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "log level: debug, info, warn, error",
|
|
35
|
+
default: "info",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
32
38
|
});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
console.log(`🚀 Server listening at: ${url}`);
|
|
61
|
-
};
|
|
62
|
-
try {
|
|
63
|
-
const schema = buildSchema(await fs.readFile(filePath, "utf-8"));
|
|
64
|
-
const normalizedConfig = normalizeConfig({
|
|
65
|
-
typesFile: "types.ts",
|
|
66
|
-
});
|
|
67
|
-
const typeInfos = getTypeInfos(normalizedConfig, schema);
|
|
68
|
-
const code = generateCode(normalizedConfig, typeInfos);
|
|
69
|
-
if (values.verbose) {
|
|
70
|
-
console.info("Generated code:");
|
|
71
|
-
console.info(code);
|
|
39
|
+
export const run = async ({ values, } = cli) => {
|
|
40
|
+
const logLevel = values.logLevel;
|
|
41
|
+
if (!logLevel || !["debug", "info", "warn", "error"].includes(logLevel)) {
|
|
42
|
+
return {
|
|
43
|
+
stdout: "",
|
|
44
|
+
stderr: "--logLevel must be one of debug, info, warn, error",
|
|
45
|
+
exitCode: 1,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const logger = createLogger(logLevel);
|
|
49
|
+
const schemaPath = values.schema;
|
|
50
|
+
if (!schemaPath) {
|
|
51
|
+
logger.info(HELP);
|
|
52
|
+
return {
|
|
53
|
+
stdout: "",
|
|
54
|
+
stderr: "--schema is required",
|
|
55
|
+
exitCode: 1,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const port = values.port ? Number.parseInt(values.port, 10) : Number.NaN;
|
|
59
|
+
if (Number.isNaN(port)) {
|
|
60
|
+
logger.info(HELP);
|
|
61
|
+
return {
|
|
62
|
+
stdout: "",
|
|
63
|
+
stderr: "--port must be a number",
|
|
64
|
+
exitCode: 1,
|
|
65
|
+
};
|
|
72
66
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
67
|
+
try {
|
|
68
|
+
const schema = buildSchema(await fs.readFile(schemaPath, "utf-8"));
|
|
69
|
+
const mockObject = await createMock({
|
|
70
|
+
schema,
|
|
71
|
+
logLevel: logLevel,
|
|
72
|
+
});
|
|
73
|
+
const closeServer = await startFakeServer({
|
|
74
|
+
mockObject,
|
|
75
|
+
port,
|
|
76
|
+
schema,
|
|
77
|
+
});
|
|
78
|
+
// TODO: more readable output?
|
|
79
|
+
return closeServer;
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger.error(error);
|
|
83
|
+
return {
|
|
84
|
+
stdout: "",
|
|
85
|
+
stderr: new Error("Failed to start server", {
|
|
86
|
+
cause: error,
|
|
87
|
+
}),
|
|
88
|
+
exitCode: 1,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
};
|
|
90
92
|
//# sourceMappingURL=cli.js.map
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { GraphQLSchema } from "graphql";
|
|
2
|
+
import { type LogLevel } from "./logger.js";
|
|
3
|
+
export type MockObject = Record<string, unknown>;
|
|
4
|
+
export type StartFakeServerOptions = {
|
|
5
|
+
schema: GraphQLSchema;
|
|
6
|
+
mockObject: MockObject;
|
|
7
|
+
port?: number;
|
|
8
|
+
logLevel?: LogLevel;
|
|
9
|
+
};
|
|
10
|
+
export declare const startFakeServer: ({ schema, mockObject, port, logLevel, }: StartFakeServerOptions) => Promise<() => void>;
|
|
11
|
+
export type GenerateMockOptions = {
|
|
12
|
+
schema: GraphQLSchema;
|
|
13
|
+
logLevel?: LogLevel;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Create mock object from schema
|
|
17
|
+
* It supports @example directive
|
|
18
|
+
* @param options
|
|
19
|
+
*/
|
|
20
|
+
export declare const createMock: (options: GenerateMockOptions) => Promise<MockObject>;
|
|
3
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,MAAM,sBAAsB,GAAG;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB,CAAC;AACF,eAAO,MAAM,eAAe,4CAKzB,sBAAsB,wBAsBxB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,UAAU,YAAmB,mBAAmB,KAAG,QAAQ,UAAU,CA4BjF,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,12 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import vm from "node:vm";
|
|
2
|
+
import { ApolloServer } from "@apollo/server";
|
|
3
|
+
import { startStandaloneServer } from "@apollo/server/standalone";
|
|
4
|
+
import { addMocksToSchema } from "@graphql-tools/mock";
|
|
5
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
6
|
+
import { generateCode, getTypeInfos, normalizeConfig } from "@newmo/graphql-fake-core";
|
|
7
|
+
//@ts-expect-error
|
|
8
|
+
import depthLimit from "graphql-depth-limit";
|
|
9
|
+
import { createLogger } from "./logger.js";
|
|
10
|
+
export const startFakeServer = async ({ schema, mockObject, port, logLevel, }) => {
|
|
11
|
+
const logger = createLogger(logLevel);
|
|
12
|
+
const mocks = Object.fromEntries(Object.entries(mockObject).map(([key, value]) => {
|
|
13
|
+
return [key, () => value];
|
|
14
|
+
}));
|
|
15
|
+
const server = new ApolloServer({
|
|
16
|
+
schema: addMocksToSchema({
|
|
17
|
+
schema: makeExecutableSchema({
|
|
18
|
+
typeDefs: schema,
|
|
19
|
+
}),
|
|
20
|
+
mocks,
|
|
21
|
+
}),
|
|
22
|
+
validationRules: [depthLimit(3)],
|
|
23
|
+
});
|
|
24
|
+
const { url } = await startStandaloneServer(server, { listen: { port: port } });
|
|
25
|
+
logger.info(`🚀 Server listening at: ${url}`);
|
|
26
|
+
return () => {
|
|
27
|
+
// close
|
|
28
|
+
server.stop();
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
const cloneAsJSON = (obj) => {
|
|
32
|
+
return JSON.parse(JSON.stringify(obj));
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Create mock object from schema
|
|
36
|
+
* It supports @example directive
|
|
37
|
+
* @param options
|
|
38
|
+
*/
|
|
39
|
+
export const createMock = async (options) => {
|
|
40
|
+
const logger = createLogger(options.logLevel);
|
|
41
|
+
try {
|
|
42
|
+
const normalizedConfig = normalizeConfig({
|
|
43
|
+
maxFieldRecursionDepth: 4,
|
|
44
|
+
});
|
|
45
|
+
const typeInfos = getTypeInfos(normalizedConfig, options.schema);
|
|
46
|
+
const code = generateCode({
|
|
47
|
+
...normalizedConfig,
|
|
48
|
+
outputType: "commonjs",
|
|
49
|
+
}, typeInfos);
|
|
50
|
+
logger.debug("Generated code:");
|
|
51
|
+
logger.debug(code);
|
|
52
|
+
// execute code in vm and get all exports
|
|
53
|
+
const exports = {};
|
|
54
|
+
vm.runInNewContext(code, { exports });
|
|
55
|
+
// Apollo Server does not support Function type in mock object
|
|
56
|
+
const plainObject = cloneAsJSON(exports);
|
|
57
|
+
logger.debug("Exports:");
|
|
58
|
+
logger.debug(JSON.stringify(plainObject, null, 2));
|
|
59
|
+
return plainObject;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.error(error);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
11
65
|
};
|
|
12
66
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* if logLevel is debug, log all logs
|
|
3
|
+
* if logLevel is info, log info, warn, error
|
|
4
|
+
* if logLevel is warn, log warn, error
|
|
5
|
+
* if logLevel is error, log error
|
|
6
|
+
*/
|
|
7
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
8
|
+
export declare const createLogger: (logLevel?: LogLevel) => {
|
|
9
|
+
debug: (...args: unknown[]) => void;
|
|
10
|
+
info: (...args: unknown[]) => void;
|
|
11
|
+
warn: (...args: unknown[]) => void;
|
|
12
|
+
error: (...args: unknown[]) => void;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,eAAO,MAAM,YAAY,cAAc,QAAQ;qBAEtB,OAAO,EAAE;oBAKV,OAAO,EAAE;oBAKT,OAAO,EAAE;qBAKR,OAAO,EAAE;CAIjC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const createLogger = (logLevel = "info") => {
|
|
2
|
+
return {
|
|
3
|
+
debug: (...args) => {
|
|
4
|
+
if (logLevel === "debug") {
|
|
5
|
+
console.debug(...args);
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
info: (...args) => {
|
|
9
|
+
if (logLevel === "debug" || logLevel === "info") {
|
|
10
|
+
console.info(...args);
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
warn: (...args) => {
|
|
14
|
+
if (logLevel === "debug" || logLevel === "info" || logLevel === "warn") {
|
|
15
|
+
console.warn(...args);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
error: (...args) => {
|
|
19
|
+
console.error(...args);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAqB,MAAM,EAAE,EAAE;IACxD,OAAO;QACH,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC1B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YACzB,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YACzB,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC,CAAC"}
|