@fluidframework/telemetry-utils 2.0.0-dev-rc.3.0.0.250606 → 2.0.0-dev-rc.3.0.0.253463

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 (98) hide show
  1. package/api-report/telemetry-utils.api.md +5 -5
  2. package/dist/config.d.ts +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +2 -2
  5. package/dist/config.js.map +1 -1
  6. package/dist/error.d.ts +4 -2
  7. package/dist/error.d.ts.map +1 -1
  8. package/dist/error.js +5 -5
  9. package/dist/error.js.map +1 -1
  10. package/dist/errorLogging.d.ts +2 -1
  11. package/dist/errorLogging.d.ts.map +1 -1
  12. package/dist/errorLogging.js.map +1 -1
  13. package/dist/events.d.ts +1 -1
  14. package/dist/events.d.ts.map +1 -1
  15. package/dist/events.js.map +1 -1
  16. package/dist/fluidErrorBase.d.ts.map +1 -1
  17. package/dist/fluidErrorBase.js.map +1 -1
  18. package/dist/logger.d.ts.map +1 -1
  19. package/dist/logger.js.map +1 -1
  20. package/dist/mockLogger.d.ts.map +1 -1
  21. package/dist/mockLogger.js +2 -2
  22. package/dist/mockLogger.js.map +1 -1
  23. package/dist/sampledTelemetryHelper.d.ts.map +1 -1
  24. package/dist/sampledTelemetryHelper.js.map +1 -1
  25. package/dist/telemetry-utils-alpha.d.ts +4 -4
  26. package/dist/telemetry-utils-beta.d.ts +4 -4
  27. package/dist/telemetry-utils-public.d.ts +4 -4
  28. package/dist/telemetry-utils-untrimmed.d.ts +5 -5
  29. package/dist/utils.d.ts.map +1 -1
  30. package/dist/utils.js.map +1 -1
  31. package/lib/config.d.ts +1 -1
  32. package/lib/config.d.ts.map +1 -1
  33. package/lib/config.js +1 -1
  34. package/lib/config.js.map +1 -1
  35. package/lib/error.d.ts +4 -2
  36. package/lib/error.d.ts.map +1 -1
  37. package/lib/error.js +1 -1
  38. package/lib/error.js.map +1 -1
  39. package/lib/errorLogging.d.ts +2 -1
  40. package/lib/errorLogging.d.ts.map +1 -1
  41. package/lib/errorLogging.js.map +1 -1
  42. package/lib/events.d.ts +1 -1
  43. package/lib/events.d.ts.map +1 -1
  44. package/lib/events.js.map +1 -1
  45. package/lib/fluidErrorBase.d.ts.map +1 -1
  46. package/lib/fluidErrorBase.js.map +1 -1
  47. package/lib/logger.d.ts.map +1 -1
  48. package/lib/logger.js.map +1 -1
  49. package/lib/mockLogger.d.ts.map +1 -1
  50. package/lib/mockLogger.js +1 -1
  51. package/lib/mockLogger.js.map +1 -1
  52. package/lib/sampledTelemetryHelper.d.ts.map +1 -1
  53. package/lib/sampledTelemetryHelper.js.map +1 -1
  54. package/lib/telemetry-utils-alpha.d.ts +4 -4
  55. package/lib/telemetry-utils-beta.d.ts +4 -4
  56. package/lib/telemetry-utils-public.d.ts +4 -4
  57. package/lib/telemetry-utils-untrimmed.d.ts +5 -5
  58. package/lib/tsdoc-metadata.json +11 -0
  59. package/lib/utils.d.ts.map +1 -1
  60. package/lib/utils.js.map +1 -1
  61. package/package.json +6 -18
  62. package/src/config.ts +2 -1
  63. package/src/error.ts +4 -4
  64. package/src/errorLogging.ts +3 -5
  65. package/src/events.ts +2 -1
  66. package/src/fluidErrorBase.ts +1 -0
  67. package/src/logger.ts +1 -0
  68. package/src/mockLogger.ts +2 -1
  69. package/src/sampledTelemetryHelper.ts +1 -0
  70. package/src/utils.ts +1 -0
  71. package/lib/test/EventEmitterWithErrorHandling.spec.js +0 -86
  72. package/lib/test/EventEmitterWithErrorHandling.spec.js.map +0 -1
  73. package/lib/test/childLogger.spec.js +0 -233
  74. package/lib/test/childLogger.spec.js.map +0 -1
  75. package/lib/test/config.spec.js +0 -229
  76. package/lib/test/config.spec.js.map +0 -1
  77. package/lib/test/error.spec.js +0 -161
  78. package/lib/test/error.spec.js.map +0 -1
  79. package/lib/test/errorLogging.spec.js +0 -801
  80. package/lib/test/errorLogging.spec.js.map +0 -1
  81. package/lib/test/errorTypeLoggingTest.spec.js +0 -107
  82. package/lib/test/errorTypeLoggingTest.spec.js.map +0 -1
  83. package/lib/test/mockLogger.spec.js +0 -164
  84. package/lib/test/mockLogger.spec.js.map +0 -1
  85. package/lib/test/multiSinkLogger.spec.js +0 -84
  86. package/lib/test/multiSinkLogger.spec.js.map +0 -1
  87. package/lib/test/performanceEvent.spec.js +0 -86
  88. package/lib/test/performanceEvent.spec.js.map +0 -1
  89. package/lib/test/sampledTelemetryHelper.spec.js +0 -169
  90. package/lib/test/sampledTelemetryHelper.spec.js.map +0 -1
  91. package/lib/test/telemetryLogger.spec.js +0 -357
  92. package/lib/test/telemetryLogger.spec.js.map +0 -1
  93. package/lib/test/thresholdCounter.spec.js +0 -51
  94. package/lib/test/thresholdCounter.spec.js.map +0 -1
  95. package/lib/test/types/validateTelemetryUtilsPrevious.generated.js +0 -132
  96. package/lib/test/types/validateTelemetryUtilsPrevious.generated.js.map +0 -1
  97. package/lib/test/utils.spec.js +0 -284
  98. package/lib/test/utils.spec.js.map +0 -1
@@ -1,229 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "node:assert";
6
- import { CachedConfigProvider, inMemoryConfigProvider, wrapConfigProviderWithDefaults, } from "../config.js";
7
- import { TelemetryDataTag } from "../logger.js";
8
- import { MockLogger } from "../mockLogger.js";
9
- const getMockStore = (settings) => {
10
- const ops = [];
11
- return {
12
- getItem: (key) => {
13
- ops.push(key);
14
- return settings[key];
15
- },
16
- getOps: () => ops,
17
- length: Object.keys(settings).length,
18
- clear: () => { },
19
- // eslint-disable-next-line unicorn/no-null
20
- key: (_index) => null,
21
- removeItem: (_key) => { },
22
- setItem: (_key, _value) => { },
23
- };
24
- };
25
- const untypedProvider = (settings) => {
26
- return {
27
- getRawConfig: (name) => settings[name],
28
- };
29
- };
30
- describe("Config", () => {
31
- it("Typing - storage provider", () => {
32
- const settings = {
33
- number: "1",
34
- badNumber: "{1}",
35
- stringAndNumber: "1",
36
- stringAndBoolean: "true",
37
- string: "string",
38
- boolean: "true",
39
- badBoolean: "truthy",
40
- numberArray: `[1, 2, 3]`,
41
- badNumberArray: `["one", "two", "three"]`,
42
- stringArray: `["1", "2", "3"]`,
43
- badStringArray: "1",
44
- booleanArray: "[true, false, true]",
45
- BadBooleanArray: "[true, 1, true]",
46
- };
47
- const mockStore = getMockStore(settings);
48
- const logger = new MockLogger();
49
- const config = new CachedConfigProvider(logger, inMemoryConfigProvider(mockStore));
50
- assert.equal(config.getNumber("number"), 1);
51
- logger.assertMatch([
52
- {
53
- category: "generic",
54
- eventName: "ConfigRead",
55
- configName: { tag: TelemetryDataTag.CodeArtifact, value: "number" },
56
- configValue: {
57
- tag: TelemetryDataTag.CodeArtifact,
58
- value: `{"raw":"1","string":"1","number":1}`,
59
- },
60
- },
61
- ]);
62
- assert.equal(config.getNumber("badNumber"), undefined);
63
- assert.equal(config.getNumber("stringAndNumber"), 1);
64
- assert.equal(config.getString("stringAndNumber"), "1");
65
- assert.equal(config.getString("stringAndBoolean"), "true");
66
- assert.equal(config.getString("string"), "string");
67
- assert.equal(config.getBoolean("boolean"), true);
68
- assert.equal(config.getBoolean("badBoolean"), undefined);
69
- assert.equal(config.getBoolean("stringAndBoolean"), true);
70
- assert.deepEqual(config.getNumberArray("numberArray"), [1, 2, 3]);
71
- assert.equal(config.getNumberArray("badNumberArray"), undefined);
72
- assert.deepEqual(config.getStringArray("stringArray"), ["1", "2", "3"]);
73
- assert.equal(config.getStringArray("badStringArray"), undefined);
74
- assert.deepEqual(config.getBooleanArray("booleanArray"), [true, false, true]);
75
- assert.equal(config.getBooleanArray("BadBooleanArray"), undefined);
76
- });
77
- it("Typing - custom provider", () => {
78
- const settings = {
79
- number: 1,
80
- badNumber: "{1}",
81
- stringAndNumber: "1",
82
- stringAndBoolean: "true",
83
- string: "string",
84
- badString: [],
85
- boolean: "true",
86
- badBoolean: "truthy",
87
- numberArray: `[1, 2, 3]`,
88
- badNumberArray: ["one", "two", "three"],
89
- stringArray: `["1", "2", "3"]`,
90
- badStringArray: "1",
91
- booleanArray: [true, false, true],
92
- badBooleanArray: [1, 2, 3],
93
- badBooleanArray2: ["true", "false", "true"],
94
- };
95
- const mockStore = untypedProvider(settings);
96
- const config = new CachedConfigProvider(undefined, mockStore);
97
- assert.equal(config.getNumber("number"), 1);
98
- assert.equal(config.getNumber("stringAndNumber"), 1);
99
- assert.equal(config.getNumber("badNumber"), undefined);
100
- assert.equal(config.getString("stringAndNumber"), "1");
101
- assert.equal(config.getString("stringAndBoolean"), "true");
102
- assert.equal(config.getString("string"), "string");
103
- assert.equal(config.getString("badString"), undefined);
104
- assert.equal(config.getBoolean("boolean"), true);
105
- assert.equal(config.getBoolean("badBoolean"), undefined);
106
- assert.equal(config.getBoolean("stringAndBoolean"), true);
107
- assert.deepEqual(config.getNumberArray("numberArray"), [1, 2, 3]);
108
- assert.equal(config.getNumberArray("badNumberArray"), undefined);
109
- assert.deepEqual(config.getStringArray("stringArray"), ["1", "2", "3"]);
110
- assert.equal(config.getStringArray("badStringArray"), undefined);
111
- assert.deepEqual(config.getBooleanArray("booleanArray"), [true, false, true]);
112
- assert.equal(config.getBooleanArray("badBooleanArray"), undefined);
113
- assert.equal(config.getBooleanArray("badBooleanArray2"), undefined);
114
- });
115
- it("Void provider", () => {
116
- const config = new CachedConfigProvider(undefined, inMemoryConfigProvider(undefined));
117
- assert.equal(config.getNumber("number"), undefined);
118
- assert.equal(config.getString("does not exist"), undefined);
119
- assert.equal(config.getBoolean("boolean"), undefined);
120
- });
121
- it("Config priority", () => {
122
- const settings1 = {
123
- number: "1",
124
- string: "string1",
125
- boolean: "true",
126
- featureEnabled: "false",
127
- };
128
- const settings2 = {
129
- number: "2",
130
- string: "string2",
131
- boolean: "false",
132
- number2: "3",
133
- featureEnabled: "true",
134
- };
135
- const settings3 = {
136
- number2: "4",
137
- number3: "4",
138
- featureEnabled: "true",
139
- };
140
- const config1 = new CachedConfigProvider(undefined, inMemoryConfigProvider(getMockStore(settings1)), inMemoryConfigProvider(getMockStore(settings1)), inMemoryConfigProvider(getMockStore(settings2)), inMemoryConfigProvider(getMockStore(settings3)));
141
- assert.equal(config1.getNumber("number"), 1); // from settings1
142
- assert.equal(config1.getString("string"), "string1"); // from settings1
143
- assert.equal(config1.getBoolean("boolean"), true); // from settings1
144
- assert.equal(config1.getNumber("number2"), 3); // from settings2
145
- assert.equal(config1.getNumber("number3"), 4); // from settings3
146
- assert.equal(config1.getBoolean("featureEnabled"), false); // from settings1.BreakGlass
147
- const config2 = new CachedConfigProvider(undefined, inMemoryConfigProvider(getMockStore(settings3)), inMemoryConfigProvider(getMockStore(settings2)), inMemoryConfigProvider(getMockStore(settings1)), inMemoryConfigProvider(getMockStore(settings1)));
148
- assert.equal(config2.getNumber("number"), 2); // from settings2
149
- assert.equal(config2.getString("string"), "string2"); // from settings2
150
- assert.equal(config2.getBoolean("boolean"), false); // from settings2
151
- assert.equal(config2.getNumber("number2"), 4); // from settings3
152
- assert.equal(config2.getNumber("number3"), 4); // from settings3
153
- assert.equal(config1.getBoolean("featureEnabled"), false); // from settings1.BreakGlass
154
- });
155
- class HybridSettingsProvider {
156
- constructor(store) {
157
- this.store = store;
158
- this.SettingsProvider = this;
159
- }
160
- getRawConfig(name) {
161
- // The point here is to use `getSetting`
162
- // eslint-disable-next-line unicorn/no-null
163
- const val = this.getSetting(name, null);
164
- return val ?? undefined;
165
- }
166
- getSetting(settingName, defaultValue, namespace) {
167
- const key = namespace === undefined ? settingName : `${namespace}.${settingName}`;
168
- return this.store[key] ?? defaultValue;
169
- }
170
- }
171
- it("Typing - SettingsProvider", () => {
172
- const settings = {
173
- number: 1,
174
- sortOfNumber: "1",
175
- badNumber: "{1}",
176
- stringAndNumber: "1",
177
- stringAndBoolean: "true",
178
- string: "string",
179
- badString: [],
180
- boolean: "true",
181
- badBoolean: "truthy",
182
- numberArray: `[1, 2, 3]`,
183
- badNumberArray: ["one", "two", "three"],
184
- stringArray: `["1", "2", "3"]`,
185
- badStringArray: "1",
186
- booleanArray: [true, false, true],
187
- badBooleanArray: [1, 2, 3],
188
- badBooleanArray2: ["true", "false", "true"],
189
- };
190
- const config = new CachedConfigProvider(undefined, new HybridSettingsProvider(settings));
191
- assert.equal(config.getNumber("number"), 1);
192
- assert.equal(config.getNumber("sortOfNumber"), 1);
193
- assert.equal(config.getNumber("badNumber"), undefined);
194
- assert.equal(config.getString("stringAndNumber"), "1");
195
- assert.equal(config.getString("stringAndBoolean"), "true");
196
- assert.equal(config.getString("string"), "string");
197
- assert.equal(config.getString("badString"), undefined);
198
- assert.equal(config.getBoolean("boolean"), true);
199
- assert.equal(config.getBoolean("badBoolean"), undefined);
200
- assert.deepEqual(config.getNumberArray("numberArray"), [1, 2, 3]);
201
- assert.equal(config.getNumberArray("badNumberArray"), undefined);
202
- assert.deepEqual(config.getStringArray("stringArray"), ["1", "2", "3"]);
203
- assert.equal(config.getStringArray("badStringArray"), undefined);
204
- assert.deepEqual(config.getBooleanArray("booleanArray"), [true, false, true]);
205
- assert.equal(config.getBooleanArray("badBooleanArray"), undefined);
206
- assert.equal(config.getBooleanArray("badBooleanArray2"), undefined);
207
- });
208
- // #endregion SettingsProvider
209
- });
210
- describe("wrappedConfigProvider", () => {
211
- const configProvider = (featureGates) => ({
212
- getRawConfig: (name) => featureGates[name],
213
- });
214
- it("When there is no original config provider", () => {
215
- const config = wrapConfigProviderWithDefaults(undefined, { "Fluid.Feature.Gate": true });
216
- assert.strictEqual(config.getRawConfig("Fluid.Feature.Gate"), true);
217
- });
218
- it("When the original config provider does not specify the required key", () => {
219
- const config = wrapConfigProviderWithDefaults(configProvider({}), {
220
- "Fluid.Feature.Gate": true,
221
- });
222
- assert.strictEqual(config.getRawConfig("Fluid.Feature.Gate"), true);
223
- });
224
- it("When the original config provider specifies the required key", () => {
225
- const config = wrapConfigProviderWithDefaults(configProvider({ "Fluid.Feature.Gate": false }), { "Fluid.Feature.Gate": true });
226
- assert.strictEqual(config.getRawConfig("Fluid.Feature.Gate"), false);
227
- });
228
- });
229
- //# sourceMappingURL=config.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.spec.js","sourceRoot":"","sources":["../../src/test/config.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tCachedConfigProvider,\n\tinMemoryConfigProvider,\n\twrapConfigProviderWithDefaults,\n} from \"../config.js\";\nimport { TelemetryDataTag } from \"../logger.js\";\nimport { MockLogger } from \"../mockLogger.js\";\n\nconst getMockStore = (settings: Record<string, string>): Storage => {\n\tconst ops: string[] = [];\n\treturn {\n\t\tgetItem: (key: string): string | null => {\n\t\t\tops.push(key);\n\t\t\treturn settings[key];\n\t\t},\n\t\tgetOps: (): Readonly<string[]> => ops,\n\t\tlength: Object.keys(settings).length,\n\t\tclear: (): void => {},\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tkey: (_index: number): string | null => null,\n\t\tremoveItem: (_key: string): void => {},\n\t\tsetItem: (_key: string, _value: string): void => {},\n\t};\n};\n\nconst untypedProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => {\n\treturn {\n\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t};\n};\n\ndescribe(\"Config\", () => {\n\tit(\"Typing - storage provider\", () => {\n\t\tconst settings = {\n\t\t\tnumber: \"1\",\n\t\t\tbadNumber: \"{1}\",\n\t\t\tstringAndNumber: \"1\",\n\t\t\tstringAndBoolean: \"true\",\n\t\t\tstring: \"string\",\n\t\t\tboolean: \"true\",\n\t\t\tbadBoolean: \"truthy\",\n\t\t\tnumberArray: `[1, 2, 3]`,\n\t\t\tbadNumberArray: `[\"one\", \"two\", \"three\"]`,\n\t\t\tstringArray: `[\"1\", \"2\", \"3\"]`,\n\t\t\tbadStringArray: \"1\",\n\t\t\tbooleanArray: \"[true, false, true]\",\n\t\t\tBadBooleanArray: \"[true, 1, true]\",\n\t\t};\n\n\t\tconst mockStore = getMockStore(settings);\n\t\tconst logger = new MockLogger();\n\t\tconst config = new CachedConfigProvider(logger, inMemoryConfigProvider(mockStore));\n\n\t\tassert.equal(config.getNumber(\"number\"), 1);\n\t\tlogger.assertMatch([\n\t\t\t{\n\t\t\t\tcategory: \"generic\",\n\t\t\t\teventName: \"ConfigRead\",\n\t\t\t\tconfigName: { tag: TelemetryDataTag.CodeArtifact, value: \"number\" },\n\t\t\t\tconfigValue: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: `{\"raw\":\"1\",\"string\":\"1\",\"number\":1}`,\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t\tassert.equal(config.getNumber(\"badNumber\"), undefined);\n\t\tassert.equal(config.getNumber(\"stringAndNumber\"), 1);\n\n\t\tassert.equal(config.getString(\"stringAndNumber\"), \"1\");\n\t\tassert.equal(config.getString(\"stringAndBoolean\"), \"true\");\n\t\tassert.equal(config.getString(\"string\"), \"string\");\n\n\t\tassert.equal(config.getBoolean(\"boolean\"), true);\n\t\tassert.equal(config.getBoolean(\"badBoolean\"), undefined);\n\t\tassert.equal(config.getBoolean(\"stringAndBoolean\"), true);\n\n\t\tassert.deepEqual(config.getNumberArray(\"numberArray\"), [1, 2, 3]);\n\t\tassert.equal(config.getNumberArray(\"badNumberArray\"), undefined);\n\n\t\tassert.deepEqual(config.getStringArray(\"stringArray\"), [\"1\", \"2\", \"3\"]);\n\t\tassert.equal(config.getStringArray(\"badStringArray\"), undefined);\n\n\t\tassert.deepEqual(config.getBooleanArray(\"booleanArray\"), [true, false, true]);\n\t\tassert.equal(config.getBooleanArray(\"BadBooleanArray\"), undefined);\n\t});\n\n\tit(\"Typing - custom provider\", () => {\n\t\tconst settings = {\n\t\t\tnumber: 1,\n\t\t\tbadNumber: \"{1}\",\n\t\t\tstringAndNumber: \"1\",\n\t\t\tstringAndBoolean: \"true\",\n\t\t\tstring: \"string\",\n\t\t\tbadString: [],\n\t\t\tboolean: \"true\",\n\t\t\tbadBoolean: \"truthy\",\n\t\t\tnumberArray: `[1, 2, 3]`,\n\t\t\tbadNumberArray: [\"one\", \"two\", \"three\"],\n\t\t\tstringArray: `[\"1\", \"2\", \"3\"]`,\n\t\t\tbadStringArray: \"1\",\n\t\t\tbooleanArray: [true, false, true],\n\t\t\tbadBooleanArray: [1, 2, 3],\n\t\t\tbadBooleanArray2: [\"true\", \"false\", \"true\"],\n\t\t};\n\n\t\tconst mockStore = untypedProvider(settings);\n\t\tconst config = new CachedConfigProvider(undefined, mockStore);\n\n\t\tassert.equal(config.getNumber(\"number\"), 1);\n\t\tassert.equal(config.getNumber(\"stringAndNumber\"), 1);\n\t\tassert.equal(config.getNumber(\"badNumber\"), undefined);\n\n\t\tassert.equal(config.getString(\"stringAndNumber\"), \"1\");\n\t\tassert.equal(config.getString(\"stringAndBoolean\"), \"true\");\n\t\tassert.equal(config.getString(\"string\"), \"string\");\n\t\tassert.equal(config.getString(\"badString\"), undefined);\n\n\t\tassert.equal(config.getBoolean(\"boolean\"), true);\n\t\tassert.equal(config.getBoolean(\"badBoolean\"), undefined);\n\t\tassert.equal(config.getBoolean(\"stringAndBoolean\"), true);\n\n\t\tassert.deepEqual(config.getNumberArray(\"numberArray\"), [1, 2, 3]);\n\t\tassert.equal(config.getNumberArray(\"badNumberArray\"), undefined);\n\n\t\tassert.deepEqual(config.getStringArray(\"stringArray\"), [\"1\", \"2\", \"3\"]);\n\t\tassert.equal(config.getStringArray(\"badStringArray\"), undefined);\n\n\t\tassert.deepEqual(config.getBooleanArray(\"booleanArray\"), [true, false, true]);\n\t\tassert.equal(config.getBooleanArray(\"badBooleanArray\"), undefined);\n\t\tassert.equal(config.getBooleanArray(\"badBooleanArray2\"), undefined);\n\t});\n\n\tit(\"Void provider\", () => {\n\t\tconst config = new CachedConfigProvider(undefined, inMemoryConfigProvider(undefined));\n\t\tassert.equal(config.getNumber(\"number\"), undefined);\n\t\tassert.equal(config.getString(\"does not exist\"), undefined);\n\t\tassert.equal(config.getBoolean(\"boolean\"), undefined);\n\t});\n\n\tit(\"Config priority\", () => {\n\t\tconst settings1 = {\n\t\t\tnumber: \"1\",\n\t\t\tstring: \"string1\",\n\t\t\tboolean: \"true\",\n\t\t\tfeatureEnabled: \"false\",\n\t\t};\n\t\tconst settings2 = {\n\t\t\tnumber: \"2\",\n\t\t\tstring: \"string2\",\n\t\t\tboolean: \"false\",\n\t\t\tnumber2: \"3\",\n\t\t\tfeatureEnabled: \"true\",\n\t\t};\n\t\tconst settings3 = {\n\t\t\tnumber2: \"4\",\n\t\t\tnumber3: \"4\",\n\t\t\tfeatureEnabled: \"true\",\n\t\t};\n\n\t\tconst config1 = new CachedConfigProvider(\n\t\t\tundefined,\n\t\t\tinMemoryConfigProvider(getMockStore(settings1)),\n\t\t\tinMemoryConfigProvider(getMockStore(settings1)),\n\t\t\tinMemoryConfigProvider(getMockStore(settings2)),\n\t\t\tinMemoryConfigProvider(getMockStore(settings3)),\n\t\t);\n\n\t\tassert.equal(config1.getNumber(\"number\"), 1); // from settings1\n\t\tassert.equal(config1.getString(\"string\"), \"string1\"); // from settings1\n\t\tassert.equal(config1.getBoolean(\"boolean\"), true); // from settings1\n\t\tassert.equal(config1.getNumber(\"number2\"), 3); // from settings2\n\t\tassert.equal(config1.getNumber(\"number3\"), 4); // from settings3\n\t\tassert.equal(config1.getBoolean(\"featureEnabled\"), false); // from settings1.BreakGlass\n\n\t\tconst config2 = new CachedConfigProvider(\n\t\t\tundefined,\n\t\t\tinMemoryConfigProvider(getMockStore(settings3)),\n\t\t\tinMemoryConfigProvider(getMockStore(settings2)),\n\t\t\tinMemoryConfigProvider(getMockStore(settings1)),\n\t\t\tinMemoryConfigProvider(getMockStore(settings1)),\n\t\t);\n\n\t\tassert.equal(config2.getNumber(\"number\"), 2); // from settings2\n\t\tassert.equal(config2.getString(\"string\"), \"string2\"); // from settings2\n\t\tassert.equal(config2.getBoolean(\"boolean\"), false); // from settings2\n\t\tassert.equal(config2.getNumber(\"number2\"), 4); // from settings3\n\t\tassert.equal(config2.getNumber(\"number3\"), 4); // from settings3\n\t\tassert.equal(config1.getBoolean(\"featureEnabled\"), false); // from settings1.BreakGlass\n\t});\n\n\t// #region SettingsProvider\n\n\ttype SettingType = string | boolean | number | (string | boolean | number)[] | null;\n\n\tinterface ProvideSettingsProvider {\n\t\treadonly SettingsProvider: SettingsProvider;\n\t}\n\n\tinterface SettingsProvider extends ProvideSettingsProvider {\n\t\t/**\n\t\t * Used to get the setting value for the specified setting.\n\t\t * Providing a default in case setting is not available or not defined.\n\t\t */\n\t\tgetSetting<T extends SettingType>(\n\t\t\tsettingName: string,\n\t\t\tdefaultValue: T,\n\t\t\tnamespace?: string,\n\t\t): T;\n\t}\n\n\tclass HybridSettingsProvider implements SettingsProvider, IConfigProviderBase {\n\t\tconstructor(private readonly store: Record<string, SettingType | ConfigTypes>) {}\n\n\t\tgetRawConfig(name: string): ConfigTypes {\n\t\t\t// The point here is to use `getSetting`\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tconst val = this.getSetting(name, null);\n\t\t\treturn val ?? undefined;\n\t\t}\n\n\t\tgetSetting<T extends SettingType>(\n\t\t\tsettingName: string,\n\t\t\tdefaultValue: T,\n\t\t\tnamespace?: string,\n\t\t): T {\n\t\t\tconst key = namespace === undefined ? settingName : `${namespace}.${settingName}`;\n\t\t\treturn (this.store[key] as T) ?? defaultValue;\n\t\t}\n\n\t\tSettingsProvider: SettingsProvider = this;\n\t}\n\n\tit(\"Typing - SettingsProvider\", () => {\n\t\tconst settings = {\n\t\t\tnumber: 1,\n\t\t\tsortOfNumber: \"1\",\n\t\t\tbadNumber: \"{1}\",\n\t\t\tstringAndNumber: \"1\",\n\t\t\tstringAndBoolean: \"true\",\n\t\t\tstring: \"string\",\n\t\t\tbadString: [],\n\t\t\tboolean: \"true\",\n\t\t\tbadBoolean: \"truthy\",\n\t\t\tnumberArray: `[1, 2, 3]`,\n\t\t\tbadNumberArray: [\"one\", \"two\", \"three\"],\n\t\t\tstringArray: `[\"1\", \"2\", \"3\"]`,\n\t\t\tbadStringArray: \"1\",\n\t\t\tbooleanArray: [true, false, true],\n\t\t\tbadBooleanArray: [1, 2, 3],\n\t\t\tbadBooleanArray2: [\"true\", \"false\", \"true\"],\n\t\t};\n\n\t\tconst config = new CachedConfigProvider(undefined, new HybridSettingsProvider(settings));\n\n\t\tassert.equal(config.getNumber(\"number\"), 1);\n\t\tassert.equal(config.getNumber(\"sortOfNumber\"), 1);\n\t\tassert.equal(config.getNumber(\"badNumber\"), undefined);\n\n\t\tassert.equal(config.getString(\"stringAndNumber\"), \"1\");\n\t\tassert.equal(config.getString(\"stringAndBoolean\"), \"true\");\n\t\tassert.equal(config.getString(\"string\"), \"string\");\n\t\tassert.equal(config.getString(\"badString\"), undefined);\n\n\t\tassert.equal(config.getBoolean(\"boolean\"), true);\n\t\tassert.equal(config.getBoolean(\"badBoolean\"), undefined);\n\n\t\tassert.deepEqual(config.getNumberArray(\"numberArray\"), [1, 2, 3]);\n\t\tassert.equal(config.getNumberArray(\"badNumberArray\"), undefined);\n\n\t\tassert.deepEqual(config.getStringArray(\"stringArray\"), [\"1\", \"2\", \"3\"]);\n\t\tassert.equal(config.getStringArray(\"badStringArray\"), undefined);\n\n\t\tassert.deepEqual(config.getBooleanArray(\"booleanArray\"), [true, false, true]);\n\t\tassert.equal(config.getBooleanArray(\"badBooleanArray\"), undefined);\n\t\tassert.equal(config.getBooleanArray(\"badBooleanArray2\"), undefined);\n\t});\n\n\t// #endregion SettingsProvider\n});\n\ndescribe(\"wrappedConfigProvider\", () => {\n\tconst configProvider = (featureGates: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\t\tgetRawConfig: (name: string): ConfigTypes => featureGates[name],\n\t});\n\n\tit(\"When there is no original config provider\", () => {\n\t\tconst config = wrapConfigProviderWithDefaults(undefined, { \"Fluid.Feature.Gate\": true });\n\t\tassert.strictEqual(config.getRawConfig(\"Fluid.Feature.Gate\"), true);\n\t});\n\n\tit(\"When the original config provider does not specify the required key\", () => {\n\t\tconst config = wrapConfigProviderWithDefaults(configProvider({}), {\n\t\t\t\"Fluid.Feature.Gate\": true,\n\t\t});\n\t\tassert.strictEqual(config.getRawConfig(\"Fluid.Feature.Gate\"), true);\n\t});\n\n\tit(\"When the original config provider specifies the required key\", () => {\n\t\tconst config = wrapConfigProviderWithDefaults(\n\t\t\tconfigProvider({ \"Fluid.Feature.Gate\": false }),\n\t\t\t{ \"Fluid.Feature.Gate\": true },\n\t\t);\n\t\tassert.strictEqual(config.getRawConfig(\"Fluid.Feature.Gate\"), false);\n\t});\n});\n"]}
@@ -1,161 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "node:assert";
6
- import { FluidErrorTypes } from "@fluidframework/core-interfaces";
7
- import { DataCorruptionError, DataProcessingError } from "../error.js";
8
- import { LoggingError, isILoggingError, normalizeError } from "../errorLogging.js";
9
- describe("Errors", () => {
10
- describe("DataProcessingError.create", () => {
11
- it("Should yield a DataProcessingError", () => {
12
- const dpe = DataProcessingError.create("Some message", "someCodepath", undefined, {
13
- someProp: 1234,
14
- });
15
- assert(dpe instanceof DataProcessingError);
16
- assert(dpe.errorType === FluidErrorTypes.dataProcessingError);
17
- assert(dpe.message === "Some message");
18
- assert(dpe.getTelemetryProperties().someProp === 1234);
19
- assert(dpe.getTelemetryProperties().dataProcessingError === 1);
20
- assert(dpe.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
21
- assert(dpe.getTelemetryProperties().untrustedOrigin === 1);
22
- });
23
- });
24
- describe("DataProcessingError coercion via DataProcessingError.wrapIfUnrecognized", () => {
25
- it("Should preserve the stack", () => {
26
- const originalError = new Error("Test error");
27
- const testError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
28
- assert(testError.stack === originalError.stack);
29
- });
30
- it("Should skip coercion for valid Fluid Error", () => {
31
- const originalError = new DataCorruptionError("some message", {});
32
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
33
- assert(coercedError === originalError);
34
- assert(coercedError.errorType === FluidErrorTypes.dataCorruptionError);
35
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
36
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
37
- });
38
- it("Should skip coercion for LoggingError with errorType", () => {
39
- const originalError = new LoggingError("Inherited error message", {
40
- errorType: "Some error type",
41
- otherProperty: "some safe-to-log property",
42
- });
43
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
44
- assert(coercedError === originalError);
45
- assert(coercedError.errorType === "Some error type");
46
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
47
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
48
- });
49
- it("Should coerce normalized external error", () => {
50
- const originalError = normalizeError("boo");
51
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
52
- assert(coercedError !== originalError);
53
- assert(coercedError instanceof DataProcessingError);
54
- assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
55
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
56
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
57
- assert(coercedError.getTelemetryProperties().untrustedOrigin === 1);
58
- });
59
- it("Should coerce external error object even with errorType", () => {
60
- const originalError = {
61
- errorType: "Some error type",
62
- };
63
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
64
- assert(coercedError !== originalError);
65
- assert(coercedError instanceof DataProcessingError);
66
- assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
67
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
68
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
69
- assert(coercedError.getTelemetryProperties().untrustedOrigin === 1);
70
- assert(coercedError.message === "[object Object]");
71
- });
72
- it("Should coerce LoggingError missing errorType", () => {
73
- const originalError = new LoggingError("Inherited error message", {
74
- otherProperty: "some safe-to-log property",
75
- });
76
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
77
- assert(coercedError !== originalError);
78
- assert(coercedError instanceof DataProcessingError);
79
- assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
80
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
81
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
82
- assert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);
83
- assert(coercedError.message === "Inherited error message");
84
- assert(coercedError.getTelemetryProperties().otherProperty === "some safe-to-log property", "telemetryProps should be copied when wrapping");
85
- });
86
- it("Should coerce Normalized LoggingError with errorType", () => {
87
- const originalError = new LoggingError("Inherited error message", {
88
- otherProperty: "some safe-to-log property",
89
- });
90
- const normalizedLoggingError = normalizeError(originalError);
91
- const coercedError = DataProcessingError.wrapIfUnrecognized(normalizedLoggingError, "someCodepath", undefined);
92
- assert(coercedError !== originalError);
93
- assert(coercedError instanceof DataProcessingError);
94
- assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
95
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
96
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
97
- assert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);
98
- assert(coercedError.message === "Inherited error message");
99
- assert(coercedError.getTelemetryProperties().otherProperty === "some safe-to-log property", "telemetryProps should be copied when wrapping");
100
- });
101
- it("Should not fail coercing malformed inputs", () => {
102
- const originalMalformations = [
103
- // eslint-disable-next-line unicorn/no-null
104
- null,
105
- undefined,
106
- false,
107
- true,
108
- 3.14,
109
- Symbol("Unique"),
110
- () => { },
111
- [],
112
- [1, 2, 3],
113
- ];
114
- const coercedErrors = originalMalformations.map((value) => DataProcessingError.wrapIfUnrecognized(value, "someCodepath", undefined));
115
- assert(coercedErrors.every((error) => typeof error.message === "string" &&
116
- error.errorType === FluidErrorTypes.dataProcessingError &&
117
- error.getTelemetryProperties().dataProcessingError === 1 &&
118
- error.getTelemetryProperties().dataProcessingCodepath === "someCodepath" &&
119
- error.getTelemetryProperties().untrustedOrigin === 1));
120
- assert(!originalMalformations.some((value) => typeof value === "string" ||
121
- (typeof value === "object" && !Array.isArray(value) && value !== null)), "Neither strings nor objects are considered malformed");
122
- });
123
- it("Should be coercible from a string message", () => {
124
- const originalMessage = "Example of some thrown string";
125
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalMessage, "someCodepath", undefined);
126
- assert(coercedError.message === originalMessage);
127
- assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
128
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
129
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
130
- });
131
- it("Should be coercible from a property object (no errorType)", () => {
132
- const originalError = {
133
- message: "Inherited error message",
134
- };
135
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
136
- assert(coercedError.message === originalError.message);
137
- assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
138
- assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
139
- assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
140
- });
141
- it("op props should be logged when coerced", () => {
142
- const originalError = {
143
- message: "Inherited error message",
144
- };
145
- const op = { sequenceNumber: 42 };
146
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", op);
147
- assert(isILoggingError(coercedError));
148
- assert(coercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber);
149
- });
150
- it("op props should be logged even when not coerced", () => {
151
- const originalError = {
152
- errorType: "hello",
153
- };
154
- const op = { sequenceNumber: 42 };
155
- const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", op);
156
- assert(isILoggingError(coercedError));
157
- assert(coercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber);
158
- });
159
- });
160
- });
161
- //# sourceMappingURL=error.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error.spec.js","sourceRoot":"","sources":["../../src/test/error.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces\";\n\nimport { DataCorruptionError, DataProcessingError } from \"../error.js\";\nimport { LoggingError, isILoggingError, normalizeError } from \"../errorLogging.js\";\n\ndescribe(\"Errors\", () => {\n\tdescribe(\"DataProcessingError.create\", () => {\n\t\tit(\"Should yield a DataProcessingError\", () => {\n\t\t\tconst dpe = DataProcessingError.create(\"Some message\", \"someCodepath\", undefined, {\n\t\t\t\tsomeProp: 1234,\n\t\t\t});\n\t\t\tassert(dpe instanceof DataProcessingError);\n\t\t\tassert(dpe.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(dpe.message === \"Some message\");\n\t\t\tassert(dpe.getTelemetryProperties().someProp === 1234);\n\t\t\tassert(dpe.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(dpe.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(dpe.getTelemetryProperties().untrustedOrigin === 1);\n\t\t});\n\t});\n\tdescribe(\"DataProcessingError coercion via DataProcessingError.wrapIfUnrecognized\", () => {\n\t\tit(\"Should preserve the stack\", () => {\n\t\t\tconst originalError = new Error(\"Test error\");\n\t\t\tconst testError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert(testError.stack === originalError.stack);\n\t\t});\n\t\tit(\"Should skip coercion for valid Fluid Error\", () => {\n\t\t\tconst originalError = new DataCorruptionError(\"some message\", {});\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) === originalError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataCorruptionError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\t\tit(\"Should skip coercion for LoggingError with errorType\", () => {\n\t\t\tconst originalError = new LoggingError(\"Inherited error message\", {\n\t\t\t\terrorType: \"Some error type\",\n\t\t\t\totherProperty: \"some safe-to-log property\",\n\t\t\t});\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) === originalError);\n\t\t\tassert(coercedError.errorType === \"Some error type\");\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\t\tit(\"Should coerce normalized external error\", () => {\n\t\t\tconst originalError = normalizeError(\"boo\");\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === 1);\n\t\t});\n\t\tit(\"Should coerce external error object even with errorType\", () => {\n\t\t\tconst originalError = {\n\t\t\t\terrorType: \"Some error type\",\n\t\t\t};\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === 1);\n\t\t\tassert(coercedError.message === \"[object Object]\");\n\t\t});\n\t\tit(\"Should coerce LoggingError missing errorType\", () => {\n\t\t\tconst originalError = new LoggingError(\"Inherited error message\", {\n\t\t\t\totherProperty: \"some safe-to-log property\",\n\t\t\t});\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);\n\t\t\tassert(coercedError.message === \"Inherited error message\");\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().otherProperty === \"some safe-to-log property\",\n\t\t\t\t\"telemetryProps should be copied when wrapping\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should coerce Normalized LoggingError with errorType\", () => {\n\t\t\tconst originalError = new LoggingError(\"Inherited error message\", {\n\t\t\t\totherProperty: \"some safe-to-log property\",\n\t\t\t});\n\t\t\tconst normalizedLoggingError = normalizeError(originalError);\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\tnormalizedLoggingError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);\n\t\t\tassert(coercedError.message === \"Inherited error message\");\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().otherProperty === \"some safe-to-log property\",\n\t\t\t\t\"telemetryProps should be copied when wrapping\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should not fail coercing malformed inputs\", () => {\n\t\t\tconst originalMalformations = [\n\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\tnull,\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t\t3.14,\n\t\t\t\tSymbol(\"Unique\"),\n\t\t\t\t(): void => {},\n\t\t\t\t[],\n\t\t\t\t[1, 2, 3],\n\t\t\t];\n\t\t\tconst coercedErrors = originalMalformations.map((value) =>\n\t\t\t\tDataProcessingError.wrapIfUnrecognized(value, \"someCodepath\", undefined),\n\t\t\t);\n\n\t\t\tassert(\n\t\t\t\tcoercedErrors.every(\n\t\t\t\t\t(error) =>\n\t\t\t\t\t\ttypeof error.message === \"string\" &&\n\t\t\t\t\t\terror.errorType === FluidErrorTypes.dataProcessingError &&\n\t\t\t\t\t\terror.getTelemetryProperties().dataProcessingError === 1 &&\n\t\t\t\t\t\terror.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\" &&\n\t\t\t\t\t\terror.getTelemetryProperties().untrustedOrigin === 1,\n\t\t\t\t),\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!originalMalformations.some(\n\t\t\t\t\t(value) =>\n\t\t\t\t\t\ttypeof value === \"string\" ||\n\t\t\t\t\t\t(typeof value === \"object\" && !Array.isArray(value) && value !== null),\n\t\t\t\t),\n\t\t\t\t\"Neither strings nor objects are considered malformed\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should be coercible from a string message\", () => {\n\t\t\tconst originalMessage = \"Example of some thrown string\";\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalMessage,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert(coercedError.message === originalMessage);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\n\t\tit(\"Should be coercible from a property object (no errorType)\", () => {\n\t\t\tconst originalError = {\n\t\t\t\tmessage: \"Inherited error message\",\n\t\t\t};\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert(coercedError.message === originalError.message);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\n\t\tit(\"op props should be logged when coerced\", () => {\n\t\t\tconst originalError = {\n\t\t\t\tmessage: \"Inherited error message\",\n\t\t\t};\n\t\t\tconst op = { sequenceNumber: 42 };\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\top,\n\t\t\t);\n\n\t\t\tassert(isILoggingError(coercedError));\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber,\n\t\t\t);\n\t\t});\n\n\t\tit(\"op props should be logged even when not coerced\", () => {\n\t\t\tconst originalError = {\n\t\t\t\terrorType: \"hello\",\n\t\t\t};\n\t\t\tconst op = { sequenceNumber: 42 };\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\top,\n\t\t\t);\n\n\t\t\tassert(isILoggingError(coercedError));\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber,\n\t\t\t);\n\t\t});\n\t});\n});\n"]}