devtoolz-library 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/baseFactory.d.ts +12 -0
- package/dist/baseFactory.js +33 -0
- package/dist/constants/regexPatterns.d.ts +2 -0
- package/dist/constants/regexPatterns.js +9 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.d.ts +4 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.factory.d.ts +4 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.factory.js +2 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.js +2 -0
- package/dist/converters/numeric-systems/numericSystem.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/numericSystem.converter.factory.d.ts +8 -0
- package/dist/converters/numeric-systems/numericSystem.converter.factory.js +17 -0
- package/dist/converters/numeric-systems/numericSystem.converter.js +17 -0
- package/dist/converters/numeric-systems/provider.d.ts +2 -0
- package/dist/converters/numeric-systems/provider.js +11 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.js +16 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.test.js +252 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.js +16 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.test.js +199 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.js +18 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.test.js +130 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.js +15 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.test.js +151 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.d.ts +7 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.js +77 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.test.js +105 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.d.ts +5 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.factory.d.ts +4 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.factory.js +2 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.js +2 -0
- package/dist/converters/serialization/interfaces/ISerializationOptions.d.ts +4 -0
- package/dist/converters/serialization/interfaces/ISerializationOptions.js +2 -0
- package/dist/converters/serialization/provider.d.ts +2 -0
- package/dist/converters/serialization/provider.js +7 -0
- package/dist/converters/serialization/serialization.converter.d.ts +6 -0
- package/dist/converters/serialization/serialization.converter.factory.d.ts +9 -0
- package/dist/converters/serialization/serialization.converter.factory.js +20 -0
- package/dist/converters/serialization/serialization.converter.js +17 -0
- package/dist/converters/serialization/services/csv/csv.converter.d.ts +6 -0
- package/dist/converters/serialization/services/csv/csv.converter.js +68 -0
- package/dist/converters/serialization/services/csv/csv.converter.test.d.ts +1 -0
- package/dist/converters/serialization/services/csv/csv.converter.test.js +295 -0
- package/dist/converters/serialization/services/json/json.converter.d.ts +5 -0
- package/dist/converters/serialization/services/json/json.converter.js +12 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.d.ts +4 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.factory.d.ts +4 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.factory.js +2 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.js +2 -0
- package/dist/converters/text-format/provider.d.ts +2 -0
- package/dist/converters/text-format/provider.js +8 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.d.ts +5 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.js +40 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.test.d.ts +1 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.test.js +174 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.d.ts +6 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.js +85 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.test.d.ts +1 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.test.js +518 -0
- package/dist/converters/text-format/services/text/text-format.converter.d.ts +5 -0
- package/dist/converters/text-format/services/text/text-format.converter.js +12 -0
- package/dist/converters/text-format/textFormatConverter.converter.d.ts +5 -0
- package/dist/converters/text-format/textFormatConverter.converter.factory.d.ts +8 -0
- package/dist/converters/text-format/textFormatConverter.converter.factory.js +17 -0
- package/dist/converters/text-format/textFormatConverter.converter.js +17 -0
- package/dist/converters/unit-converter/converter-base.d.ts +19 -0
- package/dist/converters/unit-converter/converter-base.js +56 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverter.d.ts +9 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverter.js +2 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverterFactory.d.ts +4 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverterFactory.js +2 -0
- package/dist/converters/unit-converter/models/unit.d.ts +7 -0
- package/dist/converters/unit-converter/models/unit.js +2 -0
- package/dist/converters/unit-converter/provider.d.ts +2 -0
- package/dist/converters/unit-converter/provider.js +16 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.js +15 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.test.js +112 -0
- package/dist/converters/unit-converter/services/area/area.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/area/area.converter.js +24 -0
- package/dist/converters/unit-converter/services/area/area.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/area/area.converter.test.js +439 -0
- package/dist/converters/unit-converter/services/data/data.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/data/data.converter.js +30 -0
- package/dist/converters/unit-converter/services/data/data.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/data/data.converter.test.js +209 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.js +20 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.test.js +154 -0
- package/dist/converters/unit-converter/services/length/length.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/length/length.converter.js +31 -0
- package/dist/converters/unit-converter/services/length/length.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/length/length.converter.test.js +186 -0
- package/dist/converters/unit-converter/services/power/power.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/power/power.converter.js +17 -0
- package/dist/converters/unit-converter/services/power/power.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/power/power.converter.test.js +223 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.js +18 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.test.js +107 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.js +22 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.test.js +257 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.d.ts +7 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.js +46 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.test.js +279 -0
- package/dist/converters/unit-converter/services/time/time.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/time/time.converter.js +26 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.js +39 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.test.js +295 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.js +29 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.test.js +218 -0
- package/dist/converters/unit-converter/unit.converter.factory.d.ts +9 -0
- package/dist/converters/unit-converter/unit.converter.factory.js +20 -0
- package/dist/crypt.d.ts +0 -0
- package/dist/crypt.js +77 -0
- package/dist/documents/cnpj/cnpj.d.ts +14 -0
- package/dist/documents/cnpj/cnpj.formatter.d.ts +5 -0
- package/dist/documents/cnpj/cnpj.formatter.js +12 -0
- package/dist/documents/cnpj/cnpj.generator.d.ts +9 -0
- package/dist/documents/cnpj/cnpj.generator.js +43 -0
- package/dist/documents/cnpj/cnpj.js +47 -0
- package/dist/documents/cnpj/cnpj.validator.d.ts +11 -0
- package/dist/documents/cnpj/cnpj.validator.js +49 -0
- package/dist/documents/cnpj/tests/cnpj.formatter.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.formatter.test.js +62 -0
- package/dist/documents/cnpj/tests/cnpj.generator.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.generator.test.js +51 -0
- package/dist/documents/cnpj/tests/cnpj.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.test.js +162 -0
- package/dist/documents/cnpj/tests/cnpj.validator.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.validator.test.js +104 -0
- package/dist/documents/cpf/cpf.d.ts +14 -0
- package/dist/documents/cpf/cpf.formatter.d.ts +5 -0
- package/dist/documents/cpf/cpf.formatter.js +12 -0
- package/dist/documents/cpf/cpf.generator.d.ts +9 -0
- package/dist/documents/cpf/cpf.generator.js +40 -0
- package/dist/documents/cpf/cpf.js +50 -0
- package/dist/documents/cpf/cpf.validator.d.ts +11 -0
- package/dist/documents/cpf/cpf.validator.js +46 -0
- package/dist/documents/cpf/tests/cpf.formatter.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.formatter.test.js +71 -0
- package/dist/documents/cpf/tests/cpf.generator.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.generator.test.js +71 -0
- package/dist/documents/cpf/tests/cpf.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.test.js +151 -0
- package/dist/documents/cpf/tests/cpf.validator.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.validator.test.js +113 -0
- package/dist/documents/interfaces/formatter.interface.d.ts +4 -0
- package/dist/documents/interfaces/formatter.interface.js +2 -0
- package/dist/documents/interfaces/generator.interface.d.ts +3 -0
- package/dist/documents/interfaces/generator.interface.js +2 -0
- package/dist/documents/interfaces/validator.interface.d.ts +4 -0
- package/dist/documents/interfaces/validator.interface.js +2 -0
- package/dist/documents/models/validation-result.model.d.ts +4 -0
- package/dist/documents/models/validation-result.model.js +2 -0
- package/dist/enums/cryptProvider.d.ts +6 -0
- package/dist/enums/cryptProvider.js +10 -0
- package/dist/extensions/array.extensions.d.ts +6 -0
- package/dist/extensions/array.extensions.js +7 -0
- package/dist/extensions/boolean.extensions.d.ts +6 -0
- package/dist/extensions/boolean.extensions.js +5 -0
- package/dist/extensions/number.extensions.d.ts +11 -0
- package/dist/extensions/number.extensions.js +24 -0
- package/dist/extensions/string.extensions.d.ts +13 -0
- package/dist/extensions/string.extensions.js +28 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +39 -0
- package/dist/interfaces/IFactory.d.ts +3 -0
- package/dist/interfaces/IFactory.js +2 -0
- package/dist/interfaces/IServiceCategory.d.ts +3 -0
- package/dist/interfaces/IServiceCategory.js +2 -0
- package/dist/interfaces/validator.d.ts +5 -0
- package/dist/interfaces/validator.js +2 -0
- package/dist/interfaces/value.d.ts +3 -0
- package/dist/interfaces/value.js +2 -0
- package/dist/interfaces/valueGenerator.d.ts +4 -0
- package/dist/interfaces/valueGenerator.js +2 -0
- package/dist/random.d.ts +12 -0
- package/dist/random.js +29 -0
- package/package.json +25 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const numericSystem_converter_factory_1 = require("../../numericSystem.converter.factory");
|
|
4
|
+
describe("Sistema Numérico Romano", () => {
|
|
5
|
+
let converter;
|
|
6
|
+
let factory;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
factory = new numericSystem_converter_factory_1.NumericSystemConverterFactory();
|
|
9
|
+
converter = factory.createService('roman');
|
|
10
|
+
});
|
|
11
|
+
describe("fromDecimal", () => {
|
|
12
|
+
it("2025", () => {
|
|
13
|
+
const decimalValue = 2025;
|
|
14
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
15
|
+
expect(romamValue).toBe("MMXXV");
|
|
16
|
+
});
|
|
17
|
+
it("1999", () => {
|
|
18
|
+
const decimalValue = 1999;
|
|
19
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
20
|
+
expect(romamValue).toBe("MCMXCIX");
|
|
21
|
+
});
|
|
22
|
+
it("1992", () => {
|
|
23
|
+
const decimalValue = 1992;
|
|
24
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
25
|
+
expect(romamValue).toBe("MCMXCII");
|
|
26
|
+
});
|
|
27
|
+
it("1843", () => {
|
|
28
|
+
const decimalValue = 1843;
|
|
29
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
30
|
+
expect(romamValue).toBe("MDCCCXLIII");
|
|
31
|
+
});
|
|
32
|
+
it("5", () => {
|
|
33
|
+
const decimalValue = 5;
|
|
34
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
35
|
+
expect(romamValue).toBe("V");
|
|
36
|
+
});
|
|
37
|
+
it("6", () => {
|
|
38
|
+
const decimalValue = 6;
|
|
39
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
40
|
+
expect(romamValue).toBe("VI");
|
|
41
|
+
});
|
|
42
|
+
it("1", () => {
|
|
43
|
+
const decimalValue = 1;
|
|
44
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
45
|
+
expect(romamValue).toBe("I");
|
|
46
|
+
});
|
|
47
|
+
it("3", () => {
|
|
48
|
+
const decimalValue = 3;
|
|
49
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
50
|
+
expect(romamValue).toBe("III");
|
|
51
|
+
});
|
|
52
|
+
it("4", () => {
|
|
53
|
+
const decimalValue = 4;
|
|
54
|
+
const romamValue = converter.fromDecimal(decimalValue);
|
|
55
|
+
expect(romamValue).toBe("IV");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("toDecimal", () => {
|
|
59
|
+
it("MMXXV", () => {
|
|
60
|
+
const romanValue = "MMXXV";
|
|
61
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
62
|
+
expect(decimalValue).toBe(2025);
|
|
63
|
+
});
|
|
64
|
+
it("MCMXCIX", () => {
|
|
65
|
+
const romanValue = "MCMXCIX";
|
|
66
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
67
|
+
expect(decimalValue).toBe(1999);
|
|
68
|
+
});
|
|
69
|
+
it("MCMXCII", () => {
|
|
70
|
+
const romanValue = "MCMXCII";
|
|
71
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
72
|
+
expect(decimalValue).toBe(1992);
|
|
73
|
+
});
|
|
74
|
+
it("MDCCCXLIII", () => {
|
|
75
|
+
const romanValue = "MDCCCXLIII";
|
|
76
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
77
|
+
expect(decimalValue).toBe(1843);
|
|
78
|
+
});
|
|
79
|
+
it("VI", () => {
|
|
80
|
+
const romanValue = "VI";
|
|
81
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
82
|
+
expect(decimalValue).toBe(6);
|
|
83
|
+
});
|
|
84
|
+
it("V", () => {
|
|
85
|
+
const romanValue = "V";
|
|
86
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
87
|
+
expect(decimalValue).toBe(5);
|
|
88
|
+
});
|
|
89
|
+
it("IV", () => {
|
|
90
|
+
const romanValue = "IV";
|
|
91
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
92
|
+
expect(decimalValue).toBe(4);
|
|
93
|
+
});
|
|
94
|
+
it("III", () => {
|
|
95
|
+
const romanValue = "III";
|
|
96
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
97
|
+
expect(decimalValue).toBe(3);
|
|
98
|
+
});
|
|
99
|
+
it("I", () => {
|
|
100
|
+
const romanValue = "I";
|
|
101
|
+
const decimalValue = converter.toDecimal(romanValue);
|
|
102
|
+
expect(decimalValue).toBe(1);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseFactory } from "../../baseFactory";
|
|
2
|
+
import { IServiceCategory } from "../../interfaces/IServiceCategory";
|
|
3
|
+
import { ISerializationConverter } from "./interfaces/ISerialization.converter";
|
|
4
|
+
import { ISerializationConverterFactory } from "./interfaces/ISerialization.converter.factory";
|
|
5
|
+
export declare class SerializationConverterFactory extends BaseFactory<ISerializationConverter> implements ISerializationConverterFactory {
|
|
6
|
+
constructor();
|
|
7
|
+
protected throwServiceNotFoundError(serviceId: string): never;
|
|
8
|
+
protected registerService(service: IServiceCategory): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SerializationConverterFactory = void 0;
|
|
4
|
+
const baseFactory_1 = require("../../baseFactory");
|
|
5
|
+
const provider_1 = require("./provider");
|
|
6
|
+
class SerializationConverterFactory extends baseFactory_1.BaseFactory {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(provider_1.serializations);
|
|
9
|
+
}
|
|
10
|
+
throwServiceNotFoundError(serviceId) {
|
|
11
|
+
throw new Error(`O conversor solicitado não está implementado: ${serviceId}`);
|
|
12
|
+
}
|
|
13
|
+
registerService(service) {
|
|
14
|
+
const module = require("./services/" + service.id + "/" + service.id + ".converter");
|
|
15
|
+
// Atribui o construtor: preferencialmente `default`, ou a primeira propriedade exportada
|
|
16
|
+
const implementation = module.default || Object.values(module)[0];
|
|
17
|
+
this.map.set(service.id, new implementation());
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.SerializationConverterFactory = SerializationConverterFactory;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SerializationConverter = void 0;
|
|
4
|
+
const serialization_converter_factory_1 = require("./serialization.converter.factory");
|
|
5
|
+
class SerializationConverter {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.factory = new serialization_converter_factory_1.SerializationConverterFactory();
|
|
8
|
+
}
|
|
9
|
+
convert(content, from, to, options) {
|
|
10
|
+
const source = this.factory.createService(from);
|
|
11
|
+
const target = this.factory.createService(to);
|
|
12
|
+
const json = source.toJson(content, options);
|
|
13
|
+
const result = target.fromJson(json, options);
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.SerializationConverter = SerializationConverter;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ISerializationConverter } from "../../interfaces/ISerialization.converter";
|
|
2
|
+
import { ISerializationOption } from "../../interfaces/ISerializationOptions";
|
|
3
|
+
export declare class CsvConverter implements ISerializationConverter {
|
|
4
|
+
toJson(content: string, options?: ISerializationOption): string;
|
|
5
|
+
fromJson(content: string, options?: ISerializationOption): string;
|
|
6
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CsvConverter = void 0;
|
|
4
|
+
class CsvConverter {
|
|
5
|
+
toJson(content, options) {
|
|
6
|
+
const separator = options?.separatorCharacter ?? ',';
|
|
7
|
+
const lines = content.split('\n');
|
|
8
|
+
const headers = lines[0].split(separator);
|
|
9
|
+
let jsonContent = [];
|
|
10
|
+
lines.slice(1).map((line, index) => {
|
|
11
|
+
const data = line.replaceAll(" ", "_").split(separator);
|
|
12
|
+
const item = {};
|
|
13
|
+
if (headers.length < data.length)
|
|
14
|
+
throw new Error(`A linha ${index + 1} está com mais colunas do que a quantidade de cabeçalho`);
|
|
15
|
+
if (headers.length > data.length)
|
|
16
|
+
throw new Error(`A linha ${index + 1} está com menos colunas do que a quantidade de cabeçalho`);
|
|
17
|
+
data.map(((value, index) => {
|
|
18
|
+
const header = headers[index];
|
|
19
|
+
const info = value.replaceAll("\"", "").replaceAll("\r", "");
|
|
20
|
+
if (options?.considerEmptyAsNull ?? false)
|
|
21
|
+
item[header] = null;
|
|
22
|
+
else
|
|
23
|
+
item[header] = info;
|
|
24
|
+
}));
|
|
25
|
+
jsonContent.push(item);
|
|
26
|
+
});
|
|
27
|
+
const json = JSON.stringify(jsonContent, null, 2);
|
|
28
|
+
return json;
|
|
29
|
+
}
|
|
30
|
+
fromJson(content, options) {
|
|
31
|
+
if (content === "")
|
|
32
|
+
throw new Error('O conteúdo JSON não pode ser convertido para CSV válido.');
|
|
33
|
+
const json = JSON.parse(content);
|
|
34
|
+
if (!Array.isArray(json)) {
|
|
35
|
+
throw new Error("O conteúdo JSON deve ser um array.");
|
|
36
|
+
}
|
|
37
|
+
if (json.length === 0)
|
|
38
|
+
throw new Error('Não há conteúdo no JSON fornecido.');
|
|
39
|
+
const headers = Object.keys(json[0]);
|
|
40
|
+
if (headers.length === 0)
|
|
41
|
+
throw new Error('Não há conteúdo no JSON fornecido.');
|
|
42
|
+
const separator = options?.separatorCharacter ?? ',';
|
|
43
|
+
const csvLines = json.map(item => {
|
|
44
|
+
return headers.map(header => {
|
|
45
|
+
const value = item[header];
|
|
46
|
+
if (value === null || value === undefined)
|
|
47
|
+
return '';
|
|
48
|
+
return value.toString().replace(/,/g, ''); // Remover vírgulas para evitar problemas no CSV
|
|
49
|
+
}).join(separator);
|
|
50
|
+
});
|
|
51
|
+
csvLines.unshift(headers.join(separator)); // Adicionar cabeçalho
|
|
52
|
+
const csvContent = csvLines.join('\n');
|
|
53
|
+
// Tratar o caso de conteúdo vazio
|
|
54
|
+
if (csvContent.trim() === '') {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
// Verificar se o conteúdo CSV é válido
|
|
58
|
+
const isValidCsv = csvContent.split('\n').every(line => {
|
|
59
|
+
return line.split(separator).length === headers.length;
|
|
60
|
+
});
|
|
61
|
+
if (!isValidCsv) {
|
|
62
|
+
throw new Error("O conteúdo JSON não pode ser convertido para CSV válido.");
|
|
63
|
+
}
|
|
64
|
+
// Retornar o conteúdo CSV
|
|
65
|
+
return csvContent;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.CsvConverter = CsvConverter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const serialization_converter_factory_1 = require("../../serialization.converter.factory");
|
|
4
|
+
describe('CsvConverter', () => {
|
|
5
|
+
let csvConverter;
|
|
6
|
+
let factory;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
factory = new serialization_converter_factory_1.SerializationConverterFactory();
|
|
9
|
+
csvConverter = factory.createService('csv');
|
|
10
|
+
});
|
|
11
|
+
describe('toJson', () => {
|
|
12
|
+
describe('comportamento padrão (sem opções)', () => {
|
|
13
|
+
it('deve converter CSV simples para JSON formatado', () => {
|
|
14
|
+
const csvContent = 'nome,idade,cidade\nJoão,30,São Paulo\nMaria,25,Rio de Janeiro';
|
|
15
|
+
const expectedJson = JSON.stringify([
|
|
16
|
+
{ nome: 'João', idade: '30', cidade: 'São_Paulo' },
|
|
17
|
+
{ nome: 'Maria', idade: '25', cidade: 'Rio_de_Janeiro' }
|
|
18
|
+
], null, 2);
|
|
19
|
+
const result = csvConverter.toJson(csvContent);
|
|
20
|
+
expect(result).toBe(expectedJson);
|
|
21
|
+
});
|
|
22
|
+
it('deve converter CSV com uma única linha de dados', () => {
|
|
23
|
+
const csvContent = 'nome,idade\nJoão,30';
|
|
24
|
+
const expectedJson = JSON.stringify([
|
|
25
|
+
{ nome: 'João', idade: '30' }
|
|
26
|
+
], null, 2);
|
|
27
|
+
const result = csvConverter.toJson(csvContent);
|
|
28
|
+
expect(result).toBe(expectedJson);
|
|
29
|
+
});
|
|
30
|
+
it('deve substituir espaços por underscore nos valores', () => {
|
|
31
|
+
const csvContent = 'nome,descricao\nJoão Silva,Analista de Sistemas';
|
|
32
|
+
const expectedJson = JSON.stringify([
|
|
33
|
+
{ nome: 'João_Silva', descricao: 'Analista_de_Sistemas' }
|
|
34
|
+
], null, 2);
|
|
35
|
+
const result = csvConverter.toJson(csvContent);
|
|
36
|
+
expect(result).toBe(expectedJson);
|
|
37
|
+
});
|
|
38
|
+
it('deve remover aspas duplas e caracteres de retorno', () => {
|
|
39
|
+
const csvContent = 'nome,descricao\n"João Silva","Desenvolvedor \"Senior\"\r"';
|
|
40
|
+
const expectedJson = JSON.stringify([
|
|
41
|
+
{ nome: 'João_Silva', descricao: 'Desenvolvedor_Senior' }
|
|
42
|
+
], null, 2);
|
|
43
|
+
const result = csvConverter.toJson(csvContent);
|
|
44
|
+
expect(result).toBe(expectedJson);
|
|
45
|
+
});
|
|
46
|
+
it('deve processar campos vazios como strings vazias por padrão', () => {
|
|
47
|
+
const csvContent = 'nome,idade,cidade\nJoão,,São Paulo\n,25,';
|
|
48
|
+
const expectedJson = JSON.stringify([
|
|
49
|
+
{ nome: 'João', idade: '', cidade: 'São_Paulo' },
|
|
50
|
+
{ nome: '', idade: '25', cidade: '' }
|
|
51
|
+
], null, 2);
|
|
52
|
+
const result = csvConverter.toJson(csvContent);
|
|
53
|
+
expect(result).toBe(expectedJson);
|
|
54
|
+
});
|
|
55
|
+
// it('deve retornar array com objetos para cada linha, incluindo vazias', () => {
|
|
56
|
+
// const csvContent = 'nome,idade\nJoão,30\n\nMaria,25';
|
|
57
|
+
// const expectedJson = JSON.stringify([
|
|
58
|
+
// { nome: 'João', idade: '30' },
|
|
59
|
+
// { nome: '', idade: null },
|
|
60
|
+
// { nome: 'Maria', idade: '25' }
|
|
61
|
+
// ], null, 2);
|
|
62
|
+
// const result = csvConverter.toJson(csvContent);
|
|
63
|
+
// expect(result).toBe(expectedJson);
|
|
64
|
+
// });
|
|
65
|
+
});
|
|
66
|
+
describe('com opções customizadas', () => {
|
|
67
|
+
it('deve usar separador customizado', () => {
|
|
68
|
+
const csvContent = 'nome;idade;cidade\nJoão;30;São Paulo';
|
|
69
|
+
const options = {
|
|
70
|
+
separatorCharacter: ';',
|
|
71
|
+
considerEmptyAsNull: false
|
|
72
|
+
};
|
|
73
|
+
const expectedJson = JSON.stringify([
|
|
74
|
+
{ nome: 'João', idade: '30', cidade: 'São_Paulo' }
|
|
75
|
+
], null, 2);
|
|
76
|
+
const result = csvConverter.toJson(csvContent, options);
|
|
77
|
+
expect(result).toBe(expectedJson);
|
|
78
|
+
});
|
|
79
|
+
it('deve considerar campos vazios como null quando considerEmptyAsNull = true', () => {
|
|
80
|
+
const csvContent = 'nome,idade,cidade\nJoão,,São Paulo\n,25,';
|
|
81
|
+
const options = {
|
|
82
|
+
separatorCharacter: ',',
|
|
83
|
+
considerEmptyAsNull: true
|
|
84
|
+
};
|
|
85
|
+
const expectedJson = JSON.stringify([
|
|
86
|
+
{ nome: null, idade: null, cidade: null },
|
|
87
|
+
{ nome: null, idade: null, cidade: null }
|
|
88
|
+
], null, 2);
|
|
89
|
+
const result = csvConverter.toJson(csvContent, options);
|
|
90
|
+
expect(result).toBe(expectedJson);
|
|
91
|
+
});
|
|
92
|
+
it('deve combinar separador customizado com considerEmptyAsNull', () => {
|
|
93
|
+
const csvContent = 'nome|idade|cidade\nJoão||São Paulo';
|
|
94
|
+
const options = {
|
|
95
|
+
separatorCharacter: '|',
|
|
96
|
+
considerEmptyAsNull: true
|
|
97
|
+
};
|
|
98
|
+
const expectedJson = JSON.stringify([
|
|
99
|
+
{ nome: null, idade: null, cidade: null }
|
|
100
|
+
], null, 2);
|
|
101
|
+
const result = csvConverter.toJson(csvContent, options);
|
|
102
|
+
expect(result).toBe(expectedJson);
|
|
103
|
+
});
|
|
104
|
+
it('deve manter strings vazias quando considerEmptyAsNull = false', () => {
|
|
105
|
+
const csvContent = 'nome,idade,cidade\nJoão,,São Paulo';
|
|
106
|
+
const options = {
|
|
107
|
+
separatorCharacter: ',',
|
|
108
|
+
considerEmptyAsNull: false
|
|
109
|
+
};
|
|
110
|
+
const expectedJson = JSON.stringify([
|
|
111
|
+
{ nome: 'João', idade: '', cidade: 'São_Paulo' }
|
|
112
|
+
], null, 2);
|
|
113
|
+
const result = csvConverter.toJson(csvContent, options);
|
|
114
|
+
expect(result).toBe(expectedJson);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
// describe('edge cases', () => {
|
|
118
|
+
// // it('deve processar CSV apenas com cabeçalhos', () => {
|
|
119
|
+
// // const csvContent = 'nome,idade,cidade';
|
|
120
|
+
// // const expectedJson = JSON.stringify([], null, 2);
|
|
121
|
+
// // const result = csvConverter.toJson(csvContent);
|
|
122
|
+
// // expect(result).toBe(expectedJson);
|
|
123
|
+
// // });
|
|
124
|
+
// // it('deve lidar com mais valores que cabeçalhos', () => {
|
|
125
|
+
// // const csvContent = 'nome,idade\nJoão,30,São Paulo,Extra';
|
|
126
|
+
// // const result = csvConverter.toJson(csvContent);
|
|
127
|
+
// // const parsed = JSON.parse(result);
|
|
128
|
+
// // expect(parsed).toHaveLength(1);
|
|
129
|
+
// // expect(parsed[0]).toHaveProperty('nome', 'João');
|
|
130
|
+
// // expect(parsed[0]).toHaveProperty('idade', '30');
|
|
131
|
+
// // });
|
|
132
|
+
// // it('deve lidar com menos valores que cabeçalhos', () => {
|
|
133
|
+
// // const csvContent = 'nome,idade,cidade\nJoão,30';
|
|
134
|
+
// // const result = csvConverter.toJson(csvContent);
|
|
135
|
+
// // const parsed = JSON.parse(result);
|
|
136
|
+
// // expect(parsed).toHaveLength(1);
|
|
137
|
+
// // expect(parsed[0]).toHaveProperty('nome', 'João');
|
|
138
|
+
// // expect(parsed[0]).toHaveProperty('idade', '30');
|
|
139
|
+
// // expect(parsed[0]).toHaveProperty('cidade', undefined);
|
|
140
|
+
// // });
|
|
141
|
+
// });
|
|
142
|
+
});
|
|
143
|
+
describe('fromJson', () => {
|
|
144
|
+
describe('comportamento padrão', () => {
|
|
145
|
+
it('deve converter JSON simples para CSV', () => {
|
|
146
|
+
const jsonContent = JSON.stringify([
|
|
147
|
+
{ nome: 'João', idade: 30, cidade: 'São Paulo' },
|
|
148
|
+
{ nome: 'Maria', idade: 25, cidade: 'Rio de Janeiro' }
|
|
149
|
+
]);
|
|
150
|
+
const expectedCsv = 'nome,idade,cidade\nJoão,30,São Paulo\nMaria,25,Rio de Janeiro';
|
|
151
|
+
const result = csvConverter.fromJson(jsonContent);
|
|
152
|
+
expect(result).toBe(expectedCsv);
|
|
153
|
+
});
|
|
154
|
+
it('deve converter JSON com um único objeto para CSV', () => {
|
|
155
|
+
const jsonContent = JSON.stringify([
|
|
156
|
+
{ nome: 'João', idade: 30 }
|
|
157
|
+
]);
|
|
158
|
+
const expectedCsv = 'nome,idade\nJoão,30';
|
|
159
|
+
const result = csvConverter.fromJson(jsonContent);
|
|
160
|
+
expect(result).toBe(expectedCsv);
|
|
161
|
+
});
|
|
162
|
+
// it('deve converter valores undefined para string vazia', () => {
|
|
163
|
+
// const jsonContent = JSON.stringify([
|
|
164
|
+
// { nome: 'João', idade: undefined, cidade: 'São Paulo' }
|
|
165
|
+
// ], );
|
|
166
|
+
// const expectedCsv = 'nome,idade,cidade\nJoão,,São Paulo';
|
|
167
|
+
// const result = csvConverter.fromJson(jsonContent);
|
|
168
|
+
// expect(result).toBe(expectedCsv);
|
|
169
|
+
// });
|
|
170
|
+
it('deve converter valores null para string', () => {
|
|
171
|
+
const jsonContent = JSON.stringify([
|
|
172
|
+
{ nome: 'João', idade: null, cidade: 'São Paulo' }
|
|
173
|
+
]);
|
|
174
|
+
const expectedCsv = 'nome,idade,cidade\nJoão,,São Paulo';
|
|
175
|
+
const result = csvConverter.fromJson(jsonContent);
|
|
176
|
+
expect(result).toBe(expectedCsv);
|
|
177
|
+
});
|
|
178
|
+
it('deve remover vírgulas dos valores', () => {
|
|
179
|
+
const jsonContent = JSON.stringify([
|
|
180
|
+
{ nome: 'João Silva', endereco: 'Rua A, 123, Bairro B' }
|
|
181
|
+
]);
|
|
182
|
+
const expectedCsv = 'nome,endereco\nJoão Silva,Rua A 123 Bairro B';
|
|
183
|
+
const result = csvConverter.fromJson(jsonContent);
|
|
184
|
+
expect(result).toBe(expectedCsv);
|
|
185
|
+
});
|
|
186
|
+
it('deve converter diferentes tipos para string', () => {
|
|
187
|
+
const jsonContent = JSON.stringify([
|
|
188
|
+
{ nome: 'João', idade: 30, ativo: true, salario: 5000.50 }
|
|
189
|
+
]);
|
|
190
|
+
const expectedCsv = 'nome,idade,ativo,salario\nJoão,30,true,5000.5';
|
|
191
|
+
const result = csvConverter.fromJson(jsonContent);
|
|
192
|
+
expect(result).toBe(expectedCsv);
|
|
193
|
+
});
|
|
194
|
+
it('deve estourar uma exceção', () => {
|
|
195
|
+
const jsonContent = JSON.stringify([]);
|
|
196
|
+
expect(() => {
|
|
197
|
+
csvConverter.fromJson(jsonContent);
|
|
198
|
+
}).toThrow('Não há conteúdo no JSON fornecido.');
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('validações e erros', () => {
|
|
202
|
+
it('deve lançar erro quando JSON não é um array', () => {
|
|
203
|
+
const jsonContent = JSON.stringify({ nome: 'João' });
|
|
204
|
+
expect(() => {
|
|
205
|
+
csvConverter.fromJson(jsonContent);
|
|
206
|
+
}).toThrow('O conteúdo JSON deve ser um array.');
|
|
207
|
+
});
|
|
208
|
+
it('deve lançar erro quando JSON é inválido', () => {
|
|
209
|
+
const jsonContent = '{ nome: "João" }';
|
|
210
|
+
expect(() => {
|
|
211
|
+
csvConverter.fromJson(jsonContent);
|
|
212
|
+
}).toThrow();
|
|
213
|
+
});
|
|
214
|
+
it('deve validar se o CSV gerado é válido', () => {
|
|
215
|
+
const jsonContent = JSON.stringify([
|
|
216
|
+
{ nome: 'João', idade: 30 }
|
|
217
|
+
]);
|
|
218
|
+
const result = csvConverter.fromJson(jsonContent);
|
|
219
|
+
const lines = result.split('\n');
|
|
220
|
+
const headers = lines[0].split(',');
|
|
221
|
+
lines.forEach(line => {
|
|
222
|
+
expect(line.split(',').length).toBe(headers.length);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
it('deve lançar erro quando não consegue gerar CSV válido', () => {
|
|
226
|
+
const jsonContent = JSON.stringify([{}]);
|
|
227
|
+
expect(() => {
|
|
228
|
+
csvConverter.fromJson(jsonContent);
|
|
229
|
+
}).toThrow('Não há conteúdo no JSON fornecido.');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
describe('integração toJson/fromJson', () => {
|
|
234
|
+
it('deve manter consistência básica sem opções', () => {
|
|
235
|
+
const originalCsv = 'nome,idade\nJoão,30\nMaria,25';
|
|
236
|
+
const json = csvConverter.toJson(originalCsv);
|
|
237
|
+
const resultCsv = csvConverter.fromJson(json);
|
|
238
|
+
expect(resultCsv).toContain('nome,idade');
|
|
239
|
+
expect(resultCsv).toContain('João,30');
|
|
240
|
+
expect(resultCsv).toContain('Maria,25');
|
|
241
|
+
});
|
|
242
|
+
it('deve manter consistência com separador customizado', () => {
|
|
243
|
+
const originalCsv = 'nome;idade\nJoão;30';
|
|
244
|
+
const options = {
|
|
245
|
+
separatorCharacter: ';',
|
|
246
|
+
considerEmptyAsNull: false
|
|
247
|
+
};
|
|
248
|
+
const json = csvConverter.toJson(originalCsv, options);
|
|
249
|
+
const resultCsv = csvConverter.fromJson(json);
|
|
250
|
+
expect(resultCsv).toContain('João,30'); // fromJson sempre usa vírgula
|
|
251
|
+
});
|
|
252
|
+
it('deve lidar com campos vazios e null corretamente', () => {
|
|
253
|
+
const originalJson = JSON.stringify([
|
|
254
|
+
{ nome: 'João', idade: null, cidade: 'São Paulo' }
|
|
255
|
+
]);
|
|
256
|
+
const csv = csvConverter.fromJson(originalJson);
|
|
257
|
+
const resultJson = csvConverter.toJson(csv);
|
|
258
|
+
expect(resultJson).toContain('João');
|
|
259
|
+
expect(resultJson).toContain('');
|
|
260
|
+
expect(resultJson).toContain('São_Paulo');
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
describe('casos específicos da implementação', () => {
|
|
264
|
+
it('deve estourar exceção caso em alguma parte do CSV tenha um separador diferente do informado', () => {
|
|
265
|
+
// Bug na implementação: usa separador customizado para headers mas vírgula para dados
|
|
266
|
+
const csvContent = 'nome;idade;cidade\nJoão,30,São Paulo'; // Dados com vírgula mas header com ponto e vírgula
|
|
267
|
+
const options = {
|
|
268
|
+
separatorCharacter: ';',
|
|
269
|
+
considerEmptyAsNull: false
|
|
270
|
+
};
|
|
271
|
+
expect(() => {
|
|
272
|
+
csvConverter.toJson(csvContent, options);
|
|
273
|
+
}).toThrow("A linha 1 está com menos colunas do que a quantidade de cabeçalho");
|
|
274
|
+
});
|
|
275
|
+
it('deve aplicar considerEmptyAsNull independente do valor real', () => {
|
|
276
|
+
// Bug na implementação: sempre define como null se considerEmptyAsNull = true
|
|
277
|
+
const csvContent = 'nome,idade\nJoão,30';
|
|
278
|
+
const options = {
|
|
279
|
+
separatorCharacter: ',',
|
|
280
|
+
considerEmptyAsNull: true
|
|
281
|
+
};
|
|
282
|
+
const result = csvConverter.toJson(csvContent, options);
|
|
283
|
+
const parsed = JSON.parse(result);
|
|
284
|
+
expect(parsed[0].nome).toBeNull();
|
|
285
|
+
expect(parsed[0].idade).toBeNull();
|
|
286
|
+
});
|
|
287
|
+
it('deve processar replaceAll corretamente', () => {
|
|
288
|
+
const csvContent = 'nome,descricao\n"João Silva","Texto com espaços"';
|
|
289
|
+
const result = csvConverter.toJson(csvContent);
|
|
290
|
+
const parsed = JSON.parse(result);
|
|
291
|
+
expect(parsed[0].nome).toBe('João__Silva');
|
|
292
|
+
expect(parsed[0].descricao).toBe('Texto__com__espaços');
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonConverter = void 0;
|
|
4
|
+
class JsonConverter {
|
|
5
|
+
toJson(content) {
|
|
6
|
+
return content;
|
|
7
|
+
}
|
|
8
|
+
fromJson(content) {
|
|
9
|
+
return content;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.JsonConverter = JsonConverter;
|