@neuledge/graph-router 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/matcher.js CHANGED
@@ -8,22 +8,29 @@ export class NeuledgeGraphMatcher {
8
8
  }
9
9
  match(args) {
10
10
  const match = args.path.match(this.regex);
11
- if (!match?.groups)
11
+ if (!match)
12
12
  return null;
13
13
  return {
14
14
  template: this.template,
15
- params: Object.fromEntries(Object.entries(match.groups).map(([key, value]) => [
15
+ params: Object.fromEntries(Object.entries(match.groups ?? {}).map(([key, value]) => [
16
16
  key,
17
17
  decodePathPart(value),
18
18
  ])),
19
19
  };
20
20
  }
21
21
  static generateRegex(template) {
22
- // First, convert {param} into named capture groups
23
- const withCaptureGroups = template.replace(/\{(\w+)\}/g, (_, name) => `(?<${name}>[^.]+)`);
24
- // Then escape regex special chars (dots, etc.)
25
- const regexString = withCaptureGroups.replace(/\./g, "\\.");
26
- return new RegExp(`^${regexString}$`);
22
+ try {
23
+ const escaped = template.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
24
+ const regexString = escaped.replace(/\\\{(\w+)\\\}/g, (_, name) => `(?<${name}>[^.]+?)`);
25
+ return new RegExp(`^${regexString}$`);
26
+ }
27
+ catch (err) {
28
+ if (err instanceof SyntaxError) {
29
+ const message = err.message.split(": ").at(-1) || "Syntax error";
30
+ throw new Error(`Invalid template "${template}": ${message}`);
31
+ }
32
+ throw err;
33
+ }
27
34
  }
28
35
  }
29
36
  //# sourceMappingURL=matcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,MAAM,OAAO,oBAAoB;IAGH;IAFX,KAAK,CAAS;IAE/B,YAA4B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAC5C,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAsB;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QAEhC,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBACjD,GAAG;gBACH,cAAc,CAAC,KAAK,CAAC;aACtB,CAAC,CACsC;SAC3C,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,QAAgB;QAC3C,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CACxC,YAAY,EACZ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,SAAS,CACjC,CAAC;QAEF,+CAA+C;QAC/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE5D,OAAO,IAAI,MAAM,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;IACxC,CAAC;CACF"}
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,MAAM,OAAO,oBAAoB;IAGH;IAFX,KAAK,CAAS;IAE/B,YAA4B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAC5C,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAsB;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBACvD,GAAG;gBACH,cAAc,CAAC,KAAK,CAAC;aACtB,CAAC,CACsC;SAC3C,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,QAAgB;QAC3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAEhE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CACjC,gBAAgB,EAChB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,UAAU,CAClC,CAAC;YAEF,OAAO,IAAI,MAAM,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
package/dist/router.js CHANGED
@@ -8,43 +8,43 @@ export class NeuledgeGraphRouter {
8
8
  async lookup(params) {
9
9
  const path = normalizePath(params.query);
10
10
  const match = await this.registry.match({ path });
11
- if (match) {
12
- try {
13
- const value = await this.registry.resolve(match);
14
- return {
15
- status: "matched",
16
- match,
17
- value,
18
- };
19
- }
20
- catch (error) {
21
- if (!(error instanceof NeuledgeError)) {
22
- throw error;
23
- }
24
- const suggestions = await this.registry.suggestions({
25
- path: match.template,
26
- });
27
- return {
28
- status: "ambiguous",
29
- reasonCode: "INVALID_IDENTIFIER",
30
- reasonHint: error.message,
31
- suggestions: suggestions.map((r) => ({
32
- template: r.template,
33
- })),
34
- };
11
+ if (!match) {
12
+ const suggestions = await this.registry.suggestions({
13
+ path,
14
+ });
15
+ return {
16
+ status: "ambiguous",
17
+ reasonCode: "UNKNOWN_PATH",
18
+ reasonHint: "Try using one of the suggested templates",
19
+ suggestions: suggestions.map((r) => ({
20
+ template: r.template,
21
+ })),
22
+ };
23
+ }
24
+ try {
25
+ const value = await this.registry.resolve(match);
26
+ return {
27
+ status: "matched",
28
+ match,
29
+ value,
30
+ };
31
+ }
32
+ catch (error) {
33
+ if (!(error instanceof NeuledgeError)) {
34
+ throw error;
35
35
  }
36
+ const suggestions = await this.registry.suggestions({
37
+ path: match.template,
38
+ });
39
+ return {
40
+ status: "ambiguous",
41
+ reasonCode: "INVALID_IDENTIFIER",
42
+ reasonHint: error.message,
43
+ suggestions: suggestions.map((r) => ({
44
+ template: r.template,
45
+ })),
46
+ };
36
47
  }
37
- const suggestions = await this.registry.suggestions({
38
- path,
39
- });
40
- return {
41
- status: "ambiguous",
42
- reasonCode: "UNKNOWN_PATH",
43
- reasonHint: "Try using one of the suggested templates",
44
- suggestions: suggestions.map((r) => ({
45
- template: r.template,
46
- })),
47
- };
48
48
  }
49
49
  formatError(error) {
50
50
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,OAAO,mBAAmB;IACrB,QAAQ,CAAwB;IAEzC,YAAY,OAEX;QACC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAiC;QAEjC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjD,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,KAAK;oBACL,KAAK;iBACN,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,EAAE,CAAC;oBACtC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAClD,IAAI,EAAE,KAAK,CAAC,QAAQ;iBACrB,CAAC,CAAC;gBAEH,OAAO;oBACL,MAAM,EAAE,WAAW;oBACnB,UAAU,EAAE,oBAAoB;oBAChC,UAAU,EAAE,KAAK,CAAC,OAAO;oBACzB,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ;qBACrB,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAClD,IAAI;SACL,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,0CAA0C;YACtD,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,KAAc;QACxB,OAAO;YACL,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC;aACpD;SACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,OAAO,mBAAmB;IACrB,QAAQ,CAAwB;IAEzC,YAAY,OAEX;QACC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAiC;QAEjC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAClD,IAAI;aACL,CAAC,CAAC;YAEH,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,cAAc;gBAC1B,UAAU,EAAE,0CAA0C;gBACtD,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,KAAK;gBACL,KAAK;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAClD,IAAI,EAAE,KAAK,CAAC,QAAQ;aACrB,CAAC,CAAC;YAEH,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,oBAAoB;gBAChC,UAAU,EAAE,KAAK,CAAC,OAAO;gBACzB,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAc;QACxB,OAAO;YACL,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC;aACpD;SACF,CAAC;IACJ,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neuledge/graph-router",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Router for pattern matching and resolution of queries against data source registries.",
5
5
  "keywords": [
6
6
  "ai",
@@ -48,7 +48,7 @@
48
48
  "typescript": "^5.9.3",
49
49
  "vite-tsconfig-paths": "^5.1.4",
50
50
  "vitest": "^4.0.3",
51
- "@neuledge/graph": "0.2.0"
51
+ "@neuledge/graph": "0.3.0"
52
52
  },
53
53
  "tsx": {
54
54
  "require": [