@farm.js/core 0.1.0-beta.97 → 0.1.0-beta.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/after.cjs.map +1 -0
- package/dist/agent-runtime.cjs +7 -3
- package/dist/agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime.d.mts +2 -2
- package/dist/agent-runtime.d.ts +2 -2
- package/dist/agent-runtime.mjs +2 -1
- package/dist/agent-runtime.mjs.map +1 -1
- package/dist/api/route-manager.cjs.map +1 -0
- package/dist/api/route-manager.d.mts +2 -2
- package/dist/api/route-manager.d.ts +2 -2
- package/dist/api/runtime.cjs.map +1 -0
- package/dist/api.cjs +26 -1
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +3 -3
- package/dist/api.d.ts +3 -3
- package/dist/api.mjs +2 -2
- package/dist/{app-CIOx3LvY.d.ts → app-CGjrKNoN.d.ts} +4 -4
- package/dist/{app-DBd6437H.d.mts → app-DOcLs_iq.d.mts} +4 -4
- package/dist/app-markdown.cjs +21 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +19 -4
- package/dist/app-markdown.d.ts +19 -4
- package/dist/app-markdown.mjs +7 -1
- package/dist/cache.cjs.map +1 -0
- package/dist/{chunk-VMCHLH3Y.mjs → chunk-26BCDVJS.mjs} +19 -1
- package/dist/chunk-26BCDVJS.mjs.map +1 -0
- package/dist/{chunk-FP5Q67FO.mjs → chunk-2HYYZCCI.mjs} +308 -19
- package/dist/chunk-2HYYZCCI.mjs.map +1 -0
- package/dist/{chunk-WKDAA6V2.mjs → chunk-3BTAMIQE.mjs} +100 -41
- package/dist/chunk-3BTAMIQE.mjs.map +1 -0
- package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
- package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
- package/dist/{chunk-YIBV77KZ.mjs → chunk-4WLAVHCY.mjs} +2 -2
- package/dist/{chunk-KDP5ZSWP.mjs → chunk-7PS5NKOM.mjs} +26 -11
- package/dist/chunk-7PS5NKOM.mjs.map +1 -0
- package/dist/{chunk-X4SFHKFH.mjs → chunk-BU65A3LZ.mjs} +10 -6
- package/dist/chunk-BU65A3LZ.mjs.map +1 -0
- package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
- package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
- package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
- package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
- package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
- package/dist/chunk-FDWECN3W.mjs.map +1 -0
- package/dist/chunk-FDWXXTWR.mjs +114 -0
- package/dist/chunk-FDWXXTWR.mjs.map +1 -0
- package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs → chunk-LG4XB6RN.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-LG4XB6RN.mjs.map} +1 -1
- package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
- package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
- package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
- package/dist/{chunk-D7F7YZ7L.mjs → chunk-NCVFPT67.mjs} +100 -40
- package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-NCVFPT67.mjs.map} +1 -1
- package/dist/{chunk-UMUWR5XA.mjs → chunk-PURU7FXR.mjs} +2 -2
- package/dist/{chunk-2SKCXYLB.mjs → chunk-QQCCBMTH.mjs} +60 -6
- package/dist/chunk-QQCCBMTH.mjs.map +1 -0
- package/dist/chunk-RKUPOYQV.mjs +28 -0
- package/dist/chunk-RKUPOYQV.mjs.map +1 -0
- package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
- package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
- package/dist/chunk-UOGX6UNO.mjs.map +1 -0
- package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
- package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
- package/dist/chunk-XWM2C267.mjs.map +1 -0
- package/dist/{chunk-7ZVN3YZI.mjs → chunk-Z5ARESQG.mjs} +43 -1
- package/dist/chunk-Z5ARESQG.mjs.map +1 -0
- package/dist/client/lifecycle.cjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-BqtHoJ9C.d.mts} +91 -3
- package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-DYprkCKN.d.ts} +91 -3
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +2 -2
- package/dist/client-plugins.d.ts +2 -2
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +61 -16
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +5 -5
- package/dist/client.d.ts +5 -5
- package/dist/client.mjs +7 -7
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.mts +2 -2
- package/dist/config.d.ts +2 -2
- package/dist/cron.cjs +48 -12
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.mjs +2 -1
- package/dist/deferred.cjs.map +1 -0
- package/dist/deployment.cjs.map +1 -0
- package/dist/{devtools-XWZX6CCL.mjs → devtools-24N3U5IG.mjs} +9 -7
- package/dist/{devtools-XWZX6CCL.mjs.map → devtools-24N3U5IG.mjs.map} +1 -1
- package/dist/docs.cjs +7 -3
- package/dist/docs.cjs.map +1 -0
- package/dist/docs.mjs +9 -7
- package/dist/env-types.cjs.map +1 -0
- package/dist/env.cjs.map +1 -0
- package/dist/environment/vite.cjs.map +1 -0
- package/dist/environment.cjs.map +1 -0
- package/dist/font.cjs.map +1 -0
- package/dist/headers.cjs.map +1 -0
- package/dist/i18n/client.cjs.map +1 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/server.cjs.map +1 -0
- package/dist/image/server.cjs +99 -40
- package/dist/image/server.cjs.map +1 -0
- package/dist/image/server.d.mts +6 -0
- package/dist/image/server.d.ts +6 -0
- package/dist/image/server.mjs +1 -1
- package/dist/image/sharp.cjs +1 -0
- package/dist/image/sharp.cjs.map +1 -0
- package/dist/image/sharp.d.mts +1 -1
- package/dist/image/sharp.d.ts +1 -1
- package/dist/image/sharp.mjs +1 -1
- package/dist/image/sharp.mjs.map +1 -1
- package/dist/image.cjs.map +1 -0
- package/dist/index.cjs +943 -231
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.mjs +38 -24
- package/dist/index.mjs.map +1 -1
- package/dist/instrumentation.cjs.map +1 -0
- package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
- package/dist/integrations.cjs +168 -5
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.d.mts +2 -2
- package/dist/integrations.d.ts +2 -2
- package/dist/integrations.mjs +10 -3
- package/dist/internal/build-runtime.cjs +745 -139
- package/dist/internal/build-runtime.cjs.map +1 -0
- package/dist/internal/build-runtime.d.mts +4 -4
- package/dist/internal/build-runtime.d.ts +4 -4
- package/dist/internal/build-runtime.mjs +16 -14
- package/dist/internal/client-runtime.cjs +7 -2
- package/dist/internal/client-runtime.cjs.map +1 -0
- package/dist/internal/client-runtime.mjs +8 -3
- package/dist/internal/client-runtime.mjs.map +1 -1
- package/dist/internal/config-runtime.cjs +59 -42
- package/dist/internal/config-runtime.cjs.map +1 -0
- package/dist/internal/config-runtime.d.mts +3 -3
- package/dist/internal/config-runtime.d.ts +3 -3
- package/dist/internal/config-runtime.mjs +8 -6
- package/dist/internal/isolated-boundary.cjs.map +1 -0
- package/dist/internal/metadata-image-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.cjs +52 -5
- package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.d.mts +12 -1
- package/dist/internal/product-telemetry-runtime.d.ts +12 -1
- package/dist/internal/product-telemetry-runtime.mjs +50 -5
- package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
- package/dist/internal/production-node-env.cjs.map +1 -0
- package/dist/internal/production-runtime.cjs +56 -10
- package/dist/internal/production-runtime.cjs.map +1 -0
- package/dist/internal/production-runtime.d.mts +8 -8
- package/dist/internal/production-runtime.d.ts +8 -8
- package/dist/internal/production-runtime.mjs +2 -2
- package/dist/markdown.cjs.map +1 -0
- package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-D2be_0kC.d.ts} +17 -2
- package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-Dw5CrDIZ.d.mts} +17 -2
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +4 -4
- package/dist/middleware.d.ts +4 -4
- package/dist/navigation.cjs.map +1 -0
- package/dist/{nitro-EGRNOB5P.mjs → nitro-YJEP3FWM.mjs} +4 -3
- package/dist/{nitro-EGRNOB5P.mjs.map → nitro-YJEP3FWM.mjs.map} +1 -1
- package/dist/observability.cjs.map +1 -0
- package/dist/plugin.cjs +599 -104
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +2 -2
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.mjs +13 -11
- package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-CTqpD1C8.d.ts} +2 -2
- package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-HNqNZd4D.d.mts} +2 -2
- package/dist/query/client.cjs.map +1 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/parsers.cjs.map +1 -0
- package/dist/query/server.cjs.map +1 -0
- package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-COscpW-i.d.mts} +1 -1
- package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-Z4kSxaT_.d.ts} +1 -1
- package/dist/renderer/react/client.cjs.map +1 -0
- package/dist/renderer/react/server.cjs.map +1 -0
- package/dist/renderer/react/vite.cjs.map +1 -0
- package/dist/renderer-client.cjs +26 -1
- package/dist/renderer-client.cjs.map +1 -0
- package/dist/renderer-client.d.mts +4 -4
- package/dist/renderer-client.d.ts +4 -4
- package/dist/renderer-client.mjs +2 -2
- package/dist/renderer.cjs.map +1 -0
- package/dist/{request-BstWbZ6O.d.ts → request-BEDb2jE9.d.ts} +1 -1
- package/dist/{request-BCNXSXLh.d.mts → request-CbIAqJY9.d.mts} +1 -1
- package/dist/request.cjs.map +1 -0
- package/dist/request.d.mts +3 -3
- package/dist/request.d.ts +3 -3
- package/dist/router.cjs.map +1 -0
- package/dist/routes.cjs.map +1 -0
- package/dist/routes.d.mts +2 -2
- package/dist/routes.d.ts +2 -2
- package/dist/server-action-security.cjs +117 -104
- package/dist/server-action-security.cjs.map +1 -0
- package/dist/server-action-security.mjs +2 -1
- package/dist/server-fn-client.cjs.map +1 -0
- package/dist/server-fn.cjs.map +1 -0
- package/dist/server-fn.mjs +3 -2
- package/dist/server-plugins.cjs.map +1 -0
- package/dist/server-plugins.d.mts +3 -3
- package/dist/server-plugins.d.ts +3 -3
- package/dist/server-query-client.cjs +26 -1
- package/dist/server-query-client.cjs.map +1 -0
- package/dist/server-query-client.mjs +3 -3
- package/dist/server-query.cjs.map +1 -0
- package/dist/server-query.mjs +4 -3
- package/dist/server.cjs +686 -170
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.mts +8 -8
- package/dist/server.d.ts +8 -8
- package/dist/server.mjs +16 -14
- package/dist/server.mjs.map +1 -1
- package/dist/{spa-router-COgu4txb.d.ts → spa-router-CjeQites.d.ts} +1 -1
- package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-FJbNou1a.d.mts} +1 -1
- package/dist/storage.cjs +7 -3
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.mjs +1 -1
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.mts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/testing.mjs +2 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/theme/client.cjs.map +1 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/runtime.cjs.map +1 -0
- package/dist/theme/server.cjs.map +1 -0
- package/dist/{utils-DL2VwDQl.d.mts → utils-BiMJv9Ys.d.mts} +1 -1
- package/dist/{utils-DkU2c_1B.d.ts → utils-BpnKRFv9.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +599 -104
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.mts +2 -2
- package/dist/vite.d.ts +2 -2
- package/dist/vite.mjs +13 -11
- package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
- package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
- package/dist/workflows.cjs +73 -5
- package/dist/workflows.cjs.map +1 -0
- package/dist/workflows.d.mts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.mjs +2 -1
- package/package.json +17 -17
- package/dist/chunk-2SKCXYLB.mjs.map +0 -1
- package/dist/chunk-35NPLKQJ.mjs.map +0 -1
- package/dist/chunk-7ZVN3YZI.mjs.map +0 -1
- package/dist/chunk-AAC66ILR.mjs.map +0 -1
- package/dist/chunk-BZAIS65C.mjs.map +0 -1
- package/dist/chunk-EPDIF432.mjs.map +0 -1
- package/dist/chunk-FP5Q67FO.mjs.map +0 -1
- package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
- package/dist/chunk-KDP5ZSWP.mjs.map +0 -1
- package/dist/chunk-VMCHLH3Y.mjs.map +0 -1
- package/dist/chunk-WKDAA6V2.mjs.map +0 -1
- package/dist/chunk-X4SFHKFH.mjs.map +0 -1
- /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
- /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
- /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-4WLAVHCY.mjs.map} +0 -0
- /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
- /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
- /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-PURU7FXR.mjs.map} +0 -0
- /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
- /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
- /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/island-runtime.ts"],"sourcesContent":["\"use client\";\n\nimport type { FarmIslandStrategy } from \"../island\";\n\nexport interface ScheduleFarmIslandHydrationOptions<T> {\n container: Element;\n strategy?: FarmIslandStrategy | null;\n signal?: AbortSignal;\n hydrate: () => T | Promise<T>;\n}\n\ninterface FarmQueuedClick {\n target?: EventTarget | null;\n}\n\nfunction getPreHydrationClickQueue(): FarmQueuedClick[] | null {\n const windowWithQueue = window as typeof window & {\n __FARM_PREHYDRATION_CLICK_QUEUE__?: FarmQueuedClick[];\n };\n return Array.isArray(windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__)\n ? windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__\n : null;\n}\n\nfunction findQueuedTarget(container: Element): Element | null {\n const queue = getPreHydrationClickQueue();\n if (!queue) return null;\n for (const item of queue) {\n if (item?.target instanceof Element && container.contains(item.target)) return item.target;\n }\n return null;\n}\n\nfunction takeQueuedTargets(container: Element): Element[] {\n const queue = getPreHydrationClickQueue();\n if (!queue) return [];\n\n const targets: Element[] = [];\n for (let index = queue.length - 1; index >= 0; index--) {\n const target = queue[index]?.target;\n if (!(target instanceof Element) || !container.contains(target)) continue;\n queue.splice(index, 1);\n targets.unshift(target);\n }\n return targets;\n}\n\nfunction runWhenIdle(callback: () => void): () => void {\n const windowWithIdleCallback = window as typeof window & {\n requestIdleCallback?: (callback: () => void, options?: { timeout?: number }) => number;\n cancelIdleCallback?: (handle: number) => void;\n };\n\n if (typeof windowWithIdleCallback.requestIdleCallback === \"function\") {\n const handle = windowWithIdleCallback.requestIdleCallback(callback, { timeout: 2_000 });\n return () => windowWithIdleCallback.cancelIdleCallback?.(handle);\n }\n\n const handle = window.setTimeout(callback, 1);\n return () => window.clearTimeout(handle);\n}\n\nfunction replayClick(target: Element): void {\n const clickable = target as Element & { click?: () => void };\n if (typeof clickable.click === \"function\") {\n clickable.click();\n return;\n }\n target.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n}\n\nfunction finishIslandHydration(container: Element, activatingTarget?: Element | null): void {\n const targets = new Set<Element>();\n if (activatingTarget?.isConnected) targets.add(activatingTarget);\n for (const target of takeQueuedTargets(container)) if (target.isConnected) targets.add(target);\n\n if (!container.isConnected) return;\n container.setAttribute(\"data-farm-island-hydrated\", \"true\");\n\n for (const target of targets) {\n window.setTimeout(() => {\n if (\n container.getAttribute(\"data-farm-island-hydrated\") === \"true\" &&\n container.isConnected &&\n target.isConnected &&\n container.contains(target)\n ) {\n replayClick(target);\n }\n }, 0);\n }\n}\n\n/**\n * Defer importing and hydrating a server-rendered client boundary until its\n * configured trigger. The returned promise resolves with the hydration result.\n */\nexport function scheduleFarmIslandHydration<T>({\n container,\n strategy,\n signal,\n hydrate,\n}: ScheduleFarmIslandHydrationOptions<T>): Promise<T | undefined> {\n const resolvedStrategy = strategy ?? \"load\";\n if (signal?.aborted) return Promise.resolve(undefined);\n\n if (resolvedStrategy === \"load\") {\n return Promise.resolve()\n .then(() => (signal?.aborted ? undefined : hydrate()))\n .then((value) => {\n if (signal?.aborted) return undefined;\n finishIslandHydration(container);\n return value;\n });\n }\n\n return new Promise<T | undefined>((resolve, reject) => {\n let started = false;\n let cancelled = false;\n let queuedClickTarget: Element | null = null;\n const triggerCleanups = new Set<() => void>();\n let removeAbortListener: (() => void) | null = null;\n\n const cleanupTriggers = () => {\n for (const dispose of triggerCleanups) dispose();\n triggerCleanups.clear();\n };\n const cleanup = () => {\n cleanupTriggers();\n removeAbortListener?.();\n removeAbortListener = null;\n };\n\n const start = () => {\n if (started || cancelled) return;\n started = true;\n cleanupTriggers();\n Promise.resolve()\n .then(hydrate)\n .then(\n (value) => {\n cleanup();\n if (cancelled || signal?.aborted) return;\n const target = queuedClickTarget;\n queuedClickTarget = null;\n finishIslandHydration(container, target);\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n };\n\n if (signal) {\n const abort = () => {\n cancelled = true;\n cleanup();\n takeQueuedTargets(container);\n resolve(undefined);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n removeAbortListener = () => signal.removeEventListener(\"abort\", abort);\n }\n\n if (resolvedStrategy === \"idle\") {\n triggerCleanups.add(runWhenIdle(start));\n return;\n }\n\n if (resolvedStrategy === \"visible\") {\n if (typeof IntersectionObserver !== \"function\") {\n start();\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) start();\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(container);\n triggerCleanups.add(() => observer.disconnect());\n return;\n }\n\n const queueActivatingClick = (event: MouseEvent) => {\n const target =\n event.target instanceof Element\n ? event.target.closest(\n 'button,[role=\"button\"],input[type=\"button\"],input[type=\"submit\"],input[type=\"reset\"]',\n )\n : null;\n if (\n !target ||\n !container.contains(target) ||\n target.closest(\"a[href]\") ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n queuedClickTarget ??= target;\n event.preventDefault();\n event.stopImmediatePropagation();\n start();\n };\n const activateFromQueuedClick = (event: Event) => {\n const target = (event as CustomEvent<{ target?: EventTarget | null }>).detail?.target;\n if (!(target instanceof Element) || !container.contains(target)) return;\n\n queuedClickTarget ??= target;\n start();\n };\n\n document.addEventListener(\"click\", queueActivatingClick, true);\n triggerCleanups.add(() => document.removeEventListener(\"click\", queueActivatingClick, true));\n document.addEventListener(\"farm:island-interaction\", activateFromQueuedClick);\n triggerCleanups.add(() =>\n document.removeEventListener(\"farm:island-interaction\", activateFromQueuedClick),\n );\n\n const queuedTarget = findQueuedTarget(container);\n if (queuedTarget) {\n queuedClickTarget = queuedTarget;\n start();\n }\n });\n}\n"],"mappings":"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","names":["handle"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/island-runtime.ts"],"sourcesContent":["\"use client\";\n\nimport type { FarmIslandStrategy } from \"../island\";\n\nexport interface ScheduleFarmIslandHydrationOptions<T> {\n container: Element;\n strategy?: FarmIslandStrategy | null;\n signal?: AbortSignal;\n hydrate: () => T | Promise<T>;\n}\n\ninterface FarmQueuedClick {\n target?: EventTarget | null;\n}\n\nfunction getPreHydrationClickQueue(): FarmQueuedClick[] | null {\n const windowWithQueue = window as typeof window & {\n __FARM_PREHYDRATION_CLICK_QUEUE__?: FarmQueuedClick[];\n };\n return Array.isArray(windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__)\n ? windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__\n : null;\n}\n\nfunction findQueuedTarget(container: Element): Element | null {\n const queue = getPreHydrationClickQueue();\n if (!queue) return null;\n for (const item of queue) {\n if (item?.target instanceof Element && container.contains(item.target)) return item.target;\n }\n return null;\n}\n\nfunction takeQueuedTargets(container: Element): Element[] {\n const queue = getPreHydrationClickQueue();\n if (!queue) return [];\n\n const targets: Element[] = [];\n for (let index = queue.length - 1; index >= 0; index--) {\n const target = queue[index]?.target;\n if (!(target instanceof Element) || !container.contains(target)) continue;\n queue.splice(index, 1);\n targets.unshift(target);\n }\n return targets;\n}\n\nfunction runWhenIdle(callback: () => void): () => void {\n const windowWithIdleCallback = window as typeof window & {\n requestIdleCallback?: (callback: () => void, options?: { timeout?: number }) => number;\n cancelIdleCallback?: (handle: number) => void;\n };\n\n if (typeof windowWithIdleCallback.requestIdleCallback === \"function\") {\n const handle = windowWithIdleCallback.requestIdleCallback(callback, { timeout: 2_000 });\n return () => windowWithIdleCallback.cancelIdleCallback?.(handle);\n }\n\n const handle = window.setTimeout(callback, 1);\n return () => window.clearTimeout(handle);\n}\n\nfunction replayClick(target: Element): void {\n const clickable = target as Element & { click?: () => void };\n if (typeof clickable.click === \"function\") {\n clickable.click();\n return;\n }\n target.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n}\n\nfunction finishIslandHydration(container: Element, activatingTarget?: Element | null): void {\n const targets = new Set<Element>();\n if (activatingTarget?.isConnected) targets.add(activatingTarget);\n for (const target of takeQueuedTargets(container)) if (target.isConnected) targets.add(target);\n\n if (!container.isConnected) return;\n container.setAttribute(\"data-farm-island-hydrated\", \"true\");\n\n for (const target of targets) {\n window.setTimeout(() => {\n if (\n container.getAttribute(\"data-farm-island-hydrated\") === \"true\" &&\n container.isConnected &&\n target.isConnected &&\n container.contains(target)\n ) {\n replayClick(target);\n }\n }, 0);\n }\n}\n\n/**\n * Defer importing and hydrating a server-rendered client boundary until its\n * configured trigger. The returned promise resolves with the hydration result.\n */\nexport function scheduleFarmIslandHydration<T>({\n container,\n strategy,\n signal,\n hydrate,\n}: ScheduleFarmIslandHydrationOptions<T>): Promise<T | undefined> {\n const resolvedStrategy = strategy ?? \"load\";\n if (signal?.aborted) return Promise.resolve(undefined);\n\n if (resolvedStrategy === \"load\") {\n return Promise.resolve()\n .then(() => (signal?.aborted ? undefined : hydrate()))\n .then((value) => {\n if (signal?.aborted) return undefined;\n finishIslandHydration(container);\n return value;\n });\n }\n\n return new Promise<T | undefined>((resolve, reject) => {\n let started = false;\n let cancelled = false;\n let queuedClickTarget: Element | null = null;\n const triggerCleanups = new Set<() => void>();\n let removeAbortListener: (() => void) | null = null;\n\n const cleanupTriggers = () => {\n for (const dispose of triggerCleanups) dispose();\n triggerCleanups.clear();\n };\n const cleanup = () => {\n cleanupTriggers();\n removeAbortListener?.();\n removeAbortListener = null;\n };\n\n const start = () => {\n if (started || cancelled) return;\n started = true;\n cleanupTriggers();\n Promise.resolve()\n .then(hydrate)\n .then(\n (value) => {\n cleanup();\n if (cancelled || signal?.aborted) return;\n const target = queuedClickTarget;\n queuedClickTarget = null;\n finishIslandHydration(container, target);\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n };\n\n if (signal) {\n const abort = () => {\n cancelled = true;\n cleanup();\n takeQueuedTargets(container);\n resolve(undefined);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n removeAbortListener = () => signal.removeEventListener(\"abort\", abort);\n }\n\n if (resolvedStrategy === \"idle\") {\n triggerCleanups.add(runWhenIdle(start));\n return;\n }\n\n if (resolvedStrategy === \"visible\") {\n if (typeof IntersectionObserver !== \"function\") {\n start();\n return;\n }\n\n // Isolated boundary markers render with display:contents, so the\n // container itself has no box and can never intersect. Observe its\n // element children instead; with nothing observable, start now.\n const targets =\n container.getClientRects().length > 0 ? [container] : Array.from(container.children);\n if (targets.length === 0) {\n start();\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) start();\n },\n { rootMargin: \"200px\" },\n );\n for (const target of targets) observer.observe(target);\n triggerCleanups.add(() => observer.disconnect());\n return;\n }\n\n const queueActivatingClick = (event: MouseEvent) => {\n const target =\n event.target instanceof Element\n ? event.target.closest(\n 'button,[role=\"button\"],input[type=\"button\"],input[type=\"submit\"],input[type=\"reset\"]',\n )\n : null;\n if (\n !target ||\n !container.contains(target) ||\n target.closest(\"a[href]\") ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n queuedClickTarget ??= target;\n event.preventDefault();\n event.stopImmediatePropagation();\n start();\n };\n const activateFromQueuedClick = (event: Event) => {\n const target = (event as CustomEvent<{ target?: EventTarget | null }>).detail?.target;\n if (!(target instanceof Element) || !container.contains(target)) return;\n\n queuedClickTarget ??= target;\n start();\n };\n\n document.addEventListener(\"click\", queueActivatingClick, true);\n triggerCleanups.add(() => document.removeEventListener(\"click\", queueActivatingClick, true));\n document.addEventListener(\"farm:island-interaction\", activateFromQueuedClick);\n triggerCleanups.add(() =>\n document.removeEventListener(\"farm:island-interaction\", activateFromQueuedClick),\n );\n\n const queuedTarget = findQueuedTarget(container);\n if (queuedTarget) {\n queuedClickTarget = queuedTarget;\n start();\n }\n });\n}\n"],"mappings":"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","names":["handle"]}
|
|
@@ -392,9 +392,13 @@ function getStorage(namespace) {
|
|
|
392
392
|
const namespaced = (0, import_unstorage.prefixStorage)(globalStorage, base);
|
|
393
393
|
return {
|
|
394
394
|
...namespaced,
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
395
|
+
// Scope the wipe to the namespace instead of the whole storage, and keep
|
|
396
|
+
// the caller's base so `clear("sessions")` cannot take unrelated keys with
|
|
397
|
+
// it. Dropping the argument silently widens a targeted clear into a
|
|
398
|
+
// namespace-wide delete.
|
|
399
|
+
async clear(base2, opts) {
|
|
400
|
+
const keys = await namespaced.getKeys(base2);
|
|
401
|
+
await Promise.all(keys.map((key) => namespaced.removeItem(key, opts)));
|
|
398
402
|
}
|
|
399
403
|
};
|
|
400
404
|
}
|
|
@@ -888,6 +892,41 @@ function validateConfigRouteSource(source, field = "Config route source") {
|
|
|
888
892
|
}
|
|
889
893
|
__name(validateConfigRouteSource, "validateConfigRouteSource");
|
|
890
894
|
|
|
895
|
+
// src/request-origin.ts
|
|
896
|
+
function normalizeAllowedOriginPattern(value, label) {
|
|
897
|
+
const pattern = value.trim().toLowerCase();
|
|
898
|
+
if (!pattern) {
|
|
899
|
+
throw new TypeError(`${label} cannot contain empty values`);
|
|
900
|
+
}
|
|
901
|
+
if (pattern.includes("*")) {
|
|
902
|
+
if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
|
|
903
|
+
throw new TypeError(`Invalid ${label} pattern: ${JSON.stringify(value)}`);
|
|
904
|
+
}
|
|
905
|
+
return pattern;
|
|
906
|
+
}
|
|
907
|
+
if (pattern.includes("://")) {
|
|
908
|
+
let parsed;
|
|
909
|
+
try {
|
|
910
|
+
parsed = new URL(pattern);
|
|
911
|
+
} catch {
|
|
912
|
+
throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
|
|
913
|
+
}
|
|
914
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
|
|
915
|
+
throw new TypeError(`${label} must contain origins without paths: ${JSON.stringify(value)}`);
|
|
916
|
+
}
|
|
917
|
+
return parsed.origin;
|
|
918
|
+
}
|
|
919
|
+
if (/[/@?#]/.test(pattern)) {
|
|
920
|
+
throw new TypeError(`${label} must contain origins or hosts: ${JSON.stringify(value)}`);
|
|
921
|
+
}
|
|
922
|
+
try {
|
|
923
|
+
return new URL(`http://${pattern}`).host;
|
|
924
|
+
} catch {
|
|
925
|
+
throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
__name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
|
|
929
|
+
|
|
891
930
|
// src/integration-api.ts
|
|
892
931
|
function defineIntegrationAPIOperation(operation) {
|
|
893
932
|
return {
|
|
@@ -3217,7 +3256,8 @@ function resolveWorkflowsConfig(workflows) {
|
|
|
3217
3256
|
dirs,
|
|
3218
3257
|
route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),
|
|
3219
3258
|
secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,
|
|
3220
|
-
secret: options.secret
|
|
3259
|
+
secret: options.secret,
|
|
3260
|
+
allowUnsecured: options.allowUnsecured === true
|
|
3221
3261
|
};
|
|
3222
3262
|
}
|
|
3223
3263
|
__name(resolveWorkflowsConfig, "resolveWorkflowsConfig");
|
|
@@ -3731,10 +3771,13 @@ function subscribeFarmCacheTask(listener) {
|
|
|
3731
3771
|
__name(subscribeFarmCacheTask, "subscribeFarmCacheTask");
|
|
3732
3772
|
|
|
3733
3773
|
// src/server-action-security.ts
|
|
3774
|
+
var SERVER_ACTION_ALLOWED_ORIGINS_LABEL = "serverActions.allowedOrigins";
|
|
3734
3775
|
var DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1e6;
|
|
3735
3776
|
var SERVER_ACTION_STORAGE_KEY = /* @__PURE__ */ Symbol.for("farm.serverActionStorage");
|
|
3736
3777
|
function resolveServerActionsConfig(config) {
|
|
3737
|
-
const allowedOrigins = (config?.allowedOrigins ?? []).map(
|
|
3778
|
+
const allowedOrigins = (config?.allowedOrigins ?? []).map(
|
|
3779
|
+
(value) => normalizeAllowedOriginPattern(value, SERVER_ACTION_ALLOWED_ORIGINS_LABEL)
|
|
3780
|
+
);
|
|
3738
3781
|
const bodySizeLimit = parseBodySizeLimit(
|
|
3739
3782
|
config?.bodySizeLimit ?? DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT,
|
|
3740
3783
|
"serverActions.bodySizeLimit"
|
|
@@ -3763,43 +3806,6 @@ function getServerActionStorage() {
|
|
|
3763
3806
|
return globalState2[SERVER_ACTION_STORAGE_KEY];
|
|
3764
3807
|
}
|
|
3765
3808
|
__name(getServerActionStorage, "getServerActionStorage");
|
|
3766
|
-
function normalizeAllowedOriginPattern(value) {
|
|
3767
|
-
const pattern = value.trim().toLowerCase();
|
|
3768
|
-
if (!pattern) {
|
|
3769
|
-
throw new TypeError("serverActions.allowedOrigins cannot contain empty values");
|
|
3770
|
-
}
|
|
3771
|
-
if (pattern.includes("*")) {
|
|
3772
|
-
if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
|
|
3773
|
-
throw new TypeError(`Invalid serverActions.allowedOrigins pattern: ${JSON.stringify(value)}`);
|
|
3774
|
-
}
|
|
3775
|
-
return pattern;
|
|
3776
|
-
}
|
|
3777
|
-
if (pattern.includes("://")) {
|
|
3778
|
-
let parsed;
|
|
3779
|
-
try {
|
|
3780
|
-
parsed = new URL(pattern);
|
|
3781
|
-
} catch {
|
|
3782
|
-
throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);
|
|
3783
|
-
}
|
|
3784
|
-
if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
|
|
3785
|
-
throw new TypeError(
|
|
3786
|
-
`serverActions.allowedOrigins must contain origins without paths: ${JSON.stringify(value)}`
|
|
3787
|
-
);
|
|
3788
|
-
}
|
|
3789
|
-
return parsed.origin;
|
|
3790
|
-
}
|
|
3791
|
-
if (/[/@?#]/.test(pattern)) {
|
|
3792
|
-
throw new TypeError(
|
|
3793
|
-
`serverActions.allowedOrigins must contain origins or hosts: ${JSON.stringify(value)}`
|
|
3794
|
-
);
|
|
3795
|
-
}
|
|
3796
|
-
try {
|
|
3797
|
-
return new URL(`http://${pattern}`).host;
|
|
3798
|
-
} catch {
|
|
3799
|
-
throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);
|
|
3800
|
-
}
|
|
3801
|
-
}
|
|
3802
|
-
__name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
|
|
3803
3809
|
|
|
3804
3810
|
// src/layers.ts
|
|
3805
3811
|
var import_node_fs = require("fs");
|
|
@@ -4912,6 +4918,14 @@ function normalizeCookiePath2(basePath) {
|
|
|
4912
4918
|
}
|
|
4913
4919
|
__name(normalizeCookiePath2, "normalizeCookiePath");
|
|
4914
4920
|
|
|
4921
|
+
// src/agent-config.ts
|
|
4922
|
+
function resolveFarmAgentConfig(input) {
|
|
4923
|
+
const jsonLd = input?.jsonLd;
|
|
4924
|
+
if (!jsonLd) return { jsonLd: false };
|
|
4925
|
+
return { jsonLd: jsonLd === true ? {} : jsonLd };
|
|
4926
|
+
}
|
|
4927
|
+
__name(resolveFarmAgentConfig, "resolveFarmAgentConfig");
|
|
4928
|
+
|
|
4915
4929
|
// src/renderer.ts
|
|
4916
4930
|
var import_node_module3 = require("module");
|
|
4917
4931
|
var import_node_path5 = __toESM(require("path"));
|
|
@@ -5593,6 +5607,7 @@ async function resolveConfig(userConfig, mode) {
|
|
|
5593
5607
|
const openapi = {
|
|
5594
5608
|
enabled: false,
|
|
5595
5609
|
route: "/docs/reference",
|
|
5610
|
+
specRoute: "/openapi.json",
|
|
5596
5611
|
title: "API Documentation",
|
|
5597
5612
|
description: "Auto-generated API documentation",
|
|
5598
5613
|
version: "1.0.0",
|
|
@@ -5600,6 +5615,7 @@ async function resolveConfig(userConfig, mode) {
|
|
|
5600
5615
|
...userConfig.openapi
|
|
5601
5616
|
};
|
|
5602
5617
|
if (openapi.route !== void 0) validateConfigRouteSource(openapi.route, "openapi.route");
|
|
5618
|
+
if (openapi.specRoute) validateConfigRouteSource(openapi.specRoute, "openapi.specRoute");
|
|
5603
5619
|
const resolved = {
|
|
5604
5620
|
[FARM_RESOLVED_CUSTOM_CONTEXT]: typeof userConfig.context === "function",
|
|
5605
5621
|
root,
|
|
@@ -5632,6 +5648,7 @@ async function resolveConfig(userConfig, mode) {
|
|
|
5632
5648
|
ppr: false,
|
|
5633
5649
|
...userConfig.experimental
|
|
5634
5650
|
},
|
|
5651
|
+
agent: resolveFarmAgentConfig(userConfig.agent),
|
|
5635
5652
|
plugins: [...resolveIntegrationPlugins(integrations), ...userConfig.plugins || []],
|
|
5636
5653
|
integrations,
|
|
5637
5654
|
trailingSlash: userConfig.trailingSlash ?? false,
|