@hazeljs/data 0.2.0-alpha.1

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 (171) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +308 -0
  3. package/dist/connectors/connector.interface.d.ts +29 -0
  4. package/dist/connectors/connector.interface.d.ts.map +1 -0
  5. package/dist/connectors/connector.interface.js +6 -0
  6. package/dist/connectors/csv.connector.d.ts +63 -0
  7. package/dist/connectors/csv.connector.d.ts.map +1 -0
  8. package/dist/connectors/csv.connector.js +147 -0
  9. package/dist/connectors/http.connector.d.ts +68 -0
  10. package/dist/connectors/http.connector.d.ts.map +1 -0
  11. package/dist/connectors/http.connector.js +131 -0
  12. package/dist/connectors/index.d.ts +7 -0
  13. package/dist/connectors/index.d.ts.map +1 -0
  14. package/dist/connectors/index.js +12 -0
  15. package/dist/connectors/memory.connector.d.ts +38 -0
  16. package/dist/connectors/memory.connector.d.ts.map +1 -0
  17. package/dist/connectors/memory.connector.js +56 -0
  18. package/dist/connectors/memory.connector.test.d.ts +2 -0
  19. package/dist/connectors/memory.connector.test.d.ts.map +1 -0
  20. package/dist/connectors/memory.connector.test.js +43 -0
  21. package/dist/data.module.d.ts +30 -0
  22. package/dist/data.module.d.ts.map +1 -0
  23. package/dist/data.module.js +120 -0
  24. package/dist/data.module.test.d.ts +2 -0
  25. package/dist/data.module.test.d.ts.map +1 -0
  26. package/dist/data.module.test.js +28 -0
  27. package/dist/data.types.d.ts +67 -0
  28. package/dist/data.types.d.ts.map +1 -0
  29. package/dist/data.types.js +5 -0
  30. package/dist/decorators/index.d.ts +6 -0
  31. package/dist/decorators/index.d.ts.map +1 -0
  32. package/dist/decorators/index.js +24 -0
  33. package/dist/decorators/pii.decorator.d.ts +59 -0
  34. package/dist/decorators/pii.decorator.d.ts.map +1 -0
  35. package/dist/decorators/pii.decorator.js +197 -0
  36. package/dist/decorators/pii.decorator.test.d.ts +2 -0
  37. package/dist/decorators/pii.decorator.test.d.ts.map +1 -0
  38. package/dist/decorators/pii.decorator.test.js +150 -0
  39. package/dist/decorators/pipeline.decorator.d.ts +22 -0
  40. package/dist/decorators/pipeline.decorator.d.ts.map +1 -0
  41. package/dist/decorators/pipeline.decorator.js +42 -0
  42. package/dist/decorators/pipeline.decorator.test.d.ts +2 -0
  43. package/dist/decorators/pipeline.decorator.test.d.ts.map +1 -0
  44. package/dist/decorators/pipeline.decorator.test.js +104 -0
  45. package/dist/decorators/stream.decorator.d.ts +31 -0
  46. package/dist/decorators/stream.decorator.d.ts.map +1 -0
  47. package/dist/decorators/stream.decorator.js +48 -0
  48. package/dist/decorators/transform.decorator.d.ts +29 -0
  49. package/dist/decorators/transform.decorator.d.ts.map +1 -0
  50. package/dist/decorators/transform.decorator.js +41 -0
  51. package/dist/decorators/validate.decorator.d.ts +34 -0
  52. package/dist/decorators/validate.decorator.d.ts.map +1 -0
  53. package/dist/decorators/validate.decorator.js +49 -0
  54. package/dist/flink.service.d.ts +80 -0
  55. package/dist/flink.service.d.ts.map +1 -0
  56. package/dist/flink.service.js +134 -0
  57. package/dist/flink.service.test.d.ts +2 -0
  58. package/dist/flink.service.test.d.ts.map +1 -0
  59. package/dist/flink.service.test.js +60 -0
  60. package/dist/index.d.ts +32 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +96 -0
  63. package/dist/pipelines/etl.service.d.ts +59 -0
  64. package/dist/pipelines/etl.service.d.ts.map +1 -0
  65. package/dist/pipelines/etl.service.js +223 -0
  66. package/dist/pipelines/etl.service.test.d.ts +2 -0
  67. package/dist/pipelines/etl.service.test.d.ts.map +1 -0
  68. package/dist/pipelines/etl.service.test.js +319 -0
  69. package/dist/pipelines/pipeline.base.d.ts +24 -0
  70. package/dist/pipelines/pipeline.base.d.ts.map +1 -0
  71. package/dist/pipelines/pipeline.base.js +29 -0
  72. package/dist/pipelines/pipeline.base.test.d.ts +2 -0
  73. package/dist/pipelines/pipeline.base.test.d.ts.map +1 -0
  74. package/dist/pipelines/pipeline.base.test.js +38 -0
  75. package/dist/pipelines/pipeline.builder.d.ts +95 -0
  76. package/dist/pipelines/pipeline.builder.d.ts.map +1 -0
  77. package/dist/pipelines/pipeline.builder.js +212 -0
  78. package/dist/pipelines/pipeline.builder.test.d.ts +2 -0
  79. package/dist/pipelines/pipeline.builder.test.d.ts.map +1 -0
  80. package/dist/pipelines/pipeline.builder.test.js +185 -0
  81. package/dist/pipelines/stream.service.d.ts +12 -0
  82. package/dist/pipelines/stream.service.d.ts.map +1 -0
  83. package/dist/pipelines/stream.service.js +58 -0
  84. package/dist/pipelines/stream.service.test.d.ts +2 -0
  85. package/dist/pipelines/stream.service.test.d.ts.map +1 -0
  86. package/dist/pipelines/stream.service.test.js +103 -0
  87. package/dist/quality/quality.service.d.ts +87 -0
  88. package/dist/quality/quality.service.d.ts.map +1 -0
  89. package/dist/quality/quality.service.js +326 -0
  90. package/dist/quality/quality.service.test.d.ts +2 -0
  91. package/dist/quality/quality.service.test.d.ts.map +1 -0
  92. package/dist/quality/quality.service.test.js +128 -0
  93. package/dist/schema/schema.d.ts +127 -0
  94. package/dist/schema/schema.d.ts.map +1 -0
  95. package/dist/schema/schema.js +487 -0
  96. package/dist/schema/schema.test.d.ts +2 -0
  97. package/dist/schema/schema.test.d.ts.map +1 -0
  98. package/dist/schema/schema.test.js +411 -0
  99. package/dist/streaming/flink/flink.client.d.ts +96 -0
  100. package/dist/streaming/flink/flink.client.d.ts.map +1 -0
  101. package/dist/streaming/flink/flink.client.js +267 -0
  102. package/dist/streaming/flink/flink.client.test.d.ts +2 -0
  103. package/dist/streaming/flink/flink.client.test.d.ts.map +1 -0
  104. package/dist/streaming/flink/flink.client.test.js +59 -0
  105. package/dist/streaming/flink/flink.job.d.ts +29 -0
  106. package/dist/streaming/flink/flink.job.d.ts.map +1 -0
  107. package/dist/streaming/flink/flink.job.js +27 -0
  108. package/dist/streaming/flink/flink.job.test.d.ts +2 -0
  109. package/dist/streaming/flink/flink.job.test.d.ts.map +1 -0
  110. package/dist/streaming/flink/flink.job.test.js +37 -0
  111. package/dist/streaming/flink/flink.operators.d.ts +35 -0
  112. package/dist/streaming/flink/flink.operators.d.ts.map +1 -0
  113. package/dist/streaming/flink/flink.operators.js +43 -0
  114. package/dist/streaming/flink/flink.operators.test.d.ts +2 -0
  115. package/dist/streaming/flink/flink.operators.test.d.ts.map +1 -0
  116. package/dist/streaming/flink/flink.operators.test.js +38 -0
  117. package/dist/streaming/stream.builder.d.ts +22 -0
  118. package/dist/streaming/stream.builder.d.ts.map +1 -0
  119. package/dist/streaming/stream.builder.js +50 -0
  120. package/dist/streaming/stream.builder.test.d.ts +2 -0
  121. package/dist/streaming/stream.builder.test.d.ts.map +1 -0
  122. package/dist/streaming/stream.builder.test.js +59 -0
  123. package/dist/streaming/stream.processor.d.ts +66 -0
  124. package/dist/streaming/stream.processor.d.ts.map +1 -0
  125. package/dist/streaming/stream.processor.js +178 -0
  126. package/dist/streaming/stream.processor.test.d.ts +2 -0
  127. package/dist/streaming/stream.processor.test.d.ts.map +1 -0
  128. package/dist/streaming/stream.processor.test.js +151 -0
  129. package/dist/streaming/stream.processor.windowing.test.d.ts +2 -0
  130. package/dist/streaming/stream.processor.windowing.test.d.ts.map +1 -0
  131. package/dist/streaming/stream.processor.windowing.test.js +69 -0
  132. package/dist/telemetry/telemetry.d.ts +124 -0
  133. package/dist/telemetry/telemetry.d.ts.map +1 -0
  134. package/dist/telemetry/telemetry.js +259 -0
  135. package/dist/telemetry/telemetry.test.d.ts +2 -0
  136. package/dist/telemetry/telemetry.test.d.ts.map +1 -0
  137. package/dist/telemetry/telemetry.test.js +51 -0
  138. package/dist/testing/index.d.ts +12 -0
  139. package/dist/testing/index.d.ts.map +1 -0
  140. package/dist/testing/index.js +18 -0
  141. package/dist/testing/pipeline-test-harness.d.ts +40 -0
  142. package/dist/testing/pipeline-test-harness.d.ts.map +1 -0
  143. package/dist/testing/pipeline-test-harness.js +55 -0
  144. package/dist/testing/pipeline-test-harness.test.d.ts +2 -0
  145. package/dist/testing/pipeline-test-harness.test.d.ts.map +1 -0
  146. package/dist/testing/pipeline-test-harness.test.js +102 -0
  147. package/dist/testing/schema-faker.d.ts +32 -0
  148. package/dist/testing/schema-faker.d.ts.map +1 -0
  149. package/dist/testing/schema-faker.js +91 -0
  150. package/dist/testing/schema-faker.test.d.ts +2 -0
  151. package/dist/testing/schema-faker.test.d.ts.map +1 -0
  152. package/dist/testing/schema-faker.test.js +66 -0
  153. package/dist/transformers/built-in.transformers.d.ts +12 -0
  154. package/dist/transformers/built-in.transformers.d.ts.map +1 -0
  155. package/dist/transformers/built-in.transformers.js +75 -0
  156. package/dist/transformers/built-in.transformers.test.d.ts +2 -0
  157. package/dist/transformers/built-in.transformers.test.d.ts.map +1 -0
  158. package/dist/transformers/built-in.transformers.test.js +85 -0
  159. package/dist/transformers/transformer.service.d.ts +14 -0
  160. package/dist/transformers/transformer.service.d.ts.map +1 -0
  161. package/dist/transformers/transformer.service.js +65 -0
  162. package/dist/transformers/transformer.service.test.d.ts +2 -0
  163. package/dist/transformers/transformer.service.test.d.ts.map +1 -0
  164. package/dist/transformers/transformer.service.test.js +42 -0
  165. package/dist/validators/schema.validator.d.ts +21 -0
  166. package/dist/validators/schema.validator.d.ts.map +1 -0
  167. package/dist/validators/schema.validator.js +40 -0
  168. package/dist/validators/schema.validator.test.d.ts +2 -0
  169. package/dist/validators/schema.validator.test.d.ts.map +1 -0
  170. package/dist/validators/schema.validator.test.js +42 -0
  171. package/package.json +53 -0
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemaFaker = void 0;
4
+ /**
5
+ * Generate fake data that matches a schema.
6
+ * Uses schema.toJsonSchema() to infer structure and produce valid sample data.
7
+ *
8
+ * @example
9
+ * const UserSchema = Schema.object({ name: Schema.string(), age: Schema.number() });
10
+ * const fake = SchemaFaker.generate(UserSchema);
11
+ * // { name: "random-string-123", age: 42 }
12
+ */
13
+ class SchemaFaker {
14
+ constructor(options = {}) {
15
+ this.options = { arrayMinLength: 1, arrayMaxLength: 5, ...options };
16
+ }
17
+ /**
18
+ * Generate one fake record matching the schema.
19
+ */
20
+ generate(schema) {
21
+ const js = schema.toJsonSchema();
22
+ return this.generateFromJsonSchema(js);
23
+ }
24
+ /**
25
+ * Generate N fake records.
26
+ */
27
+ generateMany(schema, count) {
28
+ return Array.from({ length: count }, () => this.generate(schema));
29
+ }
30
+ generateFromJsonSchema(js) {
31
+ if (js.const !== undefined)
32
+ return js.const;
33
+ if (js.oneOf) {
34
+ const schemas = js.oneOf;
35
+ const idx = Math.floor(Math.random() * schemas.length);
36
+ return this.generateFromJsonSchema(schemas[idx]);
37
+ }
38
+ if (js.properties) {
39
+ const out = {};
40
+ const props = js.properties;
41
+ for (const [k, v] of Object.entries(props)) {
42
+ out[k] = this.generateFromJsonSchema(v);
43
+ }
44
+ return out;
45
+ }
46
+ if (js.items) {
47
+ const len = Math.floor(Math.random() * (this.options.arrayMaxLength - this.options.arrayMinLength + 1)) + this.options.arrayMinLength;
48
+ const itemSchema = js.items;
49
+ return Array.from({ length: len }, () => this.generateFromJsonSchema(itemSchema));
50
+ }
51
+ const type = js.type;
52
+ if (Array.isArray(type)) {
53
+ const t = type.find((x) => x !== 'null') ?? 'string';
54
+ return this.genByType(t, js);
55
+ }
56
+ if (typeof type === 'string') {
57
+ return this.genByType(type, js);
58
+ }
59
+ return null;
60
+ }
61
+ genByType(type, _js) {
62
+ switch (type) {
63
+ case 'string':
64
+ return this.randomString();
65
+ case 'number':
66
+ case 'integer':
67
+ return Math.floor(Math.random() * 1000) - 100;
68
+ case 'boolean':
69
+ return Math.random() > 0.5;
70
+ case 'object':
71
+ return {};
72
+ case 'array':
73
+ return [];
74
+ default:
75
+ return null;
76
+ }
77
+ }
78
+ randomString() {
79
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
80
+ const len = Math.floor(Math.random() * 10) + 5;
81
+ return Array.from({ length: len }, () => chars[Math.floor(Math.random() * chars.length)]).join('');
82
+ }
83
+ /** Static convenience method */
84
+ static generate(schema) {
85
+ return new SchemaFaker().generate(schema);
86
+ }
87
+ static generateMany(schema, count) {
88
+ return new SchemaFaker().generateMany(schema, count);
89
+ }
90
+ }
91
+ exports.SchemaFaker = SchemaFaker;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema-faker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-faker.test.d.ts","sourceRoot":"","sources":["../../src/testing/schema-faker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const schema_1 = require("../schema/schema");
4
+ const schema_faker_1 = require("./schema-faker");
5
+ describe('SchemaFaker', () => {
6
+ it('generates string', () => {
7
+ const schema = schema_1.Schema.string();
8
+ const value = schema_faker_1.SchemaFaker.generate(schema);
9
+ expect(typeof value).toBe('string');
10
+ expect(schema.validate(value).success).toBe(true);
11
+ });
12
+ it('generates number', () => {
13
+ const schema = schema_1.Schema.number();
14
+ const value = schema_faker_1.SchemaFaker.generate(schema);
15
+ expect(typeof value).toBe('number');
16
+ expect(schema.validate(value).success).toBe(true);
17
+ });
18
+ it('generates boolean', () => {
19
+ const schema = schema_1.Schema.boolean();
20
+ const value = schema_faker_1.SchemaFaker.generate(schema);
21
+ expect(typeof value).toBe('boolean');
22
+ expect(schema.validate(value).success).toBe(true);
23
+ });
24
+ it('generates object', () => {
25
+ const schema = schema_1.Schema.object({ name: schema_1.Schema.string(), age: schema_1.Schema.number() });
26
+ const value = schema_faker_1.SchemaFaker.generate(schema);
27
+ expect(value).toHaveProperty('name');
28
+ expect(value).toHaveProperty('age');
29
+ expect(schema.validate(value).success).toBe(true);
30
+ });
31
+ it('generateMany returns array', () => {
32
+ const schema = schema_1.Schema.object({ id: schema_1.Schema.number() });
33
+ const values = schema_faker_1.SchemaFaker.generateMany(schema, 3);
34
+ expect(values).toHaveLength(3);
35
+ values.forEach((v) => expect(schema.validate(v).success).toBe(true));
36
+ });
37
+ it('generates literal', () => {
38
+ const schema = schema_1.Schema.literal('active');
39
+ const value = schema_faker_1.SchemaFaker.generate(schema);
40
+ expect(value).toBe('active');
41
+ });
42
+ it('generates array', () => {
43
+ const schema = schema_1.Schema.array(schema_1.Schema.number());
44
+ const value = schema_faker_1.SchemaFaker.generate(schema);
45
+ expect(Array.isArray(value)).toBe(true);
46
+ expect(schema.validate(value).success).toBe(true);
47
+ });
48
+ it('generates union', () => {
49
+ const schema = schema_1.Schema.union([schema_1.Schema.literal('a'), schema_1.Schema.literal('b')]);
50
+ const value = schema_faker_1.SchemaFaker.generate(schema);
51
+ expect(['a', 'b']).toContain(value);
52
+ });
53
+ it('constructor with custom array length options', () => {
54
+ const faker = new schema_faker_1.SchemaFaker({ arrayMinLength: 2, arrayMaxLength: 4 });
55
+ const schema = schema_1.Schema.array(schema_1.Schema.number());
56
+ const value = faker.generate(schema);
57
+ expect(Array.isArray(value)).toBe(true);
58
+ expect(value.length).toBeGreaterThanOrEqual(2);
59
+ expect(value.length).toBeLessThanOrEqual(4);
60
+ });
61
+ it('generateFromJsonSchema handles nullable type array', () => {
62
+ const schema = schema_1.Schema.string().nullable();
63
+ const value = schema_faker_1.SchemaFaker.generate(schema);
64
+ expect(value === null || typeof value === 'string').toBe(true);
65
+ });
66
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Built-in transformers for common data operations
3
+ */
4
+ export declare const trimString: (value: unknown) => string;
5
+ export declare const toLowerCase: (value: unknown) => string;
6
+ export declare const toUpperCase: (value: unknown) => string;
7
+ export declare const parseJson: (value: unknown) => unknown;
8
+ export declare const stringifyJson: (value: unknown) => string;
9
+ export declare const pick: (keys: string[]) => (obj: unknown) => Record<string, unknown>;
10
+ export declare const omit: (keys: string[]) => (obj: unknown) => Record<string, unknown>;
11
+ export declare const renameKeys: (mapping: Record<string, string>) => (obj: unknown) => Record<string, unknown>;
12
+ //# sourceMappingURL=built-in.transformers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in.transformers.d.ts","sourceRoot":"","sources":["../../src/transformers/built-in.transformers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,MAG3C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,MAG5C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,MAG5C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAK1C,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,MAE9C,CAAC;AAEF,eAAO,MAAM,IAAI,GACd,MAAM,MAAM,EAAE,MACd,KAAK,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAQrC,CAAC;AAEJ,eAAO,MAAM,IAAI,GACd,MAAM,MAAM,EAAE,MACd,KAAK,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAQrC,CAAC;AAEJ,eAAO,MAAM,UAAU,GACpB,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAC/B,KAAK,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAWrC,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * Built-in transformers for common data operations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renameKeys = exports.omit = exports.pick = exports.stringifyJson = exports.parseJson = exports.toUpperCase = exports.toLowerCase = exports.trimString = void 0;
7
+ const trimString = (value) => {
8
+ if (typeof value !== 'string')
9
+ return String(value);
10
+ return value.trim();
11
+ };
12
+ exports.trimString = trimString;
13
+ const toLowerCase = (value) => {
14
+ if (typeof value !== 'string')
15
+ return String(value).toLowerCase();
16
+ return value.toLowerCase();
17
+ };
18
+ exports.toLowerCase = toLowerCase;
19
+ const toUpperCase = (value) => {
20
+ if (typeof value !== 'string')
21
+ return String(value).toUpperCase();
22
+ return value.toUpperCase();
23
+ };
24
+ exports.toUpperCase = toUpperCase;
25
+ const parseJson = (value) => {
26
+ if (typeof value === 'string') {
27
+ return JSON.parse(value);
28
+ }
29
+ return value;
30
+ };
31
+ exports.parseJson = parseJson;
32
+ const stringifyJson = (value) => {
33
+ return JSON.stringify(value);
34
+ };
35
+ exports.stringifyJson = stringifyJson;
36
+ const pick = (keys) => (obj) => {
37
+ if (obj === null || typeof obj !== 'object')
38
+ return {};
39
+ const result = {};
40
+ const source = obj;
41
+ for (const key of keys) {
42
+ if (key in source)
43
+ result[key] = source[key];
44
+ }
45
+ return result;
46
+ };
47
+ exports.pick = pick;
48
+ const omit = (keys) => (obj) => {
49
+ if (obj === null || typeof obj !== 'object')
50
+ return {};
51
+ const result = {};
52
+ const source = obj;
53
+ for (const key of Object.keys(source)) {
54
+ if (!keys.includes(key))
55
+ result[key] = source[key];
56
+ }
57
+ return result;
58
+ };
59
+ exports.omit = omit;
60
+ const renameKeys = (mapping) => (obj) => {
61
+ if (obj === null || typeof obj !== 'object')
62
+ return {};
63
+ const result = {};
64
+ const source = obj;
65
+ for (const [oldKey, newKey] of Object.entries(mapping)) {
66
+ if (oldKey in source)
67
+ result[newKey] = source[oldKey];
68
+ }
69
+ for (const [key, value] of Object.entries(source)) {
70
+ if (!(key in mapping))
71
+ result[key] = value;
72
+ }
73
+ return result;
74
+ };
75
+ exports.renameKeys = renameKeys;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=built-in.transformers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in.transformers.test.d.ts","sourceRoot":"","sources":["../../src/transformers/built-in.transformers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const built_in_transformers_1 = require("./built-in.transformers");
4
+ describe('built-in transformers', () => {
5
+ describe('trimString', () => {
6
+ it('trims whitespace', () => {
7
+ expect((0, built_in_transformers_1.trimString)(' hi ')).toBe('hi');
8
+ });
9
+ it('converts non-string', () => {
10
+ expect((0, built_in_transformers_1.trimString)(123)).toBe('123');
11
+ });
12
+ });
13
+ describe('toLowerCase', () => {
14
+ it('lowercases string', () => {
15
+ expect((0, built_in_transformers_1.toLowerCase)('HELLO')).toBe('hello');
16
+ });
17
+ it('converts non-string', () => {
18
+ expect((0, built_in_transformers_1.toLowerCase)(123)).toBe('123');
19
+ });
20
+ });
21
+ describe('toUpperCase', () => {
22
+ it('uppercases string', () => {
23
+ expect((0, built_in_transformers_1.toUpperCase)('hello')).toBe('HELLO');
24
+ });
25
+ it('converts non-string', () => {
26
+ expect((0, built_in_transformers_1.toUpperCase)(123)).toBe('123');
27
+ });
28
+ });
29
+ describe('parseJson', () => {
30
+ it('parses JSON string', () => {
31
+ expect((0, built_in_transformers_1.parseJson)('{"a":1}')).toEqual({ a: 1 });
32
+ });
33
+ it('returns value for non-string', () => {
34
+ expect((0, built_in_transformers_1.parseJson)({ a: 1 })).toEqual({ a: 1 });
35
+ });
36
+ });
37
+ describe('stringifyJson', () => {
38
+ it('stringifies object', () => {
39
+ expect((0, built_in_transformers_1.stringifyJson)({ a: 1 })).toBe('{"a":1}');
40
+ });
41
+ });
42
+ describe('pick', () => {
43
+ it('picks specified keys', () => {
44
+ const fn = (0, built_in_transformers_1.pick)(['a', 'c']);
45
+ expect(fn({ a: 1, b: 2, c: 3 })).toEqual({ a: 1, c: 3 });
46
+ });
47
+ it('handles missing keys', () => {
48
+ expect((0, built_in_transformers_1.pick)(['x'])({})).toEqual({});
49
+ });
50
+ it('returns empty for null', () => {
51
+ expect((0, built_in_transformers_1.pick)(['a'])(null)).toEqual({});
52
+ });
53
+ it('returns empty for non-object', () => {
54
+ expect((0, built_in_transformers_1.pick)(['a'])('string')).toEqual({});
55
+ });
56
+ });
57
+ describe('omit', () => {
58
+ it('omits specified keys', () => {
59
+ const fn = (0, built_in_transformers_1.omit)(['b']);
60
+ expect(fn({ a: 1, b: 2, c: 3 })).toEqual({ a: 1, c: 3 });
61
+ });
62
+ it('returns empty for null', () => {
63
+ expect((0, built_in_transformers_1.omit)(['a'])(null)).toEqual({});
64
+ });
65
+ it('returns empty for non-object', () => {
66
+ expect((0, built_in_transformers_1.omit)(['a'])(123)).toEqual({});
67
+ });
68
+ });
69
+ describe('renameKeys', () => {
70
+ it('renames keys', () => {
71
+ const fn = (0, built_in_transformers_1.renameKeys)({ oldName: 'newName' });
72
+ expect(fn({ oldName: 'value', keep: 1 })).toEqual({ newName: 'value', keep: 1 });
73
+ });
74
+ it('returns empty for null', () => {
75
+ expect((0, built_in_transformers_1.renameKeys)({ a: 'b' })(null)).toEqual({});
76
+ });
77
+ it('returns empty for non-object', () => {
78
+ expect((0, built_in_transformers_1.renameKeys)({ a: 'b' })(123)).toEqual({});
79
+ });
80
+ it('keeps keys not in mapping', () => {
81
+ const fn = (0, built_in_transformers_1.renameKeys)({ a: 'A' });
82
+ expect(fn({ a: 1, b: 2 })).toEqual({ A: 1, b: 2 });
83
+ });
84
+ });
85
+ });
@@ -0,0 +1,14 @@
1
+ export type TransformFn<T = unknown, R = unknown> = (input: T) => R | Promise<R>;
2
+ /**
3
+ * Transformer Service - Data transformations
4
+ * Provides utilities for common data transformation patterns
5
+ */
6
+ export declare class TransformerService {
7
+ private transforms;
8
+ register(name: string, fn: TransformFn): void;
9
+ apply<T, R>(name: string, input: T): Promise<R>;
10
+ pipe<T>(...fns: Array<(x: unknown) => unknown | Promise<unknown>>): (input: T) => Promise<unknown>;
11
+ map<T, R>(fn: (item: T) => R | Promise<R>): (items: T[]) => Promise<R[]>;
12
+ filter<T>(predicate: (item: T) => boolean | Promise<boolean>): (items: T[]) => Promise<T[]>;
13
+ }
14
+ //# sourceMappingURL=transformer.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.service.d.ts","sourceRoot":"","sources":["../../src/transformers/transformer.service.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjF;;;GAGG;AACH,qBACa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAuC;IAEzD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI;IAKvC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASrD,IAAI,CAAC,CAAC,EACJ,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GACxD,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;IAWjC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC;IAMxE,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC;CAU5F"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TransformerService = void 0;
13
+ const core_1 = require("@hazeljs/core");
14
+ const core_2 = __importDefault(require("@hazeljs/core"));
15
+ /**
16
+ * Transformer Service - Data transformations
17
+ * Provides utilities for common data transformation patterns
18
+ */
19
+ let TransformerService = class TransformerService {
20
+ constructor() {
21
+ this.transforms = new Map();
22
+ }
23
+ register(name, fn) {
24
+ this.transforms.set(name, fn);
25
+ core_2.default.debug(`Registered transform: ${name}`);
26
+ }
27
+ async apply(name, input) {
28
+ const fn = this.transforms.get(name);
29
+ if (!fn) {
30
+ throw new Error(`Transform not found: ${name}`);
31
+ }
32
+ const result = fn(input);
33
+ return (result instanceof Promise ? await result : result);
34
+ }
35
+ pipe(...fns) {
36
+ return async (input) => {
37
+ let data = input;
38
+ for (const fn of fns) {
39
+ const result = fn(data);
40
+ data = result instanceof Promise ? await result : result;
41
+ }
42
+ return data;
43
+ };
44
+ }
45
+ map(fn) {
46
+ return async (items) => {
47
+ return Promise.all(items.map((item) => Promise.resolve(fn(item))));
48
+ };
49
+ }
50
+ filter(predicate) {
51
+ return async (items) => {
52
+ const results = [];
53
+ for (const item of items) {
54
+ const keep = await Promise.resolve(predicate(item));
55
+ if (keep)
56
+ results.push(item);
57
+ }
58
+ return results;
59
+ };
60
+ }
61
+ };
62
+ exports.TransformerService = TransformerService;
63
+ exports.TransformerService = TransformerService = __decorate([
64
+ (0, core_1.Service)()
65
+ ], TransformerService);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transformer.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.service.test.d.ts","sourceRoot":"","sources":["../../src/transformers/transformer.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const transformer_service_1 = require("./transformer.service");
4
+ describe('TransformerService', () => {
5
+ let service;
6
+ beforeEach(() => {
7
+ service = new transformer_service_1.TransformerService();
8
+ });
9
+ it('registers and applies transform', async () => {
10
+ service.register('double', (x) => x * 2);
11
+ const result = await service.apply('double', 5);
12
+ expect(result).toBe(10);
13
+ });
14
+ it('throws for unregistered transform', async () => {
15
+ await expect(service.apply('missing', 1)).rejects.toThrow('Transform not found: missing');
16
+ });
17
+ it('pipe composes functions', async () => {
18
+ const fn = service.pipe((x) => x + 1, (x) => x * 2);
19
+ const result = await fn(5);
20
+ expect(result).toBe(12);
21
+ });
22
+ it('map transforms array', async () => {
23
+ const mapper = service.map((x) => x * 2);
24
+ const result = await mapper([1, 2, 3]);
25
+ expect(result).toEqual([2, 4, 6]);
26
+ });
27
+ it('filter filters array', async () => {
28
+ const filter = service.filter((x) => x > 2);
29
+ const result = await filter([1, 2, 3, 4]);
30
+ expect(result).toEqual([3, 4]);
31
+ });
32
+ it('apply returns sync result without awaiting', async () => {
33
+ service.register('sync', (x) => x + 1);
34
+ const result = await service.apply('sync', 10);
35
+ expect(result).toBe(11);
36
+ });
37
+ it('filter with async predicate', async () => {
38
+ const filter = service.filter(async (x) => x > 1);
39
+ const result = await filter([1, 2, 3]);
40
+ expect(result).toEqual([2, 3]);
41
+ });
42
+ });
@@ -0,0 +1,21 @@
1
+ import type { BaseSchema } from '../schema/schema';
2
+ import type { SchemaValidationError } from '../schema/schema';
3
+ export declare class SchemaValidationException extends Error {
4
+ readonly errors: SchemaValidationError[];
5
+ constructor(message: string, errors: SchemaValidationError[]);
6
+ }
7
+ /**
8
+ * Schema Validator - Validates data against schemas
9
+ */
10
+ export declare class SchemaValidator {
11
+ validate<T>(schema: BaseSchema<T>, value: unknown): T;
12
+ validateOrThrow<T>(schema: BaseSchema<T>, value: unknown): T;
13
+ safeValidate<T>(schema: BaseSchema<T>, value: unknown): {
14
+ success: true;
15
+ data: T;
16
+ } | {
17
+ success: false;
18
+ errors: SchemaValidationError[];
19
+ };
20
+ }
21
+ //# sourceMappingURL=schema.validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.validator.d.ts","sourceRoot":"","sources":["../../src/validators/schema.validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,qBAAa,yBAA0B,SAAQ,KAAK;aAGhC,MAAM,EAAE,qBAAqB,EAAE;gBAD/C,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,qBAAqB,EAAE;CAKlD;AAED;;GAEG;AACH,qBACa,eAAe;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC;IAWrD,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC;IAI5D,YAAY,CAAC,CAAC,EACZ,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,OAAO,GACb;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;KAAE;CAKpF"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SchemaValidator = exports.SchemaValidationException = void 0;
10
+ const core_1 = require("@hazeljs/core");
11
+ class SchemaValidationException extends Error {
12
+ constructor(message, errors) {
13
+ super(message);
14
+ this.errors = errors;
15
+ this.name = 'SchemaValidationException';
16
+ }
17
+ }
18
+ exports.SchemaValidationException = SchemaValidationException;
19
+ /**
20
+ * Schema Validator - Validates data against schemas
21
+ */
22
+ let SchemaValidator = class SchemaValidator {
23
+ validate(schema, value) {
24
+ const result = schema.validate(value);
25
+ if (result.success) {
26
+ return result.data;
27
+ }
28
+ throw new SchemaValidationException(`Validation failed: ${result.errors.map((e) => `${e.path}: ${e.message}`).join('; ')}`, result.errors);
29
+ }
30
+ validateOrThrow(schema, value) {
31
+ return this.validate(schema, value);
32
+ }
33
+ safeValidate(schema, value) {
34
+ return schema.validate(value);
35
+ }
36
+ };
37
+ exports.SchemaValidator = SchemaValidator;
38
+ exports.SchemaValidator = SchemaValidator = __decorate([
39
+ (0, core_1.Service)()
40
+ ], SchemaValidator);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.validator.test.d.ts","sourceRoot":"","sources":["../../src/validators/schema.validator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const schema_validator_1 = require("./schema.validator");
4
+ const schema_1 = require("../schema/schema");
5
+ describe('SchemaValidator', () => {
6
+ let validator;
7
+ beforeEach(() => {
8
+ validator = new schema_validator_1.SchemaValidator();
9
+ });
10
+ it('validates and returns data', () => {
11
+ const schema = schema_1.Schema.object({ x: schema_1.Schema.number() });
12
+ const result = validator.validate(schema, { x: 42 });
13
+ expect(result).toEqual({ x: 42 });
14
+ });
15
+ it('throws SchemaValidationException on invalid data', () => {
16
+ const schema = schema_1.Schema.object({ x: schema_1.Schema.number() });
17
+ expect(() => validator.validate(schema, { x: 'not a number' })).toThrow(schema_validator_1.SchemaValidationException);
18
+ try {
19
+ validator.validate(schema, { x: 'bad' });
20
+ }
21
+ catch (e) {
22
+ expect(e).toBeInstanceOf(schema_validator_1.SchemaValidationException);
23
+ expect(e.errors).toBeDefined();
24
+ }
25
+ });
26
+ it('validateOrThrow is alias for validate', () => {
27
+ const schema = schema_1.Schema.object({ x: schema_1.Schema.number() });
28
+ const result = validator.validateOrThrow(schema, { x: 1 });
29
+ expect(result).toEqual({ x: 1 });
30
+ });
31
+ it('safeValidate returns result without throwing', () => {
32
+ const schema = schema_1.Schema.string();
33
+ const valid = validator.safeValidate(schema, 'ok');
34
+ expect(valid.success).toBe(true);
35
+ if (valid.success)
36
+ expect(valid.data).toBe('ok');
37
+ const invalid = validator.safeValidate(schema, 123);
38
+ expect(invalid.success).toBe(false);
39
+ if (!invalid.success)
40
+ expect(invalid.errors.length).toBeGreaterThan(0);
41
+ });
42
+ });
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@hazeljs/data",
3
+ "version": "0.2.0-alpha.1",
4
+ "description": "Data Processing & ETL for HazelJS framework",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc --skipLibCheck",
12
+ "test": "jest --coverage --maxWorkers=1",
13
+ "lint": "eslint \"src/**/*.ts\"",
14
+ "lint:fix": "eslint \"src/**/*.ts\" --fix",
15
+ "clean": "rm -rf dist"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^20.17.50",
19
+ "@typescript-eslint/eslint-plugin": "^8.18.2",
20
+ "@typescript-eslint/parser": "^8.18.2",
21
+ "eslint": "^8.56.0",
22
+ "jest": "^29.7.0",
23
+ "ts-jest": "^29.1.2",
24
+ "typescript": "^5.3.3"
25
+ },
26
+ "peerDependencies": {
27
+ "@hazeljs/core": ">=0.2.0-beta.0"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/hazel-js/hazeljs.git",
35
+ "directory": "packages/data"
36
+ },
37
+ "keywords": [
38
+ "hazeljs",
39
+ "data",
40
+ "etl",
41
+ "pipeline",
42
+ "flink",
43
+ "streaming",
44
+ "validation"
45
+ ],
46
+ "author": "Muhammad Arslan <muhammad.arslan@hazeljs.com>",
47
+ "license": "Apache-2.0",
48
+ "bugs": {
49
+ "url": "https://github.com/hazeljs/hazel-js/issues"
50
+ },
51
+ "homepage": "https://hazeljs.com",
52
+ "gitHead": "cbc5ee2c12ced28fd0576faf13c5f078c1e8421e"
53
+ }