jsonschema-key-compression 1.7.0 → 2.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +65 -5
  3. package/dist/es/compress.d.ts +3 -1
  4. package/dist/es/compress.js +161 -25
  5. package/dist/es/compress.js.map +1 -1
  6. package/dist/es/create-compressed-json-schema.d.ts +9 -0
  7. package/dist/es/create-compressed-json-schema.js +136 -26
  8. package/dist/es/create-compressed-json-schema.js.map +1 -1
  9. package/dist/es/create-compression-table.d.ts +7 -1
  10. package/dist/es/create-compression-table.js +56 -30
  11. package/dist/es/create-compression-table.js.map +1 -1
  12. package/dist/es/decompress.js +39 -21
  13. package/dist/es/decompress.js.map +1 -1
  14. package/dist/es/enum-compression.d.ts +35 -0
  15. package/dist/es/enum-compression.js +217 -0
  16. package/dist/es/enum-compression.js.map +1 -0
  17. package/dist/es/index.d.ts +1 -1
  18. package/dist/es/index.js.map +1 -1
  19. package/dist/es/types.d.ts +11 -0
  20. package/dist/lib/compress.d.ts +3 -1
  21. package/dist/lib/compress.js +167 -32
  22. package/dist/lib/compress.js.map +1 -1
  23. package/dist/lib/create-compressed-json-schema.d.ts +9 -0
  24. package/dist/lib/create-compressed-json-schema.js +136 -27
  25. package/dist/lib/create-compressed-json-schema.js.map +1 -1
  26. package/dist/lib/create-compression-table.d.ts +7 -1
  27. package/dist/lib/create-compression-table.js +61 -35
  28. package/dist/lib/create-compression-table.js.map +1 -1
  29. package/dist/lib/decompress.js +42 -25
  30. package/dist/lib/decompress.js.map +1 -1
  31. package/dist/lib/enum-compression.d.ts +35 -0
  32. package/dist/lib/enum-compression.js +223 -0
  33. package/dist/lib/enum-compression.js.map +1 -0
  34. package/dist/lib/index.d.ts +1 -1
  35. package/dist/lib/index.js.map +1 -1
  36. package/dist/lib/types.d.ts +11 -0
  37. package/dist/lib/util.js +3 -3
  38. package/dist/lib/util.js.map +1 -1
  39. package/package.json +9 -7
  40. package/src/compress.ts +183 -33
  41. package/src/create-compressed-json-schema.ts +158 -35
  42. package/src/create-compression-table.ts +59 -31
  43. package/src/decompress.ts +40 -27
  44. package/src/enum-compression.ts +240 -0
  45. package/src/index.ts +1 -0
  46. package/src/types.d.ts +11 -0
@@ -1,7 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uncompressedToCompressedTable = exports.compressedToUncompressedTable = exports.getPropertiesOfSchema = exports.createCompressionTable = exports.DEFAULT_COMPRESSION_FLAG = void 0;
3
+ exports.DEFAULT_COMPRESSION_FLAG = void 0;
4
+ exports.createCompressionTable = createCompressionTable;
5
+ exports.getPropertiesOfSchema = getPropertiesOfSchema;
6
+ exports.compressedToUncompressedTable = compressedToUncompressedTable;
7
+ exports.uncompressedToCompressedTable = uncompressedToCompressedTable;
4
8
  var util_1 = require("./util");
9
+ var enum_compression_1 = require("./enum-compression");
5
10
  /**
6
11
  * Compressed property-names begin with the compression-flag
7
12
  * it indicates that the name is compressed.
@@ -9,76 +14,97 @@ var util_1 = require("./util");
9
14
  * compression-flag, an error will be thrown.
10
15
  */
11
16
  exports.DEFAULT_COMPRESSION_FLAG = '|';
12
- function createCompressionTable(schema, compressionFlag, ignoreProperties) {
17
+ /**
18
+ * @param compressEnums If true, the values of string-enums are compressed
19
+ * into the index of the value inside of the enum.
20
+ * This changes the stored format, so it is opt-in
21
+ * to keep already compressed data readable.
22
+ */
23
+ function createCompressionTable(schema, compressionFlag, ignoreProperties, compressEnums) {
13
24
  if (compressionFlag === void 0) { compressionFlag = exports.DEFAULT_COMPRESSION_FLAG; }
14
25
  if (ignoreProperties === void 0) { ignoreProperties = []; }
26
+ if (compressEnums === void 0) { compressEnums = false; }
15
27
  var table = compressedToUncompressedTable(schema, ignoreProperties);
16
28
  var compressionTable = {
17
29
  compressedToUncompressed: table,
18
30
  uncompressedToCompressed: uncompressedToCompressedTable(table, compressionFlag, ignoreProperties),
19
31
  compressionFlag: compressionFlag
20
32
  };
33
+ if (compressEnums) {
34
+ var enumCompression = (0, enum_compression_1.getEnumCompressionTable)(schema, ignoreProperties);
35
+ /**
36
+ * The field stays undefined when there is nothing to compress,
37
+ * so that the compression does not have to look it up on each key.
38
+ */
39
+ if (enumCompression.size > 0) {
40
+ compressionTable.enumCompression = enumCompression;
41
+ }
42
+ }
21
43
  return compressionTable;
22
44
  }
23
- exports.createCompressionTable = createCompressionTable;
24
45
  /**
25
46
  * Returns a list of all property names that occur in the schema.
26
47
  * @returns Set of strings to ensure uniqueness.
27
48
  */
28
49
  function getPropertiesOfSchema(schema) {
29
50
  var ret = new Set();
30
- function addSchema(innerSchema) {
31
- var keys = getPropertiesOfSchema(innerSchema);
32
- Array.from(keys).forEach(function (k) { return ret.add(k); });
33
- }
34
- if (schema.properties) {
51
+ addPropertiesOfSchema(schema, ret);
52
+ return ret;
53
+ }
54
+ /**
55
+ * Adds all property names of the schema to the given set.
56
+ * Using a single accumulator set avoids creating
57
+ * a new set and array copy on each nesting level.
58
+ */
59
+ function addPropertiesOfSchema(schema, ret) {
60
+ var properties = schema.properties;
61
+ if (properties) {
35
62
  // do not use Object.entries, it is transpiled shitty
36
- Object.keys(schema.properties).forEach(function (property) {
37
- var deepSchema = schema.properties[property];
63
+ var propertyNames = Object.keys(properties);
64
+ for (var i = 0; i < propertyNames.length; i++) {
65
+ var property = propertyNames[i];
38
66
  ret.add(property);
39
- if (!schema.properties) {
40
- return;
41
- }
42
- addSchema(deepSchema);
43
- });
67
+ addPropertiesOfSchema(properties[property], ret);
68
+ }
44
69
  }
45
- if (schema.items) {
46
- if (Array.isArray(schema.items)) {
47
- schema.items.forEach(function (subSchema) {
48
- addSchema(subSchema);
49
- });
70
+ var items = schema.items;
71
+ if (items) {
72
+ if (Array.isArray(items)) {
73
+ for (var i = 0; i < items.length; i++) {
74
+ addPropertiesOfSchema(items[i], ret);
75
+ }
50
76
  }
51
77
  else {
52
- addSchema(schema.items);
78
+ addPropertiesOfSchema(items, ret);
53
79
  }
54
80
  }
55
- return ret;
56
81
  }
57
- exports.getPropertiesOfSchema = getPropertiesOfSchema;
58
82
  function compressedToUncompressedTable(schema, ignoreProperties) {
59
83
  var attributes = getPropertiesOfSchema(schema);
60
84
  var schemaKeysSorted = Array.from(attributes).sort(util_1.alphabeticCompare);
61
85
  var table = new Map();
62
86
  var lastKeyNumber = 0;
63
- schemaKeysSorted
64
- .filter(function (k) { return k.length > 3 && !ignoreProperties.includes(k); })
65
- .forEach(function (k) {
66
- var compressKey = (0, util_1.numberToLetter)(lastKeyNumber);
67
- lastKeyNumber++;
68
- table.set(k, compressKey);
69
- });
87
+ for (var i = 0; i < schemaKeysSorted.length; i++) {
88
+ var k = schemaKeysSorted[i];
89
+ if (k.length > 3 && !ignoreProperties.includes(k)) {
90
+ table.set(k, (0, util_1.numberToLetter)(lastKeyNumber));
91
+ lastKeyNumber++;
92
+ }
93
+ }
70
94
  return table;
71
95
  }
72
- exports.compressedToUncompressedTable = compressedToUncompressedTable;
73
96
  function uncompressedToCompressedTable(table, compressionFlag, ignoreProperties) {
74
97
  var reverseTable = new Map();
75
- Array.from(table.keys()).forEach(function (key) {
76
- var value = table.get(key);
77
- if (!ignoreProperties.includes(value)) {
98
+ table.forEach(function (value, key) {
99
+ /**
100
+ * The ignored properties are property names,
101
+ * so they must be compared to the key and not to the
102
+ * compressed value which could randomly be equal to an ignored name.
103
+ */
104
+ if (!ignoreProperties.includes(key)) {
78
105
  reverseTable.set(compressionFlag + value, key);
79
106
  }
80
107
  });
81
108
  return reverseTable;
82
109
  }
83
- exports.uncompressedToCompressedTable = uncompressedToCompressedTable;
84
110
  //# sourceMappingURL=create-compression-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-compression-table.js","sourceRoot":"","sources":["../../src/create-compression-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-compression-table.js","sourceRoot":"","sources":["../../src/create-compression-table.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decompressedKey = exports.decompressedPath = exports.decompressObject = void 0;
3
+ exports.decompressObject = decompressObject;
4
+ exports.decompressedPath = decompressedPath;
5
+ exports.decompressedKey = decompressedKey;
6
+ var enum_compression_1 = require("./enum-compression");
4
7
  function decompressObject(table, obj) {
5
8
  if (typeof obj !== 'object' || obj === null)
6
9
  return obj;
7
- else if (Array.isArray(obj)) {
10
+ if (Array.isArray(obj)) {
8
11
  // array
9
- return obj.map(function (item) { return decompressObject(table, item); });
12
+ var retArray = new Array(obj.length);
13
+ for (var index = 0; index < obj.length; index++) {
14
+ var item = obj[index];
15
+ // primitives do not need a recursive call
16
+ retArray[index] = (typeof item === 'object' && item !== null) ? decompressObject(table, item) : item;
17
+ }
18
+ return retArray;
10
19
  }
11
- else {
12
- // object
13
- var ret = {};
14
- var keys = Object.keys(obj);
15
- for (var index = 0; index < keys.length; index++) {
16
- var key = keys[index];
17
- var decompressed = decompressedKey(table, key);
18
- var value = decompressObject(table, obj[key]);
19
- ret[decompressed] = value;
20
+ // object
21
+ var ret = {};
22
+ var keys = Object.keys(obj);
23
+ var enumCompression = table.enumCompression;
24
+ for (var index = 0; index < keys.length; index++) {
25
+ var key = keys[index];
26
+ var value = obj[key];
27
+ var decompressed = decompressedKey(table, key);
28
+ var enumValues = enumCompression && enumCompression.get(decompressed);
29
+ if (enumValues && (typeof value === 'number' || Array.isArray(value))) {
30
+ ret[decompressed] = (0, enum_compression_1.decompressEnumValue)(enumValues, value);
31
+ }
32
+ else {
33
+ // primitives do not need a recursive call
34
+ ret[decompressed] = (typeof value === 'object' && value !== null) ?
35
+ decompressObject(table, value) :
36
+ value;
20
37
  }
21
- return ret;
22
38
  }
39
+ return ret;
23
40
  }
24
- exports.decompressObject = decompressObject;
25
41
  /**
26
42
  * transform a compressed object-path
27
43
  * into its non-compressed version
@@ -37,22 +53,23 @@ function decompressedPath(table, path) {
37
53
  return compressedKey;
38
54
  }).join('.');
39
55
  }
40
- exports.decompressedPath = decompressedPath;
41
56
  function decompressedKey(table, key) {
42
57
  /**
43
- * keys could be array-accessors like myArray[4]
44
- * we have to split and readd the squared brackets value
45
- */
46
- var splitSquaredBrackets = key.split('[');
47
- var plainKey = splitSquaredBrackets.shift();
58
+ * keys could be array-accessors like myArray[4]
59
+ * so the part before the squared bracket is looked up
60
+ * and the bracket part is re-added.
61
+ * Most keys have no bracket, so the plain lookup is the fast path.
62
+ */
63
+ var bracketIndex = key.indexOf('[');
64
+ if (bracketIndex === -1) {
65
+ var directDecompressed = table.uncompressedToCompressed.get(key);
66
+ return directDecompressed ? directDecompressed : key;
67
+ }
68
+ var plainKey = key.slice(0, bracketIndex);
48
69
  var decompressed = table.uncompressedToCompressed.get(plainKey);
49
70
  if (!decompressed) {
50
71
  return key;
51
72
  }
52
- else {
53
- var readdSquared = splitSquaredBrackets.length ? '[' + splitSquaredBrackets.join('[') : '';
54
- return decompressed + readdSquared;
55
- }
73
+ return decompressed + key.slice(bracketIndex);
56
74
  }
57
- exports.decompressedKey = decompressedKey;
58
75
  //# sourceMappingURL=decompress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decompress.js","sourceRoot":"","sources":["../../src/decompress.ts"],"names":[],"mappings":";;;AAKA,SAAgB,gBAAgB,CAC5B,KAAuB,EACvB,GAAoB;IAEpB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;SACnD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,QAAQ;QACR,OAAO,GAAG,CAAC,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,EAA7B,CAA6B,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACJ,SAAS;QACT,IAAM,GAAG,GAAoB,EAAE,CAAC;QAChC,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,IAAM,YAAY,GAAG,eAAe,CAChC,KAAK,EACL,GAAU,CACb,CAAC;YACF,IAAM,KAAK,GAAG,gBAAgB,CAC1B,KAAK,EACL,GAAG,CAAC,GAAU,CAAC,CAClB,CAAC;YACF,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;AACL,CAAC;AA1BD,4CA0BC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC5B,KAAuB,EACvB,IAAY;IAEZ,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,QAAQ;SACV,GAAG,CAAC,UAAA,MAAM;QACP,IAAM,aAAa,GAAG,eAAe,CACjC,KAAK,EACL,MAAM,CACT,CAAC;QACF,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAbD,4CAaC;AAED,SAAgB,eAAe,CAC3B,KAAuB,EACvB,GAAW;IAGX;;;UAGM;IACN,IAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,EAAY,CAAC;IAExD,IAAM,YAAY,GAAG,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC;IACf,CAAC;SAAM,CAAC;QACJ,IAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,OAAO,YAAY,GAAG,YAAY,CAAC;IACvC,CAAC;AACL,CAAC;AAnBD,0CAmBC"}
1
+ {"version":3,"file":"decompress.js","sourceRoot":"","sources":["../../src/decompress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { EnumCompressionTable, JsonSchema } from './types';
2
+ /**
3
+ * Enum-compression replaces the value of a property
4
+ * by the index of that value inside of the enum of the property.
5
+ * For example with the enum ['admin', 'editor', 'viewer']
6
+ * the value 'editor' is stored as the number 1.
7
+ *
8
+ * Only enums where all values are strings can be compressed:
9
+ * - The compressed value is a number, so a number inside of the enum
10
+ * could not be told apart from an index.
11
+ * - Strings are also where the saved space actually is.
12
+ *
13
+ * The values are sorted before the indexes are assigned, so that the order
14
+ * of the indexes is equal to the alphabetic order of the values.
15
+ * This keeps sorting and range-queries like $gt working on compressed data.
16
+ */
17
+ export declare function compressibleEnumValues(values: any[]): string[] | null;
18
+ /**
19
+ * Creates the table that maps a property name to the enum of its values.
20
+ * A property name is only compressed when it has the same compressible enum
21
+ * at every place where it occurs in the schema. Otherwise the same value
22
+ * could mean different things depending on where it is stored.
23
+ */
24
+ export declare function getEnumCompressionTable(schema: JsonSchema, ignoreProperties: string[]): EnumCompressionTable;
25
+ /**
26
+ * Replaces the enum-value by its index.
27
+ * Values that are not part of the enum are kept as they are,
28
+ * so that data which does not match the schema is not destroyed.
29
+ */
30
+ export declare function compressEnumValue(enumValues: string[], value: any): any;
31
+ /**
32
+ * Replaces the index by its enum-value.
33
+ * The exact counterpart of compressEnumValue().
34
+ */
35
+ export declare function decompressEnumValue(enumValues: string[], value: any): any;
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compressibleEnumValues = compressibleEnumValues;
4
+ exports.getEnumCompressionTable = getEnumCompressionTable;
5
+ exports.compressEnumValue = compressEnumValue;
6
+ exports.decompressEnumValue = decompressEnumValue;
7
+ var util_1 = require("./util");
8
+ /**
9
+ * Enum-compression replaces the value of a property
10
+ * by the index of that value inside of the enum of the property.
11
+ * For example with the enum ['admin', 'editor', 'viewer']
12
+ * the value 'editor' is stored as the number 1.
13
+ *
14
+ * Only enums where all values are strings can be compressed:
15
+ * - The compressed value is a number, so a number inside of the enum
16
+ * could not be told apart from an index.
17
+ * - Strings are also where the saved space actually is.
18
+ *
19
+ * The values are sorted before the indexes are assigned, so that the order
20
+ * of the indexes is equal to the alphabetic order of the values.
21
+ * This keeps sorting and range-queries like $gt working on compressed data.
22
+ */
23
+ function compressibleEnumValues(values) {
24
+ if (values.length === 0) {
25
+ return null;
26
+ }
27
+ var unique = [];
28
+ for (var i = 0; i < values.length; i++) {
29
+ var value = values[i];
30
+ if (typeof value !== 'string') {
31
+ return null;
32
+ }
33
+ if (!unique.includes(value)) {
34
+ unique.push(value);
35
+ }
36
+ }
37
+ return unique.sort(util_1.alphabeticCompare);
38
+ }
39
+ /**
40
+ * Returns the enum that applies to the values which are stored
41
+ * at a property, or null if the property has no compressible enum.
42
+ * The enum can either be defined at the property itself,
43
+ * or at the items of an array-property.
44
+ */
45
+ function valueEnumOfSchema(schema) {
46
+ if (Array.isArray(schema.enum)) {
47
+ return compressibleEnumValues(schema.enum);
48
+ }
49
+ var items = schema.items;
50
+ if (items && !Array.isArray(items) && Array.isArray(items.enum)) {
51
+ return compressibleEnumValues(items.enum);
52
+ }
53
+ return null;
54
+ }
55
+ function equalEnumValues(a, b) {
56
+ if (a.length !== b.length) {
57
+ return false;
58
+ }
59
+ for (var i = 0; i < a.length; i++) {
60
+ if (a[i] !== b[i]) {
61
+ return false;
62
+ }
63
+ }
64
+ return true;
65
+ }
66
+ /**
67
+ * Collects the enum of each property name for every place
68
+ * where the name occurs in the schema.
69
+ * All sub-schema keywords are walked, not only the ones that
70
+ * the key-compression uses, so that a property name which is used
71
+ * with different enums is detected as ambiguous.
72
+ * @recursive
73
+ */
74
+ function addEnumCandidates(schema, candidates) {
75
+ var properties = schema.properties;
76
+ if (properties) {
77
+ // do not use Object.entries, it is transpiled shitty
78
+ var propertyNames = Object.keys(properties);
79
+ for (var i = 0; i < propertyNames.length; i++) {
80
+ var property = propertyNames[i];
81
+ var subSchema = properties[property];
82
+ var found = candidates.get(property);
83
+ if (!found) {
84
+ found = [];
85
+ candidates.set(property, found);
86
+ }
87
+ found.push(valueEnumOfSchema(subSchema));
88
+ addEnumCandidates(subSchema, candidates);
89
+ }
90
+ }
91
+ var items = schema.items;
92
+ if (items) {
93
+ if (Array.isArray(items)) {
94
+ for (var i = 0; i < items.length; i++) {
95
+ addEnumCandidates(items[i], candidates);
96
+ }
97
+ }
98
+ else {
99
+ addEnumCandidates(items, candidates);
100
+ }
101
+ }
102
+ if (schema.additionalItems && typeof schema.additionalItems === 'object') {
103
+ addEnumCandidates(schema.additionalItems, candidates);
104
+ }
105
+ var subSchemaLists = [schema.allOf, schema.anyOf, schema.oneOf];
106
+ for (var i = 0; i < subSchemaLists.length; i++) {
107
+ var subSchemas = subSchemaLists[i];
108
+ if (subSchemas) {
109
+ for (var j = 0; j < subSchemas.length; j++) {
110
+ addEnumCandidates(subSchemas[j], candidates);
111
+ }
112
+ }
113
+ }
114
+ if (schema.not) {
115
+ addEnumCandidates(schema.not, candidates);
116
+ }
117
+ var subSchemaMaps = [schema.patternProperties, schema.definitions];
118
+ var _loop_1 = function (i) {
119
+ var schemaMap = subSchemaMaps[i];
120
+ if (schemaMap) {
121
+ Object.keys(schemaMap).forEach(function (key) { return addEnumCandidates(schemaMap[key], candidates); });
122
+ }
123
+ };
124
+ for (var i = 0; i < subSchemaMaps.length; i++) {
125
+ _loop_1(i);
126
+ }
127
+ var dependencies = schema.dependencies;
128
+ if (dependencies) {
129
+ Object.keys(dependencies).forEach(function (key) {
130
+ var dependency = dependencies[key];
131
+ if (!Array.isArray(dependency)) {
132
+ addEnumCandidates(dependency, candidates);
133
+ }
134
+ });
135
+ }
136
+ }
137
+ /**
138
+ * Creates the table that maps a property name to the enum of its values.
139
+ * A property name is only compressed when it has the same compressible enum
140
+ * at every place where it occurs in the schema. Otherwise the same value
141
+ * could mean different things depending on where it is stored.
142
+ */
143
+ function getEnumCompressionTable(schema, ignoreProperties) {
144
+ var candidates = new Map();
145
+ addEnumCandidates(schema, candidates);
146
+ var table = new Map();
147
+ var propertyNames = Array.from(candidates.keys()).sort(util_1.alphabeticCompare);
148
+ for (var i = 0; i < propertyNames.length; i++) {
149
+ var property = propertyNames[i];
150
+ if (ignoreProperties.includes(property)) {
151
+ continue;
152
+ }
153
+ var occurrences = candidates.get(property);
154
+ var first = occurrences[0];
155
+ if (!first) {
156
+ continue;
157
+ }
158
+ var isAmbiguous = false;
159
+ for (var j = 1; j < occurrences.length; j++) {
160
+ var other = occurrences[j];
161
+ if (!other || !equalEnumValues(first, other)) {
162
+ isAmbiguous = true;
163
+ break;
164
+ }
165
+ }
166
+ if (!isAmbiguous) {
167
+ table.set(property, first);
168
+ }
169
+ }
170
+ return table;
171
+ }
172
+ /**
173
+ * Returns true if the given number can be an index of the enum.
174
+ * Number.isInteger() is not used to stay usable on old runtimes.
175
+ */
176
+ function isEnumIndex(value, enumValues) {
177
+ return value >= 0 && value < enumValues.length && value % 1 === 0;
178
+ }
179
+ /**
180
+ * Replaces the enum-value by its index.
181
+ * Values that are not part of the enum are kept as they are,
182
+ * so that data which does not match the schema is not destroyed.
183
+ */
184
+ function compressEnumValue(enumValues, value) {
185
+ if (typeof value === 'string') {
186
+ var index = enumValues.indexOf(value);
187
+ return index === -1 ? value : index;
188
+ }
189
+ if (Array.isArray(value)) {
190
+ var ret = new Array(value.length);
191
+ for (var i = 0; i < value.length; i++) {
192
+ var item = value[i];
193
+ if (typeof item === 'string') {
194
+ var index = enumValues.indexOf(item);
195
+ ret[i] = index === -1 ? item : index;
196
+ }
197
+ else {
198
+ ret[i] = item;
199
+ }
200
+ }
201
+ return ret;
202
+ }
203
+ return value;
204
+ }
205
+ /**
206
+ * Replaces the index by its enum-value.
207
+ * The exact counterpart of compressEnumValue().
208
+ */
209
+ function decompressEnumValue(enumValues, value) {
210
+ if (typeof value === 'number') {
211
+ return isEnumIndex(value, enumValues) ? enumValues[value] : value;
212
+ }
213
+ if (Array.isArray(value)) {
214
+ var ret = new Array(value.length);
215
+ for (var i = 0; i < value.length; i++) {
216
+ var item = value[i];
217
+ ret[i] = (typeof item === 'number' && isEnumIndex(item, enumValues)) ? enumValues[item] : item;
218
+ }
219
+ return ret;
220
+ }
221
+ return value;
222
+ }
223
+ //# sourceMappingURL=enum-compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum-compression.js","sourceRoot":"","sources":["../../src/enum-compression.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export type { TableType, CompressionTable, PlainJsonObjectNotArray, PlainJsonObject, SortDirection, MangoQuery, JsonSchemaTypes, JsonSchema } from './types';
1
+ export type { TableType, CompressionTable, EnumCompressionTable, PlainJsonObjectNotArray, PlainJsonObject, SortDirection, MangoQuery, JsonSchemaTypes, JsonSchema } from './types';
2
2
  export { createCompressionTable, DEFAULT_COMPRESSION_FLAG } from './create-compression-table';
3
3
  export { compressObject, compressedPath, compressQuerySelector, compressQuery } from './compress';
4
4
  export { decompressObject, decompressedPath, } from './decompress';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAWA,uEAGoC;AAFhC,kIAAA,sBAAsB,OAAA;AACtB,oIAAA,wBAAwB,OAAA;AAG5B,uCAKoB;AAJhB,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,iHAAA,qBAAqB,OAAA;AACrB,yGAAA,aAAa,OAAA;AAGjB,2CAGsB;AAFlB,8GAAA,gBAAgB,OAAA;AAChB,8GAAA,gBAAgB,OAAA;AAGpB,iFAEyC;AADrC,2IAAA,0BAA0B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAYA,uEAGoC;AAFhC,kIAAA,sBAAsB,OAAA;AACtB,oIAAA,wBAAwB,OAAA;AAG5B,uCAKoB;AAJhB,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,iHAAA,qBAAqB,OAAA;AACrB,yGAAA,aAAa,OAAA;AAGjB,2CAGsB;AAFlB,8GAAA,gBAAgB,OAAA;AAChB,8GAAA,gBAAgB,OAAA;AAGpB,iFAEyC;AADrC,2IAAA,0BAA0B,OAAA"}
@@ -1,9 +1,20 @@
1
1
  export type TableType = Map<string, string>;
2
2
 
3
+ /**
4
+ * Maps a property name to the sorted enum-values of that property.
5
+ * A value is compressed by replacing it with its index in this list.
6
+ */
7
+ export type EnumCompressionTable = Map<string, string[]>;
8
+
3
9
  export type CompressionTable = {
4
10
  compressedToUncompressed: TableType;
5
11
  uncompressedToCompressed: TableType;
6
12
  compressionFlag: string;
13
+ /**
14
+ * Only set when enum-compression is enabled
15
+ * and the schema has at least one compressible enum.
16
+ */
17
+ enumCompression?: EnumCompressionTable;
7
18
  };
8
19
 
9
20
 
package/dist/lib/util.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.flatClone = exports.alphabeticCompare = exports.numberToLetter = void 0;
3
+ exports.alphabeticCompare = void 0;
4
+ exports.numberToLetter = numberToLetter;
5
+ exports.flatClone = flatClone;
4
6
  /**
5
7
  * @link https://de.wikipedia.org/wiki/Base58
6
8
  * this does not start with the numbers to generate valid variable-names
@@ -23,7 +25,6 @@ function numberToLetter(nr) {
23
25
  .map(function (d) { return base58Chars[d]; })
24
26
  .join('');
25
27
  }
26
- exports.numberToLetter = numberToLetter;
27
28
  var alphabeticCompare = function (a, b) {
28
29
  if (a < b) {
29
30
  return -1;
@@ -42,5 +43,4 @@ exports.alphabeticCompare = alphabeticCompare;
42
43
  function flatClone(obj) {
43
44
  return Object.assign({}, obj);
44
45
  }
45
- exports.flatClone = flatClone;
46
46
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,IAAM,WAAW,GAAG,4DAA4D,CAAC;AACjF,IAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC;AAExC;;;GAGG;AACH,SAAgB,cAAc,CAAC,EAAU;IACrC,IAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,GAAG,CAAC;QACA,IAAM,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;IACvC,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE;IAEnB,OAAO,MAAM;SACR,OAAO,EAAE;SACT,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,WAAW,CAAC,CAAC,CAAC,EAAd,CAAc,CAAC;SACxB,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAZD,wCAYC;AAIM,IAAM,iBAAiB,GAAmB,UAAC,CAAC,EAAE,CAAC;IAClD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACR,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACR,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC,CAAC;AARW,QAAA,iBAAiB,qBAQ5B;AAEF;;;;GAIG;AACH,SAAgB,SAAS,CAAI,GAAM;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAFD,8BAEC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":";;;AAWA,wCAYC;AAmBD,8BAEC;AA5CD;;;GAGG;AACH,IAAM,WAAW,GAAG,4DAA4D,CAAC;AACjF,IAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC;AAExC;;;GAGG;AACH,SAAgB,cAAc,CAAC,EAAU;IACrC,IAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,GAAG,CAAC;QACA,IAAM,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;IACvC,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE;IAEnB,OAAO,MAAM;SACR,OAAO,EAAE;SACT,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,WAAW,CAAC,CAAC,CAAC,EAAd,CAAc,CAAC;SACxB,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAIM,IAAM,iBAAiB,GAAmB,UAAC,CAAC,EAAE,CAAC;IAClD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACR,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACR,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC,CAAC;AARW,QAAA,iBAAiB,qBAQ5B;AAEF;;;;GAIG;AACH,SAAgB,SAAS,CAAI,GAAM;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsonschema-key-compression",
3
- "version": "1.7.0",
3
+ "version": "2.0.0",
4
4
  "description": "Compress json-data based on its json-schema",
5
5
  "author": "pubkey",
6
6
  "keywords": [
@@ -37,18 +37,20 @@
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/faker": "5.5.9",
40
- "@types/mocha": "10.0.6",
41
- "@types/node": "20.11.16",
40
+ "@types/mocha": "10.0.10",
41
+ "@types/node": "26.6.6",
42
42
  "@types/node-gzip": "1.1.3",
43
+ "ajv": "8.20.0",
43
44
  "assert": "2.1.0",
44
- "async-test-util": "2.4.0",
45
+ "async-test-util": "2.5.0",
45
46
  "copyfiles": "2.4.1",
46
47
  "faker": "5.5.3",
47
- "mocha": "10.2.0",
48
+ "mingo": "7.2.7",
49
+ "mocha": "12.0.3",
48
50
  "node-gzip": "1.1.2",
49
- "rimraf": "5.0.5",
51
+ "rimraf": "6.1.4",
50
52
  "ts-node": "10.9.2",
51
53
  "tslint": "6.1.3",
52
- "typescript": "5.3.3"
54
+ "typescript": "5.9.3"
53
55
  }
54
56
  }