@bemedev/decompose 0.9.0 → 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/lib/decompose.cjs CHANGED
@@ -2,36 +2,51 @@
2
2
 
3
3
  var constants_strings = require('./constants/strings.cjs');
4
4
  var helpers = require('./helpers.cjs');
5
+ var types_types = require('./types.types.cjs');
5
6
 
6
- function ddecompose(val, prev = '') {
7
+ function ddecompose(val, prev = '', options = types_types.DEFAULT_DECOMPOSE_OPTIONS) {
8
+ const { object } = {
9
+ ...types_types.DEFAULT_DECOMPOSE_OPTIONS,
10
+ ...options,
11
+ };
12
+ const canAddObjectKeys = object === 'both' || object === 'object';
13
+ const canAddKeys = object === 'both' || object === 'key';
7
14
  const _prev = prev ? prev + constants_strings.DELIMITER : '';
8
15
  const output = [];
9
16
  const entries1 = Object.entries(val);
10
17
  entries1.forEach(([key, value]) => {
11
18
  const isPrimit = helpers.isPrimitive(value) || Array.isArray(value);
12
19
  if (!isPrimit) {
13
- const values = ddecompose(value, `${_prev}${key}`);
20
+ const values = ddecompose(value, `${_prev}${key}`, options);
14
21
  output.push(...values);
22
+ if (canAddObjectKeys) {
23
+ output.push([`${_prev}${key}`, value]);
24
+ }
15
25
  }
16
- else
26
+ else if (canAddKeys)
17
27
  output.push([`${_prev}${key}`, value]);
18
28
  });
19
29
  return output;
20
30
  }
21
- const _decompose = val => {
22
- const entries1 = ddecompose(val, '');
31
+ const _decompose = (val, options) => {
32
+ const entries1 = ddecompose(val, '', options);
33
+ const { sep, start } = {
34
+ ...types_types.DEFAULT_DECOMPOSE_OPTIONS,
35
+ ...options,
36
+ };
23
37
  if (entries1.length == 0)
24
38
  return {};
25
39
  const regex = new RegExp(constants_strings.DELIMITER, 'g');
26
- const entries2 = entries1.map(([key, value]) => [
27
- key.replace(regex, '.'),
28
- value,
29
- ]);
40
+ const entries2 = entries1.map(([__key, value]) => {
41
+ const _key = __key.replace(regex, sep);
42
+ const key = start ? `${sep}${_key}` : _key;
43
+ return [key, value];
44
+ });
30
45
  const output = Object.fromEntries(entries2);
31
46
  return output;
32
47
  };
33
48
  /* v8 ignore next 1 */
34
- const decompose = val => _decompose(val);
49
+ const decompose = (val, options) => _decompose(val, options);
35
50
  decompose.low = _decompose;
36
51
  decompose.strict = _decompose;
37
52
 
@@ -1 +1 @@
1
- {"version":3,"file":"decompose.cjs","sources":["../src/decompose.ts"],"sourcesContent":["import type { types } from '@bemedev/types';\nimport { DELIMITER } from './constants/strings';\nimport { isPrimitive } from './helpers';\nimport type { Decompose } from './types.types';\n\nfunction ddecompose(val: any, prev = '') {\n const _prev = prev ? prev + DELIMITER : '';\n const output: [string, any][] = [];\n const entries1 = Object.entries(val);\n entries1.forEach(([key, value]) => {\n const isPrimit = isPrimitive(value) || Array.isArray(value);\n if (!isPrimit) {\n const values = ddecompose(value, `${_prev}${key}`);\n output.push(...values);\n } else output.push([`${_prev}${key}`, value]);\n });\n return output;\n}\n\ntype Decompose_F = <T extends types.TrueObject>(val: T) => Decompose<T>;\ntype _Decompose_F = (val: any) => any;\n\nexport type Decomposer = Decompose_F & {\n strict: Decompose_F;\n low: _Decompose_F;\n};\n\nconst _decompose: _Decompose_F = val => {\n const entries1 = ddecompose(val, '');\n if (entries1.length == 0) return {};\n\n const regex = new RegExp(DELIMITER, 'g');\n const entries2 = entries1.map(([key, value]) => [\n key.replace(regex, '.'),\n value,\n ]);\n\n const output = Object.fromEntries(entries2);\n return output;\n};\n\n/* v8 ignore next 1 */\nexport const decompose: Decomposer = val => _decompose(val);\ndecompose.low = _decompose;\ndecompose.strict = _decompose;\n"],"names":["DELIMITER","isPrimitive"],"mappings":";;;;;AAKA,SAAS,UAAU,CAAC,GAAQ,EAAE,IAAI,GAAG,EAAE,EAAA;AACrC,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAGA,2BAAS,GAAG,EAAE;IAC1C,MAAM,MAAM,GAAoB,EAAE;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAChC,QAAA,MAAM,QAAQ,GAAGC,mBAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC;AAClD,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACxB;;AAAO,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,CAAC,CAAC;AAC/C,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAUA,MAAM,UAAU,GAAiB,GAAG,IAAG;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;AACpC,IAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,EAAE;IAEnC,MAAM,KAAK,GAAG,IAAI,MAAM,CAACD,2BAAS,EAAE,GAAG,CAAC;AACxC,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;AAC9C,QAAA,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;QACvB,KAAK;AACN,KAAA,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC3C,IAAA,OAAO,MAAM;AACf,CAAC;AAED;AACO,MAAM,SAAS,GAAe,GAAG,IAAI,UAAU,CAAC,GAAG;AAC1D,SAAS,CAAC,GAAG,GAAG,UAAU;AAC1B,SAAS,CAAC,MAAM,GAAG,UAAU;;;;"}
1
+ {"version":3,"file":"decompose.cjs","sources":["../src/decompose.ts"],"sourcesContent":["import { DELIMITER } from './constants/strings';\nimport { isPrimitive } from './helpers';\nimport {\n DEFAULT_DECOMPOSE_OPTIONS,\n type Decompose,\n type DecomposeOptions,\n} from './types.types';\n\nfunction ddecompose(\n val: any,\n prev = '',\n options: DecomposeOptions = DEFAULT_DECOMPOSE_OPTIONS,\n) {\n const { object } = {\n ...DEFAULT_DECOMPOSE_OPTIONS,\n ...options,\n };\n const canAddObjectKeys = object === 'both' || object === 'object';\n const canAddKeys = object === 'both' || object === 'key';\n\n const _prev = prev ? prev + DELIMITER : '';\n const output: [string, any][] = [];\n const entries1 = Object.entries(val);\n entries1.forEach(([key, value]) => {\n const isPrimit = isPrimitive(value) || Array.isArray(value);\n if (!isPrimit) {\n const values = ddecompose(value, `${_prev}${key}`, options);\n output.push(...values);\n\n if (canAddObjectKeys) {\n output.push([`${_prev}${key}`, value]);\n }\n } else if (canAddKeys) output.push([`${_prev}${key}`, value]);\n });\n return output;\n}\n\ntype Decompose_F = <T>(val: T, options?: DecomposeOptions) => Decompose<T>;\ntype _Decompose_F = (val: any, options?: DecomposeOptions) => any;\n\nexport type Decomposer = Decompose_F & {\n strict: Decompose_F;\n low: _Decompose_F;\n};\n\nconst _decompose: _Decompose_F = (val, options) => {\n const entries1 = ddecompose(val, '', options);\n\n const { sep, start } = {\n ...DEFAULT_DECOMPOSE_OPTIONS,\n ...options,\n };\n if (entries1.length == 0) return {};\n\n const regex = new RegExp(DELIMITER, 'g');\n const entries2 = entries1.map(([__key, value]) => {\n const _key = __key.replace(regex, sep);\n const key = start ? `${sep}${_key}` : _key;\n return [key, value];\n });\n\n const output = Object.fromEntries(entries2);\n return output;\n};\n\n/* v8 ignore next 1 */\nexport const decompose: Decomposer = (val, options) =>\n _decompose(val, options);\ndecompose.low = _decompose;\ndecompose.strict = _decompose;\n"],"names":["DEFAULT_DECOMPOSE_OPTIONS","DELIMITER","isPrimitive"],"mappings":";;;;;;AAQA,SAAS,UAAU,CACjB,GAAQ,EACR,IAAI,GAAG,EAAE,EACT,OAAA,GAA4BA,qCAAyB,EAAA;IAErD,MAAM,EAAE,MAAM,EAAE,GAAG;AACjB,QAAA,GAAGA,qCAAyB;AAC5B,QAAA,GAAG,OAAO;KACX;IACD,MAAM,gBAAgB,GAAG,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ;IACjE,MAAM,UAAU,GAAG,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;AAExD,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAGC,2BAAS,GAAG,EAAE;IAC1C,MAAM,MAAM,GAAoB,EAAE;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAChC,QAAA,MAAM,QAAQ,GAAGC,mBAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,OAAO,CAAC;AAC3D,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YAEtB,IAAI,gBAAgB,EAAE;AACpB,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,CAAC,CAAC;YACxC;QACF;AAAO,aAAA,IAAI,UAAU;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,CAAC,CAAC;AAC/D,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAUA,MAAM,UAAU,GAAiB,CAAC,GAAG,EAAE,OAAO,KAAI;IAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC;AAE7C,IAAA,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;AACrB,QAAA,GAAGF,qCAAyB;AAC5B,QAAA,GAAG,OAAO;KACX;AACD,IAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,EAAE;IAEnC,MAAM,KAAK,GAAG,IAAI,MAAM,CAACC,2BAAS,EAAE,GAAG,CAAC;AACxC,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAI;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,CAAA,CAAE,GAAG,IAAI;AAC1C,QAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;AACrB,IAAA,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC3C,IAAA,OAAO,MAAM;AACf,CAAC;AAED;AACO,MAAM,SAAS,GAAe,CAAC,GAAG,EAAE,OAAO,KAChD,UAAU,CAAC,GAAG,EAAE,OAAO;AACzB,SAAS,CAAC,GAAG,GAAG,UAAU;AAC1B,SAAS,CAAC,MAAM,GAAG,UAAU;;;;"}
@@ -1,7 +1,6 @@
1
- import type { types } from '@bemedev/types';
2
- import type { Decompose } from './types.types';
3
- type Decompose_F = <T extends types.TrueObject>(val: T) => Decompose<T>;
4
- type _Decompose_F = (val: any) => any;
1
+ import { type Decompose, type DecomposeOptions } from './types.types';
2
+ type Decompose_F = <T>(val: T, options?: DecomposeOptions) => Decompose<T>;
3
+ type _Decompose_F = (val: any, options?: DecomposeOptions) => any;
5
4
  export type Decomposer = Decompose_F & {
6
5
  strict: Decompose_F;
7
6
  low: _Decompose_F;
@@ -1 +1 @@
1
- {"version":3,"file":"decompose.d.ts","sourceRoot":"","sources":["../src/decompose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAgB/C,KAAK,WAAW,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;AACxE,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG;IACrC,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;CACnB,CAAC;AAiBF,eAAO,MAAM,SAAS,EAAE,UAAmC,CAAC"}
1
+ {"version":3,"file":"decompose.d.ts","sourceRoot":"","sources":["../src/decompose.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AA+BvB,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3E,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,GAAG,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG;IACrC,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;CACnB,CAAC;AAuBF,eAAO,MAAM,SAAS,EAAE,UACE,CAAC"}
package/lib/decompose.js CHANGED
@@ -1,35 +1,50 @@
1
1
  import { DELIMITER } from './constants/strings.js';
2
2
  import { isPrimitive } from './helpers.js';
3
+ import { DEFAULT_DECOMPOSE_OPTIONS } from './types.types.js';
3
4
 
4
- function ddecompose(val, prev = '') {
5
+ function ddecompose(val, prev = '', options = DEFAULT_DECOMPOSE_OPTIONS) {
6
+ const { object } = {
7
+ ...DEFAULT_DECOMPOSE_OPTIONS,
8
+ ...options,
9
+ };
10
+ const canAddObjectKeys = object === 'both' || object === 'object';
11
+ const canAddKeys = object === 'both' || object === 'key';
5
12
  const _prev = prev ? prev + DELIMITER : '';
6
13
  const output = [];
7
14
  const entries1 = Object.entries(val);
8
15
  entries1.forEach(([key, value]) => {
9
16
  const isPrimit = isPrimitive(value) || Array.isArray(value);
10
17
  if (!isPrimit) {
11
- const values = ddecompose(value, `${_prev}${key}`);
18
+ const values = ddecompose(value, `${_prev}${key}`, options);
12
19
  output.push(...values);
20
+ if (canAddObjectKeys) {
21
+ output.push([`${_prev}${key}`, value]);
22
+ }
13
23
  }
14
- else
24
+ else if (canAddKeys)
15
25
  output.push([`${_prev}${key}`, value]);
16
26
  });
17
27
  return output;
18
28
  }
19
- const _decompose = val => {
20
- const entries1 = ddecompose(val, '');
29
+ const _decompose = (val, options) => {
30
+ const entries1 = ddecompose(val, '', options);
31
+ const { sep, start } = {
32
+ ...DEFAULT_DECOMPOSE_OPTIONS,
33
+ ...options,
34
+ };
21
35
  if (entries1.length == 0)
22
36
  return {};
23
37
  const regex = new RegExp(DELIMITER, 'g');
24
- const entries2 = entries1.map(([key, value]) => [
25
- key.replace(regex, '.'),
26
- value,
27
- ]);
38
+ const entries2 = entries1.map(([__key, value]) => {
39
+ const _key = __key.replace(regex, sep);
40
+ const key = start ? `${sep}${_key}` : _key;
41
+ return [key, value];
42
+ });
28
43
  const output = Object.fromEntries(entries2);
29
44
  return output;
30
45
  };
31
46
  /* v8 ignore next 1 */
32
- const decompose = val => _decompose(val);
47
+ const decompose = (val, options) => _decompose(val, options);
33
48
  decompose.low = _decompose;
34
49
  decompose.strict = _decompose;
35
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"decompose.js","sources":["../src/decompose.ts"],"sourcesContent":["import type { types } from '@bemedev/types';\nimport { DELIMITER } from './constants/strings';\nimport { isPrimitive } from './helpers';\nimport type { Decompose } from './types.types';\n\nfunction ddecompose(val: any, prev = '') {\n const _prev = prev ? prev + DELIMITER : '';\n const output: [string, any][] = [];\n const entries1 = Object.entries(val);\n entries1.forEach(([key, value]) => {\n const isPrimit = isPrimitive(value) || Array.isArray(value);\n if (!isPrimit) {\n const values = ddecompose(value, `${_prev}${key}`);\n output.push(...values);\n } else output.push([`${_prev}${key}`, value]);\n });\n return output;\n}\n\ntype Decompose_F = <T extends types.TrueObject>(val: T) => Decompose<T>;\ntype _Decompose_F = (val: any) => any;\n\nexport type Decomposer = Decompose_F & {\n strict: Decompose_F;\n low: _Decompose_F;\n};\n\nconst _decompose: _Decompose_F = val => {\n const entries1 = ddecompose(val, '');\n if (entries1.length == 0) return {};\n\n const regex = new RegExp(DELIMITER, 'g');\n const entries2 = entries1.map(([key, value]) => [\n key.replace(regex, '.'),\n value,\n ]);\n\n const output = Object.fromEntries(entries2);\n return output;\n};\n\n/* v8 ignore next 1 */\nexport const decompose: Decomposer = val => _decompose(val);\ndecompose.low = _decompose;\ndecompose.strict = _decompose;\n"],"names":[],"mappings":";;;AAKA,SAAS,UAAU,CAAC,GAAQ,EAAE,IAAI,GAAG,EAAE,EAAA;AACrC,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,EAAE;IAC1C,MAAM,MAAM,GAAoB,EAAE;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAChC,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC;AAClD,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACxB;;AAAO,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,CAAC,CAAC;AAC/C,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAUA,MAAM,UAAU,GAAiB,GAAG,IAAG;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;AACpC,IAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,EAAE;IAEnC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC;AACxC,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;AAC9C,QAAA,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;QACvB,KAAK;AACN,KAAA,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC3C,IAAA,OAAO,MAAM;AACf,CAAC;AAED;AACO,MAAM,SAAS,GAAe,GAAG,IAAI,UAAU,CAAC,GAAG;AAC1D,SAAS,CAAC,GAAG,GAAG,UAAU;AAC1B,SAAS,CAAC,MAAM,GAAG,UAAU;;;;"}
1
+ {"version":3,"file":"decompose.js","sources":["../src/decompose.ts"],"sourcesContent":["import { DELIMITER } from './constants/strings';\nimport { isPrimitive } from './helpers';\nimport {\n DEFAULT_DECOMPOSE_OPTIONS,\n type Decompose,\n type DecomposeOptions,\n} from './types.types';\n\nfunction ddecompose(\n val: any,\n prev = '',\n options: DecomposeOptions = DEFAULT_DECOMPOSE_OPTIONS,\n) {\n const { object } = {\n ...DEFAULT_DECOMPOSE_OPTIONS,\n ...options,\n };\n const canAddObjectKeys = object === 'both' || object === 'object';\n const canAddKeys = object === 'both' || object === 'key';\n\n const _prev = prev ? prev + DELIMITER : '';\n const output: [string, any][] = [];\n const entries1 = Object.entries(val);\n entries1.forEach(([key, value]) => {\n const isPrimit = isPrimitive(value) || Array.isArray(value);\n if (!isPrimit) {\n const values = ddecompose(value, `${_prev}${key}`, options);\n output.push(...values);\n\n if (canAddObjectKeys) {\n output.push([`${_prev}${key}`, value]);\n }\n } else if (canAddKeys) output.push([`${_prev}${key}`, value]);\n });\n return output;\n}\n\ntype Decompose_F = <T>(val: T, options?: DecomposeOptions) => Decompose<T>;\ntype _Decompose_F = (val: any, options?: DecomposeOptions) => any;\n\nexport type Decomposer = Decompose_F & {\n strict: Decompose_F;\n low: _Decompose_F;\n};\n\nconst _decompose: _Decompose_F = (val, options) => {\n const entries1 = ddecompose(val, '', options);\n\n const { sep, start } = {\n ...DEFAULT_DECOMPOSE_OPTIONS,\n ...options,\n };\n if (entries1.length == 0) return {};\n\n const regex = new RegExp(DELIMITER, 'g');\n const entries2 = entries1.map(([__key, value]) => {\n const _key = __key.replace(regex, sep);\n const key = start ? `${sep}${_key}` : _key;\n return [key, value];\n });\n\n const output = Object.fromEntries(entries2);\n return output;\n};\n\n/* v8 ignore next 1 */\nexport const decompose: Decomposer = (val, options) =>\n _decompose(val, options);\ndecompose.low = _decompose;\ndecompose.strict = _decompose;\n"],"names":[],"mappings":";;;;AAQA,SAAS,UAAU,CACjB,GAAQ,EACR,IAAI,GAAG,EAAE,EACT,OAAA,GAA4B,yBAAyB,EAAA;IAErD,MAAM,EAAE,MAAM,EAAE,GAAG;AACjB,QAAA,GAAG,yBAAyB;AAC5B,QAAA,GAAG,OAAO;KACX;IACD,MAAM,gBAAgB,GAAG,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ;IACjE,MAAM,UAAU,GAAG,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;AAExD,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,EAAE;IAC1C,MAAM,MAAM,GAAoB,EAAE;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAChC,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,OAAO,CAAC;AAC3D,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YAEtB,IAAI,gBAAgB,EAAE;AACpB,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,CAAC,CAAC;YACxC;QACF;AAAO,aAAA,IAAI,UAAU;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,CAAC,CAAC;AAC/D,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAUA,MAAM,UAAU,GAAiB,CAAC,GAAG,EAAE,OAAO,KAAI;IAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC;AAE7C,IAAA,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;AACrB,QAAA,GAAG,yBAAyB;AAC5B,QAAA,GAAG,OAAO;KACX;AACD,IAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,EAAE;IAEnC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC;AACxC,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAI;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,CAAA,CAAE,GAAG,IAAI;AAC1C,QAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;AACrB,IAAA,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC3C,IAAA,OAAO,MAAM;AACf,CAAC;AAED;AACO,MAAM,SAAS,GAAe,CAAC,GAAG,EAAE,OAAO,KAChD,UAAU,CAAC,GAAG,EAAE,OAAO;AACzB,SAAS,CAAC,GAAG,GAAG,UAAU;AAC1B,SAAS,CAAC,MAAM,GAAG,UAAU;;;;"}
package/lib/flat.cjs ADDED
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ var decompose = require('./decompose.cjs');
4
+ var types_types = require('./types.types.cjs');
5
+
6
+ const _flat = (val, omitKey, options = types_types.DEFAULT_FLAT_OPTIONS) => {
7
+ const { sep, children } = {
8
+ ...types_types.DEFAULT_FLAT_OPTIONS,
9
+ ...options,
10
+ };
11
+ const first = decompose.decompose(val, {
12
+ object: 'object',
13
+ sep,
14
+ start: true,
15
+ });
16
+ const output = {};
17
+ const entries = Object.entries(first);
18
+ if (entries.length === 0)
19
+ return output;
20
+ entries
21
+ .filter(([k]) => {
22
+ const splits = k.split(`${sep}${omitKey}${sep}`);
23
+ const last = splits[splits.length - 1];
24
+ return !last.includes(omitKey);
25
+ })
26
+ .forEach(([k, v]) => {
27
+ const _value = structuredClone(v);
28
+ if (!children)
29
+ delete _value[omitKey];
30
+ const key = k.replace(new RegExp(`${omitKey}${sep}`, 'g'), '');
31
+ output[key] = _value;
32
+ });
33
+ return output;
34
+ };
35
+ const flat = (val, key, options) => _flat(val, key, options);
36
+ flat.low = _flat;
37
+ flat.strict = _flat;
38
+
39
+ exports.flat = flat;
40
+ //# sourceMappingURL=flat.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flat.cjs","sources":["../src/flat.ts"],"sourcesContent":["import type { types } from '@bemedev/types';\nimport { decompose } from './decompose';\nimport {\n DEFAULT_FLAT_OPTIONS,\n type FlatByKey,\n type FlatOptions,\n} from './types.types';\n\ntype Flat_F = <\n T extends types.Ru,\n omit extends types.PickKeysBy<T, object> & string,\n>(\n val: T,\n omitKey: omit,\n options?: FlatOptions,\n) => FlatByKey<T, omit, FlatOptions>;\n\ntype _Flat_F = (val: any, omitKey: string, options?: FlatOptions) => any;\n\nexport type Flat = Flat_F & {\n strict: Flat_F;\n low: _Flat_F;\n};\n\nconst _flat: _Flat_F = (val, omitKey, options = DEFAULT_FLAT_OPTIONS) => {\n const { sep, children } = {\n ...DEFAULT_FLAT_OPTIONS,\n ...options,\n };\n\n const first = decompose(val, {\n object: 'object',\n sep,\n start: true,\n });\n\n const output: any = {};\n\n const entries = Object.entries(first);\n if (entries.length === 0) return output;\n\n entries\n .filter(([k]) => {\n const splits = k.split(`${sep}${omitKey}${sep}`);\n const last = splits[splits.length - 1];\n\n return !last.includes(omitKey);\n })\n .forEach(([k, v]) => {\n const _value = structuredClone(v);\n if (!children) delete _value[omitKey];\n const key = k.replace(new RegExp(`${omitKey}${sep}`, 'g'), '');\n\n output[key] = _value;\n });\n\n return output;\n};\n\nexport const flat: Flat = (val, key, options) => _flat(val, key, options);\nflat.low = _flat;\nflat.strict = _flat;\n"],"names":["DEFAULT_FLAT_OPTIONS","decompose"],"mappings":";;;;;AAwBA,MAAM,KAAK,GAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAGA,gCAAoB,KAAI;AACtE,IAAA,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;AACxB,QAAA,GAAGA,gCAAoB;AACvB,QAAA,GAAG,OAAO;KACX;AAED,IAAA,MAAM,KAAK,GAAGC,mBAAS,CAAC,GAAG,EAAE;AAC3B,QAAA,MAAM,EAAE,QAAQ;QAChB,GAAG;AACH,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA,CAAC;IAEF,MAAM,MAAM,GAAQ,EAAE;IAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,MAAM;IAEvC;AACG,SAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAI;AACd,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAEtC,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AAChC,IAAA,CAAC;SACA,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAI;AAClB,QAAA,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AAE9D,QAAA,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM;AACtB,IAAA,CAAC,CAAC;AAEJ,IAAA,OAAO,MAAM;AACf,CAAC;MAEY,IAAI,GAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO;AACxE,IAAI,CAAC,GAAG,GAAG,KAAK;AAChB,IAAI,CAAC,MAAM,GAAG,KAAK;;;;"}
package/lib/flat.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import type { types } from '@bemedev/types';
2
+ import { type FlatByKey, type FlatOptions } from './types.types';
3
+ type Flat_F = <T extends types.Ru, omit extends types.PickKeysBy<T, object> & string>(val: T, omitKey: omit, options?: FlatOptions) => FlatByKey<T, omit, FlatOptions>;
4
+ type _Flat_F = (val: any, omitKey: string, options?: FlatOptions) => any;
5
+ export type Flat = Flat_F & {
6
+ strict: Flat_F;
7
+ low: _Flat_F;
8
+ };
9
+ export declare const flat: Flat;
10
+ export {};
11
+ //# sourceMappingURL=flat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flat.d.ts","sourceRoot":"","sources":["../src/flat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAEvB,KAAK,MAAM,GAAG,CACZ,CAAC,SAAS,KAAK,CAAC,EAAE,EAClB,IAAI,SAAS,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,EAEjD,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,IAAI,EACb,OAAO,CAAC,EAAE,WAAW,KAClB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAErC,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,GAAG,CAAC;AAEzE,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAqCF,eAAO,MAAM,IAAI,EAAE,IAAsD,CAAC"}
package/lib/flat.js ADDED
@@ -0,0 +1,38 @@
1
+ import { decompose } from './decompose.js';
2
+ import { DEFAULT_FLAT_OPTIONS } from './types.types.js';
3
+
4
+ const _flat = (val, omitKey, options = DEFAULT_FLAT_OPTIONS) => {
5
+ const { sep, children } = {
6
+ ...DEFAULT_FLAT_OPTIONS,
7
+ ...options,
8
+ };
9
+ const first = decompose(val, {
10
+ object: 'object',
11
+ sep,
12
+ start: true,
13
+ });
14
+ const output = {};
15
+ const entries = Object.entries(first);
16
+ if (entries.length === 0)
17
+ return output;
18
+ entries
19
+ .filter(([k]) => {
20
+ const splits = k.split(`${sep}${omitKey}${sep}`);
21
+ const last = splits[splits.length - 1];
22
+ return !last.includes(omitKey);
23
+ })
24
+ .forEach(([k, v]) => {
25
+ const _value = structuredClone(v);
26
+ if (!children)
27
+ delete _value[omitKey];
28
+ const key = k.replace(new RegExp(`${omitKey}${sep}`, 'g'), '');
29
+ output[key] = _value;
30
+ });
31
+ return output;
32
+ };
33
+ const flat = (val, key, options) => _flat(val, key, options);
34
+ flat.low = _flat;
35
+ flat.strict = _flat;
36
+
37
+ export { flat };
38
+ //# sourceMappingURL=flat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flat.js","sources":["../src/flat.ts"],"sourcesContent":["import type { types } from '@bemedev/types';\nimport { decompose } from './decompose';\nimport {\n DEFAULT_FLAT_OPTIONS,\n type FlatByKey,\n type FlatOptions,\n} from './types.types';\n\ntype Flat_F = <\n T extends types.Ru,\n omit extends types.PickKeysBy<T, object> & string,\n>(\n val: T,\n omitKey: omit,\n options?: FlatOptions,\n) => FlatByKey<T, omit, FlatOptions>;\n\ntype _Flat_F = (val: any, omitKey: string, options?: FlatOptions) => any;\n\nexport type Flat = Flat_F & {\n strict: Flat_F;\n low: _Flat_F;\n};\n\nconst _flat: _Flat_F = (val, omitKey, options = DEFAULT_FLAT_OPTIONS) => {\n const { sep, children } = {\n ...DEFAULT_FLAT_OPTIONS,\n ...options,\n };\n\n const first = decompose(val, {\n object: 'object',\n sep,\n start: true,\n });\n\n const output: any = {};\n\n const entries = Object.entries(first);\n if (entries.length === 0) return output;\n\n entries\n .filter(([k]) => {\n const splits = k.split(`${sep}${omitKey}${sep}`);\n const last = splits[splits.length - 1];\n\n return !last.includes(omitKey);\n })\n .forEach(([k, v]) => {\n const _value = structuredClone(v);\n if (!children) delete _value[omitKey];\n const key = k.replace(new RegExp(`${omitKey}${sep}`, 'g'), '');\n\n output[key] = _value;\n });\n\n return output;\n};\n\nexport const flat: Flat = (val, key, options) => _flat(val, key, options);\nflat.low = _flat;\nflat.strict = _flat;\n"],"names":[],"mappings":";;;AAwBA,MAAM,KAAK,GAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,oBAAoB,KAAI;AACtE,IAAA,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;AACxB,QAAA,GAAG,oBAAoB;AACvB,QAAA,GAAG,OAAO;KACX;AAED,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE;AAC3B,QAAA,MAAM,EAAE,QAAQ;QAChB,GAAG;AACH,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA,CAAC;IAEF,MAAM,MAAM,GAAQ,EAAE;IAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,MAAM;IAEvC;AACG,SAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAI;AACd,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAEtC,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AAChC,IAAA,CAAC;SACA,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAI;AAClB,QAAA,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AAE9D,QAAA,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM;AACtB,IAAA,CAAC,CAAC;AAEJ,IAAA,OAAO,MAAM;AACf,CAAC;MAEY,IAAI,GAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO;AACxE,IAAI,CAAC,GAAG,GAAG,KAAK;AAChB,IAAI,CAAC,MAAM,GAAG,KAAK;;;;"}
package/lib/index.cjs CHANGED
@@ -5,6 +5,7 @@ var decomposeKeys = require('./decomposeKeys.cjs');
5
5
  var decomposeSV = require('./decomposeSV.cjs');
6
6
  var recompose = require('./recompose.cjs');
7
7
  var sortMap = require('./sortMap.cjs');
8
+ var types_types = require('./types.types.cjs');
8
9
 
9
10
 
10
11
 
@@ -14,4 +15,6 @@ exports.decomposeSV = decomposeSV.decomposeSV;
14
15
  exports.recompose = recompose.recompose;
15
16
  exports.recomposeObjectUrl = recompose.recomposeObjectUrl;
16
17
  exports.sortMap = sortMap.sortMap;
18
+ exports.DEFAULT_DECOMPOSE_OPTIONS = types_types.DEFAULT_DECOMPOSE_OPTIONS;
19
+ exports.DEFAULT_FLAT_OPTIONS = types_types.DEFAULT_FLAT_OPTIONS;
17
20
  //# sourceMappingURL=index.cjs.map
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
package/lib/index.js CHANGED
@@ -3,4 +3,5 @@ export { decomposeKeys } from './decomposeKeys.js';
3
3
  export { decomposeSV } from './decomposeSV.js';
4
4
  export { recompose, recomposeObjectUrl } from './recompose.js';
5
5
  export { sortMap } from './sortMap.js';
6
+ export { DEFAULT_DECOMPOSE_OPTIONS, DEFAULT_FLAT_OPTIONS } from './types.types.js';
6
7
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const DEFAULT_DECOMPOSE_OPTIONS = {
4
+ sep: '.',
5
+ object: 'key',
6
+ start: true,
7
+ };
8
+ const DEFAULT_FLAT_OPTIONS = {
9
+ sep: '.',
10
+ children: false,
11
+ };
12
+ // #endregion
13
+
14
+ exports.DEFAULT_DECOMPOSE_OPTIONS = DEFAULT_DECOMPOSE_OPTIONS;
15
+ exports.DEFAULT_FLAT_OPTIONS = DEFAULT_FLAT_OPTIONS;
16
+ //# sourceMappingURL=types.types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.types.cjs","sources":["../src/types.types.ts"],"sourcesContent":["import type { types } from '@bemedev/types';\n\nexport type StateMatching<\n T extends StateValue,\n Key = keyof T,\n> = T extends StateValueMap\n ? Key extends string\n ? T[Key] extends StateValueMap\n ? `${Key}.${StateMatching<T[Key]>}` | Key\n : `${Key}.${T[Key] & string}` | Key\n : never\n : T;\n\nexport type KeysMatching<\n T extends types.TrueObject,\n AddObjectKeys extends boolean = true,\n Key extends keyof T = keyof T,\n> = Key extends string\n ? Required<T[Key]> extends types.TrueObject\n ?\n | `${Key}.${KeysMatching<Required<T[Key]>, AddObjectKeys> & string}`\n | (AddObjectKeys extends true ? Key : never)\n : Key\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type EmptyObject = {};\n\n// #region Decompose\n\n// #region type Decompose\ntype WO = 'key' | 'object' | 'both';\n\ntype _Decompose<\n T,\n sep extends string = '.',\n wo extends WO = 'key',\n Remaining extends string = '',\n> = {\n [k in keyof T]: T[k] extends infer Tk\n ? UnionToIntersection2<\n Tk extends types.AnyArray<infer A>\n ? A extends Ru\n ? _Decompose<A, sep, wo, `${Remaining}${k & string}${sep}`> &\n (wo extends 'object' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : EmptyObject)\n : wo extends 'key' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : never\n : Tk extends Ru\n ? object extends Tk\n ? Record<`${Remaining}${k & string}`, Tk>\n : _Decompose<\n Tk,\n sep,\n wo,\n `${Remaining}${k & string}${sep}`\n > &\n (wo extends 'object' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : EmptyObject)\n : wo extends 'key' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : never\n >\n : never;\n}[keyof T];\n\nexport type DecomposeOptions = {\n sep?: string;\n object?: WO;\n start?: boolean;\n};\n\nexport const DEFAULT_DECOMPOSE_OPTIONS = {\n sep: '.',\n object: 'key',\n start: true,\n} as const satisfies DecomposeOptions;\n\ntype DefaultDecomposeOptions = typeof DEFAULT_DECOMPOSE_OPTIONS;\n\nexport type Decompose<\n T,\n O extends DecomposeOptions = DefaultDecomposeOptions,\n sep extends string = O['sep'] extends string\n ? O['sep']\n : DefaultDecomposeOptions['sep'],\n> = UnionToIntersection<\n _Decompose<\n T,\n sep,\n O['object'] extends WO\n ? O['object']\n : DefaultDecomposeOptions['object'],\n O['start'] extends infer S extends boolean\n ? S extends true\n ? sep\n : ''\n : sep\n >\n>;\n// #endregion\n\n// #endregion\n\n// #region type FlatByKey\ntype _ExcludeFrom<\n S extends string,\n T extends string,\n Delimiter extends string = '.',\n> = Exclude<\n S extends `${string}${T}${infer V}` ? _ExcludeFrom<V, T, Delimiter> : S,\n `${string}${string}${Delimiter}${string}` | ''\n>;\n\nexport type ExtractEndsFrom<\n S extends string,\n T extends string,\n Delimiter extends string = '.',\n> = Extract<\n S,\n `${string}${Delimiter}${T}${_ExcludeFrom<S, T, Delimiter>}`\n>;\n\nexport type ExcludeFrom<\n S extends string,\n T extends string,\n Delimiter extends string = '.',\n> = S extends `${infer P}${Delimiter}${T}${infer V}`\n ? ExcludeFrom<`${P}${V}`, T, Delimiter>\n : S;\n\n// export type ExcludeFrom<\n// S extends string,\n// T extends string,\n// Delimiter extends string = '.',\n// > = _ExcludeFrom2<ExtractFrom<S, T, Delimiter>, T>;\n\ntype _FlatByKey<\n T extends object,\n KEY extends types.PickKeysBy<T, object>,\n wc extends boolean = false,\n sep extends string = '.',\n> = (Decompose<T, { sep: sep; object: 'object' }> extends infer D\n ? {\n [K in ExtractEndsFrom<keyof D & string, KEY> as ExcludeFrom<\n K,\n KEY\n >]: wc extends true ? D[K] : Omit<D[K], KEY>;\n }\n : never) &\n Record<sep, T>;\n\nexport type FlatOptions = {\n sep?: string;\n children?: boolean;\n};\n\nexport const DEFAULT_FLAT_OPTIONS = {\n sep: '.',\n children: false,\n} as const satisfies FlatOptions;\n\ntype DefaultFlatOptions = typeof DEFAULT_FLAT_OPTIONS;\n\nexport type FlatByKey<\n T extends object,\n omit extends types.PickKeysBy<T, object>,\n O extends FlatOptions = DefaultFlatOptions,\n> = _FlatByKey<\n T,\n omit,\n O['children'] extends boolean\n ? O['children']\n : DefaultFlatOptions['children'],\n O['sep'] extends string ? O['sep'] : DefaultFlatOptions['sep']\n>;\n\n//#endregion\n\nexport type StateValue = string | StateValueMap;\n\nexport interface StateValueMap {\n [key: string]: StateValue;\n}\n\nexport type Ru = Record<string, unknown>;\n\n// #region Recompose\n// #region Preparation\n// type Primitive = string | number | boolean | null | undefined | never;\nexport type UnionToIntersection<U> = boolean extends U\n ? U\n : (U extends any ? (k: U) => void : never) extends (k: infer I) => void\n ? I\n : never;\n\nexport type UnionKeys<U> = U extends Record<infer K, any> ? K : never;\n\nexport type UnionToIntersection2<U extends object> = {\n [K in UnionKeys<U>]: U extends Record<K, infer T> ? T : never;\n};\n\ntype SplitSeparator<S extends string> = S extends `${infer A}.${string}`\n ? A\n : S;\n// #endregion\n\nexport type Recompose<T extends Ru> = {\n [key in keyof T as SplitSeparator<key & string>]: UnionToIntersection<\n key extends `${string}.${infer A}`\n ? A extends `${string}.${string}`\n ? Recompose<Record<A, T[key]>>\n : Record<A, T[key]>\n : T[key]\n >;\n};\n// #endregion\n"],"names":[],"mappings":";;AA2EO,MAAM,yBAAyB,GAAG;AACvC,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,KAAK,EAAE,IAAI;;AAkFN,MAAM,oBAAoB,GAAG;AAClC,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,QAAQ,EAAE,KAAK;;AAyDjB;;;;;"}
@@ -1,31 +1,52 @@
1
1
  import type { types } from '@bemedev/types';
2
2
  export type StateMatching<T extends StateValue, Key = keyof T> = T extends StateValueMap ? Key extends string ? T[Key] extends StateValueMap ? `${Key}.${StateMatching<T[Key]>}` | Key : `${Key}.${T[Key] & string}` | Key : never : T;
3
3
  export type KeysMatching<T extends types.TrueObject, AddObjectKeys extends boolean = true, Key extends keyof T = keyof T> = Key extends string ? Required<T[Key]> extends types.TrueObject ? `${Key}.${KeysMatching<Required<T[Key]>, AddObjectKeys> & string}` | (AddObjectKeys extends true ? Key : never) : Key : never;
4
- type ToPaths<T, D extends string = '.', P extends string = ''> = T extends Ru ? Required<{
5
- [K in keyof T]: ToPaths<T[K], D, `${P}${K & string}${D}`>;
6
- }>[keyof T] : {
7
- path: P extends `${infer P}${D}` ? P : never;
8
- type: T;
4
+ export type EmptyObject = {};
5
+ type WO = 'key' | 'object' | 'both';
6
+ type _Decompose<T, sep extends string = '.', wo extends WO = 'key', Remaining extends string = ''> = {
7
+ [k in keyof T]: T[k] extends infer Tk ? UnionToIntersection2<Tk extends types.AnyArray<infer A> ? A extends Ru ? _Decompose<A, sep, wo, `${Remaining}${k & string}${sep}`> & (wo extends 'object' | 'both' ? Record<`${Remaining}${k & string}`, Tk> : EmptyObject) : wo extends 'key' | 'both' ? Record<`${Remaining}${k & string}`, Tk> : never : Tk extends Ru ? object extends Tk ? Record<`${Remaining}${k & string}`, Tk> : _Decompose<Tk, sep, wo, `${Remaining}${k & string}${sep}`> & (wo extends 'object' | 'both' ? Record<`${Remaining}${k & string}`, Tk> : EmptyObject) : wo extends 'key' | 'both' ? Record<`${Remaining}${k & string}`, Tk> : never> : never;
8
+ }[keyof T];
9
+ export type DecomposeOptions = {
10
+ sep?: string;
11
+ object?: WO;
12
+ start?: boolean;
9
13
  };
10
- type FromPaths<T extends {
11
- path: string;
12
- type: unknown;
13
- }> = {
14
- [P in T['path']]: Extract<T, {
15
- path: P;
16
- }>['type'];
14
+ export declare const DEFAULT_DECOMPOSE_OPTIONS: {
15
+ readonly sep: ".";
16
+ readonly object: "key";
17
+ readonly start: true;
17
18
  };
18
- /**
19
- * From "Acid Coder"
20
- */
21
- export type Decompose<T extends types.TrueObject, D extends string = '.'> = types.NotSubType<FromPaths<ToPaths<T, D>>, undefined>;
22
- export type LengthOf<T> = T extends ReadonlyArray<unknown> ? T['length'] : number;
19
+ type DefaultDecomposeOptions = typeof DEFAULT_DECOMPOSE_OPTIONS;
20
+ export type Decompose<T, O extends DecomposeOptions = DefaultDecomposeOptions, sep extends string = O['sep'] extends string ? O['sep'] : DefaultDecomposeOptions['sep']> = UnionToIntersection<_Decompose<T, sep, O['object'] extends WO ? O['object'] : DefaultDecomposeOptions['object'], O['start'] extends infer S extends boolean ? S extends true ? sep : '' : sep>>;
21
+ type _ExcludeFrom<S extends string, T extends string, Delimiter extends string = '.'> = Exclude<S extends `${string}${T}${infer V}` ? _ExcludeFrom<V, T, Delimiter> : S, `${string}${string}${Delimiter}${string}` | ''>;
22
+ export type ExtractEndsFrom<S extends string, T extends string, Delimiter extends string = '.'> = Extract<S, `${string}${Delimiter}${T}${_ExcludeFrom<S, T, Delimiter>}`>;
23
+ export type ExcludeFrom<S extends string, T extends string, Delimiter extends string = '.'> = S extends `${infer P}${Delimiter}${T}${infer V}` ? ExcludeFrom<`${P}${V}`, T, Delimiter> : S;
24
+ type _FlatByKey<T extends object, KEY extends types.PickKeysBy<T, object>, wc extends boolean = false, sep extends string = '.'> = (Decompose<T, {
25
+ sep: sep;
26
+ object: 'object';
27
+ }> extends infer D ? {
28
+ [K in ExtractEndsFrom<keyof D & string, KEY> as ExcludeFrom<K, KEY>]: wc extends true ? D[K] : Omit<D[K], KEY>;
29
+ } : never) & Record<sep, T>;
30
+ export type FlatOptions = {
31
+ sep?: string;
32
+ children?: boolean;
33
+ };
34
+ export declare const DEFAULT_FLAT_OPTIONS: {
35
+ readonly sep: ".";
36
+ readonly children: false;
37
+ };
38
+ type DefaultFlatOptions = typeof DEFAULT_FLAT_OPTIONS;
39
+ export type FlatByKey<T extends object, omit extends types.PickKeysBy<T, object>, O extends FlatOptions = DefaultFlatOptions> = _FlatByKey<T, omit, O['children'] extends boolean ? O['children'] : DefaultFlatOptions['children'], O['sep'] extends string ? O['sep'] : DefaultFlatOptions['sep']>;
23
40
  export type StateValue = string | StateValueMap;
24
41
  export interface StateValueMap {
25
42
  [key: string]: StateValue;
26
43
  }
27
44
  export type Ru = Record<string, unknown>;
28
- type UnionToIntersection<U> = boolean extends U ? U : (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
45
+ export type UnionToIntersection<U> = boolean extends U ? U : (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
46
+ export type UnionKeys<U> = U extends Record<infer K, any> ? K : never;
47
+ export type UnionToIntersection2<U extends object> = {
48
+ [K in UnionKeys<U>]: U extends Record<K, infer T> ? T : never;
49
+ };
29
50
  type SplitSeparator<S extends string> = S extends `${infer A}.${string}` ? A : S;
30
51
  export type Recompose<T extends Ru> = {
31
52
  [key in keyof T as SplitSeparator<key & string>]: UnionToIntersection<key extends `${string}.${infer A}` ? A extends `${string}.${string}` ? Recompose<Record<A, T[key]>> : Record<A, T[key]> : T[key]>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.types.d.ts","sourceRoot":"","sources":["../src/types.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.types.d.ts","sourceRoot":"","sources":["../src/types.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ const DEFAULT_DECOMPOSE_OPTIONS = {
2
+ sep: '.',
3
+ object: 'key',
4
+ start: true,
5
+ };
6
+ const DEFAULT_FLAT_OPTIONS = {
7
+ sep: '.',
8
+ children: false,
9
+ };
10
+ // #endregion
11
+
12
+ export { DEFAULT_DECOMPOSE_OPTIONS, DEFAULT_FLAT_OPTIONS };
13
+ //# sourceMappingURL=types.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.types.js","sources":["../src/types.types.ts"],"sourcesContent":["import type { types } from '@bemedev/types';\n\nexport type StateMatching<\n T extends StateValue,\n Key = keyof T,\n> = T extends StateValueMap\n ? Key extends string\n ? T[Key] extends StateValueMap\n ? `${Key}.${StateMatching<T[Key]>}` | Key\n : `${Key}.${T[Key] & string}` | Key\n : never\n : T;\n\nexport type KeysMatching<\n T extends types.TrueObject,\n AddObjectKeys extends boolean = true,\n Key extends keyof T = keyof T,\n> = Key extends string\n ? Required<T[Key]> extends types.TrueObject\n ?\n | `${Key}.${KeysMatching<Required<T[Key]>, AddObjectKeys> & string}`\n | (AddObjectKeys extends true ? Key : never)\n : Key\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type EmptyObject = {};\n\n// #region Decompose\n\n// #region type Decompose\ntype WO = 'key' | 'object' | 'both';\n\ntype _Decompose<\n T,\n sep extends string = '.',\n wo extends WO = 'key',\n Remaining extends string = '',\n> = {\n [k in keyof T]: T[k] extends infer Tk\n ? UnionToIntersection2<\n Tk extends types.AnyArray<infer A>\n ? A extends Ru\n ? _Decompose<A, sep, wo, `${Remaining}${k & string}${sep}`> &\n (wo extends 'object' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : EmptyObject)\n : wo extends 'key' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : never\n : Tk extends Ru\n ? object extends Tk\n ? Record<`${Remaining}${k & string}`, Tk>\n : _Decompose<\n Tk,\n sep,\n wo,\n `${Remaining}${k & string}${sep}`\n > &\n (wo extends 'object' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : EmptyObject)\n : wo extends 'key' | 'both'\n ? Record<`${Remaining}${k & string}`, Tk>\n : never\n >\n : never;\n}[keyof T];\n\nexport type DecomposeOptions = {\n sep?: string;\n object?: WO;\n start?: boolean;\n};\n\nexport const DEFAULT_DECOMPOSE_OPTIONS = {\n sep: '.',\n object: 'key',\n start: true,\n} as const satisfies DecomposeOptions;\n\ntype DefaultDecomposeOptions = typeof DEFAULT_DECOMPOSE_OPTIONS;\n\nexport type Decompose<\n T,\n O extends DecomposeOptions = DefaultDecomposeOptions,\n sep extends string = O['sep'] extends string\n ? O['sep']\n : DefaultDecomposeOptions['sep'],\n> = UnionToIntersection<\n _Decompose<\n T,\n sep,\n O['object'] extends WO\n ? O['object']\n : DefaultDecomposeOptions['object'],\n O['start'] extends infer S extends boolean\n ? S extends true\n ? sep\n : ''\n : sep\n >\n>;\n// #endregion\n\n// #endregion\n\n// #region type FlatByKey\ntype _ExcludeFrom<\n S extends string,\n T extends string,\n Delimiter extends string = '.',\n> = Exclude<\n S extends `${string}${T}${infer V}` ? _ExcludeFrom<V, T, Delimiter> : S,\n `${string}${string}${Delimiter}${string}` | ''\n>;\n\nexport type ExtractEndsFrom<\n S extends string,\n T extends string,\n Delimiter extends string = '.',\n> = Extract<\n S,\n `${string}${Delimiter}${T}${_ExcludeFrom<S, T, Delimiter>}`\n>;\n\nexport type ExcludeFrom<\n S extends string,\n T extends string,\n Delimiter extends string = '.',\n> = S extends `${infer P}${Delimiter}${T}${infer V}`\n ? ExcludeFrom<`${P}${V}`, T, Delimiter>\n : S;\n\n// export type ExcludeFrom<\n// S extends string,\n// T extends string,\n// Delimiter extends string = '.',\n// > = _ExcludeFrom2<ExtractFrom<S, T, Delimiter>, T>;\n\ntype _FlatByKey<\n T extends object,\n KEY extends types.PickKeysBy<T, object>,\n wc extends boolean = false,\n sep extends string = '.',\n> = (Decompose<T, { sep: sep; object: 'object' }> extends infer D\n ? {\n [K in ExtractEndsFrom<keyof D & string, KEY> as ExcludeFrom<\n K,\n KEY\n >]: wc extends true ? D[K] : Omit<D[K], KEY>;\n }\n : never) &\n Record<sep, T>;\n\nexport type FlatOptions = {\n sep?: string;\n children?: boolean;\n};\n\nexport const DEFAULT_FLAT_OPTIONS = {\n sep: '.',\n children: false,\n} as const satisfies FlatOptions;\n\ntype DefaultFlatOptions = typeof DEFAULT_FLAT_OPTIONS;\n\nexport type FlatByKey<\n T extends object,\n omit extends types.PickKeysBy<T, object>,\n O extends FlatOptions = DefaultFlatOptions,\n> = _FlatByKey<\n T,\n omit,\n O['children'] extends boolean\n ? O['children']\n : DefaultFlatOptions['children'],\n O['sep'] extends string ? O['sep'] : DefaultFlatOptions['sep']\n>;\n\n//#endregion\n\nexport type StateValue = string | StateValueMap;\n\nexport interface StateValueMap {\n [key: string]: StateValue;\n}\n\nexport type Ru = Record<string, unknown>;\n\n// #region Recompose\n// #region Preparation\n// type Primitive = string | number | boolean | null | undefined | never;\nexport type UnionToIntersection<U> = boolean extends U\n ? U\n : (U extends any ? (k: U) => void : never) extends (k: infer I) => void\n ? I\n : never;\n\nexport type UnionKeys<U> = U extends Record<infer K, any> ? K : never;\n\nexport type UnionToIntersection2<U extends object> = {\n [K in UnionKeys<U>]: U extends Record<K, infer T> ? T : never;\n};\n\ntype SplitSeparator<S extends string> = S extends `${infer A}.${string}`\n ? A\n : S;\n// #endregion\n\nexport type Recompose<T extends Ru> = {\n [key in keyof T as SplitSeparator<key & string>]: UnionToIntersection<\n key extends `${string}.${infer A}`\n ? A extends `${string}.${string}`\n ? Recompose<Record<A, T[key]>>\n : Record<A, T[key]>\n : T[key]\n >;\n};\n// #endregion\n"],"names":[],"mappings":"AA2EO,MAAM,yBAAyB,GAAG;AACvC,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,KAAK,EAAE,IAAI;;AAkFN,MAAM,oBAAoB,GAAG;AAClC,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,QAAQ,EAAE,KAAK;;AAyDjB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bemedev/decompose",
3
- "version": "0.9.0",
3
+ "version": "1.0.0",
4
4
  "description": "Decompose object and so more",
5
5
  "author": {
6
6
  "email": "bri_lvi@icloud.com",
@@ -34,12 +34,12 @@
34
34
  "config": "pnpm install",
35
35
  "config:off": "pnpm run config --offline",
36
36
  "ci": "pnpm run config:off && pnpm run lint && pnpm run test",
37
- "ci:admin": "pnpm run rm && pnpm run ci",
37
+ "ci:admin": "pnpm run rm && pnpm run upgrade && pnpm run ci",
38
38
  "rollup": "rollup -c",
39
39
  "build": "rm -rf lib && pnpm run rollup",
40
40
  "pretest": "pnpm run build",
41
41
  "posttest": "pnpm run prettier && pnpm run p-q",
42
- "rm": "rm -rf node_modules pnpm-lock.yaml",
42
+ "rm": "pnpx rimraf -rf node_modules pnpm-lock.yaml",
43
43
  "p-q": "pretty-quick",
44
44
  "rinit": "pnpm run rm && pnpm run config",
45
45
  "rinit:off": "pnpm run rm && pnpm run config:off",
@@ -59,17 +59,17 @@
59
59
  "devDependencies": {
60
60
  "@bemedev/fsf": "^0.8.0",
61
61
  "@bemedev/rollup-config": "^0.1.1",
62
- "@bemedev/types": "^0.1.8",
62
+ "@bemedev/types": "^0.3.1",
63
63
  "@bemedev/vitest-alias": "^0.0.3",
64
64
  "@bemedev/vitest-exclude": "^0.1.1",
65
65
  "@bemedev/vitest-extended": "^1.3.6",
66
66
  "@eslint/eslintrc": "^3.3.1",
67
- "@eslint/js": "^9.30.1",
68
- "@types/node": "^24.0.10",
69
- "@typescript-eslint/eslint-plugin": "^8.36.0",
70
- "@typescript-eslint/parser": "^8.36.0",
67
+ "@eslint/js": "^9.32.0",
68
+ "@types/node": "^24.1.0",
69
+ "@typescript-eslint/eslint-plugin": "^8.38.0",
70
+ "@typescript-eslint/parser": "^8.38.0",
71
71
  "@vitest/coverage-v8": "^3.2.4",
72
- "eslint": "^9.30.1",
72
+ "eslint": "^9.32.0",
73
73
  "glob": "^11.0.3",
74
74
  "globals": "^16.3.0",
75
75
  "husky": "^9.1.7",
@@ -77,7 +77,7 @@
77
77
  "onchange": "^7.1.0",
78
78
  "prettier": "^3.6.2",
79
79
  "pretty-quick": "^4.2.2",
80
- "rollup": "^4.44.2",
80
+ "rollup": "^4.46.1",
81
81
  "rollup-plugin-tsc-alias": "^1.1.4",
82
82
  "rollup-plugin-typescript2": "^0.36.0",
83
83
  "tslib": "^2.8.1",