@culturefy/shared 1.0.38 → 1.0.39

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 (33) hide show
  1. package/build/cjs/middlewares/sample middleware.js +2 -0
  2. package/build/cjs/middlewares/sample middleware.js.map +1 -0
  3. package/build/cjs/types/middleware.js +2 -0
  4. package/build/cjs/types/middleware.js.map +1 -0
  5. package/build/cjs/utils/index.js +6 -0
  6. package/build/cjs/utils/index.js.map +1 -1
  7. package/build/cjs/utils/middleware.js +71 -0
  8. package/build/cjs/utils/middleware.js.map +1 -0
  9. package/build/esm/middlewares/sample middleware.js +2 -0
  10. package/build/esm/middlewares/sample middleware.js.map +1 -0
  11. package/build/esm/types/middleware.js +2 -0
  12. package/build/esm/types/middleware.js.map +1 -0
  13. package/build/esm/utils/index.js +1 -0
  14. package/build/esm/utils/index.js.map +1 -1
  15. package/build/esm/utils/middleware.js +65 -0
  16. package/build/esm/utils/middleware.js.map +1 -0
  17. package/build/src/middlewares/sample middleware.d.ts +0 -0
  18. package/build/src/middlewares/sample middleware.js +2 -0
  19. package/build/src/middlewares/sample middleware.js.map +1 -0
  20. package/build/src/types/middleware.d.ts +3 -0
  21. package/build/src/types/middleware.js +3 -0
  22. package/build/src/types/middleware.js.map +1 -0
  23. package/build/src/utils/index.d.ts +1 -0
  24. package/build/src/utils/index.js +1 -0
  25. package/build/src/utils/index.js.map +1 -1
  26. package/build/src/utils/middleware.d.ts +12 -0
  27. package/build/src/utils/middleware.js +64 -0
  28. package/build/src/utils/middleware.js.map +1 -0
  29. package/package.json +1 -1
  30. package/src/middlewares/sample middleware.ts +0 -0
  31. package/src/types/middleware.ts +10 -0
  32. package/src/utils/index.ts +2 -1
  33. package/src/utils/middleware.ts +70 -0
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=sample middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample middleware.js","names":[],"sources":["../../../src/middlewares/sample middleware.ts"],"sourcesContent":[""],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","names":[],"sources":["../../../src/types/middleware.ts"],"sourcesContent":["import { HttpRequest, HttpResponseInit, InvocationContext } from \"@azure/functions\";\n\n\nexport type IMiddleware = (\n req: HttpRequest,\n ctx: InvocationContext,\n next: () => Promise<HttpResponseInit>\n) => Promise<HttpResponseInit>;\n\nexport type IHandler = (req: HttpRequest, ctx: InvocationContext) => Promise<HttpResponseInit>;"],"mappings":"","ignoreList":[]}
@@ -31,4 +31,10 @@ Object.keys(_jwt).forEach(function (key) {
31
31
  if (key in exports && exports[key] === _jwt[key]) return;
32
32
  exports[key] = _jwt[key];
33
33
  });
34
+ var _middleware = require("./middleware");
35
+ Object.keys(_middleware).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _middleware[key]) return;
38
+ exports[key] = _middleware[key];
39
+ });
34
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_secrets","require","Object","keys","forEach","key","exports","_response","_initializers","_mapper","_jwt"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';\nexport * from './jwt';"],"mappings":";;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,QAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,SAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,SAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,SAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,SAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,aAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,aAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,aAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,aAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,OAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,OAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,OAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,OAAA,CAAAJ,GAAA;AAAA;AACA,IAAAK,IAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,IAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,IAAA,CAAAL,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAK,IAAA,CAAAL,GAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_secrets","require","Object","keys","forEach","key","exports","_response","_initializers","_mapper","_jwt","_middleware"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';\nexport * from './jwt';\nexport * from './middleware';\n"],"mappings":";;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,QAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,SAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,SAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,SAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,SAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,aAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,aAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,aAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,aAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,OAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,OAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,OAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,OAAA,CAAAJ,GAAA;AAAA;AACA,IAAAK,IAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,IAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,IAAA,CAAAL,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAK,IAAA,CAAAL,GAAA;AAAA;AACA,IAAAM,WAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,WAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,WAAA,CAAAN,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAM,WAAA,CAAAN,GAAA;AAAA","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.withMW = withMW;
5
+ /**
6
+ * Compose Azure Functions middlewares (Koa-style).
7
+ * Each middleware gets (req, ctx, next) and must either:
8
+ * - `return await next()` to pass-through, or
9
+ * - `return <HttpResponseInit>` to short-circuit.
10
+ *
11
+ * Any headers/cookies accumulated on ctx via Symbol.for("cfy.resHeaders"/"cfy.resCookies")
12
+ * are merged into the final response.
13
+ */
14
+ // ---- withMW (kept small; merges any ctx headers/cookies if you use them) ----
15
+ function withMW(middlewares, handler) {
16
+ return async (req, ctx) => {
17
+ var _res$headers;
18
+ const stack = [...middlewares, async (r, c) => handler(r, c)];
19
+ let index = -1;
20
+ const dispatch = async i => {
21
+ if (i <= index) throw new Error("next() called multiple times");
22
+ index = i;
23
+ const fn = stack[i];
24
+ if (!fn) throw new Error("No handler in middleware stack");
25
+
26
+ // next always returns a HttpResponseInit
27
+ const next = () => dispatch(i + 1);
28
+ const result = await fn(req, ctx, next);
29
+ if (result === undefined) {
30
+ throw new Error("Middleware must return a response or `return await next()`");
31
+ }
32
+ return result;
33
+ };
34
+ const res = await dispatch(0);
35
+
36
+ // optional: merge bags if you set them elsewhere
37
+ const CTX_HEADERS = Symbol.for("cfy.resHeaders");
38
+ const CTX_COOKIES = Symbol.for("cfy.resCookies"); // string[]
39
+ const CTX_COOKIES_OBJ = Symbol.for("cfy.resCookies.obj"); // HttpCookie[]
40
+
41
+ const merged = {
42
+ ...res,
43
+ headers: {
44
+ ...((_res$headers = res.headers) != null ? _res$headers : {})
45
+ }
46
+ };
47
+
48
+ // merge cookies as objects (preferred by Azure Functions)
49
+ // @ts-ignore
50
+ const objCookies = ctx[CTX_COOKIES_OBJ];
51
+ if (objCookies != null && objCookies.length) {
52
+ var _res$cookies;
53
+ merged.cookies = [...((_res$cookies = res.cookies) != null ? _res$cookies : []), ...objCookies];
54
+ }
55
+
56
+ // (optional) header fallback for environments that expect Set-Cookie header(s)
57
+ const cookies = ctx[CTX_COOKIES];
58
+ if (cookies != null && cookies.length) {
59
+ var _h$SetCookie;
60
+ const h = merged.headers;
61
+ const existing = (_h$SetCookie = h["Set-Cookie"]) != null ? _h$SetCookie : h["set-cookie"];
62
+ h["Set-Cookie"] = existing ? Array.isArray(existing) ? existing.concat(cookies) : [existing, ...cookies] : cookies;
63
+ }
64
+
65
+ // merge extra headers if you use that bag
66
+ const extra = ctx[CTX_HEADERS];
67
+ if (extra) for (const [k, v] of Object.entries(extra)) merged.headers[k] = v;
68
+ return merged;
69
+ };
70
+ }
71
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","names":["withMW","middlewares","handler","req","ctx","_res$headers","stack","r","c","index","dispatch","i","Error","fn","next","result","undefined","res","CTX_HEADERS","Symbol","for","CTX_COOKIES","CTX_COOKIES_OBJ","merged","headers","objCookies","length","_res$cookies","cookies","_h$SetCookie","h","existing","Array","isArray","concat","extra","k","v","Object","entries"],"sources":["../../../src/utils/middleware.ts"],"sourcesContent":["import { app, HttpRequest, HttpResponseInit, InvocationContext } from \"@azure/functions\";\nimport { IHandler, IMiddleware } from \"../types/middleware\";\n\n/**\n * Compose Azure Functions middlewares (Koa-style).\n * Each middleware gets (req, ctx, next) and must either:\n * - `return await next()` to pass-through, or\n * - `return <HttpResponseInit>` to short-circuit.\n *\n * Any headers/cookies accumulated on ctx via Symbol.for(\"cfy.resHeaders\"/\"cfy.resCookies\")\n * are merged into the final response.\n */\n// ---- withMW (kept small; merges any ctx headers/cookies if you use them) ----\nexport function withMW(middlewares: IMiddleware[], handler: IHandler) {\n return async (req: HttpRequest, ctx: InvocationContext): Promise<HttpResponseInit> => {\n const stack: IMiddleware[] = [...middlewares, async (r, c) => handler(r, c)];\n\n let index = -1;\n const dispatch = async (i: number): Promise<HttpResponseInit> => {\n if (i <= index) throw new Error(\"next() called multiple times\");\n index = i;\n\n const fn = stack[i];\n if (!fn) throw new Error(\"No handler in middleware stack\");\n\n // next always returns a HttpResponseInit\n const next = () => dispatch(i + 1);\n const result = await fn(req, ctx, next);\n\n if (result === undefined) {\n throw new Error(\"Middleware must return a response or `return await next()`\");\n }\n return result;\n };\n\n const res = await dispatch(0);\n\n // optional: merge bags if you set them elsewhere\n const CTX_HEADERS = Symbol.for(\"cfy.resHeaders\");\n const CTX_COOKIES = Symbol.for(\"cfy.resCookies\"); // string[]\n const CTX_COOKIES_OBJ = Symbol.for(\"cfy.resCookies.obj\"); // HttpCookie[]\n\n const merged: HttpResponseInit = { ...res, headers: { ...(res.headers ?? {}) } };\n\n // merge cookies as objects (preferred by Azure Functions)\n // @ts-ignore\n const objCookies = (ctx as any)[CTX_COOKIES_OBJ] as HttpCookie[] | undefined;\n if (objCookies?.length) {\n merged.cookies = [...(res.cookies ?? []), ...objCookies];\n }\n\n // (optional) header fallback for environments that expect Set-Cookie header(s)\n const cookies = (ctx as any)[CTX_COOKIES] as string[] | undefined;\n if (cookies?.length) {\n const h = merged.headers as any;\n const existing = h[\"Set-Cookie\"] ?? h[\"set-cookie\"];\n h[\"Set-Cookie\"] = existing\n ? (Array.isArray(existing) ? existing.concat(cookies) : [existing, ...cookies])\n : cookies;\n }\n\n // merge extra headers if you use that bag\n const extra = (ctx as any)[CTX_HEADERS] as Record<string, string | string[]> | undefined;\n if (extra) for (const [k, v] of Object.entries(extra)) (merged.headers as any)[k] = v;\n\n return merged;\n\n\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=sample middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample middleware.js","names":[],"sources":["../../../src/middlewares/sample middleware.ts"],"sourcesContent":[""],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","names":[],"sources":["../../../src/types/middleware.ts"],"sourcesContent":["import { HttpRequest, HttpResponseInit, InvocationContext } from \"@azure/functions\";\n\n\nexport type IMiddleware = (\n req: HttpRequest,\n ctx: InvocationContext,\n next: () => Promise<HttpResponseInit>\n) => Promise<HttpResponseInit>;\n\nexport type IHandler = (req: HttpRequest, ctx: InvocationContext) => Promise<HttpResponseInit>;"],"mappings":"","ignoreList":[]}
@@ -3,4 +3,5 @@ export * from './response';
3
3
  export * from './initializers';
4
4
  export * from './mapper';
5
5
  export * from './jwt';
6
+ export * from './middleware';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';\nexport * from './jwt';"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,gBAAgB;AAC9B,cAAc,UAAU;AACxB,cAAc,OAAO","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';\nexport * from './jwt';\nexport * from './middleware';\n"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,gBAAgB;AAC9B,cAAc,UAAU;AACxB,cAAc,OAAO;AACrB,cAAc,cAAc","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ /**
3
+ * Compose Azure Functions middlewares (Koa-style).
4
+ * Each middleware gets (req, ctx, next) and must either:
5
+ * - `return await next()` to pass-through, or
6
+ * - `return <HttpResponseInit>` to short-circuit.
7
+ *
8
+ * Any headers/cookies accumulated on ctx via Symbol.for("cfy.resHeaders"/"cfy.resCookies")
9
+ * are merged into the final response.
10
+ */
11
+ // ---- withMW (kept small; merges any ctx headers/cookies if you use them) ----
12
+ export function withMW(middlewares, handler) {
13
+ return async (req, ctx) => {
14
+ var _res$headers;
15
+ const stack = [...middlewares, async (r, c) => handler(r, c)];
16
+ let index = -1;
17
+ const dispatch = async i => {
18
+ if (i <= index) throw new Error("next() called multiple times");
19
+ index = i;
20
+ const fn = stack[i];
21
+ if (!fn) throw new Error("No handler in middleware stack");
22
+
23
+ // next always returns a HttpResponseInit
24
+ const next = () => dispatch(i + 1);
25
+ const result = await fn(req, ctx, next);
26
+ if (result === undefined) {
27
+ throw new Error("Middleware must return a response or `return await next()`");
28
+ }
29
+ return result;
30
+ };
31
+ const res = await dispatch(0);
32
+
33
+ // optional: merge bags if you set them elsewhere
34
+ const CTX_HEADERS = Symbol.for("cfy.resHeaders");
35
+ const CTX_COOKIES = Symbol.for("cfy.resCookies"); // string[]
36
+ const CTX_COOKIES_OBJ = Symbol.for("cfy.resCookies.obj"); // HttpCookie[]
37
+
38
+ const merged = _extends({}, res, {
39
+ headers: _extends({}, (_res$headers = res.headers) != null ? _res$headers : {})
40
+ });
41
+
42
+ // merge cookies as objects (preferred by Azure Functions)
43
+ // @ts-ignore
44
+ const objCookies = ctx[CTX_COOKIES_OBJ];
45
+ if (objCookies != null && objCookies.length) {
46
+ var _res$cookies;
47
+ merged.cookies = [...((_res$cookies = res.cookies) != null ? _res$cookies : []), ...objCookies];
48
+ }
49
+
50
+ // (optional) header fallback for environments that expect Set-Cookie header(s)
51
+ const cookies = ctx[CTX_COOKIES];
52
+ if (cookies != null && cookies.length) {
53
+ var _h$SetCookie;
54
+ const h = merged.headers;
55
+ const existing = (_h$SetCookie = h["Set-Cookie"]) != null ? _h$SetCookie : h["set-cookie"];
56
+ h["Set-Cookie"] = existing ? Array.isArray(existing) ? existing.concat(cookies) : [existing, ...cookies] : cookies;
57
+ }
58
+
59
+ // merge extra headers if you use that bag
60
+ const extra = ctx[CTX_HEADERS];
61
+ if (extra) for (const [k, v] of Object.entries(extra)) merged.headers[k] = v;
62
+ return merged;
63
+ };
64
+ }
65
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","names":["withMW","middlewares","handler","req","ctx","_res$headers","stack","r","c","index","dispatch","i","Error","fn","next","result","undefined","res","CTX_HEADERS","Symbol","for","CTX_COOKIES","CTX_COOKIES_OBJ","merged","_extends","headers","objCookies","length","_res$cookies","cookies","_h$SetCookie","h","existing","Array","isArray","concat","extra","k","v","Object","entries"],"sources":["../../../src/utils/middleware.ts"],"sourcesContent":["import { app, HttpRequest, HttpResponseInit, InvocationContext } from \"@azure/functions\";\nimport { IHandler, IMiddleware } from \"../types/middleware\";\n\n/**\n * Compose Azure Functions middlewares (Koa-style).\n * Each middleware gets (req, ctx, next) and must either:\n * - `return await next()` to pass-through, or\n * - `return <HttpResponseInit>` to short-circuit.\n *\n * Any headers/cookies accumulated on ctx via Symbol.for(\"cfy.resHeaders\"/\"cfy.resCookies\")\n * are merged into the final response.\n */\n// ---- withMW (kept small; merges any ctx headers/cookies if you use them) ----\nexport function withMW(middlewares: IMiddleware[], handler: IHandler) {\n return async (req: HttpRequest, ctx: InvocationContext): Promise<HttpResponseInit> => {\n const stack: IMiddleware[] = [...middlewares, async (r, c) => handler(r, c)];\n\n let index = -1;\n const dispatch = async (i: number): Promise<HttpResponseInit> => {\n if (i <= index) throw new Error(\"next() called multiple times\");\n index = i;\n\n const fn = stack[i];\n if (!fn) throw new Error(\"No handler in middleware stack\");\n\n // next always returns a HttpResponseInit\n const next = () => dispatch(i + 1);\n const result = await fn(req, ctx, next);\n\n if (result === undefined) {\n throw new Error(\"Middleware must return a response or `return await next()`\");\n }\n return result;\n };\n\n const res = await dispatch(0);\n\n // optional: merge bags if you set them elsewhere\n const CTX_HEADERS = Symbol.for(\"cfy.resHeaders\");\n const CTX_COOKIES = Symbol.for(\"cfy.resCookies\"); // string[]\n const CTX_COOKIES_OBJ = Symbol.for(\"cfy.resCookies.obj\"); // HttpCookie[]\n\n const merged: HttpResponseInit = { ...res, headers: { ...(res.headers ?? {}) } };\n\n // merge cookies as objects (preferred by Azure Functions)\n // @ts-ignore\n const objCookies = (ctx as any)[CTX_COOKIES_OBJ] as HttpCookie[] | undefined;\n if (objCookies?.length) {\n merged.cookies = [...(res.cookies ?? []), ...objCookies];\n }\n\n // (optional) header fallback for environments that expect Set-Cookie header(s)\n const cookies = (ctx as any)[CTX_COOKIES] as string[] | undefined;\n if (cookies?.length) {\n const h = merged.headers as any;\n const existing = h[\"Set-Cookie\"] ?? h[\"set-cookie\"];\n h[\"Set-Cookie\"] = existing\n ? (Array.isArray(existing) ? existing.concat(cookies) : [existing, ...cookies])\n : cookies;\n }\n\n // merge extra headers if you use that bag\n const extra = (ctx as any)[CTX_HEADERS] as Record<string, string | string[]> | undefined;\n if (extra) for (const [k, v] of Object.entries(extra)) (merged.headers as any)[k] = v;\n\n return merged;\n\n\n };\n}\n"],"mappings":"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","ignoreList":[]}
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=sample%20middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample middleware.js","sourceRoot":"","sources":["../../../src/middlewares/sample middleware.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
2
+ export type IMiddleware = (req: HttpRequest, ctx: InvocationContext, next: () => Promise<HttpResponseInit>) => Promise<HttpResponseInit>;
3
+ export type IHandler = (req: HttpRequest, ctx: InvocationContext) => Promise<HttpResponseInit>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/types/middleware.ts"],"names":[],"mappings":""}
@@ -3,3 +3,4 @@ export * from './response';
3
3
  export * from './initializers';
4
4
  export * from './mapper';
5
5
  export * from './jwt';
6
+ export * from './middleware';
@@ -6,4 +6,5 @@ tslib_1.__exportStar(require("./response"), exports);
6
6
  tslib_1.__exportStar(require("./initializers"), exports);
7
7
  tslib_1.__exportStar(require("./mapper"), exports);
8
8
  tslib_1.__exportStar(require("./jwt"), exports);
9
+ tslib_1.__exportStar(require("./middleware"), exports);
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,qDAA2B;AAC3B,yDAA+B;AAC/B,mDAAyB;AACzB,gDAAsB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,qDAA2B;AAC3B,yDAA+B;AAC/B,mDAAyB;AACzB,gDAAsB;AACtB,uDAA6B"}
@@ -0,0 +1,12 @@
1
+ import { HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
2
+ import { IHandler, IMiddleware } from "../types/middleware";
3
+ /**
4
+ * Compose Azure Functions middlewares (Koa-style).
5
+ * Each middleware gets (req, ctx, next) and must either:
6
+ * - `return await next()` to pass-through, or
7
+ * - `return <HttpResponseInit>` to short-circuit.
8
+ *
9
+ * Any headers/cookies accumulated on ctx via Symbol.for("cfy.resHeaders"/"cfy.resCookies")
10
+ * are merged into the final response.
11
+ */
12
+ export declare function withMW(middlewares: IMiddleware[], handler: IHandler): (req: HttpRequest, ctx: InvocationContext) => Promise<HttpResponseInit>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withMW = withMW;
4
+ const tslib_1 = require("tslib");
5
+ /**
6
+ * Compose Azure Functions middlewares (Koa-style).
7
+ * Each middleware gets (req, ctx, next) and must either:
8
+ * - `return await next()` to pass-through, or
9
+ * - `return <HttpResponseInit>` to short-circuit.
10
+ *
11
+ * Any headers/cookies accumulated on ctx via Symbol.for("cfy.resHeaders"/"cfy.resCookies")
12
+ * are merged into the final response.
13
+ */
14
+ // ---- withMW (kept small; merges any ctx headers/cookies if you use them) ----
15
+ function withMW(middlewares, handler) {
16
+ return (req, ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () {
17
+ var _a, _b, _c;
18
+ const stack = [...middlewares, (r, c) => tslib_1.__awaiter(this, void 0, void 0, function* () { return handler(r, c); })];
19
+ let index = -1;
20
+ const dispatch = (i) => tslib_1.__awaiter(this, void 0, void 0, function* () {
21
+ if (i <= index)
22
+ throw new Error("next() called multiple times");
23
+ index = i;
24
+ const fn = stack[i];
25
+ if (!fn)
26
+ throw new Error("No handler in middleware stack");
27
+ // next always returns a HttpResponseInit
28
+ const next = () => dispatch(i + 1);
29
+ const result = yield fn(req, ctx, next);
30
+ if (result === undefined) {
31
+ throw new Error("Middleware must return a response or `return await next()`");
32
+ }
33
+ return result;
34
+ });
35
+ const res = yield dispatch(0);
36
+ // optional: merge bags if you set them elsewhere
37
+ const CTX_HEADERS = Symbol.for("cfy.resHeaders");
38
+ const CTX_COOKIES = Symbol.for("cfy.resCookies"); // string[]
39
+ const CTX_COOKIES_OBJ = Symbol.for("cfy.resCookies.obj"); // HttpCookie[]
40
+ const merged = Object.assign(Object.assign({}, res), { headers: Object.assign({}, ((_a = res.headers) !== null && _a !== void 0 ? _a : {})) });
41
+ // merge cookies as objects (preferred by Azure Functions)
42
+ // @ts-ignore
43
+ const objCookies = ctx[CTX_COOKIES_OBJ];
44
+ if (objCookies === null || objCookies === void 0 ? void 0 : objCookies.length) {
45
+ merged.cookies = [...((_b = res.cookies) !== null && _b !== void 0 ? _b : []), ...objCookies];
46
+ }
47
+ // (optional) header fallback for environments that expect Set-Cookie header(s)
48
+ const cookies = ctx[CTX_COOKIES];
49
+ if (cookies === null || cookies === void 0 ? void 0 : cookies.length) {
50
+ const h = merged.headers;
51
+ const existing = (_c = h["Set-Cookie"]) !== null && _c !== void 0 ? _c : h["set-cookie"];
52
+ h["Set-Cookie"] = existing
53
+ ? (Array.isArray(existing) ? existing.concat(cookies) : [existing, ...cookies])
54
+ : cookies;
55
+ }
56
+ // merge extra headers if you use that bag
57
+ const extra = ctx[CTX_HEADERS];
58
+ if (extra)
59
+ for (const [k, v] of Object.entries(extra))
60
+ merged.headers[k] = v;
61
+ return merged;
62
+ });
63
+ }
64
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/utils/middleware.ts"],"names":[],"mappings":";;AAaA,wBAwDC;;AAlED;;;;;;;;GAQG;AACH,gFAAgF;AAChF,SAAgB,MAAM,CAAC,WAA0B,EAAE,OAAiB;IAClE,OAAO,CAAO,GAAgB,EAAE,GAAsB,EAA6B,EAAE;;QACjF,MAAM,KAAK,GAAkB,CAAC,GAAG,WAAW,EAAE,CAAO,CAAC,EAAE,CAAC,EAAE,EAAE,wDAAC,OAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,GAAA,CAAC,CAAC;QAE7E,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,MAAM,QAAQ,GAAG,CAAO,CAAS,EAA6B,EAAE;YAC5D,IAAI,CAAC,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAChE,KAAK,GAAG,CAAC,CAAC;YAEV,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAE3D,yCAAyC;YACzC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAExC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC,CAAA,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE9B,iDAAiD;QACjD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAO,WAAW;QACnE,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe;QAEzE,MAAM,MAAM,mCAA0B,GAAG,KAAE,OAAO,oBAAO,CAAC,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAC,IAAI,CAAC;QAEjF,0DAA0D;QAC1D,aAAa;QACb,MAAM,UAAU,GAAI,GAAW,CAAC,eAAe,CAA6B,CAAC;QAC7E,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,+EAA+E;QAC/E,MAAM,OAAO,GAAI,GAAW,CAAC,WAAW,CAAyB,CAAC;QAClE,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAc,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAA,CAAC,CAAC,YAAY,CAAC,mCAAI,CAAC,CAAC,YAAY,CAAC,CAAC;YACpD,CAAC,CAAC,YAAY,CAAC,GAAG,QAAQ;gBACtB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC;gBAC/E,CAAC,CAAC,OAAO,CAAC;QAClB,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAI,GAAW,CAAC,WAAW,CAAkD,CAAC;QACzF,IAAI,KAAK;YAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAG,MAAM,CAAC,OAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEtF,OAAO,MAAM,CAAC;IAGlB,CAAC,CAAA,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@culturefy/shared",
3
3
  "description": "Shared utilities for culturefy serverless services",
4
- "version": "1.0.38",
4
+ "version": "1.0.39",
5
5
  "main": "build/cjs/index.js",
6
6
  "module": "build/esm/index.js",
7
7
  "types": "build/src/index.d.ts",
File without changes
@@ -0,0 +1,10 @@
1
+ import { HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
2
+
3
+
4
+ export type IMiddleware = (
5
+ req: HttpRequest,
6
+ ctx: InvocationContext,
7
+ next: () => Promise<HttpResponseInit>
8
+ ) => Promise<HttpResponseInit>;
9
+
10
+ export type IHandler = (req: HttpRequest, ctx: InvocationContext) => Promise<HttpResponseInit>;
@@ -2,4 +2,5 @@ export * from './secrets';
2
2
  export * from './response';
3
3
  export * from './initializers';
4
4
  export * from './mapper';
5
- export * from './jwt';
5
+ export * from './jwt';
6
+ export * from './middleware';
@@ -0,0 +1,70 @@
1
+ import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
2
+ import { IHandler, IMiddleware } from "../types/middleware";
3
+
4
+ /**
5
+ * Compose Azure Functions middlewares (Koa-style).
6
+ * Each middleware gets (req, ctx, next) and must either:
7
+ * - `return await next()` to pass-through, or
8
+ * - `return <HttpResponseInit>` to short-circuit.
9
+ *
10
+ * Any headers/cookies accumulated on ctx via Symbol.for("cfy.resHeaders"/"cfy.resCookies")
11
+ * are merged into the final response.
12
+ */
13
+ // ---- withMW (kept small; merges any ctx headers/cookies if you use them) ----
14
+ export function withMW(middlewares: IMiddleware[], handler: IHandler) {
15
+ return async (req: HttpRequest, ctx: InvocationContext): Promise<HttpResponseInit> => {
16
+ const stack: IMiddleware[] = [...middlewares, async (r, c) => handler(r, c)];
17
+
18
+ let index = -1;
19
+ const dispatch = async (i: number): Promise<HttpResponseInit> => {
20
+ if (i <= index) throw new Error("next() called multiple times");
21
+ index = i;
22
+
23
+ const fn = stack[i];
24
+ if (!fn) throw new Error("No handler in middleware stack");
25
+
26
+ // next always returns a HttpResponseInit
27
+ const next = () => dispatch(i + 1);
28
+ const result = await fn(req, ctx, next);
29
+
30
+ if (result === undefined) {
31
+ throw new Error("Middleware must return a response or `return await next()`");
32
+ }
33
+ return result;
34
+ };
35
+
36
+ const res = await dispatch(0);
37
+
38
+ // optional: merge bags if you set them elsewhere
39
+ const CTX_HEADERS = Symbol.for("cfy.resHeaders");
40
+ const CTX_COOKIES = Symbol.for("cfy.resCookies"); // string[]
41
+ const CTX_COOKIES_OBJ = Symbol.for("cfy.resCookies.obj"); // HttpCookie[]
42
+
43
+ const merged: HttpResponseInit = { ...res, headers: { ...(res.headers ?? {}) } };
44
+
45
+ // merge cookies as objects (preferred by Azure Functions)
46
+ // @ts-ignore
47
+ const objCookies = (ctx as any)[CTX_COOKIES_OBJ] as HttpCookie[] | undefined;
48
+ if (objCookies?.length) {
49
+ merged.cookies = [...(res.cookies ?? []), ...objCookies];
50
+ }
51
+
52
+ // (optional) header fallback for environments that expect Set-Cookie header(s)
53
+ const cookies = (ctx as any)[CTX_COOKIES] as string[] | undefined;
54
+ if (cookies?.length) {
55
+ const h = merged.headers as any;
56
+ const existing = h["Set-Cookie"] ?? h["set-cookie"];
57
+ h["Set-Cookie"] = existing
58
+ ? (Array.isArray(existing) ? existing.concat(cookies) : [existing, ...cookies])
59
+ : cookies;
60
+ }
61
+
62
+ // merge extra headers if you use that bag
63
+ const extra = (ctx as any)[CTX_HEADERS] as Record<string, string | string[]> | undefined;
64
+ if (extra) for (const [k, v] of Object.entries(extra)) (merged.headers as any)[k] = v;
65
+
66
+ return merged;
67
+
68
+
69
+ };
70
+ }