cloudcommerce 0.10.0 → 0.12.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 (193) hide show
  1. package/.github/renovate.json +1 -2
  2. package/CHANGELOG.md +42 -0
  3. package/action.yml +1 -1
  4. package/ecomplus-stores/monocard/functions/core/package.json +2 -2
  5. package/ecomplus-stores/monocard/functions/events/package.json +3 -3
  6. package/ecomplus-stores/monocard/functions/modules/package.json +3 -3
  7. package/ecomplus-stores/monocard/functions/passport/package.json +3 -3
  8. package/ecomplus-stores/monocard/functions/ssr/index.js +2 -2
  9. package/ecomplus-stores/monocard/functions/ssr/package.json +7 -7
  10. package/ecomplus-stores/monocard/functions/ssr/src/env.d.ts +1 -0
  11. package/ecomplus-stores/monocard/functions/ssr/src/main/Home.astro +1 -1
  12. package/ecomplus-stores/monocard/functions/ssr/src/scripts/InlineScripts.astro +1 -1
  13. package/ecomplus-stores/monocard/package.json +2 -2
  14. package/ecomplus-stores/tia-sonia/functions/ssr/index.js +2 -2
  15. package/ecomplus-stores/tia-sonia/functions/ssr/src/env.d.ts +3 -1
  16. package/ecomplus-stores/tia-sonia/functions/ssr/src/scripts/head-scripts.ts +2 -4
  17. package/ecomplus-stores/tia-sonia/functions/ssr/src/scripts/modules-info-preset.ts +1 -1
  18. package/package.json +15 -15
  19. package/packages/api/lib/types/orders.d.ts +15 -0
  20. package/packages/api/package.json +2 -3
  21. package/packages/api/src/types/orders.d.ts +15 -0
  22. package/packages/apps/correios/package.json +2 -2
  23. package/packages/apps/custom-payment/package.json +1 -1
  24. package/packages/apps/custom-shipping/package.json +1 -1
  25. package/packages/apps/datafrete/package.json +4 -4
  26. package/packages/apps/discounts/lib-mjs/apply-discount.mjs +4 -2
  27. package/packages/apps/discounts/package.json +1 -1
  28. package/packages/apps/emails/lib/functios-lib/utils.js +8 -8
  29. package/packages/apps/emails/lib/functios-lib/utils.js.map +1 -1
  30. package/packages/apps/emails/package.json +2 -2
  31. package/packages/apps/emails/src/functios-lib/utils.ts +8 -8
  32. package/packages/apps/fb-conversions/package.json +3 -3
  33. package/packages/apps/frenet/package.json +4 -4
  34. package/packages/apps/galaxpay/package.json +4 -4
  35. package/packages/apps/google-analytics/package.json +4 -4
  36. package/packages/apps/infinitepay/package.json +4 -4
  37. package/packages/apps/jadlog/package.json +2 -2
  38. package/packages/apps/loyalty-points/package.json +1 -1
  39. package/packages/apps/melhor-envio/package.json +4 -4
  40. package/packages/apps/mercadopago/package.json +4 -4
  41. package/packages/apps/pagarme/package.json +6 -6
  42. package/packages/apps/paghiper/package.json +4 -4
  43. package/packages/apps/pix/package.json +4 -4
  44. package/packages/apps/tiny-erp/package.json +4 -4
  45. package/packages/apps/webhooks/package.json +4 -4
  46. package/packages/cli/config/firebase.json +6 -16
  47. package/packages/cli/package.json +2 -2
  48. package/packages/config/lib/config.d.ts +2 -2
  49. package/packages/config/lib/config.js +6 -6
  50. package/packages/config/lib/config.js.map +1 -1
  51. package/packages/config/package.json +1 -1
  52. package/packages/config/src/config.ts +8 -8
  53. package/packages/emails/lib/index.js +3 -3
  54. package/packages/emails/lib/index.js.map +1 -1
  55. package/packages/emails/package.json +4 -4
  56. package/packages/emails/src/index.ts +3 -3
  57. package/packages/events/package.json +3 -3
  58. package/packages/feeds/CHANGELOG.md +1 -0
  59. package/packages/feeds/README.md +1 -0
  60. package/packages/feeds/firebase.js +1 -0
  61. package/packages/{ssr → feeds}/lib/firebase/serve-feeds.js +3 -2
  62. package/packages/{ssr → feeds}/lib/firebase/serve-feeds.js.map +1 -1
  63. package/packages/feeds/lib/firebase.js +17 -0
  64. package/packages/feeds/lib/firebase.js.map +1 -0
  65. package/packages/feeds/lib/index.js +1 -0
  66. package/packages/feeds/lib/index.js.map +1 -0
  67. package/packages/feeds/package.json +33 -0
  68. package/packages/{ssr → feeds}/src/firebase/serve-feeds.ts +3 -2
  69. package/packages/feeds/src/firebase.ts +17 -0
  70. package/packages/feeds/src/index.ts +0 -0
  71. package/packages/feeds/tsconfig.json +3 -0
  72. package/packages/firebase/lib/config.d.ts +3 -3
  73. package/packages/firebase/lib/config.js +6 -6
  74. package/packages/firebase/lib/config.js.map +1 -1
  75. package/packages/firebase/lib/handlers/check-store-events.d.ts +4 -0
  76. package/packages/firebase/lib/handlers/check-store-events.js +4 -7
  77. package/packages/firebase/lib/handlers/check-store-events.js.map +1 -1
  78. package/packages/firebase/package.json +4 -4
  79. package/packages/firebase/src/config.ts +7 -7
  80. package/packages/firebase/src/handlers/check-store-events.ts +20 -8
  81. package/packages/i18n/package.json +1 -1
  82. package/packages/modules/lib/firebase/call-app-module.js +6 -6
  83. package/packages/modules/lib/firebase/call-app-module.js.map +1 -1
  84. package/packages/modules/package.json +5 -5
  85. package/packages/modules/src/firebase/call-app-module.ts +17 -7
  86. package/packages/passport/package.json +3 -3
  87. package/packages/ssr/lib/firebase/serve-storefront.js +5 -6
  88. package/packages/ssr/lib/firebase/serve-storefront.js.map +1 -1
  89. package/packages/ssr/lib/firebase.js +6 -16
  90. package/packages/ssr/lib/firebase.js.map +1 -1
  91. package/packages/ssr/package.json +8 -8
  92. package/packages/ssr/src/firebase/serve-storefront.ts +14 -9
  93. package/packages/ssr/src/firebase.ts +6 -16
  94. package/packages/ssr/src/tests/benchmark.sh +50 -0
  95. package/packages/storefront/.base.eslintrc.cjs +9 -1
  96. package/packages/storefront/astro.config.mjs +1 -0
  97. package/packages/storefront/client.d.ts +4 -4
  98. package/packages/storefront/config/storefront.cms.cjs +7 -7
  99. package/packages/storefront/config/storefront.cms.mjs +7 -7
  100. package/packages/storefront/dist/client/_astro/Carousel.e137cab2.js +1 -0
  101. package/packages/storefront/dist/client/_astro/HeroSlider.d677b64a.js +1 -0
  102. package/packages/storefront/dist/client/_astro/PitchBar.94f525f9.js +1 -0
  103. package/packages/storefront/dist/client/_astro/Prices.b8d4b8e4.js +1 -0
  104. package/packages/storefront/dist/client/_astro/ShopHeader.f12e72f6.js +4 -0
  105. package/packages/storefront/dist/client/_astro/_plugin-vue_export-helper.116fec5b.js +1 -0
  106. package/packages/storefront/dist/client/_astro/client.c2102734.js +1 -0
  107. package/packages/storefront/dist/client/_astro/{firebase-app.2840bd36.js → firebase-app.d513d4b8.js} +63 -63
  108. package/packages/storefront/dist/client/_astro/{format-money.d54c1237.js → format-money.1a95a3b5.js} +1 -1
  109. package/packages/storefront/dist/client/_astro/{hoisted.56fa2eff.js → hoisted.be7b77c7.js} +1 -1
  110. package/packages/storefront/dist/client/_astro/index.1190ddf5.js +1 -0
  111. package/packages/storefront/dist/client/_astro/{modules-info.ea748f9d.js → modules-info.bc2146d9.js} +1 -1
  112. package/packages/storefront/dist/client/_astro/runtime-dom.esm-bundler.e2053595.js +1 -0
  113. package/packages/storefront/dist/client/_astro/session-utm.744b0db3.js +1 -0
  114. package/packages/storefront/dist/client/admin/.gitkeep +2 -0
  115. package/packages/storefront/dist/client/sw.js +1 -1
  116. package/packages/storefront/dist/server/chunks/{astro.39f7f387.mjs → astro.7ac24846.mjs} +323 -88
  117. package/packages/storefront/dist/server/chunks/pages/{all.e51db7f0.mjs → all.a42f9fc6.mjs} +125 -128
  118. package/packages/storefront/dist/server/entry.mjs +39 -27
  119. package/packages/storefront/package.json +14 -20
  120. package/packages/storefront/scripts/prepare-monorepo.sh +0 -1
  121. package/packages/storefront/server.d.ts +12 -8
  122. package/packages/storefront/src/lib/components/AccountLink.vue +2 -2
  123. package/packages/storefront/src/lib/components/globals/ALink.vue +1 -1
  124. package/packages/storefront/src/lib/composables/use-pitch-bar.ts +6 -9
  125. package/packages/storefront/src/lib/content.d.ts +25 -0
  126. package/packages/storefront/src/lib/layouts/Base.astro +5 -5
  127. package/packages/storefront/src/lib/layouts/BaseHead.astro +10 -10
  128. package/packages/storefront/src/lib/layouts/BaseStateJson.astro +4 -4
  129. package/packages/storefront/src/lib/layouts/sections/use-hero-section.ts +5 -5
  130. package/packages/storefront/src/lib/layouts/use-page-layout.ts +12 -12
  131. package/packages/storefront/src/lib/pages/_vue.ts +2 -2
  132. package/packages/storefront/src/lib/scripts/firebase-app.ts +1 -1
  133. package/packages/storefront/src/lib/scripts/modules-info-preset.ts +5 -5
  134. package/packages/storefront/src/lib/server-data.ts +1 -1
  135. package/packages/storefront/src/lib/ssr-context.ts +20 -23
  136. package/packages/storefront/src/lib/state/customer-session.ts +1 -1
  137. package/packages/storefront/src/lib/state/use-cms-preview.ts +15 -78
  138. package/packages/storefront/src/vue-globals.d.ts +2 -2
  139. package/packages/storefront/storefront.config.mjs +3 -3
  140. package/packages/storefront/tailwind.config.cjs +5 -5
  141. package/packages/types/index.ts +2 -2
  142. package/packages/types/package.json +1 -1
  143. package/pnpm-workspace.yaml +2 -4
  144. package/packages/api/fetch-polyfill.js +0 -21
  145. package/packages/storefront/dist/client/_astro/Carousel.06e8cee5.js +0 -1
  146. package/packages/storefront/dist/client/_astro/HeroSlider.2c4563ee.js +0 -1
  147. package/packages/storefront/dist/client/_astro/PitchBar.8945ceb4.js +0 -1
  148. package/packages/storefront/dist/client/_astro/Prices.bc136725.js +0 -1
  149. package/packages/storefront/dist/client/_astro/ShopHeader.5d83d6d5.js +0 -4
  150. package/packages/storefront/dist/client/_astro/_commonjsHelpers.725317a4.js +0 -1
  151. package/packages/storefront/dist/client/_astro/_plugin-vue_export-helper.d71c044e.js +0 -1
  152. package/packages/storefront/dist/client/_astro/client.97e9e785.js +0 -1
  153. package/packages/storefront/dist/client/_astro/client.f447e2e8.js +0 -128
  154. package/packages/storefront/dist/client/_astro/index.2899cbe4.js +0 -9
  155. package/packages/storefront/dist/client/_astro/index.b12dff85.js +0 -1
  156. package/packages/storefront/dist/client/_astro/index.es.28e34903.js +0 -1
  157. package/packages/storefront/dist/client/_astro/runtime-dom.esm-bundler.e9908a78.js +0 -1
  158. package/packages/storefront/dist/client/_astro/server.browser.e1b1e312.js +0 -27
  159. package/packages/storefront/dist/client/_astro/session-utm.ac492493.js +0 -1
  160. package/packages/storefront/dist/client/admin/assets/Range.es-3e45690c.js +0 -1
  161. package/packages/storefront/dist/client/admin/assets/SchemaReference.es-68e2a833.js +0 -1
  162. package/packages/storefront/dist/client/admin/assets/brace-fold.es-f96db61f.js +0 -1
  163. package/packages/storefront/dist/client/admin/assets/closebrackets.es-0488b839.js +0 -2
  164. package/packages/storefront/dist/client/admin/assets/codemirror.es-15b9374a.js +0 -24
  165. package/packages/storefront/dist/client/admin/assets/comment.es-d4bed417.js +0 -2
  166. package/packages/storefront/dist/client/admin/assets/dialog.es-56aaee5b.js +0 -1
  167. package/packages/storefront/dist/client/admin/assets/foldgutter.es-55067bee.js +0 -1
  168. package/packages/storefront/dist/client/admin/assets/forEachState.es-1e367fb2.js +0 -1
  169. package/packages/storefront/dist/client/admin/assets/hint.es-07ec11aa.js +0 -1
  170. package/packages/storefront/dist/client/admin/assets/hint.es2-35fd7219.js +0 -1
  171. package/packages/storefront/dist/client/admin/assets/index-64cd926d.css +0 -1
  172. package/packages/storefront/dist/client/admin/assets/index-d5c6a1a9.js +0 -6332
  173. package/packages/storefront/dist/client/admin/assets/index-f1d880da.js +0 -216
  174. package/packages/storefront/dist/client/admin/assets/info-addon.es-eded2c26.js +0 -1
  175. package/packages/storefront/dist/client/admin/assets/info.es-93649208.js +0 -1
  176. package/packages/storefront/dist/client/admin/assets/javascript.es-634a06b1.js +0 -1
  177. package/packages/storefront/dist/client/admin/assets/jump-to-line.es-23d2d4a8.js +0 -1
  178. package/packages/storefront/dist/client/admin/assets/jump.es-732b233e.js +0 -1
  179. package/packages/storefront/dist/client/admin/assets/lint.es-240359bd.js +0 -6
  180. package/packages/storefront/dist/client/admin/assets/lint.es2-df11292b.js +0 -1
  181. package/packages/storefront/dist/client/admin/assets/lint.es3-aa543b52.js +0 -1
  182. package/packages/storefront/dist/client/admin/assets/matchbrackets.es-f5e3ac04.js +0 -1
  183. package/packages/storefront/dist/client/admin/assets/mode-indent.es-341daf63.js +0 -1
  184. package/packages/storefront/dist/client/admin/assets/mode.es-c74239d3.js +0 -1
  185. package/packages/storefront/dist/client/admin/assets/mode.es2-9319d2a9.js +0 -1
  186. package/packages/storefront/dist/client/admin/assets/mode.es3-deb92d78.js +0 -1
  187. package/packages/storefront/dist/client/admin/assets/search.es-143ba137.js +0 -2
  188. package/packages/storefront/dist/client/admin/assets/searchcursor.es-6069a13e.js +0 -7
  189. package/packages/storefront/dist/client/admin/assets/show-hint.es-ff4fde1d.js +0 -1
  190. package/packages/storefront/dist/client/admin/assets/sublime.es-23f726a0.js +0 -6
  191. package/packages/storefront/dist/client/admin/index.html +0 -15
  192. package/packages/storefront/src/lib/cms.d.ts +0 -21
  193. package/packages/storefront/src/lib/components/Post.vue +0 -107
@@ -633,6 +633,90 @@ Expected \`true\` value but got \`${suffix}\`.`;
633
633
  code: 3030,
634
634
  message: "The response has already been sent to the browser and cannot be altered."
635
635
  },
636
+ /**
637
+ * @docs
638
+ * @description
639
+ * Thrown when the middleware does not return any data or call the `next` function.
640
+ *
641
+ * For example:
642
+ * ```ts
643
+ * import {defineMiddleware} from "astro/middleware";
644
+ * export const onRequest = defineMiddleware((context, _) => {
645
+ * // doesn't return anything or call `next`
646
+ * context.locals.someData = false;
647
+ * });
648
+ * ```
649
+ */
650
+ MiddlewareNoDataOrNextCalled: {
651
+ title: "The middleware didn't return a response or call `next`",
652
+ code: 3031,
653
+ message: "The middleware needs to either return a `Response` object or call the `next` function."
654
+ },
655
+ /**
656
+ * @docs
657
+ * @description
658
+ * Thrown in development mode when middleware returns something that is not a `Response` object.
659
+ *
660
+ * For example:
661
+ * ```ts
662
+ * import {defineMiddleware} from "astro/middleware";
663
+ * export const onRequest = defineMiddleware(() => {
664
+ * return "string"
665
+ * });
666
+ * ```
667
+ */
668
+ MiddlewareNotAResponse: {
669
+ title: "The middleware returned something that is not a `Response` object",
670
+ code: 3032,
671
+ message: "Any data returned from middleware must be a valid `Response` object."
672
+ },
673
+ /**
674
+ * @docs
675
+ * @description
676
+ *
677
+ * Thrown in development mode when `locals` is overwritten with something that is not an object
678
+ *
679
+ * For example:
680
+ * ```ts
681
+ * import {defineMiddleware} from "astro/middleware";
682
+ * export const onRequest = defineMiddleware((context, next) => {
683
+ * context.locals = 1541;
684
+ * return next();
685
+ * });
686
+ * ```
687
+ */
688
+ LocalsNotAnObject: {
689
+ title: "Value assigned to `locals` is not accepted",
690
+ code: 3033,
691
+ message: "`locals` can only be assigned to an object. Other values like numbers, strings, etc. are not accepted.",
692
+ hint: "If you tried to remove some information from the `locals` object, try to use `delete` or set the property to `undefined`."
693
+ },
694
+ /**
695
+ * @docs
696
+ * @description
697
+ * Thrown in development mode when a user attempts to store something that is not serializable in `locals`.
698
+ *
699
+ * For example:
700
+ * ```ts
701
+ * import {defineMiddleware} from "astro/middleware";
702
+ * export const onRequest = defineMiddleware((context, next) => {
703
+ * context.locals = {
704
+ * foo() {
705
+ * alert("Hello world!")
706
+ * }
707
+ * };
708
+ * return next();
709
+ * });
710
+ * ```
711
+ */
712
+ LocalsNotSerializable: {
713
+ title: "`Astro.locals` is not serializable",
714
+ code: 3034,
715
+ message: (href) => {
716
+ return `The information stored in \`Astro.locals\` for the path "${href}" is not serializable.
717
+ Make sure you store only serializable data.`;
718
+ }
719
+ },
636
720
  // No headings here, that way Vite errors are merged with Astro ones in the docs, which makes more sense to users.
637
721
  // Vite Errors - 4xxx
638
722
  /**
@@ -1226,7 +1310,7 @@ function createComponent(arg1, moduleId) {
1226
1310
  }
1227
1311
  }
1228
1312
 
1229
- const ASTRO_VERSION = "2.3.0";
1313
+ const ASTRO_VERSION = "2.4.5";
1230
1314
 
1231
1315
  function createAstroGlobFn() {
1232
1316
  const globHandler = (importMetaGlobResult, globValue) => {
@@ -1260,7 +1344,7 @@ function getHandlerFromModule(mod, method) {
1260
1344
  }
1261
1345
  async function renderEndpoint(mod, context, ssr) {
1262
1346
  var _a;
1263
- const { request, params } = context;
1347
+ const { request, params, locals } = context;
1264
1348
  const chosenMethod = (_a = request.method) == null ? void 0 : _a.toLowerCase();
1265
1349
  const handler = getHandlerFromModule(mod, chosenMethod);
1266
1350
  if (!ssr && ssr === false && chosenMethod && chosenMethod !== "get") {
@@ -1639,7 +1723,9 @@ const uniqueElements = (item, index, all) => {
1639
1723
  };
1640
1724
  function renderAllHeadContent(result) {
1641
1725
  result._metadata.hasRenderedHead = true;
1642
- const styles = Array.from(result.styles).filter(uniqueElements).map((style) => renderElement$1("style", style));
1726
+ const styles = Array.from(result.styles).filter(uniqueElements).map(
1727
+ (style) => style.props.rel === "stylesheet" ? renderElement$1("link", style) : renderElement$1("style", style)
1728
+ );
1643
1729
  result.styles.clear();
1644
1730
  const scripts = Array.from(result.scripts).filter(uniqueElements).map((script, i) => {
1645
1731
  return renderElement$1("script", script, false);
@@ -2656,7 +2742,7 @@ If you're still stuck, please open an issue on GitHub or join us at https://astr
2656
2742
  if (isPage || (renderer == null ? void 0 : renderer.name) === "astro:jsx") {
2657
2743
  yield html;
2658
2744
  } else if (html && html.length > 0) {
2659
- yield markHTMLString(html.replace(/\<\/?astro-slot\>/g, ""));
2745
+ yield markHTMLString(html.replace(/\<\/?astro-slot\b[^>]*>/g, ""));
2660
2746
  } else {
2661
2747
  yield "";
2662
2748
  }
@@ -3009,6 +3095,41 @@ if (typeof process !== "undefined") {
3009
3095
  }
3010
3096
  }
3011
3097
 
3098
+ async function callMiddleware(onRequest, apiContext, responseFunction) {
3099
+ new Promise((resolve) => {
3100
+ });
3101
+ let nextCalled = false;
3102
+ let responseFunctionPromise = void 0;
3103
+ const next = async () => {
3104
+ nextCalled = true;
3105
+ responseFunctionPromise = responseFunction();
3106
+ return responseFunctionPromise;
3107
+ };
3108
+ let middlewarePromise = onRequest(apiContext, next);
3109
+ return await Promise.resolve(middlewarePromise).then(async (value) => {
3110
+ if (nextCalled) {
3111
+ if (typeof value !== "undefined") {
3112
+ if (value instanceof Response === false) {
3113
+ throw new AstroError(AstroErrorData.MiddlewareNotAResponse);
3114
+ }
3115
+ return value;
3116
+ } else {
3117
+ if (responseFunctionPromise) {
3118
+ return responseFunctionPromise;
3119
+ } else {
3120
+ throw new AstroError(AstroErrorData.MiddlewareNotAResponse);
3121
+ }
3122
+ }
3123
+ } else if (typeof value === "undefined") {
3124
+ throw new AstroError(AstroErrorData.MiddlewareNoDataOrNextCalled);
3125
+ } else if (value instanceof Response === false) {
3126
+ throw new AstroError(AstroErrorData.MiddlewareNotAResponse);
3127
+ } else {
3128
+ return value;
3129
+ }
3130
+ });
3131
+ }
3132
+
3012
3133
  const VALID_PARAM_TYPES = ["string", "number", "undefined"];
3013
3134
  function validateGetStaticPathsParameter([key, value], route) {
3014
3135
  if (!VALID_PARAM_TYPES.includes(typeof value)) {
@@ -3190,7 +3311,7 @@ class Slots {
3190
3311
  }
3191
3312
  let renderMarkdown = null;
3192
3313
  function createResult(args) {
3193
- const { markdown, params, pathname, renderers, request, resolve } = args;
3314
+ const { markdown, params, pathname, renderers, request, resolve, locals } = args;
3194
3315
  const url = new URL(request.url);
3195
3316
  const headers = new Headers();
3196
3317
  headers.set("Content-Type", "text/html");
@@ -3244,6 +3365,7 @@ function createResult(args) {
3244
3365
  },
3245
3366
  params,
3246
3367
  props,
3368
+ locals,
3247
3369
  request,
3248
3370
  url,
3249
3371
  redirect: args.ssr ? (path, status) => {
@@ -3428,17 +3550,25 @@ function findPathItemByKey(staticPaths, params, route) {
3428
3550
  debug("findPathItemByKey", `Unexpected cache miss looking for ${paramsKey}`);
3429
3551
  }
3430
3552
 
3431
- var GetParamsAndPropsError = /* @__PURE__ */ ((GetParamsAndPropsError2) => {
3432
- GetParamsAndPropsError2[GetParamsAndPropsError2["NoMatchingStaticPath"] = 0] = "NoMatchingStaticPath";
3433
- return GetParamsAndPropsError2;
3434
- })(GetParamsAndPropsError || {});
3553
+ async function getParamsAndPropsOrThrow(options) {
3554
+ var _a, _b;
3555
+ let paramsAndPropsResp = await getParamsAndProps(options);
3556
+ if (paramsAndPropsResp === 0 /* NoMatchingStaticPath */) {
3557
+ throw new AstroError({
3558
+ ...AstroErrorData.NoMatchingStaticPathFound,
3559
+ message: AstroErrorData.NoMatchingStaticPathFound.message(options.pathname),
3560
+ hint: ((_a = options.route) == null ? void 0 : _a.component) ? AstroErrorData.NoMatchingStaticPathFound.hint([(_b = options.route) == null ? void 0 : _b.component]) : ""
3561
+ });
3562
+ }
3563
+ return paramsAndPropsResp;
3564
+ }
3435
3565
  async function getParamsAndProps(opts) {
3436
3566
  const { logging, mod, route, routeCache, pathname, ssr } = opts;
3437
3567
  let params = {};
3438
3568
  let pageProps;
3439
3569
  if (route && !route.pathname) {
3440
3570
  if (route.params.length) {
3441
- const paramsMatch = route.pattern.exec(pathname);
3571
+ const paramsMatch = route.pattern.exec(decodeURIComponent(pathname));
3442
3572
  if (paramsMatch) {
3443
3573
  params = getParams(route.params)(paramsMatch);
3444
3574
  if (route.type === "endpoint" && mod.getStaticPaths) {
@@ -3473,65 +3603,88 @@ async function getParamsAndProps(opts) {
3473
3603
  }
3474
3604
  return [params, pageProps];
3475
3605
  }
3476
- async function renderPage(mod, ctx, env) {
3477
- var _a, _b;
3478
- const paramsAndPropsRes = await getParamsAndProps({
3479
- logging: env.logging,
3480
- mod,
3481
- route: ctx.route,
3482
- routeCache: env.routeCache,
3483
- pathname: ctx.pathname,
3484
- ssr: env.ssr
3485
- });
3486
- if (paramsAndPropsRes === 0 /* NoMatchingStaticPath */) {
3487
- throw new AstroError({
3488
- ...AstroErrorData.NoMatchingStaticPathFound,
3489
- message: AstroErrorData.NoMatchingStaticPathFound.message(ctx.pathname),
3490
- hint: ((_a = ctx.route) == null ? void 0 : _a.component) ? AstroErrorData.NoMatchingStaticPathFound.hint([(_b = ctx.route) == null ? void 0 : _b.component]) : ""
3491
- });
3492
- }
3493
- const [params, pageProps] = paramsAndPropsRes;
3606
+ async function renderPage({ mod, renderContext, env, apiContext }) {
3494
3607
  const Component = mod.default;
3495
3608
  if (!Component)
3496
3609
  throw new Error(`Expected an exported Astro component but received typeof ${typeof Component}`);
3610
+ let locals = {};
3611
+ if (apiContext) {
3612
+ if (env.mode === "development" && !isValueSerializable(apiContext.locals)) {
3613
+ throw new AstroError({
3614
+ ...AstroErrorData.LocalsNotSerializable,
3615
+ message: AstroErrorData.LocalsNotSerializable.message(renderContext.pathname)
3616
+ });
3617
+ }
3618
+ locals = apiContext.locals;
3619
+ }
3497
3620
  const result = createResult({
3498
3621
  adapterName: env.adapterName,
3499
- links: ctx.links,
3500
- styles: ctx.styles,
3622
+ links: renderContext.links,
3623
+ styles: renderContext.styles,
3501
3624
  logging: env.logging,
3502
3625
  markdown: env.markdown,
3503
3626
  mode: env.mode,
3504
- origin: ctx.origin,
3505
- params,
3506
- props: pageProps,
3507
- pathname: ctx.pathname,
3508
- componentMetadata: ctx.componentMetadata,
3627
+ origin: renderContext.origin,
3628
+ params: renderContext.params,
3629
+ props: renderContext.props,
3630
+ pathname: renderContext.pathname,
3631
+ componentMetadata: renderContext.componentMetadata,
3509
3632
  resolve: env.resolve,
3510
3633
  renderers: env.renderers,
3511
- request: ctx.request,
3634
+ request: renderContext.request,
3512
3635
  site: env.site,
3513
- scripts: ctx.scripts,
3636
+ scripts: renderContext.scripts,
3514
3637
  ssr: env.ssr,
3515
- status: ctx.status ?? 200
3638
+ status: renderContext.status ?? 200,
3639
+ locals
3516
3640
  });
3517
3641
  if (typeof mod.components === "object") {
3518
- Object.assign(pageProps, { components: mod.components });
3642
+ Object.assign(renderContext.props, { components: mod.components });
3519
3643
  }
3520
- const response = await renderPage$1(
3644
+ let response = await renderPage$1(
3521
3645
  result,
3522
3646
  Component,
3523
- pageProps,
3647
+ renderContext.props,
3524
3648
  null,
3525
3649
  env.streaming,
3526
- ctx.route
3650
+ renderContext.route
3527
3651
  );
3528
3652
  if (result.cookies) {
3529
3653
  attachToResponse(response, result.cookies);
3530
3654
  }
3531
3655
  return response;
3532
3656
  }
3657
+ function isValueSerializable(value) {
3658
+ let type = typeof value;
3659
+ let plainObject = true;
3660
+ if (type === "object" && isPlainObject(value)) {
3661
+ for (const [, nestedValue] of Object.entries(value)) {
3662
+ if (!isValueSerializable(nestedValue)) {
3663
+ plainObject = false;
3664
+ break;
3665
+ }
3666
+ }
3667
+ } else {
3668
+ plainObject = false;
3669
+ }
3670
+ let result = value === null || type === "string" || type === "number" || type === "boolean" || Array.isArray(value) || plainObject;
3671
+ return result;
3672
+ }
3673
+ function isPlainObject(value) {
3674
+ if (typeof value !== "object" || value === null)
3675
+ return false;
3676
+ let proto = Object.getPrototypeOf(value);
3677
+ if (proto === null)
3678
+ return true;
3679
+ let baseProto = proto;
3680
+ while (Object.getPrototypeOf(baseProto) !== null) {
3681
+ baseProto = Object.getPrototypeOf(baseProto);
3682
+ }
3683
+ return proto === baseProto;
3684
+ }
3533
3685
 
3534
3686
  const clientAddressSymbol$1 = Symbol.for("astro.clientAddress");
3687
+ const clientLocalsSymbol$1 = Symbol.for("astro.locals");
3535
3688
  function createAPIContext({
3536
3689
  request,
3537
3690
  params,
@@ -3539,7 +3692,7 @@ function createAPIContext({
3539
3692
  props,
3540
3693
  adapterName
3541
3694
  }) {
3542
- return {
3695
+ const context = {
3543
3696
  cookies: new AstroCookies(request),
3544
3697
  request,
3545
3698
  params,
@@ -3555,7 +3708,6 @@ function createAPIContext({
3555
3708
  });
3556
3709
  },
3557
3710
  url: new URL(request.url),
3558
- // @ts-expect-error
3559
3711
  get clientAddress() {
3560
3712
  if (!(clientAddressSymbol$1 in request)) {
3561
3713
  if (adapterName) {
@@ -3570,33 +3722,49 @@ function createAPIContext({
3570
3722
  return Reflect.get(request, clientAddressSymbol$1);
3571
3723
  }
3572
3724
  };
3573
- }
3574
- async function call(mod, env, ctx, logging) {
3575
- var _a, _b;
3576
- const paramsAndPropsResp = await getParamsAndProps({
3577
- mod,
3578
- route: ctx.route,
3579
- routeCache: env.routeCache,
3580
- pathname: ctx.pathname,
3581
- logging: env.logging,
3582
- ssr: env.ssr
3725
+ Object.defineProperty(context, "locals", {
3726
+ get() {
3727
+ return Reflect.get(request, clientLocalsSymbol$1);
3728
+ },
3729
+ set(val) {
3730
+ if (typeof val !== "object") {
3731
+ throw new AstroError(AstroErrorData.LocalsNotAnObject);
3732
+ } else {
3733
+ Reflect.set(request, clientLocalsSymbol$1, val);
3734
+ }
3735
+ }
3583
3736
  });
3584
- if (paramsAndPropsResp === GetParamsAndPropsError.NoMatchingStaticPath) {
3585
- throw new AstroError({
3586
- ...AstroErrorData.NoMatchingStaticPathFound,
3587
- message: AstroErrorData.NoMatchingStaticPathFound.message(ctx.pathname),
3588
- hint: ((_a = ctx.route) == null ? void 0 : _a.component) ? AstroErrorData.NoMatchingStaticPathFound.hint([(_b = ctx.route) == null ? void 0 : _b.component]) : ""
3589
- });
3590
- }
3591
- const [params, props] = paramsAndPropsResp;
3737
+ return context;
3738
+ }
3739
+ async function call(mod, env, ctx, logging, middleware) {
3592
3740
  const context = createAPIContext({
3593
3741
  request: ctx.request,
3594
- params,
3595
- props,
3742
+ params: ctx.params,
3743
+ props: ctx.props,
3596
3744
  site: env.site,
3597
3745
  adapterName: env.adapterName
3598
3746
  });
3599
- const response = await renderEndpoint(mod, context, env.ssr);
3747
+ let response = await renderEndpoint(mod, context, env.ssr);
3748
+ if (middleware && middleware.onRequest) {
3749
+ if (response.body === null) {
3750
+ const onRequest = middleware.onRequest;
3751
+ response = await callMiddleware(onRequest, context, async () => {
3752
+ if (env.mode === "development" && !isValueSerializable(context.locals)) {
3753
+ throw new AstroError({
3754
+ ...AstroErrorData.LocalsNotSerializable,
3755
+ message: AstroErrorData.LocalsNotSerializable.message(ctx.pathname)
3756
+ });
3757
+ }
3758
+ return response;
3759
+ });
3760
+ } else {
3761
+ warn(
3762
+ env.logging,
3763
+ "middleware",
3764
+ "Middleware doesn't work for endpoints that return a simple body. The middleware will be disabled for this page."
3765
+ );
3766
+ }
3767
+ }
3600
3768
  if (response instanceof Response) {
3601
3769
  attachToResponse(response, context.cookies);
3602
3770
  return {
@@ -3672,6 +3840,9 @@ function prependForwardSlash(path) {
3672
3840
  function removeTrailingForwardSlash(path) {
3673
3841
  return path.endsWith("/") ? path.slice(0, path.length - 1) : path;
3674
3842
  }
3843
+ function removeLeadingForwardSlash(path) {
3844
+ return path.startsWith("/") ? path.substring(1) : path;
3845
+ }
3675
3846
  function trimSlashes(path) {
3676
3847
  return path.replace(/^\/|\/$/g, "");
3677
3848
  }
@@ -3679,19 +3850,37 @@ function isString(path) {
3679
3850
  return typeof path === "string" || path instanceof String;
3680
3851
  }
3681
3852
  function joinPaths(...paths) {
3682
- return paths.filter(isString).map(trimSlashes).join("/");
3853
+ return paths.filter(isString).map((path, i) => {
3854
+ if (i === 0) {
3855
+ return removeTrailingForwardSlash(path);
3856
+ } else if (i === paths.length - 1) {
3857
+ return removeLeadingForwardSlash(path);
3858
+ } else {
3859
+ return trimSlashes(path);
3860
+ }
3861
+ }).join("/");
3683
3862
  }
3684
3863
 
3685
- function createRenderContext(options) {
3864
+ async function createRenderContext(options) {
3686
3865
  const request = options.request;
3687
3866
  const url = new URL(request.url);
3688
3867
  const origin = options.origin ?? url.origin;
3689
3868
  const pathname = options.pathname ?? url.pathname;
3869
+ const [params, props] = await getParamsAndPropsOrThrow({
3870
+ mod: options.mod,
3871
+ route: options.route,
3872
+ routeCache: options.env.routeCache,
3873
+ pathname,
3874
+ logging: options.env.logging,
3875
+ ssr: options.env.ssr
3876
+ });
3690
3877
  return {
3691
3878
  ...options,
3692
3879
  origin,
3693
3880
  pathname,
3694
- url
3881
+ url,
3882
+ params,
3883
+ props
3695
3884
  };
3696
3885
  }
3697
3886
 
@@ -3708,19 +3897,26 @@ function createAssetLink(href, base, assetsPrefix) {
3708
3897
  return href;
3709
3898
  }
3710
3899
  }
3711
- function createLinkStylesheetElement(href, base, assetsPrefix) {
3712
- return {
3713
- props: {
3714
- rel: "stylesheet",
3715
- href: createAssetLink(href, base, assetsPrefix)
3716
- },
3717
- children: ""
3718
- };
3900
+ function createStylesheetElement(stylesheet, base, assetsPrefix) {
3901
+ if (stylesheet.type === "inline") {
3902
+ return {
3903
+ props: {
3904
+ type: "text/css"
3905
+ },
3906
+ children: stylesheet.content
3907
+ };
3908
+ } else {
3909
+ return {
3910
+ props: {
3911
+ rel: "stylesheet",
3912
+ href: createAssetLink(stylesheet.src, base, assetsPrefix)
3913
+ },
3914
+ children: ""
3915
+ };
3916
+ }
3719
3917
  }
3720
- function createLinkStylesheetElementSet(hrefs, base, assetsPrefix) {
3721
- return new Set(
3722
- hrefs.map((href) => createLinkStylesheetElement(href, base, assetsPrefix))
3723
- );
3918
+ function createStylesheetElementSet(stylesheets, base, assetsPrefix) {
3919
+ return new Set(stylesheets.map((s) => createStylesheetElement(s, base, assetsPrefix)));
3724
3920
  }
3725
3921
  function createModuleScriptElement(script, base, assetsPrefix) {
3726
3922
  if (script.type === "external") {
@@ -3748,6 +3944,7 @@ function matchRoute(pathname, manifest) {
3748
3944
  return manifest.routes.find((route) => route.pattern.test(decodeURI(pathname)));
3749
3945
  }
3750
3946
 
3947
+ const clientLocalsSymbol = Symbol.for("astro.locals");
3751
3948
  const responseSentSymbol = Symbol.for("astro.responseSent");
3752
3949
  class App {
3753
3950
  #env;
@@ -3784,7 +3981,7 @@ class App {
3784
3981
  return bundlePath;
3785
3982
  }
3786
3983
  default: {
3787
- return prependForwardSlash(joinPaths(manifest.base, bundlePath));
3984
+ return createAssetLink(bundlePath, manifest.base, manifest.assetsPrefix);
3788
3985
  }
3789
3986
  }
3790
3987
  },
@@ -3837,6 +4034,7 @@ class App {
3837
4034
  });
3838
4035
  }
3839
4036
  }
4037
+ Reflect.set(request, clientLocalsSymbol, {});
3840
4038
  if (routeData.route === "/404") {
3841
4039
  defaultStatus = 404;
3842
4040
  }
@@ -3870,10 +4068,12 @@ class App {
3870
4068
  return getSetCookiesFromResponse(response);
3871
4069
  }
3872
4070
  async #renderPage(request, routeData, mod, status = 200) {
4071
+ var _a;
3873
4072
  const url = new URL(request.url);
3874
4073
  const pathname = "/" + this.removeBase(url.pathname);
3875
4074
  const info = this.#routeDataToRouteInfo.get(routeData);
3876
- const links = createLinkStylesheetElementSet(info.links);
4075
+ const links = /* @__PURE__ */ new Set();
4076
+ const styles = createStylesheetElementSet(info.styles);
3877
4077
  let scripts = /* @__PURE__ */ new Set();
3878
4078
  for (const script of info.scripts) {
3879
4079
  if ("stage" in script) {
@@ -3888,17 +4088,44 @@ class App {
3888
4088
  }
3889
4089
  }
3890
4090
  try {
3891
- const ctx = createRenderContext({
4091
+ const renderContext = await createRenderContext({
3892
4092
  request,
3893
4093
  origin: url.origin,
3894
4094
  pathname,
3895
4095
  componentMetadata: this.#manifest.componentMetadata,
3896
4096
  scripts,
4097
+ styles,
3897
4098
  links,
3898
4099
  route: routeData,
3899
- status
4100
+ status,
4101
+ mod,
4102
+ env: this.#env
4103
+ });
4104
+ const apiContext = createAPIContext({
4105
+ request: renderContext.request,
4106
+ params: renderContext.params,
4107
+ props: renderContext.props,
4108
+ site: this.#env.site,
4109
+ adapterName: this.#env.adapterName
3900
4110
  });
3901
- const response = await renderPage(mod, ctx, this.#env);
4111
+ const onRequest = (_a = this.#manifest.middleware) == null ? void 0 : _a.onRequest;
4112
+ let response;
4113
+ if (onRequest) {
4114
+ response = await callMiddleware(
4115
+ onRequest,
4116
+ apiContext,
4117
+ () => {
4118
+ return renderPage({ mod, renderContext, env: this.#env, apiContext });
4119
+ }
4120
+ );
4121
+ } else {
4122
+ response = await renderPage({
4123
+ mod,
4124
+ renderContext,
4125
+ env: this.#env,
4126
+ apiContext
4127
+ });
4128
+ }
3902
4129
  Reflect.set(request, responseSentSymbol, true);
3903
4130
  return response;
3904
4131
  } catch (err) {
@@ -3913,14 +4140,22 @@ class App {
3913
4140
  const url = new URL(request.url);
3914
4141
  const pathname = "/" + this.removeBase(url.pathname);
3915
4142
  const handler = mod;
3916
- const ctx = createRenderContext({
4143
+ const ctx = await createRenderContext({
3917
4144
  request,
3918
4145
  origin: url.origin,
3919
4146
  pathname,
3920
4147
  route: routeData,
3921
- status
4148
+ status,
4149
+ env: this.#env,
4150
+ mod: handler
3922
4151
  });
3923
- const result = await call(handler, this.#env, ctx, this.#logging);
4152
+ const result = await call(
4153
+ handler,
4154
+ this.#env,
4155
+ ctx,
4156
+ this.#logging,
4157
+ this.#manifest.middleware
4158
+ );
3924
4159
  if (result.type === "response") {
3925
4160
  if (result.response.headers.get("X-Astro-Response") === "Not-Found") {
3926
4161
  const fourOhFourRequest = new Request(new URL("/404", request.url));