@effect-app/infra 0.67.0 → 0.68.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 (29) hide show
  1. package/.cache/effect/095519d034161945a8d2616a506d3e7f35a9b3d868814f44c747429c60fc4e7f.hash +1 -1
  2. package/.cache/effect/134218688132dfbdea493cbe1f26e73449f2759121df35ddd5448346b59c9a8d.content +25 -0
  3. package/.cache/effect/134218688132dfbdea493cbe1f26e73449f2759121df35ddd5448346b59c9a8d.hash +1 -0
  4. package/.cache/effect/14eb9da4ca6d22162888c7fdb7f39ab772d2a2dc6625db6031ecdb32ac89158f.content +87 -0
  5. package/.cache/effect/14eb9da4ca6d22162888c7fdb7f39ab772d2a2dc6625db6031ecdb32ac89158f.hash +1 -0
  6. package/.cache/effect/1bfd92946b11da4292f2ed99dc0e322462b60559148f9524abc20e26f70779e1.hash +1 -1
  7. package/.cache/effect/49c1bd9ec26e6df78b994d8df0bfe21b119803fa4aa46349bf4679fd0f1e7cda.hash +1 -1
  8. package/.cache/effect/58d4ccde8bd2db7829706db5bebd01b99900ee83f0f6a8413b53d17cbd69f510.hash +1 -1
  9. package/.cache/effect/72a5a16a6b62b63cd71719c833091128207d7e6c823cb32293549b3dd58c451b.hash +1 -1
  10. package/.cache/effect/7a9c33db6aedaf00093a132c1d4e48e9d043cef05e932b8a37da24d44e224248.hash +1 -1
  11. package/.cache/effect/8594f0f42afc0641b00e88998000cc47382a1d07da31f4a148f7976701ca22d5.content +97 -0
  12. package/.cache/effect/8594f0f42afc0641b00e88998000cc47382a1d07da31f4a148f7976701ca22d5.hash +1 -0
  13. package/.cache/effect/c67d971634d2dc8118b40452b61c9a51620c35809be4a89982476aa80701d852.hash +1 -1
  14. package/.cache/effect/f38adf43700dab905456a534a0690eaf882cff2cd576c731f23d6d14a3c3d659.hash +1 -1
  15. package/CHANGELOG.md +15 -0
  16. package/_cjs/api/express/makeJsonSchema.cjs +63 -4
  17. package/_cjs/api/express/makeJsonSchema.cjs.map +1 -1
  18. package/_cjs/api/express/makeJsonSchema.test.cjs +27 -0
  19. package/_cjs/api/express/makeJsonSchema.test.cjs.map +1 -0
  20. package/_src/api/express/makeJsonSchema.test.ts +35 -0
  21. package/_src/api/express/makeJsonSchema.ts +60 -0
  22. package/dist/api/express/makeJsonSchema.d.ts +7 -1
  23. package/dist/api/express/makeJsonSchema.d.ts.map +1 -1
  24. package/dist/api/express/makeJsonSchema.js +52 -5
  25. package/dist/api/express/makeJsonSchema.test.d.ts.map +1 -0
  26. package/dist/api/express/makeOpenApiSpecs.d.ts +2 -2
  27. package/dist/api/writeDocs.d.ts +1 -1
  28. package/dist/api/writeDocs.d.ts.map +1 -1
  29. package/package.json +12 -12
@@ -1 +1 @@
1
- 303f340f76ffd50c75569aa3043bf124145e06cceb4057d9c4530ed31d07a728
1
+ 16bfaefe5a2429ca909ad25c1703bbd285431a8192a0c87f95827a21cf7cd387
@@ -0,0 +1,25 @@
1
+ import * as tsplus_module_1 from "@effect/io/Effect";
2
+ import { InvalidStateError } from "../../errors.js";
3
+ import { checkDuplicatePaths } from "./makeJsonSchema.js";
4
+ const path = { path: "/securities/:id/search/:id2", method: "get" };
5
+ const equalPaths = [
6
+ "/securities/:idt/search/:id2",
7
+ "/securities/:id/search/:id2t",
8
+ "/securities/:idt/search/:id2t"
9
+ ]
10
+ .map((path) => ({ path, method: "get" }));
11
+ const differentPaths = [
12
+ "/securities/:id/search/",
13
+ "/securities/search/:id2",
14
+ "/securities/:id/:id2/search/:id3"
15
+ ]
16
+ .map((path) => ({ path, method: "get" }))
17
+ .concat([
18
+ "/securities/:idt/search/:id2"
19
+ ]
20
+ .map((path) => ({ path, method: "post" })));
21
+ test("works", () => {
22
+ expect(checkDuplicatePaths([path, ...differentPaths])).toStrictEqual(tsplus_module_1.succeed([path, ...differentPaths]));
23
+ equalPaths.forEach((p) => expect(checkDuplicatePaths([path, p])).toStrictEqual(tsplus_module_1.fail(new InvalidStateError(`Duplicate method ${p.method} for path ${p.path}`))));
24
+ });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL19zcmMvYXBpL2V4cHJlc3MvbWFrZUpzb25TY2hlbWEudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFekQsTUFBTSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFBO0FBRW5FLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLDhCQUE4QjtJQUM5Qiw4QkFBOEI7SUFDOUIsK0JBQStCO0NBQ2hDO0tBQ0UsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFFM0MsTUFBTSxjQUFjLEdBR2Q7SUFDSix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLGtDQUFrQztDQUNuQztLQUNFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN4QyxNQUFNLENBQUM7SUFDTiw4QkFBOEI7Q0FDL0I7S0FDRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRS9DLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQ2pCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsd0JBQWUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFL0csVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3ZCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUNsRCxxQkFBWSxJQUFJLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3RGLENBQ0YsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW52YWxpZFN0YXRlRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLmpzXCJcbmltcG9ydCB7IGNoZWNrRHVwbGljYXRlUGF0aHMgfSBmcm9tIFwiLi9tYWtlSnNvblNjaGVtYS5qc1wiXG5cbmNvbnN0IHBhdGggPSB7IHBhdGg6IFwiL3NlY3VyaXRpZXMvOmlkL3NlYXJjaC86aWQyXCIsIG1ldGhvZDogXCJnZXRcIiB9XG5cbmNvbnN0IGVxdWFsUGF0aHMgPSBbXG4gIFwiL3NlY3VyaXRpZXMvOmlkdC9zZWFyY2gvOmlkMlwiLFxuICBcIi9zZWN1cml0aWVzLzppZC9zZWFyY2gvOmlkMnRcIixcbiAgXCIvc2VjdXJpdGllcy86aWR0L3NlYXJjaC86aWQydFwiXG5dXG4gIC5tYXAoKHBhdGgpID0+ICh7IHBhdGgsIG1ldGhvZDogXCJnZXRcIiB9KSlcblxuY29uc3QgZGlmZmVyZW50UGF0aHM6IHtcbiAgcGF0aDogc3RyaW5nXG4gIG1ldGhvZDogc3RyaW5nXG59W10gPSBbXG4gIFwiL3NlY3VyaXRpZXMvOmlkL3NlYXJjaC9cIixcbiAgXCIvc2VjdXJpdGllcy9zZWFyY2gvOmlkMlwiLFxuICBcIi9zZWN1cml0aWVzLzppZC86aWQyL3NlYXJjaC86aWQzXCJcbl1cbiAgLm1hcCgocGF0aCkgPT4gKHsgcGF0aCwgbWV0aG9kOiBcImdldFwiIH0pKVxuICAuY29uY2F0KFtcbiAgICBcIi9zZWN1cml0aWVzLzppZHQvc2VhcmNoLzppZDJcIlxuICBdXG4gICAgLm1hcCgocGF0aCkgPT4gKHsgcGF0aCwgbWV0aG9kOiBcInBvc3RcIiB9KSkpXG5cbnRlc3QoXCJ3b3Jrc1wiLCAoKSA9PiB7XG4gIGV4cGVjdChjaGVja0R1cGxpY2F0ZVBhdGhzKFtwYXRoLCAuLi5kaWZmZXJlbnRQYXRoc10pKS50b1N0cmljdEVxdWFsKEVmZmVjdC5zdWNjZWVkKFtwYXRoLCAuLi5kaWZmZXJlbnRQYXRoc10pKVxuXG4gIGVxdWFsUGF0aHMuZm9yRWFjaCgocCkgPT5cbiAgICBleHBlY3QoY2hlY2tEdXBsaWNhdGVQYXRocyhbcGF0aCwgcF0pKS50b1N0cmljdEVxdWFsKFxuICAgICAgRWZmZWN0LmZhaWwobmV3IEludmFsaWRTdGF0ZUVycm9yKGBEdXBsaWNhdGUgbWV0aG9kICR7cC5tZXRob2R9IGZvciBwYXRoICR7cC5wYXRofWApKVxuICAgIClcbiAgKVxufSlcbiJdfQ==
@@ -0,0 +1 @@
1
+ eeeabf23eeed55cc19be92fad9db0ad57b0af0d181bde005fe3c6a7181ab452f
@@ -0,0 +1,87 @@
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";
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ import { InvalidStateError } from "../../errors.js";
6
+ import * as RS from "./schema/routing.js";
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;
29
+ }
30
+ case "param": {
31
+ let numberOfParams = 1;
32
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
33
+ numberOfParams++;
34
+ i++;
35
+ }
36
+ if (!(numberOfParams in pathNavigator)) {
37
+ ;
38
+ (pathNavigator)[numberOfParams] = { [methods]: [] };
39
+ }
40
+ pathNavigator = (pathNavigator)[numberOfParams];
41
+ i++;
42
+ break;
43
+ }
44
+ }
45
+ }
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);
53
+ }
54
+ /**
55
+ * Work in progress JSONSchema generator.
56
+ */
57
+ 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) => {
59
+ const map = ({ method, path, responses, ...rest }) => ({
60
+ [method]: {
61
+ ...rest,
62
+ responses: responses.reduce((prev, cur) => {
63
+ prev[cur.statusCode] = cur.type;
64
+ return prev;
65
+ }, {})
66
+ }
67
+ });
68
+ return e.reduce((prev, e) => {
69
+ const path = e.path.split("?")[0].replace(rx, (_a, b) => `{${b}}`);
70
+ prev[path] = {
71
+ ...prev[path],
72
+ ...map(e)
73
+ };
74
+ return prev;
75
+ }, {});
76
+ });
77
+ }
78
+ class Response {
79
+ statusCode;
80
+ type;
81
+ constructor(statusCode, type // string | JSONSchema | SubSchema
82
+ ) {
83
+ this.statusCode = statusCode;
84
+ this.type = type;
85
+ }
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2FwaS9leHByZXNzL21ha2VKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBSXpDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQTtBQUlwQixNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUtqQyxNQUFNLFdBQVcsR0FBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ2xELE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFBO0lBRTFDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNiLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQVc7WUFDaEQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBRSxFQUFXLENBQ2pELENBQUE7UUFFSCxJQUFJLGFBQWEsR0FBMkIsV0FBVyxDQUFBO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHO1lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8s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R0FBRyxDQUFDLENBQUE7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO2dCQUNYLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDYixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQVE7YUFDakIsQ0FBQTtZQUNELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQyxFQUNELEVBQTZELENBQzlELENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUM7QUFFRCxNQUFNLFFBQVE7SUFFTTtJQUNBO0lBRmxCLFlBQ2tCLFVBQWtCLEVBQ2xCLElBQVMsQ0FBQyxrQ0FBa0M7O1FBRDVDLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBSztJQUN4QixDQUFDO0NBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IEludmFsaWRTdGF0ZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy5qc1wiXG5pbXBvcnQgKiBhcyBSUyBmcm9tIFwiLi9zY2hlbWEvcm91dGluZy5qc1wiXG5cbnR5cGUgTWV0aG9kcyA9IFwiR0VUXCIgfCBcIlBVVFwiIHwgXCJQT1NUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiXG5cbmNvbnN0IHJ4ID0gLzooXFx3KykvZ1xuXG50eXBlIF9BPEM+ID0gQyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgQT4gPyBBIDogbmV2ZXJcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRHVwbGljYXRlUGF0aHM8VCBleHRlbmRzIHsgcGF0aDogc3RyaW5nOyBtZXRob2Q6IHN0cmluZyB9PihcbiAgcGF0aHM6IHJlYWRvbmx5IFRbXVxuKTogRWZmZWN0PG5ldmVyLCBJbnZhbGlkU3RhdGVFcnJvciwgcmVhZG9ubHkgVFtdPiB7XG4gIGNvbnN0IG1ldGhvZHMgPSBTeW1ib2woXCJtZXRob2RzXCIpXG4gIGludGVyZmFjZSBQYXRoTWV0aG9kcyB7XG4gICAgW2tleTogc3RyaW5nIHwgbnVtYmVyXTogdGhpcyB8IHVuZGVmaW5lZFxuICAgIFttZXRob2RzXTogc3RyaW5nW11cbiAgfVxuICBjb25zdCBwYXRoTWV0aG9kczogUGF0aE1ldGhvZHMgPSB7IFttZXRob2RzXTogW10gfVxuICBjb25zdCByZWdleCA9IC8oPzpefFxcLykoW14vOlxcbl0rKXw6KFxcdyspL2dcblxuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gWy4uLnBhdGgucGF0aC5tYXRjaEFsbChyZWdleCldXG4gICAgICAubWFwKChtYXRjaCkgPT5cbiAgICAgICAgbWF0Y2hbMV1cbiAgICAgICAgICA/IHsgX3RhZzogXCJyZXNvdXJjZVwiLCB2YWx1ZTogbWF0Y2hbMV0gfSBhcyBjb25zdFxuICAgICAgICAgIDogeyBfdGFnOiBcInBhcmFtXCIsIHZhbHVlOiBtYXRjaFsyXSEgfSBhcyBjb25zdFxuICAgICAgKVxuXG4gICAgbGV0IHBhdGhOYXZpZ2F0b3I6IFBhdGhNZXRob2RzIHwgc3RyaW5nW10gPSBwYXRoTWV0aG9kc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXNbaV0hXG4gICAgICBzd2l0Y2ggKG1hdGNoLl90YWcpIHtcbiAgICAgICAgY2FzZSBcInJlc291cmNlXCI6IHtcbiAgICAgICAgICBpZiAoIShtYXRjaC52YWx1ZSBpbiAocGF0aE5hdmlnYXRvcikpKSB7XG4gICAgICAgICAgICA7KHBhdGhOYXZpZ2F0b3IpW21hdGNoLnZhbHVlXSA9IHsgW21ldGhvZHNdOiBbXSB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGhOYXZpZ2F0b3IgPSAocGF0aE5hdmlnYXRvcilbbWF0Y2gudmFsdWVdIVxuICAgICAgICAgIGkrK1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInBhcmFtXCI6IHtcbiAgICAgICAgICBsZXQgbnVtYmVyT2ZQYXJhbXMgPSAxXG4gICAgICAgICAgd2hpbGUgKGkgPCBtYXRjaGVzLmxlbmd0aCAmJiBtYXRjaGVzW2kgKyAxXT8uX3RhZyA9PT0gXCJwYXJhbVwiKSB7XG4gICAgICAgICAgICBudW1iZXJPZlBhcmFtcysrXG4gICAgICAgICAgICBpKytcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShudW1iZXJPZlBhcmFtcyBpbiBwYXRoTmF2aWdhdG9yKSkge1xuICAgICAgICAgICAgOyhwYXRoTmF2aWdhdG9yKVtudW1iZXJPZlBhcmFtc10gPSB7IFttZXRob2RzXTogW10gfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoTmF2aWdhdG9yID0gKHBhdGhOYXZpZ2F0b3IpW251bWJlck9mUGFyYW1zXSFcbiAgICAgICAgICBpKytcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhdGhOYXZpZ2F0b3JbbWV0aG9kc10uaW5jbHVkZXMocGF0aC5tZXRob2QpKSB7XG4gICAgICAvLyB0aHJvdyBkdXBsaWNhdGUgcGF0aC1tZXRob2QgZXJyb3JcbiAgICAgIHJldHVybiBFZmZlY3QuZmFpbChuZXcgSW52YWxpZFN0YXRlRXJyb3IoYER1cGxpY2F0ZSBtZXRob2QgJHtwYXRoLm1ldGhvZH0gZm9yIHBhdGggJHtwYXRoLnBhdGh9YCkpXG4gICAgfVxuICAgIHBhdGhOYXZpZ2F0b3JbbWV0aG9kc10ucHVzaChwYXRoLm1ldGhvZClcbiAgfVxuXG4gIHJldHVybiBFZmZlY3Quc3VjY2VlZChwYXRocylcbn1cblxuLyoqXG4gKiBXb3JrIGluIHByb2dyZXNzIEpTT05TY2hlbWEgZ2VuZXJhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUpzb25TY2hlbWEocjogSXRlcmFibGU8UlMuUm91dGVEZXNjcmlwdG9yQW55Pikge1xuICByZXR1cm4gQ2h1bmtcbiAgICAuZnJvbUl0ZXJhYmxlKHIpXG4gICAgLmZvckVhY2hFZmZlY3QoUlMubWFrZUZyb21TY2hlbWEpXG4gICAgLmZsYXRNYXAoY2hlY2tEdXBsaWNhdGVQYXRocylcbiAgICAubWFwKChlKSA9PiB7XG4gICAgICBjb25zdCBtYXAgPSAoeyBtZXRob2QsIHBhdGgsIHJlc3BvbnNlcywgLi4ucmVzdCB9OiBfQTx0eXBlb2YgZT4pID0+ICh7XG4gICAgICAgIFttZXRob2RdOiB7XG4gICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgICByZXNwb25zZXM6IChyZXNwb25zZXMgYXMgQXJyYXk8YW55PikucmVkdWNlKFxuICAgICAgICAgICAgKHByZXYsIGN1cikgPT4ge1xuICAgICAgICAgICAgICBwcmV2W2N1ci5zdGF0dXNDb2RlXSA9IGN1ci50eXBlXG4gICAgICAgICAgICAgIHJldHVybiBwcmV2XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30gYXMgUmVjb3JkPFJlc3BvbnNlW1wic3RhdHVzQ29kZVwiXSwgUmVzcG9uc2VbXCJ0eXBlXCJdPlxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBlLnJlZHVjZShcbiAgICAgICAgKHByZXYsIGUpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gZS5wYXRoLnNwbGl0KFwiP1wiKVswXS5yZXBsYWNlKHJ4LCAoX2EsIGIpID0+IGB7JHtifX1gKVxuICAgICAgICAgIHByZXZbcGF0aF0gPSB7XG4gICAgICAgICAgICAuLi5wcmV2W3BhdGhdLFxuICAgICAgICAgICAgLi4ubWFwKGUpIGFzIGFueVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8TWV0aG9kcywgUmV0dXJuVHlwZTx0eXBlb2YgbWFwPj4+XG4gICAgICApXG4gICAgfSlcbn1cblxuY2xhc3MgUmVzcG9uc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBhbnkgLy8gc3RyaW5nIHwgSlNPTlNjaGVtYSB8IFN1YlNjaGVtYVxuICApIHt9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ 8cc23346cd9bd1e663ddc1a53b36d0946bd5be2c5d457dd4fb342a3ea8f7e52e
@@ -1 +1 @@
1
- 2106804d7ed5f62d59b96efcf115903f0f9819d46ae439f0e1304f2d1b729287
1
+ 83c9f6474d25a55a8363a18bec5e9e7ef2f1e57bcf59ea51051641eb430a9ee8
@@ -1 +1 @@
1
- 0c3f90d28e483961c87493d6563be45e5a24323b6d777f037429c5c041113be2
1
+ 20378cb1c31dd43c775c6044789dd947cb08ce40f2804afd1623ec87cfe2e4ea
@@ -1 +1 @@
1
- 30f1491bd7ed7b71a8f3b2d6d9d549cced916cd60721bf96085353b20d87b77f
1
+ 2ad2ca48c69fc592e81a7dea735173234df685d4464a17e30868181c4ee3959a
@@ -1 +1 @@
1
- 84a172eae432ab308b0da7a1450443906102c34d10c90afdf2a73f756cf96a30
1
+ 35207ebdda44c6e08dd00ffc65f33a96b6b76a90f685949c026b2c702478d1fb
@@ -1 +1 @@
1
- 4e41249ba004a7c0dc89e9306f2fcedc66585f6a43cff02e094f0d73d723bf8d
1
+ a32a40b2ee49298c8da08cd6bba7807b93ce8b451fdc3072b8065764b621a666
@@ -0,0 +1,97 @@
1
+ import * as tsplus_module_1 from "@effect-app/core/Option";
2
+ import * as tsplus_module_2 from "@effect/io/Effect";
3
+ import * as tsplus_module_3 from "@effect/data/Option";
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ import * as MO from "@effect-app/schema";
6
+ import { isObjectSchema } from "@effect-app/infra-adapters/Openapi/atlas-plutus";
7
+ import * as OpenApi from "@effect-app/infra-adapters/Openapi/index";
8
+ export function asRouteDescriptionAny(i) {
9
+ return i;
10
+ }
11
+ export function arrAsRouteDescriptionAny(arr) {
12
+ return arr.map(asRouteDescriptionAny);
13
+ }
14
+ export function makeRouteDescriptor(path, method, handler) {
15
+ return { path, method, handler, _tag: "Schema" };
16
+ }
17
+ export function makeFromSchema(e) {
18
+ const jsonSchema_ = OpenApi.for;
19
+ const jsonSchema = (r) => jsonSchema_(r);
20
+ const { Request: Req, Response: Res_, ResponseOpenApi } = e.handler;
21
+ const r = ResponseOpenApi ?? Res_;
22
+ const Res = r ? MO.extractSchema(r) : MO.Void;
23
+ // TODO EffectOption.fromNullable(Req.Headers).flatMapOpt(jsonSchema)
24
+ // TODO: use the path vs body etc serialisation also in the Client.
25
+ const makeReqQuerySchema = tsplus_module_2.flatMap(tsplus_module_2.sync(() => tsplus_module_3.fromNullable(Req.Query)), (_) => tsplus_module_3.match(_, () => tsplus_module_2.sync(() => tsplus_module_1.none), (_) => tsplus_module_2.map(jsonSchema(_), tsplus_module_3.some)));
26
+ const makeReqHeadersSchema = tsplus_module_2.flatMap(tsplus_module_2.sync(() => tsplus_module_3.fromNullable(Req.Headers)), (_) => tsplus_module_3.match(_, () => tsplus_module_2.sync(() => tsplus_module_1.none), (_) => tsplus_module_2.map(jsonSchema(_), tsplus_module_3.some)));
27
+ const makeReqCookieSchema = tsplus_module_2.flatMap(tsplus_module_2.sync(() => tsplus_module_3.fromNullable(Req.Cookie)), (_) => tsplus_module_3.match(_, () => tsplus_module_2.sync(() => tsplus_module_1.none), (_) => tsplus_module_2.map(jsonSchema(_), tsplus_module_3.some)));
28
+ const makeReqPathSchema = tsplus_module_2.flatMap(tsplus_module_2.sync(() => tsplus_module_3.fromNullable(Req.Path)), (_) => tsplus_module_3.match(_, () => tsplus_module_2.sync(() => tsplus_module_1.none), (_) => tsplus_module_2.map(jsonSchema(_), tsplus_module_3.some)));
29
+ const makeReqBodySchema = tsplus_module_2.flatMap(tsplus_module_2.sync(() => tsplus_module_3.fromNullable(Req.Body)), (_) => tsplus_module_3.match(_, () => tsplus_module_2.sync(() => tsplus_module_1.none), (_) => tsplus_module_2.map(jsonSchema(_), tsplus_module_3.some)));
30
+ // const makeReqSchema = schema(Req)
31
+ const makeResSchema = jsonSchema_(Res);
32
+ function makeParameters(inn) {
33
+ return (a) => {
34
+ return tsplus_module_3.getOrElse(tsplus_module_3.map(tsplus_module_3.flatMap(a, (o) => (isObjectSchema(o) ? tsplus_module_3.some(o) : tsplus_module_1.none)), (x) => {
35
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
36
+ return Object.keys(x.properties).map((p) => {
37
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
38
+ const schema = x.properties[p];
39
+ const required = Boolean(x.required?.includes(p));
40
+ return { name: p, in: inn, required, schema };
41
+ });
42
+ }), () => []);
43
+ };
44
+ }
45
+ return tsplus_module_2.map(tsplus_module_2.all({
46
+ req: jsonSchema(Req.Model),
47
+ reqQuery: makeReqQuerySchema,
48
+ reqHeaders: makeReqHeadersSchema,
49
+ reqBody: makeReqBodySchema,
50
+ reqPath: makeReqPathSchema,
51
+ reqCookie: makeReqCookieSchema,
52
+ res: makeResSchema
53
+ }), (_) => {
54
+ // console.log("$$$ REQ", _.req)
55
+ const isEmpty = !e.handler.Response || e.handler.Response === MO.Void;
56
+ return {
57
+ path: e.path,
58
+ method: e.method.toLowerCase(),
59
+ tags: e.info?.tags,
60
+ description: _.req?.description,
61
+ summary: _.req?.summary,
62
+ operationId: _.req?.title,
63
+ parameters: [
64
+ ...makeParameters("path")(_.reqPath),
65
+ ...makeParameters("query")(_.reqQuery),
66
+ ...makeParameters("header")(_.reqHeaders),
67
+ ...makeParameters("cookie")(_.reqCookie)
68
+ ],
69
+ requestBody: tsplus_module_1.getOrUndefined(tsplus_module_3.map(_
70
+ .reqBody, (schema) => ({
71
+ content: { "application/json": { schema } }
72
+ }))),
73
+ responses: [
74
+ isEmpty
75
+ ? new Response(204, { description: "Empty" })
76
+ : new Response(200, {
77
+ description: "OK",
78
+ content: { "application/json": { schema: _.res } }
79
+ }),
80
+ new Response(400, { description: "ValidationError" })
81
+ ]
82
+ .concat(e.path.includes(":") && isEmpty
83
+ ? [new Response(404, { description: "NotFoundError" })]
84
+ : [])
85
+ };
86
+ });
87
+ }
88
+ class Response {
89
+ statusCode;
90
+ type;
91
+ constructor(statusCode, type // string | JSONSchema | SubSchema
92
+ ) {
93
+ this.statusCode = statusCode;
94
+ this.type = type;
95
+ }
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL19zcmMvYXBpL2V4cHJlc3Mvc2NoZW1hL3JvdXRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQXVEO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFJeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFBO0FBQ2hGLE9BQU8sS0FBSyxPQUFPLE1BQU0sMENBQTBDLENBQUE7QUFHbkUsTUFBTSxVQUFVLHFCQUFxQixDQUErQixDQUFJO0lBQ3RFLE9BQU8sQ0FBdUIsQ0FBQTtBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxHQUFxQjtJQUVyQixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUN2QyxDQUFDO0FBa0NELE1BQU0sVUFBVSxtQkFBbUIsQ0FZakMsSUFBWSxFQUNaLE1BQWMsRUFDZCxPQVVDO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBVzdDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsQ0FBZ0U7SUFFaEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQTtJQUMvQixNQUFNLFVBQVUsR0FBRyxDQUFPLENBQWtCLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUE7SUFDbkUsTUFBTSxDQUFDLEdBQUcsZUFBZSxJQUFJLElBQUksQ0FBQTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMs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eHBsaWNpdC1hbnkgKi9cbmltcG9ydCAqIGFzIE1PIGZyb20gXCJAZWZmZWN0LWFwcC9zY2hlbWFcIlxuaW1wb3J0IHR5cGUgeyBNZXRob2RzIH0gZnJvbSBcIkBlZmZlY3QtYXBwL3NjaGVtYVwiXG5cbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYSwgUGFyYW1ldGVyTG9jYXRpb24sIFN1YlNjaGVtYSB9IGZyb20gXCJAZWZmZWN0LWFwcC9pbmZyYS1hZGFwdGVycy9PcGVuYXBpL2F0bGFzLXBsdXR1c1wiXG5pbXBvcnQgeyBpc09iamVjdFNjaGVtYSB9IGZyb20gXCJAZWZmZWN0LWFwcC9pbmZyYS1hZGFwdGVycy9PcGVuYXBpL2F0bGFzLXBsdXR1c1wiXG5pbXBvcnQgKiBhcyBPcGVuQXBpIGZyb20gXCJAZWZmZWN0LWFwcC9pbmZyYS1hZGFwdGVycy9PcGVuYXBpL2luZGV4XCJcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEhhbmRsZXIsIFJlcXVlc3RIYW5kbGVyT3B0UmVzIH0gZnJvbSBcIi4vcmVxdWVzdEhhbmRsZXIuanNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXNSb3V0ZURlc2NyaXB0aW9uQW55PFIgZXh0ZW5kcyBSb3V0ZURlc2NyaXB0b3JBbnk+KGk6IFIpIHtcbiAgcmV0dXJuIGkgYXMgUm91dGVEZXNjcmlwdG9yQW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJBc1JvdXRlRGVzY3JpcHRpb25Bbnk8UiBleHRlbmRzIFJvdXRlRGVzY3JpcHRvckFueT4oXG4gIGFycjogUmVhZG9ubHlBcnJheTxSPlxuKSB7XG4gIHJldHVybiBhcnIubWFwKGFzUm91dGVEZXNjcmlwdGlvbkFueSlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZURlc2NyaXB0b3I8XG4gIFIsXG4gIFBhdGhBLFxuICBDb29raWVBLFxuICBRdWVyeUEsXG4gIEJvZHlBLFxuICBIZWFkZXJBLFxuICBSZXFBIGV4dGVuZHMgUGF0aEEgJiBRdWVyeUEgJiBCb2R5QSxcbiAgUmVzQSxcbiAgRXJyb3JzLFxuICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RzID0gTWV0aG9kc1xuPiB7XG4gIHBhdGg6IHN0cmluZ1xuICBtZXRob2Q6IE1FVEhPRFxuICBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcjxSLCBQYXRoQSwgQ29va2llQSwgUXVlcnlBLCBCb2R5QSwgSGVhZGVyQSwgUmVxQSwgUmVzQSwgRXJyb3JzPlxuICBpbmZvPzoge1xuICAgIHRhZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlRGVzY3JpcHRvckFueSA9IFJvdXRlRGVzY3JpcHRvcjxcbiAgYW55LFxuICBhbnksXG4gIGFueSxcbiAgYW55LFxuICBhbnksXG4gIGFueSxcbiAgYW55LFxuICBhbnksXG4gIGFueVxuPlxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJvdXRlRGVzY3JpcHRvcjxcbiAgUixcbiAgUGF0aEEsXG4gIENvb2tpZUEsXG4gIFF1ZXJ5QSxcbiAgQm9keUEsXG4gIEhlYWRlckEsXG4gIFJlcUEgZXh0ZW5kcyBQYXRoQSAmIFF1ZXJ5QSAmIEJvZHlBLFxuICBSZXNBID0gdm9pZCxcbiAgRXJyb3JzID0gYW55LFxuICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RzID0gTWV0aG9kc1xuPihcbiAgcGF0aDogc3RyaW5nLFxuICBtZXRob2Q6IE1FVEhPRCxcbiAgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXJPcHRSZXM8XG4gICAgUixcbiAgICBQYXRoQSxcbiAgICBDb29raWVBLFxuICAgIFF1ZXJ5QSxcbiAgICBCb2R5QSxcbiAgICBIZWFkZXJBLFxuICAgIFJlcUEsXG4gICAgUmVzQSxcbiAgICBFcnJvcnNcbiAgPlxuKSB7XG4gIHJldHVybiB7IHBhdGgsIG1ldGhvZCwgaGFuZGxlciwgX3RhZzogXCJTY2hlbWFcIiB9IGFzIFJvdXRlRGVzY3JpcHRvcjxcbiAgICBSLFxuICAgIFBhdGhBLFxuICAgIENvb2tpZUEsXG4gICAgUXVlcnlBLFxuICAgIEJvZHlBLFxuICAgIEhlYWRlckEsXG4gICAgUmVxQSxcbiAgICBSZXNBLFxuICAgIEVycm9ycyxcbiAgICBNRVRIT0RcbiAgPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZyb21TY2hlbWE8UmVzQT4oXG4gIGU6IFJvdXRlRGVzY3JpcHRvcjxhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBSZXNBLCBhbnksIGFueT5cbikge1xuICBjb25zdCBqc29uU2NoZW1hXyA9IE9wZW5BcGkuZm9yXG4gIGNvbnN0IGpzb25TY2hlbWEgPSA8RSwgQT4ocjogTU8uUmVxUmVzPEUsIEE+KSA9PiBqc29uU2NoZW1hXyhyKVxuICBjb25zdCB7IFJlcXVlc3Q6IFJlcSwgUmVzcG9uc2U6IFJlc18sIFJlc3BvbnNlT3BlbkFwaSB9ID0gZS5oYW5kbGVyXG4gIGNvbnN0IHIgPSBSZXNwb25zZU9wZW5BcGkgPz8gUmVzX1xuICBjb25zdCBSZXMgPSByID8gTU8uZXh0cmFjdFNjaGVtYShyKSA6IE1PLlZvaWRcbiAgLy8gVE9ETyBFZmZlY3RPcHRpb24uZnJvbU51bGxhYmxlKFJlcS5IZWFkZXJzKS5mbGF0TWFwT3B0KGpzb25TY2hlbWEpXG4gIC8vIFRPRE86IHVzZSB0aGUgcGF0aCB2cyBib2R5IGV0YyBzZXJpYWxpc2F0aW9uIGFsc28gaW4gdGhlIENsaWVudC5cbiAgY29uc3QgbWFrZVJlcVF1ZXJ5U2NoZW1hID0gRWZmZWN0KE9wdGlvbi5mcm9tTnVsbGFibGUoUmVxLlF1ZXJ5KSkuZmxhdE1hcCgoXykgPT5cbiAgICBfLm1hdGNoKFxuICAgICAgKCkgPT4gRWZmZWN0KE9wdGlvbi5ub25lKSxcbiAgICAgIChfKSA9PiBqc29uU2NoZW1hKF8pLm1hcChPcHRpb24uc29tZSlcbiAgICApXG4gIClcbiAgY29uc3QgbWFrZVJlcUhlYWRlcnNTY2hlbWEgPSBFZmZlY3QoT3B0aW9uLmZyb21OdWxsYWJsZShSZXEuSGVhZGVycykpLmZsYXRNYXAoKF8pID0+XG4gICAgXy5tYXRjaChcbiAgICAgICgpID0+IEVmZmVjdChPcHRpb24ubm9uZSksXG4gICAgICAoXykgPT4ganNvblNjaGVtYShfKS5tYXAoT3B0aW9uLnNvbWUpXG4gICAgKVxuICApXG4gIGNvbnN0IG1ha2VSZXFDb29raWVTY2hlbWEgPSBFZmZlY3QoT3B0aW9uLmZyb21OdWxsYWJsZShSZXEuQ29va2llKSkuZmxhdE1hcCgoXykgPT5cbiAgICBfLm1hdGNoKFxuICAgICAgKCkgPT4gRWZmZWN0KE9wdGlvbi5ub25lKSxcbiAgICAgIChfKSA9PiBqc29uU2NoZW1hKF8pLm1hcChPcHRpb24uc29tZSlcbiAgICApXG4gIClcbiAgY29uc3QgbWFrZVJlcVBhdGhTY2hlbWEgPSBFZmZlY3QoT3B0aW9uLmZyb21OdWxsYWJsZShSZXEuUGF0aCkpLmZsYXRNYXAoKF8pID0+XG4gICAgXy5tYXRjaChcbiAgICAgICgpID0+IEVmZmVjdChPcHRpb24ubm9uZSksXG4gICAgICAoXykgPT4ganNvblNjaGVtYShfKS5tYXAoT3B0aW9uLnNvbWUpXG4gICAgKVxuICApXG4gIGNvbnN0IG1ha2VSZXFCb2R5U2NoZW1hID0gRWZmZWN0KE9wdGlvbi5mcm9tTnVsbGFibGUoUmVxLkJvZHkpKS5mbGF0TWFwKChfKSA9PlxuICAgIF8ubWF0Y2goXG4gICAgICAoKSA9PiBFZmZlY3QoT3B0aW9uLm5vbmUpLFxuICAgICAgKF8pID0+IGpzb25TY2hlbWEoXykubWFwKE9wdGlvbi5zb21lKVxuICAgIClcbiAgKVxuICAvLyBjb25zdCBtYWtlUmVxU2NoZW1hID0gc2NoZW1hKFJlcSlcblxuICBjb25zdCBtYWtlUmVzU2NoZW1hID0ganNvblNjaGVtYV8oUmVzIGFzIGFueSlcblxuICBmdW5jdGlvbiBtYWtlUGFyYW1ldGVycyhpbm46IFBhcmFtZXRlckxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIChhOiBPcHRpb248SlNPTlNjaGVtYSB8IFN1YlNjaGVtYT4pID0+IHtcbiAgICAgIHJldHVybiBhXG4gICAgICAgIC5mbGF0TWFwKChvKSA9PiAoaXNPYmplY3RTY2hlbWEobykgPyBPcHRpb24obykgOiBPcHRpb24ubm9uZSkpXG4gICAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh4LnByb3BlcnRpZXMhKS5tYXAoKHApID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB4LnByb3BlcnRpZXMhW3BdXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZCA9IEJvb2xlYW4oeC5yZXF1aXJlZD8uaW5jbHVkZXMocCkpXG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBwLCBpbjogaW5uLCByZXF1aXJlZCwgc2NoZW1hIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICAuZ2V0T3JFbHNlKCgpID0+IFtdKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBFZmZlY3RcbiAgICAuYWxsKHtcbiAgICAgIHJlcToganNvblNjaGVtYShSZXEuTW9kZWwpLFxuICAgICAgcmVxUXVlcnk6IG1ha2VSZXFRdWVyeVNjaGVtYSxcbiAgICAgIHJlcUhlYWRlcnM6IG1ha2VSZXFIZWFkZXJzU2NoZW1hLFxuICAgICAgcmVxQm9keTogbWFrZVJlcUJvZHlTY2hlbWEsXG4gICAgICByZXFQYXRoOiBtYWtlUmVxUGF0aFNjaGVtYSxcbiAgICAgIHJlcUNvb2tpZTogbWFrZVJlcUNvb2tpZVNjaGVtYSxcbiAgICAgIHJlczogbWFrZVJlc1NjaGVtYVxuICAgIH0pXG4gICAgLm1hcCgoXykgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCIkJCQgUkVRXCIsIF8ucmVxKVxuICAgICAgY29uc3QgaXNFbXB0eSA9ICFlLmhhbmRsZXIuUmVzcG9uc2UgfHwgZS5oYW5kbGVyLlJlc3BvbnNlID09PSBNTy5Wb2lkXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICAgIG1ldGhvZDogZS5tZXRob2QudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgdGFnczogZS5pbmZvPy50YWdzLFxuICAgICAgICBkZXNjcmlwdGlvbjogXy5yZXE/LmRlc2NyaXB0aW9uLFxuICAgICAgICBzdW1tYXJ5OiBfLnJlcT8uc3VtbWFyeSxcbiAgICAgICAgb3BlcmF0aW9uSWQ6IF8ucmVxPy50aXRsZSxcbiAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgIC4uLm1ha2VQYXJhbWV0ZXJzKFwicGF0aFwiKShfLnJlcVBhdGgpLFxuICAgICAgICAgIC4uLm1ha2VQYXJhbWV0ZXJzKFwicXVlcnlcIikoXy5yZXFRdWVyeSksXG4gICAgICAgICAgLi4ubWFrZVBhcmFtZXRlcnMoXCJoZWFkZXJcIikoXy5yZXFIZWFkZXJzKSxcbiAgICAgICAgICAuLi5tYWtlUGFyYW1ldGVycyhcImNvb2tpZVwiKShfLnJlcUNvb2tpZSlcbiAgICAgICAgXSxcbiAgICAgICAgcmVxdWVzdEJvZHk6IF9cbiAgICAgICAgICAucmVxQm9keVxuICAgICAgICAgIC5tYXAoKHNjaGVtYSkgPT4gKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHsgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHsgc2NoZW1hIH0gfVxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC52YWx1ZSxcbiAgICAgICAgcmVzcG9uc2VzOiBbXG4gICAgICAgICAgaXNFbXB0eVxuICAgICAgICAgICAgPyBuZXcgUmVzcG9uc2UoMjA0LCB7IGRlc2NyaXB0aW9uOiBcIkVtcHR5XCIgfSlcbiAgICAgICAgICAgIDogbmV3IFJlc3BvbnNlKDIwMCwge1xuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPS1wiLFxuICAgICAgICAgICAgICBjb250ZW50OiB7IFwiYXBwbGljYXRpb24vanNvblwiOiB7IHNjaGVtYTogXy5yZXMgfSB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBuZXcgUmVzcG9uc2UoNDAwLCB7IGRlc2NyaXB0aW9uOiBcIlZhbGlkYXRpb25FcnJvclwiIH0pXG4gICAgICAgIF1cbiAgICAgICAgICAuY29uY2F0KFxuICAgICAgICAgICAgZS5wYXRoLmluY2x1ZGVzKFwiOlwiKSAmJiBpc0VtcHR5XG4gICAgICAgICAgICAgID8gW25ldyBSZXNwb25zZSg0MDQsIHsgZGVzY3JpcHRpb246IFwiTm90Rm91bmRFcnJvclwiIH0pXVxuICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG59XG5cbmNsYXNzIFJlc3BvbnNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogYW55IC8vIHN0cmluZyB8IEpTT05TY2hlbWEgfCBTdWJTY2hlbWFcbiAgKSB7fVxufVxuIl19
@@ -0,0 +1 @@
1
+ afd0a6760e1c0bb81d8f009c93722e5100019cd98eaaba1b82175573756e27d7
@@ -1 +1 @@
1
- 0958fd132e2c918acec7e021223aec95701d820ac3efbcb7b6f5c96200d7c3ad
1
+ 2e7b6be49bc3deac32bc70abcdb88dbca6696392d6f2f72d02048ceac445b558
@@ -1 +1 @@
1
- 76ac514b63e950709a008303d53d3e9cc91c0bdb845dc16d2b78b8c751391d40
1
+ acd0b034bacd357b1279f27a4bbbf4912c57d104f5a5fea36a26c9b16bc39356
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 0.68.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 4856c46c: add duplicated paths detection
8
+ - update packages
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+ - @effect-app/core@0.54.0
14
+ - @effect-app/infra-adapters@0.47.0
15
+ - @effect-app/prelude@0.55.0
16
+ - @effect-app/schema@0.48.0
17
+
3
18
  ## 0.67.0
4
19
 
5
20
  ### Minor Changes
@@ -3,21 +3,80 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.checkDuplicatePaths = checkDuplicatePaths;
6
7
  exports.makeJsonSchema = makeJsonSchema;
7
- var tsplus_module_1 = _interopRequireWildcard(require("@effect/data/Chunk"));
8
- var tsplus_module_2 = _interopRequireWildcard(require("@effect-app/core/_ext/Iterable"));
9
- var tsplus_module_3 = _interopRequireWildcard(require("@effect/io/Effect"));
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"));
11
+ var _errors = require("../../errors.cjs");
10
12
  var RS = _interopRequireWildcard(require("./schema/routing.cjs"));
11
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); }
12
14
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
15
  /* eslint-disable @typescript-eslint/no-explicit-any */
14
16
 
15
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;
47
+ }
48
+ case "param":
49
+ {
50
+ let numberOfParams = 1;
51
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
52
+ numberOfParams++;
53
+ i++;
54
+ }
55
+ if (!(numberOfParams in pathNavigator)) {
56
+ ;
57
+ pathNavigator[numberOfParams] = {
58
+ [methods]: []
59
+ };
60
+ }
61
+ pathNavigator = pathNavigator[numberOfParams];
62
+ i++;
63
+ break;
64
+ }
65
+ }
66
+ }
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);
74
+ }
16
75
  /**
17
76
  * Work in progress JSONSchema generator.
18
77
  */
19
78
  function makeJsonSchema(r) {
20
- return tsplus_module_3.map(tsplus_module_2.ext_forEach(tsplus_module_1.fromIterable(r), RS.makeFromSchema), e => {
79
+ return tsplus_module_1.map(tsplus_module_1.flatMap(tsplus_module_3.ext_forEach(tsplus_module_2.fromIterable(r), RS.makeFromSchema), checkDuplicatePaths), e => {
21
80
  const map = ({
22
81
  method,
23
82
  path,
@@ -1 +1 @@
1
- {"version":3,"file":"makeJsonSchema.cjs","names":["RS","_interopRequireWildcard","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","rx","makeJsonSchema","r","tsplus_module_3","map","tsplus_module_2","ext_forEach","tsplus_module_1","fromIterable","makeFromSchema","e","method","path","responses","rest","reduce","prev","cur","statusCode","type","split","replace","_a","b","Response","constructor"],"sources":["../../../_src/api/express/makeJsonSchema.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;AAEA,IAAAA,EAAA,GAAAC,uBAAA,CAAAC,OAAA;AAAyC,SAAAC,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,SAAAH,wBAAAO,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,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;AAFzC;;AAMA,MAAMW,EAAE,GAAG,SAAS;AAIpB;;;AAGM,SAAUC,cAAcA,CAACC,CAAkC;EAC/D,OAAOC,eAAA,CAAAC,GAAA,CAAAC,eAAA,CAAAC,WAAA,CAAAC,eAAA,CAAAC,YAAA,CACSN,CAAC,CAAC,EACD3B,EAAE,CAACkC,cAAc,CAAC,EAC3BC,CAAC,IAAI;IACT,MAAMN,GAAG,GAAGA,CAAC;MAAEO,MAAM;MAAEC,IAAI;MAAEC,SAAS;MAAE,GAAGC;IAAI,CAAgB,MAAM;MACnE,CAACH,MAAM,GAAG;QACR,GAAGG,IAAI;QACPD,SAAS,EAAGA,SAAwB,CAACE,MAAM,CACzC,CAACC,IAAI,EAAEC,GAAG,KAAI;UACZD,IAAI,CAACC,GAAG,CAACC,UAAU,CAAC,GAAGD,GAAG,CAACE,IAAI;UAC/B,OAAOH,IAAI;QACb,CAAC,EACD,EAAsD;;KAG3D,CAAC;IACF,OAAON,CAAC,CAACK,MAAM,CACb,CAACC,IAAI,EAAEN,CAAC,KAAI;MACV,MAAME,IAAI,GAAGF,CAAC,CAACE,IAAI,CAACQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAACrB,EAAE,EAAE,CAACsB,EAAE,EAAEC,CAAC,KAAK,IAAIA,CAAC,GAAG,CAAC;MAClEP,IAAI,CAACJ,IAAI,CAAC,GAAG;QACX,GAAGI,IAAI,CAACJ,IAAI,CAAC;QACb,GAAGR,GAAG,CAACM,CAAC;OACT;MACD,OAAOM,IAAI;IACb,CAAC,EACD,EAA6D,CAC9D;EACH,CAAC,CAAC;AACN;AAEA,MAAMQ,QAAQ;EACZC,YACkBP,UAAkB,EAClBC,IAAS,CAAC;EAAA,E;IADV,KAAAD,UAAU,GAAVA,UAAU;IACV,KAAAC,IAAI,GAAJA,IAAI;EACnB"}
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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"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var tsplus_module_1 = _interopRequireWildcard(require("@effect/io/Effect"));
4
+ var _errors = require("../../errors.cjs");
5
+ var _makeJsonSchema = require("./makeJsonSchema.cjs");
6
+ 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); }
7
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
8
+ const path = {
9
+ path: "/securities/:id/search/:id2",
10
+ method: "get"
11
+ };
12
+ const equalPaths = ["/securities/:idt/search/:id2", "/securities/:id/search/:id2t", "/securities/:idt/search/:id2t"].map(path => ({
13
+ path,
14
+ method: "get"
15
+ }));
16
+ const differentPaths = ["/securities/:id/search/", "/securities/search/:id2", "/securities/:id/:id2/search/:id3"].map(path => ({
17
+ path,
18
+ method: "get"
19
+ })).concat(["/securities/:idt/search/:id2"].map(path => ({
20
+ path,
21
+ method: "post"
22
+ })));
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}`))));
26
+ });
27
+ //# sourceMappingURL=makeJsonSchema.test.cjs.map
@@ -0,0 +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"}
@@ -0,0 +1,35 @@
1
+ import { InvalidStateError } from "../../errors.js"
2
+ import { checkDuplicatePaths } from "./makeJsonSchema.js"
3
+
4
+ const path = { path: "/securities/:id/search/:id2", method: "get" }
5
+
6
+ const equalPaths = [
7
+ "/securities/:idt/search/:id2",
8
+ "/securities/:id/search/:id2t",
9
+ "/securities/:idt/search/:id2t"
10
+ ]
11
+ .map((path) => ({ path, method: "get" }))
12
+
13
+ const differentPaths: {
14
+ path: string
15
+ method: string
16
+ }[] = [
17
+ "/securities/:id/search/",
18
+ "/securities/search/:id2",
19
+ "/securities/:id/:id2/search/:id3"
20
+ ]
21
+ .map((path) => ({ path, method: "get" }))
22
+ .concat([
23
+ "/securities/:idt/search/:id2"
24
+ ]
25
+ .map((path) => ({ path, method: "post" })))
26
+
27
+ test("works", () => {
28
+ expect(checkDuplicatePaths([path, ...differentPaths])).toStrictEqual(Effect.succeed([path, ...differentPaths]))
29
+
30
+ equalPaths.forEach((p) =>
31
+ expect(checkDuplicatePaths([path, p])).toStrictEqual(
32
+ Effect.fail(new InvalidStateError(`Duplicate method ${p.method} for path ${p.path}`))
33
+ )
34
+ )
35
+ })
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
 
3
+ import { InvalidStateError } from "../../errors.js"
3
4
  import * as RS from "./schema/routing.js"
4
5
 
5
6
  type Methods = "GET" | "PUT" | "POST" | "PATCH" | "DELETE"
@@ -8,6 +9,64 @@ const rx = /:(\w+)/g
8
9
 
9
10
  type _A<C> = C extends ReadonlyArray<infer A> ? A : never
10
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[]
19
+ }
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
+ )
30
+
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
42
+ }
43
+ case "param": {
44
+ let numberOfParams = 1
45
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
46
+ numberOfParams++
47
+ i++
48
+ }
49
+
50
+ if (!(numberOfParams in pathNavigator)) {
51
+ ;(pathNavigator)[numberOfParams] = { [methods]: [] }
52
+ }
53
+ pathNavigator = (pathNavigator)[numberOfParams]!
54
+ i++
55
+ break
56
+ }
57
+ }
58
+ }
59
+
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}`))
63
+ }
64
+ pathNavigator[methods].push(path.method)
65
+ }
66
+
67
+ return Effect.succeed(paths)
68
+ }
69
+
11
70
  /**
12
71
  * Work in progress JSONSchema generator.
13
72
  */
@@ -15,6 +74,7 @@ export function makeJsonSchema(r: Iterable<RS.RouteDescriptorAny>) {
15
74
  return Chunk
16
75
  .fromIterable(r)
17
76
  .forEachEffect(RS.makeFromSchema)
77
+ .flatMap(checkDuplicatePaths)
18
78
  .map((e) => {
19
79
  const map = ({ method, path, responses, ...rest }: _A<typeof e>) => ({
20
80
  [method]: {
@@ -1,9 +1,15 @@
1
+ import { Effect } from "@effect/io/Effect";
2
+ import { InvalidStateError } from "../../errors.js";
1
3
  import * as RS from "./schema/routing.js";
2
4
  type Methods = "GET" | "PUT" | "POST" | "PATCH" | "DELETE";
5
+ export declare function checkDuplicatePaths<T extends {
6
+ path: string;
7
+ method: string;
8
+ }>(paths: readonly T[]): Effect<never, InvalidStateError, readonly T[]>;
3
9
  /**
4
10
  * Work in progress JSONSchema generator.
5
11
  */
6
- export declare function makeJsonSchema(r: Iterable<RS.RouteDescriptorAny>): import("@effect/io/Effect").Effect<never, never, Record<string, Record<Methods, {
12
+ export declare function makeJsonSchema(r: Iterable<RS.RouteDescriptorAny>): import("@effect/io/Effect").Effect<never, InvalidStateError, Record<string, Record<Methods, {
7
13
  [x: string]: {
8
14
  responses: any;
9
15
  tags: readonly string[] | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"makeJsonSchema.d.ts","sourceRoot":"","sources":["../../../_src/api/express/makeJsonSchema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEzC,KAAK,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAM1D;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;KA6BhE"}
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,14 +1,61 @@
1
- import * as tsplus_module_1 from "@effect/data/Chunk";
2
- import * as tsplus_module_2 from "@effect-app/core/_ext/Iterable";
3
- import * as tsplus_module_3 from "@effect/io/Effect";
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";
4
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ import { InvalidStateError } from "../../errors.js";
5
6
  import * as RS from "./schema/routing.js";
6
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;
29
+ }
30
+ case "param": {
31
+ let numberOfParams = 1;
32
+ while (i < matches.length && matches[i + 1]?._tag === "param") {
33
+ numberOfParams++;
34
+ i++;
35
+ }
36
+ if (!(numberOfParams in pathNavigator)) {
37
+ ;
38
+ (pathNavigator)[numberOfParams] = { [methods]: [] };
39
+ }
40
+ pathNavigator = (pathNavigator)[numberOfParams];
41
+ i++;
42
+ break;
43
+ }
44
+ }
45
+ }
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);
53
+ }
7
54
  /**
8
55
  * Work in progress JSONSchema generator.
9
56
  */
10
57
  export function makeJsonSchema(r) {
11
- return tsplus_module_3.map(tsplus_module_2.ext_forEach(tsplus_module_1.fromIterable(r), RS.makeFromSchema), (e) => {
58
+ return tsplus_module_1.map(tsplus_module_1.flatMap(tsplus_module_3.ext_forEach(tsplus_module_2.fromIterable(r), RS.makeFromSchema), checkDuplicatePaths), (e) => {
12
59
  const map = ({ method, path, responses, ...rest }) => ({
13
60
  [method]: {
14
61
  ...rest,
@@ -35,4 +82,4 @@ class Response {
35
82
  this.type = type;
36
83
  }
37
84
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2FwaS9leHByZXNzL21ha2VKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBSXpDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQTtBQUlwQjs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBa0M7SUFDL0QsT0FBTyxvQkFBQSw0QkFBQSw2QkFDUyxDQUFDLENBQUMsRUFDRCxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQzVCLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDVCxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDUixHQUFHLElBQUk7Z0JBQ1AsU0FBUyxFQUFHLFNBQXdCLENBQUMsTUFBTSxDQUN6QyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDWixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7b0JBQy9CLE9BQU8sSUFBSSxDQUFBO2dCQUNiLENBQUMsRUFDRCxFQUFzRCxDQUN2RDthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUNiLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ1YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQ1gsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNiLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBUTthQUNqQixDQUFBO1lBQ0QsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDLEVBQ0QsRUFBNkQsQ0FDOUQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQztBQUVELE1BQU0sUUFBUTtJQUNaLFlBQ2tCLFVBQWtCLEVBQ2xCLElBQVMsQ0FBQyxrQ0FBa0M7O1FBRDVDLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBSztJQUN4QixDQUFDO0NBQ0wifQ==
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2FwaS9leHByZXNzL21ha2VKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBSXpDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQTtBQUlwQixNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUtqQyxNQUFNLFdBQVcsR0FBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ2xELE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFBO0lBRTFDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNiLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQVc7WUFDaEQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBRSxFQUFXLENBQ2pELENBQUE7UUFFSCxJQUFJLGFBQWEsR0FBMkIsV0FBVyxDQUFBO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHO1lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8s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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeJsonSchema.test.d.ts","sourceRoot":"","sources":["../../../_src/api/express/makeJsonSchema.test.ts"],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import type * as Plutus from "@effect-app/infra-adapters/Openapi/atlas-plutus";
2
2
  import type { RouteDescriptorAny } from "./schema/routing.js";
3
- export declare function makeOpenApiSpecs(rdescs: Iterable<RouteDescriptorAny>, info: Plutus.Info): import("@effect/io/Effect").Effect<never, never, {
3
+ export declare function makeOpenApiSpecs(rdescs: Iterable<RouteDescriptorAny>, info: Plutus.Info): import("@effect/io/Effect").Effect<never, import("../../errors.js").InvalidStateError, {
4
4
  openapi: string;
5
5
  info: {
6
6
  title: string;
@@ -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<"GET" | "POST" | "PUT" | "PATCH" | "DELETE", {
21
+ paths: Record<string, Record<"PATCH" | "GET" | "POST" | "PUT" | "DELETE", {
22
22
  [x: string]: {
23
23
  responses: any;
24
24
  tags: readonly string[] | undefined;
@@ -1,3 +1,3 @@
1
1
  import type { RouteDescriptorAny } from "./express/schema/routing.js";
2
- export declare function writeOpenapiDocs(rdescs: Record<string, Record<string, RouteDescriptorAny>>): import("@effect/io/Effect").Effect<never, never, void>;
2
+ export declare function writeOpenapiDocs(rdescs: Record<string, Record<string, RouteDescriptorAny>>): import("@effect/io/Effect").Effect<never, import("../errors.js").InvalidStateError, void>;
3
3
  //# sourceMappingURL=writeDocs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeDocs.d.ts","sourceRoot":"","sources":["../../_src/api/writeDocs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,0DAmB1F"}
1
+ {"version":3,"file":"writeDocs.d.ts","sourceRoot":"","sources":["../../_src/api/writeDocs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,6FAmB1F"}
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
7
7
  "@azure/cosmos": "^3.17.3",
8
8
  "@azure/service-bus": "^7.9.0",
9
9
  "@effect/data": "^0.12.2",
10
- "@effect/io": "^0.25.9",
10
+ "@effect/io": "^0.25.12",
11
11
  "@sendgrid/helpers": "^7.7.0",
12
12
  "@sendgrid/mail": "^7.7.0",
13
13
  "change-case": "^4.1.2",
14
- "cross-fetch": "^3.1.5",
14
+ "cross-fetch": "^3.1.6",
15
15
  "faker": "^5.5.3",
16
- "fast-check": "^3.8.1",
16
+ "fast-check": "^3.9.0",
17
17
  "object-hash": "^3.0.0",
18
18
  "path-parser": "^6.1.0",
19
19
  "proper-lockfile": "^4.1.2",
20
20
  "pure-rand": "^6.0.2",
21
21
  "redlock": "^4.2.0",
22
- "@effect-app/prelude": "0.54.0",
23
- "@effect-app/infra-adapters": "0.46.3",
24
- "@effect-app/schema": "0.47.1",
25
- "@effect-app/core": "0.53.1"
22
+ "@effect-app/prelude": "0.55.0",
23
+ "@effect-app/core": "0.54.0",
24
+ "@effect-app/infra-adapters": "0.47.0",
25
+ "@effect-app/schema": "0.48.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@babel/cli": "^7.21.5",
29
- "@sentry/node": "^7.51.0",
29
+ "@sentry/node": "^7.52.1",
30
30
  "@types/express": "^4.17.17",
31
- "@types/node": "~20.1.0",
31
+ "@types/node": "~20.2.1",
32
32
  "@types/proper-lockfile": "^4.1.2",
33
33
  "@types/redis": "^2.8.32",
34
34
  "@types/redlock": "^4.0.4",
@@ -37,11 +37,11 @@
37
37
  "express-jwt-authz": "^2.4.1",
38
38
  "jwks-rsa": "2.1.4",
39
39
  "jwt-decode": "^3.1.2",
40
- "mongodb": "5.4.0",
40
+ "mongodb": "5.5.0",
41
41
  "redis": "^3.1.2",
42
42
  "ts-node": "^10.9.1",
43
43
  "typescript": "https://cdn.jsdelivr.net/npm/@tsplus/installer@0.0.176/compiler/typescript.tgz",
44
- "vitest": "^0.31.0",
44
+ "vitest": "^0.31.1",
45
45
  "@effect-app/compiler": "0.26.0"
46
46
  },
47
47
  "typesVersions": {