@x12i/memorix-hippox 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.
Files changed (58) hide show
  1. package/README.md +96 -0
  2. package/dist/collection-resolver.d.ts +16 -0
  3. package/dist/collection-resolver.d.ts.map +1 -0
  4. package/dist/collection-resolver.js +121 -0
  5. package/dist/collection-resolver.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +24 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/filters.d.ts +10 -0
  11. package/dist/filters.d.ts.map +1 -0
  12. package/dist/filters.js +75 -0
  13. package/dist/filters.js.map +1 -0
  14. package/dist/http/register-routes.d.ts +12 -0
  15. package/dist/http/register-routes.d.ts.map +1 -0
  16. package/dist/http/register-routes.js +90 -0
  17. package/dist/http/register-routes.js.map +1 -0
  18. package/dist/index-recommendations.d.ts +4 -0
  19. package/dist/index-recommendations.d.ts.map +1 -0
  20. package/dist/index-recommendations.js +40 -0
  21. package/dist/index-recommendations.js.map +1 -0
  22. package/dist/index.d.ts +14 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +13 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/legacy-bridge.d.ts +27 -0
  27. package/dist/legacy-bridge.d.ts.map +1 -0
  28. package/dist/legacy-bridge.js +53 -0
  29. package/dist/legacy-bridge.js.map +1 -0
  30. package/dist/paths.d.ts +15 -0
  31. package/dist/paths.d.ts.map +1 -0
  32. package/dist/paths.js +79 -0
  33. package/dist/paths.js.map +1 -0
  34. package/dist/resolve.d.ts +11 -0
  35. package/dist/resolve.d.ts.map +1 -0
  36. package/dist/resolve.js +180 -0
  37. package/dist/resolve.js.map +1 -0
  38. package/dist/service.d.ts +43 -0
  39. package/dist/service.d.ts.map +1 -0
  40. package/dist/service.js +96 -0
  41. package/dist/service.js.map +1 -0
  42. package/dist/simulate.d.ts +11 -0
  43. package/dist/simulate.d.ts.map +1 -0
  44. package/dist/simulate.js +211 -0
  45. package/dist/simulate.js.map +1 -0
  46. package/dist/store.d.ts +39 -0
  47. package/dist/store.d.ts.map +1 -0
  48. package/dist/store.js +180 -0
  49. package/dist/store.js.map +1 -0
  50. package/dist/types.d.ts +135 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/validation.d.ts +18 -0
  55. package/dist/validation.d.ts.map +1 -0
  56. package/dist/validation.js +107 -0
  57. package/dist/validation.js.map +1 -0
  58. package/package.json +68 -0
@@ -0,0 +1,107 @@
1
+ const VALID_DIRECTIONS = new Set(['downstream', 'upstream']);
2
+ const VALID_STATUSES = new Set(['draft', 'simulated', 'approved', 'disabled']);
3
+ const VALID_JOIN_OPS = new Set(['eq', 'ne', 'in', 'nin']);
4
+ const VALID_FILTER_OPS = new Set(['eq', 'ne', 'in', 'nin', 'exists', 'gt', 'gte', 'lt', 'lte']);
5
+ const VALID_OUTPUT_MODES = new Set(['data', 'record', 'dataWithRecordId']);
6
+ export class HippoxValidationError extends Error {
7
+ statusCode = 400;
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'HippoxValidationError';
11
+ }
12
+ }
13
+ function assertNonEmptyString(value, label) {
14
+ if (typeof value !== 'string' || !value.trim()) {
15
+ throw new HippoxValidationError(`${label} is required`);
16
+ }
17
+ return value.trim();
18
+ }
19
+ function validateRetrieval(retrieval) {
20
+ if (!retrieval || typeof retrieval !== 'object') {
21
+ throw new HippoxValidationError('retrieval is required');
22
+ }
23
+ if (retrieval.type === 'record') {
24
+ if (retrieval.outputMode && !VALID_OUTPUT_MODES.has(retrieval.outputMode)) {
25
+ throw new HippoxValidationError(`invalid record outputMode: ${retrieval.outputMode}`);
26
+ }
27
+ return retrieval;
28
+ }
29
+ if (retrieval.type === 'list') {
30
+ if (retrieval.outputMode && !VALID_OUTPUT_MODES.has(retrieval.outputMode)) {
31
+ throw new HippoxValidationError(`invalid list outputMode: ${retrieval.outputMode}`);
32
+ }
33
+ if (retrieval.limit !== undefined && (!Number.isFinite(retrieval.limit) || retrieval.limit <= 0)) {
34
+ throw new HippoxValidationError('list retrieval limit must be a positive number');
35
+ }
36
+ return retrieval;
37
+ }
38
+ if (retrieval.type === 'aggregate') {
39
+ if (!Array.isArray(retrieval.properties) || retrieval.properties.length === 0) {
40
+ throw new HippoxValidationError('aggregate retrieval requires at least one property path');
41
+ }
42
+ for (const path of retrieval.properties) {
43
+ assertNonEmptyString(path, 'aggregate property path');
44
+ }
45
+ return retrieval;
46
+ }
47
+ throw new HippoxValidationError('retrieval.type must be record, list, or aggregate');
48
+ }
49
+ export function validateContextLinkInput(input) {
50
+ const sourceObjectType = assertNonEmptyString(input.sourceObjectType, 'sourceObjectType');
51
+ const targetObjectType = assertNonEmptyString(input.targetObjectType, 'targetObjectType');
52
+ const direction = assertNonEmptyString(input.direction, 'direction');
53
+ if (!VALID_DIRECTIONS.has(direction)) {
54
+ throw new HippoxValidationError(`invalid direction: ${direction}`);
55
+ }
56
+ if (input.status && !VALID_STATUSES.has(input.status)) {
57
+ throw new HippoxValidationError(`invalid status: ${input.status}`);
58
+ }
59
+ if (!Array.isArray(input.join) || input.join.length === 0) {
60
+ throw new HippoxValidationError('join requires at least one mapping');
61
+ }
62
+ for (const mapping of input.join) {
63
+ assertNonEmptyString(mapping.sourcePath, 'join.sourcePath');
64
+ assertNonEmptyString(mapping.targetPath, 'join.targetPath');
65
+ const op = mapping.operator ?? 'eq';
66
+ if (!VALID_JOIN_OPS.has(op)) {
67
+ throw new HippoxValidationError(`invalid join operator: ${op}`);
68
+ }
69
+ }
70
+ for (const filter of input.fixedFilters ?? []) {
71
+ assertNonEmptyString(filter.targetPath, 'fixedFilters.targetPath');
72
+ if (!VALID_FILTER_OPS.has(filter.operator)) {
73
+ throw new HippoxValidationError(`invalid fixed filter operator: ${filter.operator}`);
74
+ }
75
+ }
76
+ const retrieval = validateRetrieval(input.retrieval);
77
+ return {
78
+ ...input,
79
+ sourceObjectType,
80
+ targetObjectType,
81
+ direction: direction,
82
+ join: input.join,
83
+ retrieval,
84
+ };
85
+ }
86
+ export function defaultRecordRetrieval() {
87
+ return { type: 'record', outputMode: 'data' };
88
+ }
89
+ export function defaultListRetrieval(limit) {
90
+ return { type: 'list', outputMode: 'data', limit };
91
+ }
92
+ export function contextKeyForLink(link) {
93
+ return link.alias?.trim() || link.targetObjectType;
94
+ }
95
+ export function detectContextKeyCollisions(links) {
96
+ const seen = new Map();
97
+ for (const link of links) {
98
+ const key = contextKeyForLink(link);
99
+ const existing = seen.get(key);
100
+ if (existing && existing !== link.id) {
101
+ return key;
102
+ }
103
+ seen.set(key, link.id ?? key);
104
+ }
105
+ return null;
106
+ }
107
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AAC7D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAChG,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAE3E,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,KAAa;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,qBAAqB,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA+B;IACxD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,SAAS,CAAC,UAAU,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,IAAI,SAAS,CAAC,UAAU,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,qBAAqB,CAAC,4BAA4B,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YACjG,MAAM,IAAI,qBAAqB,CAAC,gDAAgD,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,qBAAqB,CAAC,yDAAyD,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACxC,oBAAoB,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,qBAAqB,CAAC,mDAAmD,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC9D,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAC1F,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACrE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,qBAAqB,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,CAAC;IACxE,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACjC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC5D,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,qBAAqB,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC9C,oBAAoB,CAAC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QACnE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,qBAAqB,CAAC,kCAAkC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO;QACL,GAAG,KAAK;QACR,gBAAgB;QAChB,gBAAgB;QAChB,SAAS,EAAE,SAA0C;QACrD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAkD;IAClF,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAuE;IAEvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@x12i/memorix-hippox",
3
+ "version": "1.0.0",
4
+ "description": "Memorix Hippox: discover, simulate, persist, and resolve contextual relationships between Memorix object types.",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=20"
8
+ },
9
+ "publishConfig": {
10
+ "access": "public",
11
+ "registry": "https://registry.npmjs.org/"
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./http": {
21
+ "types": "./dist/http/register-routes.d.ts",
22
+ "import": "./dist/http/register-routes.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.build.json",
31
+ "clean": "node -e \"import('node:fs').then(fs=>fs.promises.rm('dist',{recursive:true,force:true}))\"",
32
+ "prepack": "npm run build",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest"
35
+ },
36
+ "dependencies": {
37
+ "@x12i/memorix-mongo": "^1.4.0",
38
+ "@x12i/memorix-retrieval": "^1.19.0",
39
+ "mongodb": "^6.21.0"
40
+ },
41
+ "peerDependencies": {
42
+ "fastify": ">=4"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "fastify": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.10.2",
51
+ "fastify": "^5.8.5",
52
+ "typescript": "^5.7.2",
53
+ "vitest": "^3.0.0"
54
+ },
55
+ "keywords": [
56
+ "exellix",
57
+ "memorix",
58
+ "hippox",
59
+ "context-links",
60
+ "job-memory"
61
+ ],
62
+ "license": "exellix-license",
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+ssh://git@github.com/x12i/memorix-mono-repo.git",
66
+ "directory": "memorix-hippox"
67
+ }
68
+ }