astro-integration-pocketbase
Version:
An Astro integration to support developers working with astro-loader-pocketbase.
1 lines • 3.63 kB
Source Map (JSON)
{"version":3,"file":"middleware.mjs","names":[],"sources":["../src/middleware/is-pocketbase-entry.ts","../src/middleware/index.ts"],"sourcesContent":["import { z } from \"astro/zod\";\n\n/**\n * Schema for a PocketBase entry created with [astro-loader-pocketbase](https://github.com/pawcoding/astro-loader-pocketbase)\n */\nconst pocketbaseEntrySchema = z.object({\n id: z.string(),\n data: z.object({\n id: z.string(),\n collectionId: z.string(),\n collectionName: z.string()\n }),\n digest: z.string().length(16),\n collection: z.string()\n});\n\n/**\n * Type for a PocketBase entry created with [astro-loader-pocketbase](https://github.com/pawcoding/astro-loader-pocketbase)\n */\nexport type PocketBaseEntry = z.infer<typeof pocketbaseEntrySchema>;\n\n/**\n * Checks if the given data is a PocketBase entry.\n */\nexport function isPocketbaseEntry(data: unknown): data is PocketBaseEntry {\n try {\n // Try to parse the data with the PocketBase entry schema\n pocketbaseEntrySchema.parse(data);\n return true;\n } catch {\n return false;\n }\n}\n","import { defineMiddleware } from \"astro/middleware\";\nimport type { PocketBaseEntry } from \"./is-pocketbase-entry\";\nimport { isPocketbaseEntry } from \"./is-pocketbase-entry\";\n\nexport const onRequest = defineMiddleware(async (context, next) => {\n // Look for entities given as props to the page\n const props = Object.values(context.props);\n const entities = findEntitiesRecursive(props).map((entity) => entity.data);\n\n const response = await next();\n const contentType = response.headers.get(\"content-type\");\n if (!contentType?.includes(\"text/html\")) {\n // Pass through non-HTML responses unchanged\n return response;\n }\n\n const body = await response.text();\n\n // Append the entities to the <head>\n const entitiesJson = JSON.stringify(entities);\n const newBody = body.replace(\n \"</head>\",\n `<script>window.__astro_entities__ = ${entitiesJson}</script></head>`\n );\n\n return new Response(newBody, response);\n});\n\n/**\n * Find PocketBase entities in the given data.\n */\nfunction findEntitiesRecursive(data: unknown): Array<PocketBaseEntry> {\n // Check if the data is an array and search for entities in each element\n if (Array.isArray(data)) {\n return data.flatMap((item) => findEntitiesRecursive(item));\n }\n\n if (typeof data === \"object\" && data !== null) {\n // Check if the data is an object and a PocketBase entry\n if (isPocketbaseEntry(data)) {\n return [data];\n }\n\n // Search for entities in all values\n return findEntitiesRecursive(Object.values(data));\n }\n\n // No entities found\n return [];\n}\n"],"mappings":";;;;;;AAKA,MAAM,wBAAwB,EAAE,OAAO;CACrC,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;EACb,IAAI,EAAE,OAAO;EACb,cAAc,EAAE,OAAO;EACvB,gBAAgB,EAAE,OAAO;CAC3B,CAAC;CACD,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE;CAC5B,YAAY,EAAE,OAAO;AACvB,CAAC;;;;AAUD,SAAgB,kBAAkB,MAAwC;CACxE,IAAI;EAEF,sBAAsB,MAAM,IAAI;EAChC,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;AC5BA,MAAa,YAAY,iBAAiB,OAAO,SAAS,SAAS;CAGjE,MAAM,WAAW,sBADH,OAAO,OAAO,QAAQ,KACO,CAAC,CAAC,CAAC,KAAK,WAAW,OAAO,IAAI;CAEzE,MAAM,WAAW,MAAM,KAAK;CAE5B,IAAI,CADgB,SAAS,QAAQ,IAAI,cAC1B,CAAC,EAAE,SAAS,WAAW,GAEpC,OAAO;CAGT,MAAM,OAAO,MAAM,SAAS,KAAK;CAGjC,MAAM,eAAe,KAAK,UAAU,QAAQ;CAC5C,MAAM,UAAU,KAAK,QACnB,WACA,uCAAuC,aAAa,kBACtD;CAEA,OAAO,IAAI,SAAS,SAAS,QAAQ;AACvC,CAAC;;;;AAKD,SAAS,sBAAsB,MAAuC;CAEpE,IAAI,MAAM,QAAQ,IAAI,GACpB,OAAO,KAAK,SAAS,SAAS,sBAAsB,IAAI,CAAC;CAG3D,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM;EAE7C,IAAI,kBAAkB,IAAI,GACxB,OAAO,CAAC,IAAI;EAId,OAAO,sBAAsB,OAAO,OAAO,IAAI,CAAC;CAClD;CAGA,OAAO,CAAC;AACV"}