@ibgib/ts-gib 0.4.9

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 (87) hide show
  1. package/.vscode/launch.json +24 -0
  2. package/.vscode/settings.json +34 -0
  3. package/.vscode/tasks.json +37 -0
  4. package/CHANGELOG.md +159 -0
  5. package/README.md +502 -0
  6. package/dist/V1/constants.d.mts +22 -0
  7. package/dist/V1/constants.d.mts.map +1 -0
  8. package/dist/V1/constants.mjs +21 -0
  9. package/dist/V1/constants.mjs.map +1 -0
  10. package/dist/V1/factory.d.mts +23 -0
  11. package/dist/V1/factory.d.mts.map +1 -0
  12. package/dist/V1/factory.mjs +78 -0
  13. package/dist/V1/factory.mjs.map +1 -0
  14. package/dist/V1/index.d.mts +6 -0
  15. package/dist/V1/index.d.mts.map +1 -0
  16. package/dist/V1/index.mjs +6 -0
  17. package/dist/V1/index.mjs.map +1 -0
  18. package/dist/V1/sha256v1.d.mts +19 -0
  19. package/dist/V1/sha256v1.d.mts.map +1 -0
  20. package/dist/V1/sha256v1.mjs +86 -0
  21. package/dist/V1/sha256v1.mjs.map +1 -0
  22. package/dist/V1/transforms/fork.d.mts +16 -0
  23. package/dist/V1/transforms/fork.d.mts.map +1 -0
  24. package/dist/V1/transforms/fork.mjs +111 -0
  25. package/dist/V1/transforms/fork.mjs.map +1 -0
  26. package/dist/V1/transforms/index.d.mts +5 -0
  27. package/dist/V1/transforms/index.d.mts.map +1 -0
  28. package/dist/V1/transforms/index.mjs +5 -0
  29. package/dist/V1/transforms/index.mjs.map +1 -0
  30. package/dist/V1/transforms/mut8.d.mts +50 -0
  31. package/dist/V1/transforms/mut8.d.mts.map +1 -0
  32. package/dist/V1/transforms/mut8.mjs +246 -0
  33. package/dist/V1/transforms/mut8.mjs.map +1 -0
  34. package/dist/V1/transforms/rel8.d.mts +14 -0
  35. package/dist/V1/transforms/rel8.d.mts.map +1 -0
  36. package/dist/V1/transforms/rel8.mjs +176 -0
  37. package/dist/V1/transforms/rel8.mjs.map +1 -0
  38. package/dist/V1/transforms/transform-helper.d.mts +92 -0
  39. package/dist/V1/transforms/transform-helper.d.mts.map +1 -0
  40. package/dist/V1/transforms/transform-helper.mjs +189 -0
  41. package/dist/V1/transforms/transform-helper.mjs.map +1 -0
  42. package/dist/V1/types.d.mts +79 -0
  43. package/dist/V1/types.d.mts.map +1 -0
  44. package/dist/V1/types.mjs +12 -0
  45. package/dist/V1/types.mjs.map +1 -0
  46. package/dist/helper.d.mts +77 -0
  47. package/dist/helper.d.mts.map +1 -0
  48. package/dist/helper.mjs +179 -0
  49. package/dist/helper.mjs.map +1 -0
  50. package/dist/index.cjs +4 -0
  51. package/dist/index.cjs.map +1 -0
  52. package/dist/index.d.cts +4 -0
  53. package/dist/index.d.cts.map +1 -0
  54. package/dist/index.d.mts +4 -0
  55. package/dist/index.d.mts.map +1 -0
  56. package/dist/index.mjs +4 -0
  57. package/dist/index.mjs.map +1 -0
  58. package/dist/types.d.mts +242 -0
  59. package/dist/types.d.mts.map +1 -0
  60. package/dist/types.mjs +2 -0
  61. package/dist/types.mjs.map +1 -0
  62. package/jasmine-browser.json +18 -0
  63. package/jasmine.json +6 -0
  64. package/package.json +61 -0
  65. package/src/V1/constants.mts +23 -0
  66. package/src/V1/factory.mts +110 -0
  67. package/src/V1/factory.spec.mts +162 -0
  68. package/src/V1/index.mts +5 -0
  69. package/src/V1/sha256v1.mts +85 -0
  70. package/src/V1/sha256v1.spec.mts +221 -0
  71. package/src/V1/transforms/fork.mts +100 -0
  72. package/src/V1/transforms/fork.spec.mts +410 -0
  73. package/src/V1/transforms/index.mts +4 -0
  74. package/src/V1/transforms/mut8.mts +239 -0
  75. package/src/V1/transforms/mut8.spec.mts +656 -0
  76. package/src/V1/transforms/rel8.mts +173 -0
  77. package/src/V1/transforms/rel8.spec.mts +556 -0
  78. package/src/V1/transforms/transform-helper.mts +263 -0
  79. package/src/V1/transforms/transform-helper.spec.mts +45 -0
  80. package/src/V1/types.mts +84 -0
  81. package/src/helper.mts +192 -0
  82. package/src/helper.spec.mts +127 -0
  83. package/src/index.cts +3 -0
  84. package/src/index.mts +3 -0
  85. package/src/types.mts +242 -0
  86. package/tsconfig.json +15 -0
  87. package/tsconfig.test.json +10 -0
@@ -0,0 +1,173 @@
1
+ import { getIbGibAddr, clone, getTimestamp } from '../../helper.mjs';
2
+ import { sha256v1 } from '../sha256v1.mjs';
3
+ import { IbGib_V1, IbGibData_V1, IbGibRel8ns_V1, Rel8n } from '../types.mjs';
4
+ import { TransformOpts_Rel8, TransformResult, IbGibAddr } from '../../types.mjs';
5
+ import { IBGIB_DELIMITER, GIB, FORBIDDEN_ADD_RENAME_REMOVE_REL8N_NAMES } from '../constants.mjs';
6
+ import { buildDna, getGib, isPrimitive } from './transform-helper.mjs';
7
+ /**
8
+ * Original-ish V1 transform behavior.
9
+ *
10
+ * NOTE:
11
+ * This is NOT going to do the plan^gib stuff ATM.
12
+ * Also this does NOT add any identity information ATM.
13
+ */
14
+ /**
15
+ * Relate (and/or unrelate) other ibGib(s), thus mutating it **extrinsically**.
16
+ */
17
+ export async function rel8(
18
+ opts: TransformOpts_Rel8<IbGib_V1>
19
+ ): Promise<TransformResult<IbGib_V1>> {
20
+ const {
21
+ noTimestamp, dna, linkedRel8ns,
22
+ rel8nsToAddByAddr, rel8nsToRemoveByAddr,
23
+ type = 'rel8'
24
+ } = opts;
25
+ let src = opts.src;
26
+ const lc = '[rel8_v1]';
27
+ if (type !== 'rel8') { throw new Error(`${lc} not a rel8 transform.`); }
28
+ if (!opts.type) { opts.type = 'rel8' }
29
+
30
+ // #region validation
31
+
32
+ if (type !== 'rel8') { throw new Error(`${lc} not a rel8 transform.`); }
33
+ if (!opts.type) { opts.type = 'rel8' }
34
+
35
+ if (!src) { throw new Error(`${lc} src required.`); }
36
+ if (!src!.ib) { throw new Error(`${lc} src.ib required.`); }
37
+ if (src!.ib!.includes(IBGIB_DELIMITER)) {
38
+ throw new Error(`${lc} ib can't contain hardcoded delimiter (${IBGIB_DELIMITER}) right now.`);
39
+ }
40
+ if (!src!.gib) { throw new Error(`${lc} src.gib required.`); }
41
+
42
+ // if (!src.gib || src.gib === GIB) { throw new Error(`${lc} cannot relate to primitive ibGib.`); }
43
+ if (isPrimitive({ ibGib: src })) { throw new Error(`${lc} cannot relate/unrelate primitive ibgib`); }
44
+
45
+ // if neither add nor remove specified, what are we even doing?
46
+ const isAdding = rel8nsToAddByAddr && Object.keys(rel8nsToAddByAddr!).length > 0;
47
+ const isRemoving = rel8nsToRemoveByAddr && Object.keys(rel8nsToRemoveByAddr!).length > 0;
48
+ if (!(isAdding || isRemoving)) {
49
+ throw new Error(`${lc} gotta provide relations to either add or remove.`);
50
+ }
51
+
52
+ const srcAddr = getIbGibAddr({ ib: src.ib, gib: src.gib });
53
+ if (opts.srcAddr && srcAddr !== opts.srcAddr) { throw new Error(`${lc} srcAddr from src does not equal opts.srcAddr`); }
54
+ opts.srcAddr = srcAddr;
55
+
56
+ // validate all ibgib addresses to add/remove
57
+ const fnValidIbGibAddr = (s: string) => {
58
+ // for now, only requiring a single character and trailing delim.
59
+ // i.e. primitive with implied 'gib'
60
+ return s && typeof (s) === 'string' && s.length >= 2 &&
61
+ s.includes('^') && s.split('^')[0].length >= 1;
62
+ };
63
+ Object.keys(rel8nsToAddByAddr || {})
64
+ .map(x => (rel8nsToAddByAddr || {})[x])
65
+ .forEach(rel8ds => {
66
+ if (!(rel8ds && rel8ds.every(rel8d => fnValidIbGibAddr(rel8d)))) {
67
+ throw new Error(`${lc} Invalid rel8n attempt. Must be valid ibGibs. Did you include a delimiter (^)?`);
68
+ }
69
+ });
70
+ Object.keys(rel8nsToRemoveByAddr || {})
71
+ .map(x => (rel8nsToRemoveByAddr || {})[x])
72
+ .forEach(rel8ds => {
73
+ if (!(rel8ds && rel8ds.every(rel8d => fnValidIbGibAddr(rel8d)))) {
74
+ throw new Error(`${lc} Invalid remove rel8n attempt. Must be valid ibGibs. Did you include a delimiter (^)?`);
75
+ }
76
+ });
77
+
78
+ // #endregion validation
79
+
80
+ // we want to forget `src` proper very quickly because it may have other
81
+ // non-IbGib properties that are not relevant to our transform.
82
+ let dto: IbGib_V1 = { ib: src.ib, gib: src.gib, };
83
+ if (src.data && Object.keys(src.data).length > 0) { dto.data = src.data; }
84
+ if (src.rel8ns && Object.keys(src.rel8ns).length > 0) { dto.rel8ns = src.rel8ns; }
85
+ src = dto;
86
+
87
+ const newIbGib = clone(src) as IbGib_V1<IbGibData_V1>;
88
+
89
+ const data: any = clone(src.data || {});
90
+ if (opts.nCounter || Object.keys(data).includes('n')) {
91
+ if (Object.keys(data).includes('n')) {
92
+ if (Number.isInteger(data.n)) {
93
+ if (data.n >= 0) {
94
+ data.n = data.n + 1;
95
+ } else {
96
+ console.warn(`${lc} data.n is less than 0, which is unexpected. Resetting data.n to 0.`);
97
+ data.n = 0;
98
+ }
99
+ } else {
100
+ throw new Error('cannot increment nCounter because data.n is not a number.');
101
+ }
102
+ } else {
103
+ data.n = 0;
104
+ }
105
+ }
106
+
107
+ if (!noTimestamp) { data.timestamp = getTimestamp(); }
108
+
109
+ const rel8ns: IbGibRel8ns_V1 = clone(src.rel8ns || {});
110
+ Object.keys(rel8nsToAddByAddr || {}).forEach(rel8nName => {
111
+ if (FORBIDDEN_ADD_RENAME_REMOVE_REL8N_NAMES.includes(rel8nName)) {
112
+ throw new Error(`${lc} Cannot manually add relationship: ${rel8nName}.`);
113
+ }
114
+ const existingRel8d = rel8ns[rel8nName] || [];
115
+ const toAddRel8d = rel8nsToAddByAddr![rel8nName];
116
+ const newRel8d = toAddRel8d!.filter(x => !existingRel8d.includes(x));
117
+ rel8ns[rel8nName] = existingRel8d.concat(newRel8d);
118
+ });
119
+ Object.keys(rel8nsToRemoveByAddr || {}).forEach(rel8nName => {
120
+ if (FORBIDDEN_ADD_RENAME_REMOVE_REL8N_NAMES.includes(rel8nName)) {
121
+ throw new Error(`${lc} Cannot manually remove relationship: ${rel8nName}.`);
122
+ }
123
+ const existingRel8d = rel8ns[rel8nName] || [];
124
+ const toRemoveRel8d = rel8nsToRemoveByAddr![rel8nName] || [];
125
+ const prunedRel8d = existingRel8d.filter((x: IbGibAddr) => !toRemoveRel8d!.includes(x));
126
+ if (prunedRel8d.length > 0) {
127
+ rel8ns[rel8nName] = prunedRel8d;
128
+ }
129
+ else {
130
+ delete rel8ns[rel8nName];
131
+ }
132
+ });
133
+ rel8ns.past = (rel8ns.past || []).concat([srcAddr]);
134
+ (linkedRel8ns || [])
135
+ .filter(linkedRel8nName => Object.keys(rel8ns).includes(linkedRel8nName))
136
+ .filter(linkedRel8nName => (rel8ns[linkedRel8nName] || []).length > 1)
137
+ .forEach(linkedRel8nName => {
138
+ // take the last item only, and put it in an array
139
+ let initialLength = rel8ns[linkedRel8nName]!.length;
140
+ rel8ns[linkedRel8nName] = [rel8ns[linkedRel8nName]![initialLength - 1]];
141
+ });
142
+
143
+ // rel8ns.past = linkedRel8ns?.includes(Rel8n.past) ?
144
+ // [srcAddr] :
145
+ // (rel8ns.past || []).concat([srcAddr]);
146
+
147
+ if (data.isTjp) {
148
+ let tjpRel8n: IbGibAddr[] = rel8ns['tjp'] || [];
149
+ tjpRel8n.push(srcAddr);
150
+ rel8ns.tjp = tjpRel8n;
151
+ delete data.isTjp;
152
+ }
153
+
154
+ newIbGib.data = data;
155
+ newIbGib.rel8ns = rel8ns;
156
+ // newIbGib.gib = await sha256v1(newIbGib, '');
157
+ const hasTjp = (rel8ns.tjp?.length ?? 0) > 0;
158
+
159
+ let transformDna: IbGib_V1 | null = null;
160
+ if (dna) {
161
+ transformDna = await buildDna(opts);
162
+ const dnaAddr = getIbGibAddr({ ibGib: transformDna });
163
+ rel8ns.dna = linkedRel8ns?.includes(Rel8n.dna) ?
164
+ rel8ns.dna = [dnaAddr] :
165
+ rel8ns.dna = (rel8ns.dna || []).concat(dnaAddr);
166
+ }
167
+
168
+ newIbGib.gib = await getGib({ ibGib: newIbGib, hasTjp });
169
+
170
+ const result: TransformResult<IbGib_V1> = { newIbGib };
171
+ if (transformDna) { result.dnas = [transformDna]; }
172
+ return result;
173
+ }