@effect-app/infra 0.71.2 → 0.72.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 0.72.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b6af4d2f: enhance shadowing paths check
8
+
3
9
  ## 0.71.2
4
10
 
5
11
  ### Patch Changes
@@ -3,11 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.checkDuplicatePaths = checkDuplicatePaths;
6
+ exports.checkPaths = checkPaths;
7
7
  exports.makeJsonSchema = makeJsonSchema;
8
8
  var tsplus_module_1 = _interopRequireWildcard(require("@effect/io/Effect"));
9
- var tsplus_module_2 = _interopRequireWildcard(require("@effect/data/Chunk"));
10
- var tsplus_module_3 = _interopRequireWildcard(require("@effect-app/core/_ext/Iterable"));
9
+ var tsplus_module_2 = _interopRequireWildcard(require("@effect-app/core/_ext/Iterable"));
10
+ var tsplus_module_3 = _interopRequireWildcard(require("@effect/data/Chunk"));
11
11
  var _errors = require("../../errors.cjs");
12
12
  var RS = _interopRequireWildcard(require("./schema/routing.cjs"));
13
13
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -15,68 +15,95 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
15
15
  /* eslint-disable @typescript-eslint/no-explicit-any */
16
16
 
17
17
  const rx = /:(\w+)/g;
18
- function checkDuplicatePaths(paths) {
19
- const methods = Symbol("methods");
20
- const pathMethods = {
21
- [methods]: []
22
- };
23
- const regex = /(?:^|\/)([^/:\n]+)|:(\w+)/g;
24
- for (const path of paths) {
25
- const matches = [...path.path.matchAll(regex)].map(match => match[1] ? {
26
- _tag: "resource",
27
- value: match[1]
28
- } : {
29
- _tag: "param",
30
- value: match[2]
31
- });
32
- let pathNavigator = pathMethods;
33
- for (let i = 0; i < matches.length;) {
34
- const match = matches[i];
35
- switch (match._tag) {
36
- case "resource":
37
- {
38
- if (!(match.value in pathNavigator)) {
39
- ;
40
- pathNavigator[match.value] = {
41
- [methods]: []
42
- };
43
- }
44
- pathNavigator = pathNavigator[match.value];
45
- i++;
46
- break;
18
+ class PathsTree {
19
+ constructor(path) {
20
+ this.methods = [];
21
+ this.params = {};
22
+ this.subpaths = {};
23
+ this.path = path;
24
+ }
25
+ }
26
+ function checkShadowing(pathNavigator, match) {
27
+ return tsplus_module_1.gen(function* ($) {
28
+ switch (match._tag) {
29
+ case "resource":
30
+ {
31
+ // check shadowing: if 'a/:param' comes before 'a/b', then 'a/b' is shadowed
32
+ if (pathNavigator.params[1]) {
33
+ return yield* $(tsplus_module_1.fail(new _errors.InvalidStateError(`Path ${pathNavigator.path}${match.value}/ is shadowed by ${pathNavigator.params[1].path}`)));
47
34
  }
48
- case "param":
49
- {
50
- let numberOfParams = 1;
51
- while (i < matches.length && matches[i + 1]?._tag === "param") {
52
- numberOfParams++;
35
+ break;
36
+ }
37
+ case "param":
38
+ {
39
+ // check shadowing: if 'a/b' comes before 'a/:param', then 'a/"param' is partially shadowed
40
+ const subpaths = Object.getOwnPropertyNames(pathNavigator.subpaths);
41
+ if (subpaths.length > 0) {
42
+ yield* $(tsplus_module_2.ext_forEach(subpaths, s => tsplus_module_1.logInfo(`Path ${pathNavigator.path}:${match.value}/ is partially shadowed by ${pathNavigator.subpaths[s].path}`)));
43
+ }
44
+ break;
45
+ }
46
+ }
47
+ });
48
+ }
49
+ function checkPaths(paths) {
50
+ return tsplus_module_1.gen(function* ($) {
51
+ const pathMethods = new PathsTree("/");
52
+ const regex = /(?:^|\/)([^/:\n]+)|:(\w+)/g;
53
+ for (const path of paths) {
54
+ const matches = [...path.path.matchAll(regex)].map(match => match[1] ? {
55
+ _tag: "resource",
56
+ value: match[1]
57
+ } : {
58
+ _tag: "param",
59
+ value: match[2]
60
+ });
61
+ let pathNavigator = pathMethods;
62
+ for (let i = 0; i < matches.length;) {
63
+ const match = matches[i];
64
+ yield* $(checkShadowing(pathNavigator, match));
65
+ switch (match._tag) {
66
+ case "resource":
67
+ {
68
+ if (!(match.value in pathNavigator.subpaths)) {
69
+ pathNavigator.subpaths[match.value] = new PathsTree(`${pathNavigator.path}${match.value}/`);
70
+ }
71
+ pathNavigator = pathNavigator.subpaths[match.value];
53
72
  i++;
73
+ break;
54
74
  }
55
- if (!(numberOfParams in pathNavigator)) {
56
- ;
57
- pathNavigator[numberOfParams] = {
58
- [methods]: []
59
- };
75
+ case "param":
76
+ {
77
+ const paramsNames = [match.value];
78
+ let numberOfParams = 1;
79
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
80
+ numberOfParams++;
81
+ i++;
82
+ paramsNames.push(matches[i].value);
83
+ }
84
+ if (!(numberOfParams in pathNavigator.params)) {
85
+ pathNavigator.params[numberOfParams] = new PathsTree(`${pathNavigator.path}:${paramsNames.join("/:")}/`);
86
+ }
87
+ pathNavigator = pathNavigator.params[numberOfParams];
88
+ i++;
89
+ break;
60
90
  }
61
- pathNavigator = pathNavigator[numberOfParams];
62
- i++;
63
- break;
64
- }
91
+ }
65
92
  }
93
+ if (pathNavigator.methods.includes(path.method)) {
94
+ // throw duplicate path-method error
95
+ return yield* $(tsplus_module_1.fail(new _errors.InvalidStateError(`Duplicate method ${path.method} for path ${path.path}`)));
96
+ }
97
+ pathNavigator.methods.push(path.method);
66
98
  }
67
- if (pathNavigator[methods].includes(path.method)) {
68
- // throw duplicate path-method error
69
- return tsplus_module_1.fail(new _errors.InvalidStateError(`Duplicate method ${path.method} for path ${path.path}`));
70
- }
71
- pathNavigator[methods].push(path.method);
72
- }
73
- return tsplus_module_1.succeed(paths);
99
+ return paths;
100
+ });
74
101
  }
75
102
  /**
76
103
  * Work in progress JSONSchema generator.
77
104
  */
78
105
  function makeJsonSchema(r) {
79
- return tsplus_module_1.map(tsplus_module_1.flatMap(tsplus_module_3.ext_forEach(tsplus_module_2.fromIterable(r), RS.makeFromSchema), checkDuplicatePaths), e => {
106
+ return tsplus_module_1.map(tsplus_module_1.flatMap(tsplus_module_2.ext_forEach(tsplus_module_3.fromIterable(r), RS.makeFromSchema), checkPaths), e => {
80
107
  const map = ({
81
108
  method,
82
109
  path,
@@ -1 +1 @@
1
- {"version":3,"file":"makeJsonSchema.cjs","names":["_errors","require","RS","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","rx","checkDuplicatePaths","paths","methods","Symbol","pathMethods","regex","path","matches","matchAll","map","match","_tag","value","pathNavigator","i","length","numberOfParams","includes","method","tsplus_module_1","fail","InvalidStateError","push","succeed","makeJsonSchema","r","flatMap","tsplus_module_3","ext_forEach","tsplus_module_2","fromIterable","makeFromSchema","e","responses","rest","reduce","prev","cur","statusCode","type","split","replace","_a","b","Response","constructor"],"sources":["../../../_src/api/express/makeJsonSchema.ts"],"sourcesContent":[null],"mappings":"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"}
1
+ {"version":3,"file":"makeJsonSchema.cjs","names":["_errors","require","RS","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","rx","PathsTree","constructor","path","methods","params","subpaths","checkShadowing","pathNavigator","match","tsplus_module_1","gen","$","_tag","fail","InvalidStateError","value","getOwnPropertyNames","length","tsplus_module_2","ext_forEach","s","logInfo","checkPaths","paths","pathMethods","regex","matches","matchAll","map","i","paramsNames","numberOfParams","push","join","includes","method","makeJsonSchema","r","flatMap","tsplus_module_3","fromIterable","makeFromSchema","e","responses","rest","reduce","prev","cur","statusCode","type","split","replace","_a","b","Response"],"sources":["../../../_src/api/express/makeJsonSchema.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  var tsplus_module_1 = _interopRequireWildcard(require("@effect/io/Effect"));
4
+ var tsplus_module_2 = _interopRequireWildcard(require("@effect/data/Either"));
5
+ var tsplus_module_3 = _interopRequireWildcard(require("@effect/io/Logger"));
4
6
  var _errors = require("../../errors.cjs");
5
7
  var _makeJsonSchema = require("./makeJsonSchema.cjs");
6
8
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -13,15 +15,37 @@ const equalPaths = ["/securities/:idt/search/:id2", "/securities/:id/search/:id2
13
15
  path,
14
16
  method: "get"
15
17
  }));
16
- const differentPaths = ["/securities/:id/search/", "/securities/search/:id2", "/securities/:id/:id2/search/:id3"].map(path => ({
18
+ const differentPaths = ["/securities/search/:id2", "/securities/:id/search/", "/securities/:id/search/:id2", "/securities/:id/:id2/search/:id3"].map(path => ({
17
19
  path,
18
20
  method: "get"
19
21
  })).concat(["/securities/:idt/search/:id2"].map(path => ({
20
22
  path,
21
23
  method: "post"
22
24
  })));
23
- test("works", () => {
24
- expect((0, _makeJsonSchema.checkDuplicatePaths)([path, ...differentPaths])).toStrictEqual(tsplus_module_1.succeed([path, ...differentPaths]));
25
- equalPaths.forEach(p => expect((0, _makeJsonSchema.checkDuplicatePaths)([path, p])).toStrictEqual(tsplus_module_1.fail(new _errors.InvalidStateError(`Duplicate method ${p.method} for path ${p.path}`))));
25
+ test("works", async () => {
26
+ expect(await tsplus_module_1.runPromise((0, _makeJsonSchema.checkPaths)(differentPaths))).toStrictEqual(differentPaths);
27
+ for (const p of equalPaths) {
28
+ expect(await tsplus_module_1.runPromiseEither((0, _makeJsonSchema.checkPaths)([path, p]))).toStrictEqual(tsplus_module_2.left(new _errors.InvalidStateError(`Duplicate method ${p.method} for path ${p.path}`)));
29
+ }
30
+ expect(await tsplus_module_1.runPromiseEither((0, _makeJsonSchema.checkPaths)(["a/:p1/c/:p2", "a/b"].map(path => ({
31
+ path,
32
+ method: "get"
33
+ }))))).toStrictEqual(tsplus_module_2.left(new _errors.InvalidStateError(`Path /a/b/ is shadowed by /a/:p1/`)));
34
+ expect(await tsplus_module_1.runPromiseEither((0, _makeJsonSchema.checkPaths)(["a/:p1/c/:p2", "a/:p111/c/d"].map(path => ({
35
+ path,
36
+ method: "get"
37
+ }))))).toStrictEqual(tsplus_module_2.left(new _errors.InvalidStateError(`Path /a/:p1/c/d/ is shadowed by /a/:p1/c/:p2/`)));
38
+ });
39
+ test("log shadowing", async () => {
40
+ const arr = [];
41
+ const paths = ["a/b", "a/:p"].map(path => ({
42
+ path,
43
+ method: "get"
44
+ }));
45
+ const CustomLogger = tsplus_module_3.make((_, __, message) => {
46
+ arr.push(message);
47
+ });
48
+ await tsplus_module_1.runPromise(tsplus_module_1.provideLayer((0, _makeJsonSchema.checkPaths)(paths), tsplus_module_3.replace(tsplus_module_3.defaultLogger, CustomLogger)));
49
+ expect(arr).toStrictEqual([`Path /a/:p/ is partially shadowed by /a/b/`]);
26
50
  });
27
51
  //# sourceMappingURL=makeJsonSchema.test.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeJsonSchema.test.cjs","names":["_errors","require","_makeJsonSchema","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","path","method","equalPaths","map","differentPaths","concat","test","expect","checkDuplicatePaths","toStrictEqual","tsplus_module_1","succeed","forEach","p","fail","InvalidStateError"],"sources":["../../../_src/api/express/makeJsonSchema.test.ts"],"sourcesContent":[null],"mappings":";;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAAyD,SAAAE,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAI,wBAAAC,GAAA,EAAAL,WAAA,SAAAA,WAAA,IAAAK,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAT,wBAAA,CAAAC,WAAA,OAAAQ,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAEzD,MAAMW,IAAI,GAAG;EAAEA,IAAI,EAAE,6BAA6B;EAAEC,MAAM,EAAE;AAAK,CAAE;AAEnE,MAAMC,UAAU,GAAG,CACjB,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,CAChC,CACEC,GAAG,CAAEH,IAAI,KAAM;EAAEA,IAAI;EAAEC,MAAM,EAAE;AAAK,CAAE,CAAC,CAAC;AAE3C,MAAMG,cAAc,GAGd,CACJ,yBAAyB,EACzB,yBAAyB,EACzB,kCAAkC,CACnC,CACED,GAAG,CAAEH,IAAI,KAAM;EAAEA,IAAI;EAAEC,MAAM,EAAE;AAAK,CAAE,CAAC,CAAC,CACxCI,MAAM,CAAC,CACN,8BAA8B,CAC/B,CACEF,GAAG,CAAEH,IAAI,KAAM;EAAEA,IAAI;EAAEC,MAAM,EAAE;AAAM,CAAE,CAAC,CAAC,CAAC;AAE/CK,IAAI,CAAC,OAAO,EAAE,MAAK;EACjBC,MAAM,CAAC,IAAAC,mCAAmB,EAAC,CAACR,IAAI,EAAE,GAAGI,cAAc,CAAC,CAAC,CAAC,CAACK,aAAa,CAACC,eAAA,CAAAC,OAAA,CAAe,CAACX,IAAI,EAAE,GAAGI,cAAc,CAAC,CAAC,CAAC;EAE/GF,UAAU,CAACU,OAAO,CAAEC,CAAC,IACnBN,MAAM,CAAC,IAAAC,mCAAmB,EAAC,CAACR,IAAI,EAAEa,CAAC,CAAC,CAAC,CAAC,CAACJ,aAAa,CAClDC,eAAA,CAAAI,IAAA,CAAY,IAAIC,yBAAiB,CAAC,oBAAoBF,CAAC,CAACZ,MAAM,aAAaY,CAAC,CAACb,IAAI,EAAE,CAAC,CAAC,CACtF,CACF;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"makeJsonSchema.test.cjs","names":["_errors","require","_makeJsonSchema","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","path","method","equalPaths","map","differentPaths","concat","test","expect","tsplus_module_1","runPromise","checkPaths","toStrictEqual","p","runPromiseEither","tsplus_module_2","left","InvalidStateError","arr","paths","CustomLogger","tsplus_module_3","make","_","__","message","push","provideLayer","replace","defaultLogger"],"sources":["../../../_src/api/express/makeJsonSchema.test.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { InvalidStateError } from "../../errors.js"
2
- import { checkDuplicatePaths } from "./makeJsonSchema.js"
2
+ import { checkPaths } from "./makeJsonSchema.js"
3
3
 
4
4
  const path = { path: "/securities/:id/search/:id2", method: "get" }
5
5
 
@@ -14,8 +14,9 @@ const differentPaths: {
14
14
  path: string
15
15
  method: string
16
16
  }[] = [
17
- "/securities/:id/search/",
18
17
  "/securities/search/:id2",
18
+ "/securities/:id/search/",
19
+ "/securities/:id/search/:id2",
19
20
  "/securities/:id/:id2/search/:id3"
20
21
  ]
21
22
  .map((path) => ({ path, method: "get" }))
@@ -24,12 +25,37 @@ const differentPaths: {
24
25
  ]
25
26
  .map((path) => ({ path, method: "post" })))
26
27
 
27
- test("works", () => {
28
- expect(checkDuplicatePaths([path, ...differentPaths])).toStrictEqual(Effect.succeed([path, ...differentPaths]))
28
+ test("works", async () => {
29
+ expect(await (checkPaths(differentPaths)).runPromise).toStrictEqual(differentPaths)
30
+
31
+ for (const p of equalPaths) {
32
+ expect(await checkPaths([path, p]).runPromiseEither).toStrictEqual(
33
+ Either.left(new InvalidStateError(`Duplicate method ${p.method} for path ${p.path}`))
34
+ )
35
+ }
36
+
37
+ expect(await checkPaths(["a/:p1/c/:p2", "a/b"].map((path) => ({ path, method: "get" }))).runPromiseEither)
38
+ .toStrictEqual(
39
+ Either.left(new InvalidStateError(`Path /a/b/ is shadowed by /a/:p1/`))
40
+ )
29
41
 
30
- equalPaths.forEach((p) =>
31
- expect(checkDuplicatePaths([path, p])).toStrictEqual(
32
- Effect.fail(new InvalidStateError(`Duplicate method ${p.method} for path ${p.path}`))
42
+ expect(await checkPaths(["a/:p1/c/:p2", "a/:p111/c/d"].map((path) => ({ path, method: "get" }))).runPromiseEither)
43
+ .toStrictEqual(
44
+ Either.left(new InvalidStateError(`Path /a/:p1/c/d/ is shadowed by /a/:p1/c/:p2/`))
33
45
  )
34
- )
46
+ })
47
+
48
+ test("log shadowing", async () => {
49
+ const arr: string[] = []
50
+ const paths = ["a/b", "a/:p"].map((path) => ({ path, method: "get" }))
51
+
52
+ const CustomLogger = Logger.make<string, void>((_, __, message) => {
53
+ arr.push(message)
54
+ })
55
+
56
+ await checkPaths(paths)
57
+ .provideLayer(Logger.replace(Logger.defaultLogger, CustomLogger))
58
+ .runPromise
59
+
60
+ expect(arr).toStrictEqual([`Path /a/:p/ is partially shadowed by /a/b/`])
35
61
  })
@@ -9,62 +9,118 @@ const rx = /:(\w+)/g
9
9
 
10
10
  type _A<C> = C extends ReadonlyArray<infer A> ? A : never
11
11
 
12
- export function checkDuplicatePaths<T extends { path: string; method: string }>(
13
- paths: readonly T[]
14
- ): Effect<never, InvalidStateError, readonly T[]> {
15
- const methods = Symbol("methods")
16
- interface PathMethods {
17
- [key: string | number]: this | undefined
18
- [methods]: string[]
12
+ class PathsTree {
13
+ public readonly methods: string[]
14
+ public readonly params: { [key: number]: PathsTree | undefined }
15
+ public readonly subpaths: { [key: string]: PathsTree | undefined }
16
+ public readonly path: string
17
+
18
+ constructor(path: string) {
19
+ this.methods = []
20
+ this.params = {}
21
+ this.subpaths = {}
22
+ this.path = path
19
23
  }
20
- const pathMethods: PathMethods = { [methods]: [] }
21
- const regex = /(?:^|\/)([^/:\n]+)|:(\w+)/g
22
-
23
- for (const path of paths) {
24
- const matches = [...path.path.matchAll(regex)]
25
- .map((match) =>
26
- match[1]
27
- ? { _tag: "resource", value: match[1] } as const
28
- : { _tag: "param", value: match[2]! } as const
29
- )
24
+ }
30
25
 
31
- let pathNavigator: PathMethods | string[] = pathMethods
32
- for (let i = 0; i < matches.length;) {
33
- const match = matches[i]!
34
- switch (match._tag) {
35
- case "resource": {
36
- if (!(match.value in (pathNavigator))) {
37
- ;(pathNavigator)[match.value] = { [methods]: [] }
38
- }
39
- pathNavigator = (pathNavigator)[match.value]!
40
- i++
41
- break
26
+ interface Match {
27
+ _tag: "resource" | "param"
28
+ value: string
29
+ }
30
+
31
+ function checkShadowing(
32
+ pathNavigator: PathsTree,
33
+ match: Match
34
+ ) {
35
+ return Effect.gen(function*($) {
36
+ switch (match._tag) {
37
+ case "resource": {
38
+ // check shadowing: if 'a/:param' comes before 'a/b', then 'a/b' is shadowed
39
+ if (pathNavigator.params[1]) {
40
+ return yield* $(Effect.fail(
41
+ new InvalidStateError(
42
+ `Path ${pathNavigator.path}${match.value}/ is shadowed by ${pathNavigator.params[1].path}`
43
+ )
44
+ ))
45
+ }
46
+ break
47
+ }
48
+ case "param": {
49
+ // check shadowing: if 'a/b' comes before 'a/:param', then 'a/"param' is partially shadowed
50
+ const subpaths = Object.getOwnPropertyNames(pathNavigator.subpaths)
51
+ if (subpaths.length > 0) {
52
+ yield* $(subpaths.forEachEffect((s) =>
53
+ Effect.logInfo(
54
+ `Path ${pathNavigator.path}:${match.value}/ is partially shadowed by ${pathNavigator.subpaths[s]!.path}`
55
+ )
56
+ ))
42
57
  }
43
- case "param": {
44
- let numberOfParams = 1
45
- while (i < matches.length && matches[i + 1]?._tag === "param") {
46
- numberOfParams++
58
+ break
59
+ }
60
+ }
61
+ })
62
+ }
63
+
64
+ export function checkPaths<T extends { path: string; method: string }>(
65
+ paths: readonly T[]
66
+ ) {
67
+ return Effect.gen(function*($) {
68
+ const pathMethods: PathsTree = new PathsTree("/")
69
+ const regex = /(?:^|\/)([^/:\n]+)|:(\w+)/g
70
+ for (const path of paths) {
71
+ const matches = [...path.path.matchAll(regex)]
72
+ .map((match) =>
73
+ match[1]
74
+ ? { _tag: "resource", value: match[1] } as const
75
+ : { _tag: "param", value: match[2]! } as const
76
+ )
77
+
78
+ let pathNavigator = pathMethods
79
+ for (let i = 0; i < matches.length;) {
80
+ const match = matches[i]!
81
+
82
+ yield* $(checkShadowing(pathNavigator, match))
83
+
84
+ switch (match._tag) {
85
+ case "resource": {
86
+ if (!(match.value in pathNavigator.subpaths)) {
87
+ pathNavigator.subpaths[match.value] = new PathsTree(`${pathNavigator.path}${match.value}/`)
88
+ }
89
+
90
+ pathNavigator = pathNavigator.subpaths[match.value]!
47
91
  i++
92
+ break
48
93
  }
94
+ case "param": {
95
+ const paramsNames = [match.value]
96
+ let numberOfParams = 1
97
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
98
+ numberOfParams++
99
+ i++
100
+ paramsNames.push(matches[i]!.value)
101
+ }
49
102
 
50
- if (!(numberOfParams in pathNavigator)) {
51
- ;(pathNavigator)[numberOfParams] = { [methods]: [] }
103
+ if (!(numberOfParams in pathNavigator.params)) {
104
+ pathNavigator.params[numberOfParams] = new PathsTree(
105
+ `${pathNavigator.path}:${paramsNames.join("/:")}/`
106
+ )
107
+ }
108
+ pathNavigator = pathNavigator.params[numberOfParams]!
109
+ i++
110
+ break
52
111
  }
53
- pathNavigator = (pathNavigator)[numberOfParams]!
54
- i++
55
- break
56
112
  }
57
113
  }
58
- }
59
114
 
60
- if (pathNavigator[methods].includes(path.method)) {
61
- // throw duplicate path-method error
62
- return Effect.fail(new InvalidStateError(`Duplicate method ${path.method} for path ${path.path}`))
115
+ if (pathNavigator.methods.includes(path.method)) {
116
+ // throw duplicate path-method error
117
+ return yield* $(Effect.fail(new InvalidStateError(`Duplicate method ${path.method} for path ${path.path}`)))
118
+ }
119
+ pathNavigator.methods.push(path.method)
63
120
  }
64
- pathNavigator[methods].push(path.method)
65
- }
66
121
 
67
- return Effect.succeed(paths)
122
+ return paths
123
+ })
68
124
  }
69
125
 
70
126
  /**
@@ -74,7 +130,7 @@ export function makeJsonSchema(r: Iterable<RS.RouteDescriptorAny>) {
74
130
  return Chunk
75
131
  .fromIterable(r)
76
132
  .forEachEffect(RS.makeFromSchema)
77
- .flatMap(checkDuplicatePaths)
133
+ .flatMap(checkPaths)
78
134
  .map((e) => {
79
135
  const map = ({ method, path, responses, ...rest }: _A<typeof e>) => ({
80
136
  [method]: {
@@ -1,11 +1,10 @@
1
- import { Effect } from "@effect/io/Effect";
2
1
  import { InvalidStateError } from "../../errors.js";
3
2
  import * as RS from "./schema/routing.js";
4
3
  type Methods = "GET" | "PUT" | "POST" | "PATCH" | "DELETE";
5
- export declare function checkDuplicatePaths<T extends {
4
+ export declare function checkPaths<T extends {
6
5
  path: string;
7
6
  method: string;
8
- }>(paths: readonly T[]): Effect<never, InvalidStateError, readonly T[]>;
7
+ }>(paths: readonly T[]): import("@effect/io/Effect").Effect<never, InvalidStateError, readonly T[]>;
9
8
  /**
10
9
  * Work in progress JSONSchema generator.
11
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"makeJsonSchema.d.ts","sourceRoot":"","sources":["../../../_src/api/express/makeJsonSchema.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEzC,KAAK,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAM1D,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC5E,KAAK,EAAE,SAAS,CAAC,EAAE,GAClB,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,CAAC,CAsDhD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;KA8BhE"}
1
+ {"version":3,"file":"makeJsonSchema.d.ts","sourceRoot":"","sources":["../../../_src/api/express/makeJsonSchema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEzC,KAAK,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AA0D1D,wBAAgB,UAAU,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACnE,KAAK,EAAE,SAAS,CAAC,EAAE,8EA2DpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;KA8BhE"}
@@ -1,61 +1,92 @@
1
1
  import * as tsplus_module_1 from "@effect/io/Effect";
2
- import * as tsplus_module_2 from "@effect/data/Chunk";
3
- import * as tsplus_module_3 from "@effect-app/core/_ext/Iterable";
2
+ import * as tsplus_module_2 from "@effect-app/core/_ext/Iterable";
3
+ import * as tsplus_module_3 from "@effect/data/Chunk";
4
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
5
5
  import { InvalidStateError } from "../../errors.js";
6
6
  import * as RS from "./schema/routing.js";
7
7
  const rx = /:(\w+)/g;
8
- export function checkDuplicatePaths(paths) {
9
- const methods = Symbol("methods");
10
- const pathMethods = { [methods]: [] };
11
- const regex = /(?:^|\/)([^/:\n]+)|:(\w+)/g;
12
- for (const path of paths) {
13
- const matches = [...path.path.matchAll(regex)]
14
- .map((match) => match[1]
15
- ? { _tag: "resource", value: match[1] }
16
- : { _tag: "param", value: match[2] });
17
- let pathNavigator = pathMethods;
18
- for (let i = 0; i < matches.length;) {
19
- const match = matches[i];
20
- switch (match._tag) {
21
- case "resource": {
22
- if (!(match.value in (pathNavigator))) {
23
- ;
24
- (pathNavigator)[match.value] = { [methods]: [] };
25
- }
26
- pathNavigator = (pathNavigator)[match.value];
27
- i++;
28
- break;
8
+ class PathsTree {
9
+ constructor(path) {
10
+ this.methods = [];
11
+ this.params = {};
12
+ this.subpaths = {};
13
+ this.path = path;
14
+ }
15
+ }
16
+ function checkShadowing(pathNavigator, match) {
17
+ return tsplus_module_1.gen(function* ($) {
18
+ switch (match._tag) {
19
+ case "resource": {
20
+ // check shadowing: if 'a/:param' comes before 'a/b', then 'a/b' is shadowed
21
+ if (pathNavigator.params[1]) {
22
+ return yield* $(tsplus_module_1.fail(new InvalidStateError(`Path ${pathNavigator.path}${match.value}/ is shadowed by ${pathNavigator.params[1].path}`)));
29
23
  }
30
- case "param": {
31
- let numberOfParams = 1;
32
- while (i < matches.length && matches[i + 1]?._tag === "param") {
33
- numberOfParams++;
24
+ break;
25
+ }
26
+ case "param": {
27
+ // check shadowing: if 'a/b' comes before 'a/:param', then 'a/"param' is partially shadowed
28
+ const subpaths = Object.getOwnPropertyNames(pathNavigator.subpaths);
29
+ if (subpaths.length > 0) {
30
+ yield* $(tsplus_module_2.ext_forEach(subpaths, (s) => tsplus_module_1.logInfo(`Path ${pathNavigator.path}:${match.value}/ is partially shadowed by ${pathNavigator.subpaths[s].path}`)));
31
+ }
32
+ break;
33
+ }
34
+ }
35
+ });
36
+ }
37
+ export function checkPaths(paths) {
38
+ return tsplus_module_1.gen(function* ($) {
39
+ const pathMethods = new PathsTree("/");
40
+ const regex = /(?:^|\/)([^/:\n]+)|:(\w+)/g;
41
+ for (const path of paths) {
42
+ const matches = [...path.path.matchAll(regex)]
43
+ .map((match) => match[1]
44
+ ? { _tag: "resource", value: match[1] }
45
+ : { _tag: "param", value: match[2] });
46
+ let pathNavigator = pathMethods;
47
+ for (let i = 0; i < matches.length;) {
48
+ const match = matches[i];
49
+ yield* $(checkShadowing(pathNavigator, match));
50
+ switch (match._tag) {
51
+ case "resource": {
52
+ if (!(match.value in pathNavigator.subpaths)) {
53
+ pathNavigator.subpaths[match.value] = new PathsTree(`${pathNavigator.path}${match.value}/`);
54
+ }
55
+ pathNavigator = pathNavigator.subpaths[match.value];
34
56
  i++;
57
+ break;
35
58
  }
36
- if (!(numberOfParams in pathNavigator)) {
37
- ;
38
- (pathNavigator)[numberOfParams] = { [methods]: [] };
59
+ case "param": {
60
+ const paramsNames = [match.value];
61
+ let numberOfParams = 1;
62
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
63
+ numberOfParams++;
64
+ i++;
65
+ paramsNames.push(matches[i].value);
66
+ }
67
+ if (!(numberOfParams in pathNavigator.params)) {
68
+ pathNavigator.params[numberOfParams] = new PathsTree(`${pathNavigator.path}:${paramsNames.join("/:")}/`);
69
+ }
70
+ pathNavigator = pathNavigator.params[numberOfParams];
71
+ i++;
72
+ break;
39
73
  }
40
- pathNavigator = (pathNavigator)[numberOfParams];
41
- i++;
42
- break;
43
74
  }
44
75
  }
76
+ if (pathNavigator.methods.includes(path.method)) {
77
+ // throw duplicate path-method error
78
+ return yield* $(tsplus_module_1.fail(new InvalidStateError(`Duplicate method ${path.method} for path ${path.path}`)));
79
+ }
80
+ pathNavigator.methods.push(path.method);
45
81
  }
46
- if (pathNavigator[methods].includes(path.method)) {
47
- // throw duplicate path-method error
48
- return tsplus_module_1.fail(new InvalidStateError(`Duplicate method ${path.method} for path ${path.path}`));
49
- }
50
- pathNavigator[methods].push(path.method);
51
- }
52
- return tsplus_module_1.succeed(paths);
82
+ return paths;
83
+ });
53
84
  }
54
85
  /**
55
86
  * Work in progress JSONSchema generator.
56
87
  */
57
88
  export function makeJsonSchema(r) {
58
- return tsplus_module_1.map(tsplus_module_1.flatMap(tsplus_module_3.ext_forEach(tsplus_module_2.fromIterable(r), RS.makeFromSchema), checkDuplicatePaths), (e) => {
89
+ return tsplus_module_1.map(tsplus_module_1.flatMap(tsplus_module_2.ext_forEach(tsplus_module_3.fromIterable(r), RS.makeFromSchema), checkPaths), (e) => {
59
90
  const map = ({ method, path, responses, ...rest }) => ({
60
91
  [method]: {
61
92
  ...rest,
@@ -82,4 +113,4 @@ class Response {
82
113
  this.type = type;
83
114
  }
84
115
  }
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2FwaS9leHByZXNzL21ha2VKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBSXpDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQTtBQUlwQixNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUtqQyxNQUFNLFdBQVcsR0FBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ2xELE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFBO0lBRTFDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNiLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQVc7WUFDaEQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBRSxFQUFXLENBQ2pELENBQUE7UUFFSCxJQUFJLGFBQWEsR0FBMkIsV0FBVyxDQUFBO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHO1lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8s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
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2FwaS9leHByZXNzL21ha2VKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBSXpDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQTtBQUlwQixNQUFNLFNBQVM7SUFNYixZQUFZLElBQVk7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7SUFDbEIsQ0FBQztDQUNGO0FBT0QsU0FBUyxjQUFjLENBQ3JCLGFBQXdCLEVBQ3hCLEtBQVk7SUFFWixPQUFPLG9CQUFXLFFBQVEsQ0FBQyxFQUFDLENBQUM7UUFDM0IsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ2YsNEVBQTRFO2dCQUM1RSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzNCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUNkLElBQUksaUJBQWlCLENBQ25CLFFBQVEsYUFBYSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxvQkFBb0IsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDM0YsQ0FDRixDQUFDLENBQUE7aUJBQ0g7Z0JBQ0QsTUFBSzthQUNOO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDWiwyRkFBMkY7Z0JBQzNGLE1BQU0sUUFBUSxH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
@@ -18,7 +18,7 @@ export declare function makeOpenApiSpecs(rdescs: Iterable<RouteDescriptorAny>, i
18
18
  version: string;
19
19
  };
20
20
  tags: never[];
21
- paths: Record<string, Record<"PATCH" | "GET" | "POST" | "PUT" | "DELETE", {
21
+ paths: Record<string, Record<"GET" | "PUT" | "POST" | "PATCH" | "DELETE", {
22
22
  [x: string]: {
23
23
  responses: any;
24
24
  tags: readonly string[] | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "0.71.2",
3
+ "version": "0.72.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -21,8 +21,8 @@
21
21
  "redlock": "^4.2.0",
22
22
  "@effect-app/core": "0.56.1",
23
23
  "@effect-app/infra-adapters": "0.49.2",
24
- "@effect-app/schema": "0.50.1",
25
- "@effect-app/prelude": "0.58.2"
24
+ "@effect-app/prelude": "0.58.2",
25
+ "@effect-app/schema": "0.50.1"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@babel/cli": "^7.22.5",