@kravc/schema 2.7.6 → 2.8.0-alpha.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.
Files changed (170) hide show
  1. package/README.md +19 -14
  2. package/dist/CredentialFactory.d.ts +345 -0
  3. package/dist/CredentialFactory.d.ts.map +1 -0
  4. package/dist/CredentialFactory.js +381 -0
  5. package/dist/CredentialFactory.js.map +1 -0
  6. package/dist/Schema.d.ts +448 -0
  7. package/dist/Schema.d.ts.map +1 -0
  8. package/dist/Schema.js +506 -0
  9. package/dist/Schema.js.map +1 -0
  10. package/dist/ValidationError.d.ts +70 -0
  11. package/dist/ValidationError.d.ts.map +1 -0
  12. package/dist/ValidationError.js +78 -0
  13. package/dist/ValidationError.js.map +1 -0
  14. package/dist/Validator.d.ts +483 -0
  15. package/dist/Validator.d.ts.map +1 -0
  16. package/dist/Validator.js +570 -0
  17. package/dist/Validator.js.map +1 -0
  18. package/dist/helpers/JsonSchema.d.ts +99 -0
  19. package/dist/helpers/JsonSchema.d.ts.map +1 -0
  20. package/dist/helpers/JsonSchema.js +3 -0
  21. package/dist/helpers/JsonSchema.js.map +1 -0
  22. package/dist/helpers/cleanupAttributes.d.ts +34 -0
  23. package/dist/helpers/cleanupAttributes.d.ts.map +1 -0
  24. package/dist/helpers/cleanupAttributes.js +113 -0
  25. package/dist/helpers/cleanupAttributes.js.map +1 -0
  26. package/dist/helpers/cleanupNulls.d.ts +27 -0
  27. package/dist/helpers/cleanupNulls.d.ts.map +1 -0
  28. package/dist/helpers/cleanupNulls.js +96 -0
  29. package/dist/helpers/cleanupNulls.js.map +1 -0
  30. package/dist/helpers/getReferenceIds.d.ts +169 -0
  31. package/dist/helpers/getReferenceIds.d.ts.map +1 -0
  32. package/dist/helpers/getReferenceIds.js +241 -0
  33. package/dist/helpers/getReferenceIds.js.map +1 -0
  34. package/dist/helpers/got.d.ts +60 -0
  35. package/dist/helpers/got.d.ts.map +1 -0
  36. package/dist/helpers/got.js +72 -0
  37. package/dist/helpers/got.js.map +1 -0
  38. package/dist/helpers/mapObjectProperties.d.ts +150 -0
  39. package/dist/helpers/mapObjectProperties.d.ts.map +1 -0
  40. package/dist/helpers/mapObjectProperties.js +229 -0
  41. package/dist/helpers/mapObjectProperties.js.map +1 -0
  42. package/dist/helpers/normalizeAttributes.d.ts +213 -0
  43. package/dist/helpers/normalizeAttributes.d.ts.map +1 -0
  44. package/dist/helpers/normalizeAttributes.js +243 -0
  45. package/dist/helpers/normalizeAttributes.js.map +1 -0
  46. package/dist/helpers/normalizeProperties.d.ts +168 -0
  47. package/dist/helpers/normalizeProperties.d.ts.map +1 -0
  48. package/dist/helpers/normalizeProperties.js +223 -0
  49. package/dist/helpers/normalizeProperties.js.map +1 -0
  50. package/dist/helpers/normalizeRequired.d.ts +159 -0
  51. package/dist/helpers/normalizeRequired.d.ts.map +1 -0
  52. package/dist/helpers/normalizeRequired.js +206 -0
  53. package/dist/helpers/normalizeRequired.js.map +1 -0
  54. package/dist/helpers/normalizeType.d.ts +81 -0
  55. package/dist/helpers/normalizeType.d.ts.map +1 -0
  56. package/dist/helpers/normalizeType.js +210 -0
  57. package/dist/helpers/normalizeType.js.map +1 -0
  58. package/dist/helpers/nullifyEmptyValues.d.ts +139 -0
  59. package/dist/helpers/nullifyEmptyValues.d.ts.map +1 -0
  60. package/dist/helpers/nullifyEmptyValues.js +191 -0
  61. package/dist/helpers/nullifyEmptyValues.js.map +1 -0
  62. package/dist/helpers/removeRequiredAndDefault.d.ts +106 -0
  63. package/dist/helpers/removeRequiredAndDefault.d.ts.map +1 -0
  64. package/dist/helpers/removeRequiredAndDefault.js +138 -0
  65. package/dist/helpers/removeRequiredAndDefault.js.map +1 -0
  66. package/dist/helpers/validateId.d.ts +39 -0
  67. package/dist/helpers/validateId.d.ts.map +1 -0
  68. package/dist/helpers/validateId.js +51 -0
  69. package/dist/helpers/validateId.js.map +1 -0
  70. package/dist/index.d.ts +7 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +17 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/ld/documentLoader.d.ts +8 -0
  75. package/dist/ld/documentLoader.d.ts.map +1 -0
  76. package/dist/ld/documentLoader.js +24 -0
  77. package/dist/ld/documentLoader.js.map +1 -0
  78. package/dist/ld/getLinkedDataAttributeType.d.ts +10 -0
  79. package/dist/ld/getLinkedDataAttributeType.d.ts.map +1 -0
  80. package/dist/ld/getLinkedDataAttributeType.js +32 -0
  81. package/dist/ld/getLinkedDataAttributeType.js.map +1 -0
  82. package/dist/ld/getLinkedDataContext.d.ts +19 -0
  83. package/dist/ld/getLinkedDataContext.d.ts.map +1 -0
  84. package/dist/ld/getLinkedDataContext.js +50 -0
  85. package/dist/ld/getLinkedDataContext.js.map +1 -0
  86. package/eslint.config.mjs +32 -52
  87. package/examples/credentials/createAccountCredential.ts +27 -0
  88. package/examples/credentials/createMineSweeperScoreCredential.ts +115 -0
  89. package/examples/index.ts +7 -0
  90. package/examples/schemas/FavoriteItemSchema.ts +27 -0
  91. package/examples/{Preferences.yaml → schemas/Preferences.yaml} +2 -0
  92. package/examples/schemas/PreferencesSchema.ts +29 -0
  93. package/examples/schemas/ProfileSchema.ts +91 -0
  94. package/examples/schemas/Status.yaml +3 -0
  95. package/examples/schemas/StatusSchema.ts +12 -0
  96. package/jest.config.mjs +5 -0
  97. package/package.json +27 -20
  98. package/src/CredentialFactory.ts +392 -0
  99. package/src/Schema.ts +583 -0
  100. package/src/ValidationError.ts +90 -0
  101. package/src/Validator.ts +603 -0
  102. package/src/__tests__/CredentialFactory.test.ts +588 -0
  103. package/src/__tests__/Schema.test.ts +371 -0
  104. package/src/__tests__/ValidationError.test.ts +235 -0
  105. package/src/__tests__/Validator.test.ts +787 -0
  106. package/src/helpers/JsonSchema.ts +119 -0
  107. package/src/helpers/__tests__/cleanupAttributes.test.ts +943 -0
  108. package/src/helpers/__tests__/cleanupNulls.test.ts +772 -0
  109. package/src/helpers/__tests__/getReferenceIds.test.ts +975 -0
  110. package/src/helpers/__tests__/got.test.ts +193 -0
  111. package/src/helpers/__tests__/mapObjectProperties.test.ts +1126 -0
  112. package/src/helpers/__tests__/normalizeAttributes.test.ts +1435 -0
  113. package/src/helpers/__tests__/normalizeProperties.test.ts +727 -0
  114. package/src/helpers/__tests__/normalizeRequired.test.ts +669 -0
  115. package/src/helpers/__tests__/normalizeType.test.ts +772 -0
  116. package/src/helpers/__tests__/nullifyEmptyValues.test.ts +735 -0
  117. package/src/helpers/__tests__/removeRequiredAndDefault.test.ts +734 -0
  118. package/src/helpers/__tests__/validateId.test.ts +118 -0
  119. package/src/helpers/cleanupAttributes.ts +151 -0
  120. package/src/helpers/cleanupNulls.ts +106 -0
  121. package/src/helpers/getReferenceIds.ts +273 -0
  122. package/src/helpers/got.ts +73 -0
  123. package/src/helpers/mapObjectProperties.ts +272 -0
  124. package/src/helpers/normalizeAttributes.ts +247 -0
  125. package/src/helpers/normalizeProperties.ts +249 -0
  126. package/src/helpers/normalizeRequired.ts +233 -0
  127. package/src/helpers/normalizeType.ts +235 -0
  128. package/src/helpers/nullifyEmptyValues.ts +207 -0
  129. package/src/helpers/removeRequiredAndDefault.ts +151 -0
  130. package/src/helpers/validateId.ts +53 -0
  131. package/src/index.ts +13 -0
  132. package/src/ld/__tests__/documentLoader.test.ts +57 -0
  133. package/src/ld/__tests__/getLinkedDataAttributeType.test.ts +212 -0
  134. package/src/ld/__tests__/getLinkedDataContext.test.ts +378 -0
  135. package/src/ld/documentLoader.ts +28 -0
  136. package/src/ld/getLinkedDataAttributeType.ts +46 -0
  137. package/src/ld/getLinkedDataContext.ts +80 -0
  138. package/tsconfig.json +27 -0
  139. package/types/credentials-context.d.ts +14 -0
  140. package/types/security-context.d.ts +6 -0
  141. package/examples/Status.yaml +0 -3
  142. package/examples/createAccountCredential.js +0 -27
  143. package/examples/createMineSweeperScoreCredential.js +0 -63
  144. package/examples/index.js +0 -9
  145. package/src/CredentialFactory.js +0 -67
  146. package/src/CredentialFactory.spec.js +0 -131
  147. package/src/Schema.js +0 -104
  148. package/src/Schema.spec.js +0 -172
  149. package/src/ValidationError.js +0 -31
  150. package/src/Validator.js +0 -128
  151. package/src/Validator.spec.js +0 -355
  152. package/src/helpers/cleanupAttributes.js +0 -71
  153. package/src/helpers/cleanupNulls.js +0 -42
  154. package/src/helpers/getReferenceIds.js +0 -71
  155. package/src/helpers/mapObject.js +0 -65
  156. package/src/helpers/normalizeAttributes.js +0 -28
  157. package/src/helpers/normalizeProperties.js +0 -61
  158. package/src/helpers/normalizeRequired.js +0 -37
  159. package/src/helpers/normalizeType.js +0 -41
  160. package/src/helpers/nullifyEmptyValues.js +0 -57
  161. package/src/helpers/removeRequiredAndDefault.js +0 -30
  162. package/src/helpers/validateId.js +0 -19
  163. package/src/index.d.ts +0 -25
  164. package/src/index.js +0 -8
  165. package/src/ld/documentLoader.js +0 -25
  166. package/src/ld/documentLoader.spec.js +0 -12
  167. package/src/ld/getLinkedDataContext.js +0 -63
  168. package/src/ld/getLinkedDataType.js +0 -38
  169. /package/examples/{FavoriteItem.yaml → schemas/FavoriteItem.yaml} +0 -0
  170. /package/examples/{Profile.yaml → schemas/Profile.yaml} +0 -0
@@ -0,0 +1,193 @@
1
+ import got from '../got';
2
+
3
+ describe('got', () => {
4
+ describe('returns value when it exists', () => {
5
+ it('returns value for simple property path', () => {
6
+ const obj = { name: 'John', age: 30 };
7
+ expect(got(obj, 'name')).toBe('John');
8
+ expect(got(obj, 'age')).toBe(30);
9
+ });
10
+
11
+ it('returns value for nested property path', () => {
12
+ const obj = { user: { profile: { name: 'John' } } };
13
+ expect(got(obj, 'user.profile.name')).toBe('John');
14
+ expect(got(obj, 'user.profile')).toEqual({ name: 'John' });
15
+ });
16
+
17
+ it('returns value for array index path', () => {
18
+ const obj = { items: ['a', 'b', 'c'] };
19
+ expect(got(obj, 'items[0]')).toBe('a');
20
+ expect(got(obj, 'items[1]')).toBe('b');
21
+ expect(got(obj, 'items[2]')).toBe('c');
22
+ });
23
+
24
+ it('returns value for nested array path', () => {
25
+ const obj = { data: { items: [{ id: 1 }, { id: 2 }] } };
26
+ expect(got(obj, 'data.items[0].id')).toBe(1);
27
+ expect(got(obj, 'data.items[1].id')).toBe(2);
28
+ });
29
+
30
+ it('returns falsy but defined values (null, false, 0, empty string)', () => {
31
+ const obj = {
32
+ nullValue: null,
33
+ falseValue: false,
34
+ zeroValue: 0,
35
+ emptyString: '',
36
+ };
37
+ expect(got(obj, 'nullValue')).toBeNull();
38
+ expect(got(obj, 'falseValue')).toBe(false);
39
+ expect(got(obj, 'zeroValue')).toBe(0);
40
+ expect(got(obj, 'emptyString')).toBe('');
41
+ });
42
+
43
+ it('returns empty object and empty array as values', () => {
44
+ const obj = { emptyObj: {}, emptyArr: [] };
45
+ expect(got(obj, 'emptyObj')).toEqual({});
46
+ expect(got(obj, 'emptyArr')).toEqual([]);
47
+ });
48
+
49
+ it('returns object and array by reference', () => {
50
+ const nestedObj = { nested: true };
51
+ const arr = [1, 2, 3];
52
+ const obj = { data: nestedObj, items: arr };
53
+ expect(got(obj, 'data')).toBe(nestedObj);
54
+ expect(got(obj, 'items')).toBe(arr);
55
+ });
56
+
57
+ it('returns value for deeply nested path', () => {
58
+ const obj = {
59
+ level1: {
60
+ level2: {
61
+ level3: {
62
+ level4: { value: 'deep' },
63
+ },
64
+ },
65
+ },
66
+ };
67
+ expect(got(obj, 'level1.level2.level3.level4.value')).toBe('deep');
68
+ });
69
+
70
+ it('handles paths with special characters in property names', () => {
71
+ const obj = { 'property-with-dashes': 'value' };
72
+ expect(got(obj, 'property-with-dashes')).toBe('value');
73
+ });
74
+
75
+ it('handles numeric property names', () => {
76
+ const obj = { '123': 'numeric-key' };
77
+ expect(got(obj, '123')).toBe('numeric-key');
78
+ });
79
+
80
+ it('handles bracket and dot notation for array indices', () => {
81
+ const obj = { items: ['a', 'b'] };
82
+ expect(got(obj, 'items.0')).toBe('a');
83
+ expect(got(obj, 'items[0]')).toBe('a');
84
+ });
85
+ });
86
+
87
+ describe('throws when value is undefined', () => {
88
+ it('throws Error instance with default message for missing simple property', () => {
89
+ const obj = { name: 'John' };
90
+ let err: Error | undefined;
91
+ try {
92
+ got(obj, 'age');
93
+ } catch (e) {
94
+ err = e as Error;
95
+ }
96
+ expect(err).toBeDefined();
97
+ expect(err).toBeInstanceOf(Error);
98
+ expect(err!.message).toBe('Value is undefined for "age"');
99
+ });
100
+
101
+ it('throws for non-existent nested property', () => {
102
+ const obj = { user: { name: 'John' } };
103
+ expect(() => got(obj, 'user.age')).toThrow('Value is undefined for "user.age"');
104
+ });
105
+
106
+ it('throws for non-existent deep nested property', () => {
107
+ const obj = { level1: { level2: {} } };
108
+ expect(() => got(obj, 'level1.level2.level3.value')).toThrow(
109
+ 'Value is undefined for "level1.level2.level3.value"'
110
+ );
111
+ });
112
+
113
+ it('throws for non-existent array index', () => {
114
+ const obj = { items: ['a', 'b'] };
115
+ expect(() => got(obj, 'items[5]')).toThrow('Value is undefined for "items[5]"');
116
+ });
117
+
118
+ it('throws when path traverses undefined parent', () => {
119
+ const obj = { user: undefined };
120
+ expect(() => got(obj, 'user.name')).toThrow('Value is undefined for "user.name"');
121
+ });
122
+
123
+ it('throws when path traverses null parent', () => {
124
+ const obj = { user: null };
125
+ expect(() => got(obj, 'user.name')).toThrow('Value is undefined for "user.name"');
126
+ });
127
+
128
+ it('throws for empty object', () => {
129
+ const obj = {};
130
+ expect(() => got(obj, 'anyProperty')).toThrow('Value is undefined for "anyProperty"');
131
+ });
132
+
133
+ it('throws for non-existent root-level property', () => {
134
+ const obj = { existing: 'value' };
135
+ expect(() => got(obj, 'nonExistent')).toThrow('Value is undefined for "nonExistent"');
136
+ });
137
+
138
+ it('includes exact path in default error message', () => {
139
+ const obj = { data: {} };
140
+ expect(() => got(obj, 'data.items[0].id')).toThrow(
141
+ 'Value is undefined for "data.items[0].id"'
142
+ );
143
+ });
144
+
145
+ it('throws for empty array index access', () => {
146
+ const obj = { items: [] };
147
+ expect(() => got(obj, 'items[0]')).toThrow('Value is undefined for "items[0]"');
148
+ });
149
+
150
+ it('throws for empty path', () => {
151
+ const obj = { a: 1 };
152
+ expect(() => got(obj, '')).toThrow('Value is undefined for ""');
153
+ });
154
+ });
155
+
156
+ describe('custom errorTemplate (3rd argument)', () => {
157
+ it('uses custom message when value is undefined', () => {
158
+ const obj = { name: 'John' };
159
+ expect(() => got(obj, 'age', 'Missing key: $PATH')).toThrow('Missing key: age');
160
+ });
161
+
162
+ it('substitutes $PATH with path in custom template', () => {
163
+ const obj = { data: {} };
164
+ expect(() =>
165
+ got(obj, 'data.items[0].id', 'Required field "$PATH" is missing')
166
+ ).toThrow('Required field "data.items[0].id" is missing');
167
+ });
168
+
169
+ it('supports schema-lookup style template', () => {
170
+ const schemasMap: Record<string, { id: string }> = {
171
+ 'schema-a': { id: 'schema-a' },
172
+ };
173
+ expect(got(schemasMap, 'schema-a', 'Schema "$PATH" not found')).toEqual({
174
+ id: 'schema-a',
175
+ });
176
+ expect(() =>
177
+ got(schemasMap, 'schema-b', 'Schema "$PATH" not found')
178
+ ).toThrow('Schema "schema-b" not found');
179
+ });
180
+
181
+ it('uses template as-is when $PATH is absent', () => {
182
+ const obj = { a: 1 };
183
+ expect(() => got(obj, 'missing', 'Generic error')).toThrow('Generic error');
184
+ });
185
+
186
+ it('replaces only first $PATH when template contains multiple', () => {
187
+ const obj = {};
188
+ expect(() =>
189
+ got(obj, 'foo', 'Path $PATH or $PATH invalid')
190
+ ).toThrow('Path foo or $PATH invalid');
191
+ });
192
+ });
193
+ });