@player-ui/player 0.8.0--canary.307.9621 → 0.8.0-next.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/dist/Player.native.js +11630 -0
- package/dist/Player.native.js.map +1 -0
- package/dist/cjs/index.cjs +5626 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/{index.esm.js → index.legacy-esm.js} +2044 -1667
- package/dist/{index.cjs.js → index.mjs} +2052 -1761
- package/dist/index.mjs.map +1 -0
- package/package.json +29 -63
- package/src/__tests__/data.test.ts +498 -0
- package/src/__tests__/flow.test.ts +312 -0
- package/src/__tests__/helpers/action-exp.plugin.ts +22 -0
- package/src/__tests__/helpers/actions.flow.ts +67 -0
- package/src/__tests__/helpers/binding.plugin.ts +125 -0
- package/src/__tests__/helpers/expression.plugin.ts +88 -0
- package/src/__tests__/helpers/transform-plugin.ts +19 -0
- package/src/__tests__/helpers/validation.flow.ts +56 -0
- package/src/__tests__/player.test.ts +597 -0
- package/src/__tests__/string-resolver.test.ts +186 -0
- package/src/__tests__/validation.test.ts +3555 -0
- package/src/__tests__/view.test.ts +715 -0
- package/src/binding/__tests__/binding.test.ts +113 -0
- package/src/binding/__tests__/index.test.ts +208 -0
- package/src/binding/__tests__/resolver.test.ts +83 -0
- package/src/binding/binding.ts +6 -6
- package/src/binding/index.ts +34 -34
- package/src/binding/resolver.ts +19 -19
- package/src/binding/utils.ts +7 -7
- package/src/binding-grammar/__tests__/parser.test.ts +64 -0
- package/src/binding-grammar/__tests__/test-utils/ast-cases.ts +198 -0
- package/src/binding-grammar/__tests__/test-utils/perf-test.ts +66 -0
- package/src/binding-grammar/ast.ts +11 -11
- package/src/binding-grammar/custom/index.ts +19 -22
- package/src/binding-grammar/ebnf/index.ts +20 -21
- package/src/binding-grammar/ebnf/types.ts +13 -13
- package/src/binding-grammar/index.ts +4 -4
- package/src/binding-grammar/parsimmon/index.ts +14 -14
- package/src/controllers/constants/__tests__/index.test.ts +106 -0
- package/src/controllers/constants/index.ts +3 -3
- package/src/controllers/constants/utils.ts +4 -4
- package/src/controllers/data/controller.ts +22 -22
- package/src/controllers/data/index.ts +1 -1
- package/src/controllers/data/utils.ts +7 -7
- package/src/controllers/flow/__tests__/controller.test.ts +195 -0
- package/src/controllers/flow/__tests__/flow.test.ts +381 -0
- package/src/controllers/flow/controller.ts +13 -13
- package/src/controllers/flow/flow.ts +23 -23
- package/src/controllers/flow/index.ts +2 -2
- package/src/controllers/index.ts +5 -5
- package/src/controllers/validation/binding-tracker.ts +71 -59
- package/src/controllers/validation/controller.ts +104 -104
- package/src/controllers/validation/index.ts +2 -2
- package/src/controllers/view/asset-transform.ts +20 -20
- package/src/controllers/view/controller.ts +27 -27
- package/src/controllers/view/index.ts +4 -4
- package/src/controllers/view/store.ts +3 -3
- package/src/controllers/view/types.ts +7 -7
- package/src/data/__tests__/__snapshots__/dependency-tracker.test.ts.snap +64 -0
- package/src/data/__tests__/dependency-tracker.test.ts +146 -0
- package/src/data/__tests__/local-model.test.ts +46 -0
- package/src/data/__tests__/model.test.ts +78 -0
- package/src/data/dependency-tracker.ts +16 -16
- package/src/data/index.ts +4 -4
- package/src/data/local-model.ts +6 -6
- package/src/data/model.ts +17 -17
- package/src/data/noop-model.ts +1 -1
- package/src/expressions/__tests__/__snapshots__/parser.test.ts.snap +854 -0
- package/src/expressions/__tests__/evaluator-functions.test.ts +47 -0
- package/src/expressions/__tests__/evaluator.test.ts +410 -0
- package/src/expressions/__tests__/parser.test.ts +115 -0
- package/src/expressions/__tests__/utils.test.ts +44 -0
- package/src/expressions/evaluator-functions.ts +6 -6
- package/src/expressions/evaluator.ts +71 -67
- package/src/expressions/index.ts +4 -4
- package/src/expressions/parser.ts +102 -105
- package/src/expressions/types.ts +29 -21
- package/src/expressions/utils.ts +32 -21
- package/src/index.ts +13 -13
- package/src/logger/__tests__/consoleLogger.test.ts +46 -0
- package/src/logger/__tests__/noopLogger.test.ts +13 -0
- package/src/logger/__tests__/proxyLogger.test.ts +31 -0
- package/src/logger/__tests__/tapableLogger.test.ts +41 -0
- package/src/logger/consoleLogger.ts +9 -9
- package/src/logger/index.ts +5 -5
- package/src/logger/noopLogger.ts +1 -1
- package/src/logger/proxyLogger.ts +6 -6
- package/src/logger/tapableLogger.ts +7 -7
- package/src/logger/types.ts +2 -2
- package/src/player.ts +60 -58
- package/src/plugins/default-exp-plugin.ts +10 -10
- package/src/plugins/default-view-plugin.ts +29 -0
- package/src/plugins/flow-exp-plugin.ts +6 -6
- package/src/schema/__tests__/schema.test.ts +243 -0
- package/src/schema/index.ts +2 -2
- package/src/schema/schema.ts +24 -24
- package/src/schema/types.ts +4 -4
- package/src/string-resolver/__tests__/index.test.ts +361 -0
- package/src/string-resolver/index.ts +17 -17
- package/src/types.ts +17 -17
- package/src/utils/__tests__/replaceParams.test.ts +33 -0
- package/src/utils/index.ts +1 -1
- package/src/utils/replaceParams.ts +1 -1
- package/src/validator/__tests__/binding-map-splice.test.ts +53 -0
- package/src/validator/__tests__/validation-middleware.test.ts +127 -0
- package/src/validator/binding-map-splice.ts +5 -5
- package/src/validator/index.ts +4 -4
- package/src/validator/registry.ts +1 -1
- package/src/validator/types.ts +13 -13
- package/src/validator/validation-middleware.ts +15 -15
- package/src/view/__tests__/view.immutable.test.ts +269 -0
- package/src/view/__tests__/view.test.ts +959 -0
- package/src/view/builder/index.test.ts +69 -0
- package/src/view/builder/index.ts +3 -3
- package/src/view/index.ts +5 -5
- package/src/view/parser/__tests__/__snapshots__/parser.test.ts.snap +394 -0
- package/src/view/parser/__tests__/parser.test.ts +264 -0
- package/src/view/parser/index.ts +43 -33
- package/src/view/parser/types.ts +11 -11
- package/src/view/parser/utils.ts +5 -5
- package/src/view/plugins/__tests__/__snapshots__/template.test.ts.snap +278 -0
- package/src/view/plugins/__tests__/applicability.test.ts +265 -0
- package/src/view/plugins/__tests__/string.test.ts +122 -0
- package/src/view/plugins/__tests__/template.test.ts +724 -0
- package/src/view/plugins/applicability.ts +19 -19
- package/src/view/plugins/index.ts +4 -5
- package/src/view/plugins/options.ts +1 -1
- package/src/view/plugins/string-resolver.ts +22 -22
- package/src/view/plugins/switch.ts +22 -23
- package/src/view/plugins/template-plugin.ts +26 -27
- package/src/view/resolver/__tests__/dependencies.test.ts +321 -0
- package/src/view/resolver/__tests__/edgecases.test.ts +626 -0
- package/src/view/resolver/index.ts +42 -42
- package/src/view/resolver/types.ts +21 -20
- package/src/view/resolver/utils.ts +9 -9
- package/src/view/view.ts +32 -22
- package/types/binding/binding.d.ts +50 -0
- package/types/binding/index.d.ts +29 -0
- package/types/binding/resolver.d.ts +26 -0
- package/types/binding/utils.d.ts +12 -0
- package/types/binding-grammar/ast.d.ts +67 -0
- package/types/binding-grammar/custom/index.d.ts +4 -0
- package/types/binding-grammar/ebnf/index.d.ts +4 -0
- package/types/binding-grammar/ebnf/types.d.ts +75 -0
- package/types/binding-grammar/index.d.ts +5 -0
- package/types/binding-grammar/parsimmon/index.d.ts +4 -0
- package/types/controllers/constants/index.d.ts +45 -0
- package/types/controllers/constants/utils.d.ts +6 -0
- package/types/controllers/data/controller.d.ts +45 -0
- package/types/controllers/data/index.d.ts +2 -0
- package/types/controllers/data/utils.d.ts +14 -0
- package/types/controllers/flow/controller.d.ts +25 -0
- package/types/controllers/flow/flow.d.ts +50 -0
- package/types/controllers/flow/index.d.ts +3 -0
- package/types/controllers/index.d.ts +6 -0
- package/types/controllers/validation/binding-tracker.d.ts +32 -0
- package/types/controllers/validation/controller.d.ts +151 -0
- package/types/controllers/validation/index.d.ts +3 -0
- package/types/controllers/view/asset-transform.d.ts +19 -0
- package/types/controllers/view/controller.d.ts +37 -0
- package/types/controllers/view/index.d.ts +5 -0
- package/types/controllers/view/store.d.ts +20 -0
- package/types/controllers/view/types.d.ts +16 -0
- package/types/data/dependency-tracker.d.ts +49 -0
- package/types/data/index.d.ts +5 -0
- package/types/data/local-model.d.ts +16 -0
- package/types/data/model.d.ts +86 -0
- package/types/data/noop-model.d.ts +13 -0
- package/types/expressions/evaluator-functions.d.ts +15 -0
- package/types/expressions/evaluator.d.ts +52 -0
- package/types/expressions/index.d.ts +5 -0
- package/types/expressions/parser.d.ts +10 -0
- package/types/expressions/types.d.ts +144 -0
- package/types/expressions/utils.d.ts +12 -0
- package/types/index.d.ts +14 -0
- package/types/logger/consoleLogger.d.ts +17 -0
- package/types/logger/index.d.ts +6 -0
- package/types/logger/noopLogger.d.ts +10 -0
- package/types/logger/proxyLogger.d.ts +15 -0
- package/types/logger/tapableLogger.d.ts +23 -0
- package/types/logger/types.d.ts +6 -0
- package/types/player.d.ts +101 -0
- package/types/plugins/default-exp-plugin.d.ts +9 -0
- package/types/plugins/default-view-plugin.d.ts +9 -0
- package/types/plugins/flow-exp-plugin.d.ts +11 -0
- package/types/schema/index.d.ts +3 -0
- package/types/schema/schema.d.ts +36 -0
- package/types/schema/types.d.ts +38 -0
- package/types/string-resolver/index.d.ts +30 -0
- package/types/types.d.ts +73 -0
- package/types/utils/index.d.ts +2 -0
- package/types/utils/replaceParams.d.ts +9 -0
- package/types/validator/binding-map-splice.d.ts +10 -0
- package/types/validator/index.d.ts +5 -0
- package/types/validator/registry.d.ts +11 -0
- package/types/validator/types.d.ts +53 -0
- package/types/validator/validation-middleware.d.ts +36 -0
- package/types/view/builder/index.d.ts +35 -0
- package/types/view/index.d.ts +6 -0
- package/types/view/parser/index.d.ts +52 -0
- package/types/view/parser/types.d.ts +109 -0
- package/types/view/parser/utils.d.ts +6 -0
- package/types/view/plugins/applicability.d.ts +10 -0
- package/types/view/plugins/index.d.ts +5 -0
- package/types/view/plugins/options.d.ts +4 -0
- package/types/view/plugins/string-resolver.d.ts +13 -0
- package/types/view/plugins/switch.d.ts +14 -0
- package/types/view/plugins/template-plugin.d.ts +33 -0
- package/types/view/resolver/index.d.ts +73 -0
- package/types/view/resolver/types.d.ts +129 -0
- package/types/view/resolver/utils.d.ts +11 -0
- package/types/view/view.d.ts +37 -0
- package/dist/index.d.ts +0 -1814
- package/dist/player.dev.js +0 -11472
- package/dist/player.prod.js +0 -2
- package/src/view/plugins/plugin.ts +0 -21
package/src/expressions/utils.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { isExpressionNode } from
|
|
1
|
+
import { isExpressionNode } from "./types";
|
|
2
2
|
import type {
|
|
3
|
+
ErrorWithLocation,
|
|
3
4
|
ExpressionHandler,
|
|
4
5
|
ExpressionNode,
|
|
5
6
|
ExpressionObjectType,
|
|
6
7
|
ExpressionType,
|
|
7
8
|
NodeLocation,
|
|
8
9
|
NodePosition,
|
|
9
|
-
} from
|
|
10
|
+
} from "./types";
|
|
10
11
|
|
|
11
12
|
/** Generates a function by removing the first context argument */
|
|
12
13
|
export function withoutContext<T extends unknown[], Return>(
|
|
13
|
-
fn: (...args: T) => Return
|
|
14
|
+
fn: (...args: T) => Return,
|
|
14
15
|
): ExpressionHandler<T, Return> {
|
|
15
16
|
return (_context, ...args) => fn(...args);
|
|
16
17
|
}
|
|
@@ -26,16 +27,16 @@ function isInRange(position: NodePosition, location: NodeLocation) {
|
|
|
26
27
|
/** Get the node in the expression that's closest to the desired position */
|
|
27
28
|
export function findClosestNodeAtPosition(
|
|
28
29
|
node: ExpressionNode,
|
|
29
|
-
position: NodePosition
|
|
30
|
+
position: NodePosition,
|
|
30
31
|
): ExpressionNode | undefined {
|
|
31
32
|
// This is just mapping recursively over nodes in the tree
|
|
32
33
|
|
|
33
34
|
// eslint-disable-next-line default-case
|
|
34
35
|
switch (node.type) {
|
|
35
|
-
case
|
|
36
|
-
case
|
|
37
|
-
case
|
|
38
|
-
case
|
|
36
|
+
case "Modification":
|
|
37
|
+
case "Assignment":
|
|
38
|
+
case "LogicalExpression":
|
|
39
|
+
case "BinaryExpression": {
|
|
39
40
|
const check =
|
|
40
41
|
findClosestNodeAtPosition(node.left, position) ??
|
|
41
42
|
findClosestNodeAtPosition(node.right, position);
|
|
@@ -46,7 +47,7 @@ export function findClosestNodeAtPosition(
|
|
|
46
47
|
break;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
case
|
|
50
|
+
case "UnaryExpression": {
|
|
50
51
|
const checkArg = findClosestNodeAtPosition(node.argument, position);
|
|
51
52
|
if (checkArg) {
|
|
52
53
|
return checkArg;
|
|
@@ -55,7 +56,7 @@ export function findClosestNodeAtPosition(
|
|
|
55
56
|
break;
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
case
|
|
59
|
+
case "MemberExpression": {
|
|
59
60
|
const checkObject =
|
|
60
61
|
findClosestNodeAtPosition(node.object, position) ??
|
|
61
62
|
findClosestNodeAtPosition(node.property, position);
|
|
@@ -66,7 +67,7 @@ export function findClosestNodeAtPosition(
|
|
|
66
67
|
break;
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
case
|
|
70
|
+
case "ConditionalExpression": {
|
|
70
71
|
const checkObject =
|
|
71
72
|
findClosestNodeAtPosition(node.test, position) ??
|
|
72
73
|
findClosestNodeAtPosition(node.consequent, position) ??
|
|
@@ -78,13 +79,13 @@ export function findClosestNodeAtPosition(
|
|
|
78
79
|
break;
|
|
79
80
|
}
|
|
80
81
|
|
|
81
|
-
case
|
|
82
|
-
case
|
|
82
|
+
case "ArrayExpression":
|
|
83
|
+
case "Compound": {
|
|
83
84
|
const elements =
|
|
84
|
-
node.type ===
|
|
85
|
+
node.type === "ArrayExpression" ? node.elements : node.body;
|
|
85
86
|
|
|
86
87
|
const anyElements = elements.find((e) =>
|
|
87
|
-
findClosestNodeAtPosition(e, position)
|
|
88
|
+
findClosestNodeAtPosition(e, position),
|
|
88
89
|
);
|
|
89
90
|
|
|
90
91
|
if (anyElements) {
|
|
@@ -94,7 +95,7 @@ export function findClosestNodeAtPosition(
|
|
|
94
95
|
break;
|
|
95
96
|
}
|
|
96
97
|
|
|
97
|
-
case
|
|
98
|
+
case "Object": {
|
|
98
99
|
const checkObject = node.attributes.reduce<ExpressionNode | undefined>(
|
|
99
100
|
(found, next) => {
|
|
100
101
|
return (
|
|
@@ -103,7 +104,7 @@ export function findClosestNodeAtPosition(
|
|
|
103
104
|
findClosestNodeAtPosition(next.value, position)
|
|
104
105
|
);
|
|
105
106
|
},
|
|
106
|
-
undefined
|
|
107
|
+
undefined,
|
|
107
108
|
);
|
|
108
109
|
|
|
109
110
|
if (checkObject) {
|
|
@@ -113,7 +114,7 @@ export function findClosestNodeAtPosition(
|
|
|
113
114
|
break;
|
|
114
115
|
}
|
|
115
116
|
|
|
116
|
-
case
|
|
117
|
+
case "CallExpression": {
|
|
117
118
|
const anyArgs =
|
|
118
119
|
node.args.find((arg) => {
|
|
119
120
|
return findClosestNodeAtPosition(arg, position);
|
|
@@ -135,16 +136,26 @@ export function findClosestNodeAtPosition(
|
|
|
135
136
|
|
|
136
137
|
/** Checks if the expression is a simple type */
|
|
137
138
|
export function isObjectExpression(
|
|
138
|
-
expr: ExpressionType
|
|
139
|
+
expr: ExpressionType,
|
|
139
140
|
): expr is ExpressionObjectType {
|
|
140
141
|
if (isExpressionNode(expr)) {
|
|
141
142
|
return false;
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
return (
|
|
145
|
-
typeof expr ===
|
|
146
|
+
typeof expr === "object" &&
|
|
146
147
|
expr !== null &&
|
|
147
148
|
!Array.isArray(expr) &&
|
|
148
|
-
|
|
149
|
+
"value" in expr
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Type guard for ErrorWithLocation
|
|
155
|
+
*/
|
|
156
|
+
export function isErrorWithLocation(error: Error): error is ErrorWithLocation {
|
|
157
|
+
return (
|
|
158
|
+
(error as ErrorWithLocation).index !== undefined &&
|
|
159
|
+
(error as ErrorWithLocation).description !== undefined
|
|
149
160
|
);
|
|
150
161
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// Add the types export first so it's naming takes precedence
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
9
|
-
export * from
|
|
10
|
-
export * from
|
|
2
|
+
export * from "@player-ui/types";
|
|
3
|
+
export * from "./binding/index";
|
|
4
|
+
export * from "./data/index";
|
|
5
|
+
export * from "./expressions/index";
|
|
6
|
+
export * from "./logger/index";
|
|
7
|
+
export * from "./schema/index";
|
|
8
|
+
export * from "./string-resolver/index";
|
|
9
|
+
export * from "./validator/index";
|
|
10
|
+
export * from "./view/index";
|
|
11
11
|
|
|
12
|
-
export * from
|
|
13
|
-
export * from
|
|
14
|
-
export * from
|
|
15
|
-
export * from
|
|
12
|
+
export * from "./player";
|
|
13
|
+
export * from "./controllers/index";
|
|
14
|
+
export * from "./types";
|
|
15
|
+
export * from "./plugins/flow-exp-plugin";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, it, expect, vitest, beforeEach } from "vitest";
|
|
2
|
+
import { ConsoleLogger } from "..";
|
|
3
|
+
import type { ConsoleHandler } from "../consoleLogger";
|
|
4
|
+
|
|
5
|
+
describe("console logger", () => {
|
|
6
|
+
let consoleFns: ConsoleHandler;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
consoleFns = {
|
|
10
|
+
log: vitest.fn(),
|
|
11
|
+
warn: vitest.fn(),
|
|
12
|
+
error: vitest.fn(),
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("calls console fns", () => {
|
|
17
|
+
const logger = new ConsoleLogger("warn", consoleFns);
|
|
18
|
+
logger.warn("test warning");
|
|
19
|
+
|
|
20
|
+
expect(consoleFns.warn).toBeCalledTimes(1);
|
|
21
|
+
expect(consoleFns.warn).toBeCalledWith("player - warn -", "test warning");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("handles severity", () => {
|
|
25
|
+
const logger = new ConsoleLogger("warn", consoleFns);
|
|
26
|
+
logger.warn("test warning");
|
|
27
|
+
expect(consoleFns.warn).toBeCalledTimes(1);
|
|
28
|
+
|
|
29
|
+
logger.info("test info");
|
|
30
|
+
expect(consoleFns.log).toBeCalledTimes(0);
|
|
31
|
+
|
|
32
|
+
logger.setSeverity("info");
|
|
33
|
+
logger.info("test info");
|
|
34
|
+
expect(consoleFns.log).toBeCalledTimes(1);
|
|
35
|
+
expect(consoleFns.log).toBeCalledWith("player - info -", "test info");
|
|
36
|
+
|
|
37
|
+
logger.setSeverity("trace");
|
|
38
|
+
logger.debug("test debug");
|
|
39
|
+
expect(consoleFns.log).toBeCalledTimes(2);
|
|
40
|
+
expect(consoleFns.log).toBeCalledWith("player - debug -", "test debug");
|
|
41
|
+
|
|
42
|
+
logger.error("errrr");
|
|
43
|
+
expect(consoleFns.error).toBeCalledTimes(1);
|
|
44
|
+
expect(consoleFns.error).toBeCalledWith("player - error -", "errrr");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { test, expect } from "vitest";
|
|
2
|
+
import { NoopLogger, severities } from "..";
|
|
3
|
+
import type { LogFn } from "../types";
|
|
4
|
+
|
|
5
|
+
test("does nothing - like it should", () => {
|
|
6
|
+
const logger = new NoopLogger();
|
|
7
|
+
|
|
8
|
+
severities.forEach((s) => {
|
|
9
|
+
(logger[s] as LogFn)("foo");
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
expect(true).toBe(true);
|
|
13
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { test, expect, vitest } from "vitest";
|
|
2
|
+
import type { Logger } from "../types";
|
|
3
|
+
import ProxyLogger from "../proxyLogger";
|
|
4
|
+
|
|
5
|
+
test("proxyLogger works with no logger", () => {
|
|
6
|
+
const proxyLogger = new ProxyLogger(() => undefined);
|
|
7
|
+
expect(() => proxyLogger.info("foo")).not.toThrow();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test("calls real logger when set", () => {
|
|
11
|
+
const testLogger: Logger = {
|
|
12
|
+
trace: vitest.fn(),
|
|
13
|
+
debug: vitest.fn(),
|
|
14
|
+
info: vitest.fn(),
|
|
15
|
+
warn: vitest.fn(),
|
|
16
|
+
error: vitest.fn(),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
let useTestLogger = false;
|
|
20
|
+
|
|
21
|
+
const proxyLogger = new ProxyLogger(() =>
|
|
22
|
+
useTestLogger ? testLogger : undefined,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
proxyLogger.error("err");
|
|
26
|
+
expect(testLogger.error).toBeCalledTimes(0);
|
|
27
|
+
|
|
28
|
+
useTestLogger = true;
|
|
29
|
+
proxyLogger.error("err");
|
|
30
|
+
expect(testLogger.error).toBeCalledTimes(1);
|
|
31
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { test, expect, vitest } from "vitest";
|
|
2
|
+
import { TapableLogger } from "..";
|
|
3
|
+
import type { Logger } from "../types";
|
|
4
|
+
import { severities } from "../types";
|
|
5
|
+
|
|
6
|
+
test("works via logger api", () => {
|
|
7
|
+
const logger = new TapableLogger();
|
|
8
|
+
|
|
9
|
+
const testLogger: Logger = {
|
|
10
|
+
trace: vitest.fn(),
|
|
11
|
+
debug: vitest.fn(),
|
|
12
|
+
info: vitest.fn(),
|
|
13
|
+
warn: vitest.fn(),
|
|
14
|
+
error: vitest.fn(),
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
logger.addHandler(testLogger);
|
|
18
|
+
|
|
19
|
+
severities.forEach((s) => {
|
|
20
|
+
logger[s](s);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
severities.forEach((s) => {
|
|
24
|
+
expect(testLogger[s]).toBeCalledTimes(1);
|
|
25
|
+
expect(testLogger[s]).toBeCalledWith(s);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
severities.forEach((s) => {
|
|
29
|
+
(testLogger[s] as jest.Mock<any, any>).mockClear();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
logger.removeHandler(testLogger);
|
|
33
|
+
|
|
34
|
+
severities.forEach((s) => {
|
|
35
|
+
logger[s](s);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
severities.forEach((s) => {
|
|
39
|
+
expect(testLogger[s]).toBeCalledTimes(0);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { Logger, Severity } from
|
|
2
|
-
import { severities } from
|
|
1
|
+
import type { Logger, Severity } from "./types";
|
|
2
|
+
import { severities } from "./types";
|
|
3
3
|
|
|
4
|
-
export type ConsoleHandler = Pick<typeof console,
|
|
4
|
+
export type ConsoleHandler = Pick<typeof console, "log" | "warn" | "error">;
|
|
5
5
|
|
|
6
6
|
/** A Logger implementation that uses console */
|
|
7
7
|
export default class ConsoleLogger implements Logger {
|
|
8
8
|
private severity: Severity;
|
|
9
9
|
private _console: ConsoleHandler;
|
|
10
10
|
|
|
11
|
-
constructor(severity: Severity =
|
|
11
|
+
constructor(severity: Severity = "warn", _console: ConsoleHandler = console) {
|
|
12
12
|
this.severity = severity;
|
|
13
13
|
this._console = _console;
|
|
14
14
|
}
|
|
@@ -41,9 +41,9 @@ export default class ConsoleLogger implements Logger {
|
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
public readonly trace = this.createHandler(
|
|
45
|
-
public readonly debug = this.createHandler(
|
|
46
|
-
public readonly info = this.createHandler(
|
|
47
|
-
public readonly warn = this.createHandler(
|
|
48
|
-
public readonly error = this.createHandler(
|
|
44
|
+
public readonly trace = this.createHandler("trace");
|
|
45
|
+
public readonly debug = this.createHandler("debug");
|
|
46
|
+
public readonly info = this.createHandler("info");
|
|
47
|
+
public readonly warn = this.createHandler("warn");
|
|
48
|
+
public readonly error = this.createHandler("error");
|
|
49
49
|
}
|
package/src/logger/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export { default as ConsoleLogger } from
|
|
3
|
-
export { default as NoopLogger } from
|
|
4
|
-
export { default as TapableLogger } from
|
|
5
|
-
export { default as ProxyLogger } from
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export { default as ConsoleLogger } from "./consoleLogger";
|
|
3
|
+
export { default as NoopLogger } from "./noopLogger";
|
|
4
|
+
export { default as TapableLogger } from "./tapableLogger";
|
|
5
|
+
export { default as ProxyLogger } from "./proxyLogger";
|
package/src/logger/noopLogger.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Logger, Severity, LoggerProvider } from
|
|
1
|
+
import type { Logger, Severity, LoggerProvider } from "./types";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* The ProxyLogger allows a user to log to another Logger instance that may not exist yet
|
|
@@ -17,9 +17,9 @@ export default class ProxyLogger implements Logger {
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public readonly trace = this.createHandler(
|
|
21
|
-
public readonly debug = this.createHandler(
|
|
22
|
-
public readonly info = this.createHandler(
|
|
23
|
-
public readonly warn = this.createHandler(
|
|
24
|
-
public readonly error = this.createHandler(
|
|
20
|
+
public readonly trace = this.createHandler("trace");
|
|
21
|
+
public readonly debug = this.createHandler("debug");
|
|
22
|
+
public readonly info = this.createHandler("info");
|
|
23
|
+
public readonly warn = this.createHandler("warn");
|
|
24
|
+
public readonly error = this.createHandler("error");
|
|
25
25
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SyncHook } from
|
|
2
|
-
import type { Logger, Severity } from
|
|
1
|
+
import { SyncHook } from "tapable-ts";
|
|
2
|
+
import type { Logger, Severity } from "./types";
|
|
3
3
|
|
|
4
4
|
/** A logger that has a tapable subscriptions to callbacks */
|
|
5
5
|
export default class TapableLogger implements Logger {
|
|
@@ -30,9 +30,9 @@ export default class TapableLogger implements Logger {
|
|
|
30
30
|
this.logHandlers.delete(logHandler);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
public readonly trace = this.createHandler(
|
|
34
|
-
public readonly debug = this.createHandler(
|
|
35
|
-
public readonly info = this.createHandler(
|
|
36
|
-
public readonly warn = this.createHandler(
|
|
37
|
-
public readonly error = this.createHandler(
|
|
33
|
+
public readonly trace = this.createHandler("trace");
|
|
34
|
+
public readonly debug = this.createHandler("debug");
|
|
35
|
+
public readonly info = this.createHandler("info");
|
|
36
|
+
public readonly warn = this.createHandler("warn");
|
|
37
|
+
public readonly error = this.createHandler("error");
|
|
38
38
|
}
|
package/src/logger/types.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type LogFn = (...args: Array<any>) => void;
|
|
2
2
|
|
|
3
|
-
export const severities = [
|
|
4
|
-
export type Severity = typeof severities[number];
|
|
3
|
+
export const severities = ["trace", "debug", "info", "warn", "error"] as const;
|
|
4
|
+
export type Severity = (typeof severities)[number];
|
|
5
5
|
export type Logger = Record<Severity, LogFn>;
|
|
6
6
|
export type LoggerProvider = () => Logger | undefined;
|