@farm.js/core 0.1.50 → 0.1.51-beta.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.
- package/README.md +163 -3
- package/dist/{agent-mcp-9BMbRgg_.d.ts → agent-mcp-BBMfNpsC.d.ts} +1 -1
- package/dist/{agent-mcp-CIMH324y.d.mts → agent-mcp-D44ip11f.d.mts} +1 -1
- package/dist/agent-runtime.d.mts +1 -1
- package/dist/agent-runtime.d.ts +1 -1
- package/dist/{analyzer-DDW34OMC.mjs → analyzer-HOUCQR3K.mjs} +1 -1
- package/dist/{analyzer-CN7C74WX.cjs → analyzer-VKUDHNDF.cjs} +2 -2
- package/dist/api/route-manager.cjs +5 -5
- package/dist/api/route-manager.d.mts +3 -3
- package/dist/api/route-manager.d.ts +3 -3
- package/dist/api/route-manager.mjs +4 -4
- package/dist/api/runtime.d.mts +2 -2
- package/dist/api/runtime.d.ts +2 -2
- package/dist/api.cjs +6 -6
- package/dist/api.d.mts +3 -3
- package/dist/api.d.ts +3 -3
- package/dist/api.mjs +5 -5
- package/dist/{app-BWibTHVT.d.ts → app-CourU3rQ.d.ts} +4 -4
- package/dist/{app-DVJ13FPA.d.mts → app-aeD4s_mg.d.mts} +4 -4
- package/dist/{app-manifest-CQDJOKL2.d.mts → app-manifest-BC6mFn5A.d.mts} +1 -1
- package/dist/{app-manifest-D0kaXdwu.d.ts → app-manifest-LzjoNPeq.d.ts} +1 -1
- package/dist/app-markdown.d.mts +2 -2
- package/dist/app-markdown.d.ts +2 -2
- package/dist/base-path-BOUV5ozD.d.mts +10 -0
- package/dist/base-path-BOUV5ozD.d.ts +10 -0
- package/dist/{chunk-RWT2BTJT.cjs → chunk-2IAPKPEB.cjs} +6 -6
- package/dist/{chunk-2G63BIRL.mjs → chunk-2KVDHNQS.mjs} +8 -11
- package/dist/{chunk-76R5GJER.mjs → chunk-3HA7PP72.mjs} +2 -2
- package/dist/{chunk-NJVFPJ2Y.cjs → chunk-3OWVWZ6R.cjs} +28 -2
- package/dist/{chunk-KO2NWUKN.mjs → chunk-4GJJ65RB.mjs} +9 -1
- package/dist/{chunk-GERUXONA.cjs → chunk-5A77OEIG.cjs} +4 -1
- package/dist/{chunk-4HBKBHVP.mjs → chunk-5ENW27SL.mjs} +1 -1
- package/dist/{chunk-MTB57GOK.mjs → chunk-724WT3NI.mjs} +4 -2
- package/dist/{chunk-VCKGOXFI.cjs → chunk-76GHW3WI.cjs} +7 -1
- package/dist/{chunk-ZIBIE7AH.mjs → chunk-7UPCJDB5.mjs} +7 -1
- package/dist/{chunk-CPXDDWGL.mjs → chunk-AER5I65K.mjs} +1 -1
- package/dist/{chunk-WB6XES4V.mjs → chunk-ALEUMLJN.mjs} +34 -5
- package/dist/{chunk-WVBUXNBX.mjs → chunk-AMRK3P6W.mjs} +123 -47
- package/dist/{chunk-L6QDME5Z.cjs → chunk-B3GZAQSC.cjs} +3 -3
- package/dist/chunk-CKPTIEDX.cjs +12 -0
- package/dist/{chunk-B5S2JS6M.cjs → chunk-DWW3AMJX.cjs} +288 -255
- package/dist/{chunk-EQMTJBB7.cjs → chunk-DZZHTMWM.cjs} +35 -6
- package/dist/{chunk-3ATXWZPH.cjs → chunk-E36C43IX.cjs} +13 -16
- package/dist/{chunk-J2ZEVDEK.cjs → chunk-EHB77D5U.cjs} +3 -3
- package/dist/{chunk-WQGRD5BJ.cjs → chunk-EX6ZSN5P.cjs} +1 -16
- package/dist/{chunk-474FO3UE.cjs → chunk-F42U3R4F.cjs} +170 -163
- package/dist/{chunk-6QA2SXVH.cjs → chunk-FK25QSVC.cjs} +2 -1
- package/dist/{chunk-BW6SCVYX.mjs → chunk-FSQMN2MQ.mjs} +1 -0
- package/dist/{chunk-2H3FJYY6.mjs → chunk-FSXSQQTV.mjs} +3 -2
- package/dist/chunk-GNZIAJGB.mjs +358 -0
- package/dist/{chunk-TXK4D46O.mjs → chunk-H3ASZDT7.mjs} +21 -1
- package/dist/{chunk-B6PREBN6.cjs → chunk-HASX6DC7.cjs} +8 -8
- package/dist/{chunk-ZLOQQ2UF.mjs → chunk-I2ZA5SXS.mjs} +60 -27
- package/dist/{chunk-X2EL3BLH.cjs → chunk-IOUOGRDX.cjs} +11 -3
- package/dist/{chunk-CBJKDB6F.mjs → chunk-IRSS4HS4.mjs} +1 -1
- package/dist/{chunk-GOOK2J2W.cjs → chunk-J22JD5YJ.cjs} +2 -2
- package/dist/{chunk-2DEPNLXK.mjs → chunk-JF5CNHHF.mjs} +4 -4
- package/dist/{chunk-VOZ5DI7D.mjs → chunk-JWI5PUO2.mjs} +6 -2
- package/dist/{chunk-YAXOEAND.cjs → chunk-KHXAJ2KA.cjs} +6 -6
- package/dist/{chunk-WXHDVXJE.mjs → chunk-KY32FWK7.mjs} +2 -2
- package/dist/{chunk-EQWWOQTK.cjs → chunk-LEIXUFJN.cjs} +6 -2
- package/dist/{chunk-2GLQSIZD.mjs → chunk-LMFJCXDD.mjs} +1 -1
- package/dist/{chunk-IXSMFKZ2.cjs → chunk-LNM57D3H.cjs} +4 -4
- package/dist/{chunk-5V4KZOZO.mjs → chunk-LZ4SB57H.mjs} +2 -2
- package/dist/{chunk-E2BMCNMJ.cjs → chunk-MMEEXMUQ.cjs} +2 -2
- package/dist/chunk-N4AQNEXR.cjs +17 -0
- package/dist/{chunk-JZMZKABS.cjs → chunk-NWUHS6GV.cjs} +3 -2
- package/dist/{chunk-LYWAGXXW.cjs → chunk-O3MMJPC2.cjs} +12 -12
- package/dist/{chunk-FACTMUPI.cjs → chunk-PDJSL7PL.cjs} +30 -19
- package/dist/{chunk-XLLVWLWO.mjs → chunk-PIHKO25G.mjs} +1 -1
- package/dist/chunk-PIUTGRDI.cjs +358 -0
- package/dist/{chunk-KGP76FSV.mjs → chunk-PPDHCRTC.mjs} +1 -1
- package/dist/{chunk-C73RIAEF.mjs → chunk-QI5AQMEE.mjs} +17 -6
- package/dist/{chunk-F5LERVY3.cjs → chunk-QK3HBOTG.cjs} +10 -10
- package/dist/{chunk-Q3UU2KXC.mjs → chunk-QMDU6QHN.mjs} +4 -1
- package/dist/{chunk-JJOWY3XD.mjs → chunk-R5P4KFPM.mjs} +1 -1
- package/dist/{chunk-IWJKJDNW.mjs → chunk-S5ZA2T2W.mjs} +35 -28
- package/dist/{chunk-PXEXOQ5R.mjs → chunk-SHS6KXOZ.mjs} +1 -1
- package/dist/{chunk-ETF5C6HR.cjs → chunk-SJ23LJ3N.cjs} +3 -3
- package/dist/{chunk-KZH6YLND.cjs → chunk-SO3T6T4I.cjs} +427 -351
- package/dist/{chunk-JHXJBNLY.cjs → chunk-SUCDVKUB.cjs} +21 -1
- package/dist/{chunk-7ONZDKVY.mjs → chunk-T4EW7AAD.mjs} +2 -2
- package/dist/{chunk-UY6HS5PF.cjs → chunk-USL2ANCB.cjs} +8 -8
- package/dist/{chunk-4T25YCZ5.cjs → chunk-VIFPE5RG.cjs} +14 -14
- package/dist/{chunk-HYN3LLG7.cjs → chunk-VO6NLTV4.cjs} +3 -3
- package/dist/{chunk-XN2MB4QZ.cjs → chunk-VQJYGZNX.cjs} +4 -4
- package/dist/{chunk-5PKDHKQP.cjs → chunk-WFVSAT7Y.cjs} +6 -4
- package/dist/{chunk-X3HOVNHI.mjs → chunk-WSY2JD7O.mjs} +6 -6
- package/dist/{chunk-SHJJM6OG.mjs → chunk-WVX3BUNJ.mjs} +1 -1
- package/dist/chunk-X3EFRVXY.mjs +12 -0
- package/dist/{chunk-UCQ52TJY.mjs → chunk-X3JNB2TB.mjs} +1 -1
- package/dist/{chunk-RHOR2J6V.cjs → chunk-X5BCMLGP.cjs} +1 -1
- package/dist/{chunk-IQXGHGZF.cjs → chunk-XB24LZWI.cjs} +5 -5
- package/dist/{chunk-BNMHXVLL.mjs → chunk-XMHERKSE.mjs} +0 -15
- package/dist/{chunk-CGCJ2TJU.cjs → chunk-XPMC4E2G.cjs} +3 -3
- package/dist/{chunk-HWCHIBJZ.mjs → chunk-XWC5NAHV.mjs} +4 -4
- package/dist/{chunk-C7425KDG.cjs → chunk-XYL4HSVC.cjs} +2 -2
- package/dist/{chunk-2SVJGOAX.mjs → chunk-Y3N5BFRJ.mjs} +3 -3
- package/dist/{chunk-IUBDMDZZ.cjs → chunk-Y7TLL65B.cjs} +4 -4
- package/dist/{chunk-M7LKA632.mjs → chunk-YLNBWUVS.mjs} +1 -1
- package/dist/chunk-Z5A6CNV2.mjs +60 -0
- package/dist/chunk-Z64V4WZI.mjs +17 -0
- package/dist/{chunk-2VCC3GVC.mjs → chunk-ZF3GX4O7.mjs} +1 -1
- package/dist/{client-plugins-BPfltM5m.d.ts → client-plugins-CFBEfVPO.d.ts} +20 -3
- package/dist/{client-plugins-D4RO59f0.d.mts → client-plugins-cqy_dQd0.d.mts} +20 -3
- package/dist/client-plugins.d.mts +1 -1
- package/dist/client-plugins.d.ts +1 -1
- package/dist/client.cjs +5 -4
- package/dist/client.d.mts +6 -6
- package/dist/client.d.ts +6 -6
- package/dist/client.mjs +4 -3
- package/dist/config.d.mts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/cron.cjs +4 -4
- package/dist/cron.mjs +3 -3
- package/dist/desktop.d.mts +2 -2
- package/dist/desktop.d.ts +2 -2
- package/dist/{devtools-STG7HPRV.mjs → devtools-4MLL3RAL.mjs} +6 -6
- package/dist/{devtools-N5XTOECL.cjs → devtools-4ZLMD454.cjs} +8 -8
- package/dist/docs.cjs +10 -10
- package/dist/docs.d.mts +2 -2
- package/dist/docs.d.ts +2 -2
- package/dist/docs.mjs +9 -9
- package/dist/{index-k8o8eUOd.d.mts → index-BYkNbeQV.d.mts} +1 -1
- package/dist/{index-C-N3Pwg-.d.ts → index-BxjN_UDZ.d.ts} +1 -1
- package/dist/index.cjs +42 -40
- package/dist/index.d.mts +16 -16
- package/dist/index.d.ts +16 -16
- package/dist/index.mjs +41 -39
- package/dist/integrations.d.mts +1 -1
- package/dist/integrations.d.ts +1 -1
- package/dist/internal/app-markdown-runtime.d.mts +2 -2
- package/dist/internal/app-markdown-runtime.d.ts +2 -2
- package/dist/internal/build-runtime.cjs +32 -31
- package/dist/internal/build-runtime.d.mts +3 -3
- package/dist/internal/build-runtime.d.ts +3 -3
- package/dist/internal/build-runtime.mjs +31 -30
- package/dist/internal/cli-runtime.cjs +15 -15
- package/dist/internal/cli-runtime.mjs +14 -14
- package/dist/internal/client-error-overlay.cjs +4 -4
- package/dist/internal/client-error-overlay.mjs +1 -1
- package/dist/internal/client-runtime.cjs +4 -2
- package/dist/internal/client-runtime.d.mts +5 -5
- package/dist/internal/client-runtime.d.ts +5 -5
- package/dist/internal/client-runtime.mjs +3 -1
- package/dist/internal/compression-runtime.d.mts +1 -1
- package/dist/internal/compression-runtime.d.ts +1 -1
- package/dist/internal/config-runtime.cjs +8 -8
- package/dist/internal/config-runtime.d.mts +3 -3
- package/dist/internal/config-runtime.d.ts +3 -3
- package/dist/internal/config-runtime.mjs +7 -7
- package/dist/internal/form-actions.cjs +4 -3
- package/dist/internal/form-actions.mjs +3 -2
- package/dist/internal/infra-analytics-runtime.cjs +5 -5
- package/dist/internal/infra-analytics-runtime.mjs +3 -3
- package/dist/internal/islands-runtime.cjs +56 -0
- package/dist/internal/islands-runtime.mjs +57 -1
- package/dist/internal/product-telemetry-runtime.cjs +2 -2
- package/dist/internal/product-telemetry-runtime.mjs +1 -1
- package/dist/internal/production-runtime.cjs +11 -8
- package/dist/internal/production-runtime.d.mts +24 -11
- package/dist/internal/production-runtime.d.ts +24 -11
- package/dist/internal/production-runtime.mjs +10 -7
- package/dist/internal/server-fn-transform.cjs +13 -0
- package/dist/internal/server-fn-transform.d.mts +24 -0
- package/dist/internal/server-fn-transform.d.ts +24 -0
- package/dist/internal/server-fn-transform.mjs +13 -0
- package/dist/markdown.d.mts +1 -1
- package/dist/markdown.d.ts +1 -1
- package/dist/middleware.cjs +7 -7
- package/dist/middleware.d.mts +3 -3
- package/dist/middleware.d.ts +3 -3
- package/dist/middleware.mjs +6 -6
- package/dist/mobile.d.mts +30 -3
- package/dist/mobile.d.ts +30 -3
- package/dist/{navigation-delegate-8xg3Zvp4.d.ts → navigation-delegate-BU4xqdnw.d.ts} +1 -1
- package/dist/{navigation-delegate-ji6elCKy.d.mts → navigation-delegate-DLhbfEN4.d.mts} +1 -1
- package/dist/navigation.d.mts +4 -4
- package/dist/navigation.d.ts +4 -4
- package/dist/{nitro-YPSZBYDK.cjs → nitro-CK7M4RMY.cjs} +11 -11
- package/dist/{nitro-2Q5NVY7L.mjs → nitro-R444AF3O.mjs} +7 -7
- package/dist/plugin.cjs +25 -23
- package/dist/plugin.d.mts +3 -3
- package/dist/plugin.d.ts +3 -3
- package/dist/plugin.mjs +24 -22
- package/dist/{production-runtime-TdKaYRj0.d.ts → production-runtime-C78A8YgK.d.ts} +1 -1
- package/dist/{production-runtime-DXnQQkQf.d.mts → production-runtime-DLA4J5WG.d.mts} +1 -1
- package/dist/{programmatic-routes-client-BwiTndEC.d.ts → programmatic-routes-client-CBqkNhBy.d.ts} +2 -2
- package/dist/{programmatic-routes-client-Dh1SDLSM.d.mts → programmatic-routes-client-NpqGBn-i.d.mts} +2 -2
- package/dist/{render-plan-BvCGXF6K.d.mts → render-plan-C9sWvDTv.d.mts} +1 -1
- package/dist/{render-plan-BPbwRbuN.d.ts → render-plan-CrqcBbnV.d.ts} +1 -1
- package/dist/renderer-client.cjs +8 -6
- package/dist/renderer-client.d.mts +4 -4
- package/dist/renderer-client.d.ts +4 -4
- package/dist/renderer-client.mjs +4 -2
- package/dist/{request-B8PGTZNR.d.ts → request-BizeuqD7.d.ts} +1 -1
- package/dist/{request-C_xTkJib.d.mts → request-WwB1-Uim.d.mts} +1 -1
- package/dist/request.d.mts +2 -2
- package/dist/request.d.ts +2 -2
- package/dist/{route-rendering-RNtcj607.d.ts → route-rendering-BGhJN64l.d.ts} +1 -1
- package/dist/{route-rendering-DlddURL1.d.mts → route-rendering-S6NFjnx4.d.mts} +1 -1
- package/dist/{router-B97eB0Mq.d.mts → router-BIheIy9G.d.mts} +1 -1
- package/dist/{router-qUVaoEN8.d.ts → router-BUD_j2EL.d.ts} +1 -1
- package/dist/routes.cjs +3 -2
- package/dist/routes.d.mts +2 -2
- package/dist/routes.d.ts +2 -2
- package/dist/routes.mjs +2 -1
- package/dist/{rsc-pipeline-L4XOZ2TE.cjs → rsc-pipeline-JRGUZBYM.cjs} +11 -11
- package/dist/{rsc-pipeline-T3775JUA.mjs → rsc-pipeline-OLAVIKI3.mjs} +10 -10
- package/dist/{runtime-C8GUnNeP.d.ts → runtime-CWP-21hP.d.ts} +1 -1
- package/dist/{runtime-CaDswfWi.d.mts → runtime-CgJwe6H_.d.mts} +1 -1
- package/dist/{runtime-BIBGJO7V.cjs → runtime-G23RSLEK.cjs} +14 -14
- package/dist/{runtime-HRSFC4ZC.mjs → runtime-OGCHDACZ.mjs} +12 -12
- package/dist/{schema-dev-notice-LZ5NXGLN.mjs → schema-dev-notice-F6QYSOAI.mjs} +2 -2
- package/dist/{schema-dev-notice-XV7GZ3QJ.cjs → schema-dev-notice-UU7DMZEU.cjs} +3 -3
- package/dist/{search-client-BTXL5XWD.mjs → search-client-OXH6GBNO.mjs} +5 -3
- package/dist/search-client-ZZLKVO5R.cjs +15 -0
- package/dist/server-action-security.cjs +2 -2
- package/dist/server-action-security.mjs +1 -1
- package/dist/server-fn.cjs +3 -3
- package/dist/server-fn.mjs +2 -2
- package/dist/server-plugins.d.mts +2 -2
- package/dist/server-plugins.d.ts +2 -2
- package/dist/server-query-client.cjs +4 -3
- package/dist/server-query-client.mjs +3 -2
- package/dist/server-query.cjs +4 -4
- package/dist/server-query.mjs +3 -3
- package/dist/server.cjs +57 -55
- package/dist/server.d.mts +9 -9
- package/dist/server.d.ts +9 -9
- package/dist/server.mjs +34 -32
- package/dist/{spa-router-Dlv5ofg0.d.mts → spa-router-CVOL0Vrq.d.mts} +2 -2
- package/dist/{spa-router-qapSboKz.d.ts → spa-router-Kytv4jSB.d.ts} +2 -2
- package/dist/testing.cjs +12 -11
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.mjs +9 -8
- package/dist/{utils-A-cYF81u.d.ts → utils-DbyXlzaj.d.ts} +1 -1
- package/dist/{utils-DyvlSxFk.d.mts → utils-Dsa1HZ7X.d.mts} +1 -1
- package/dist/version.cjs +2 -2
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +25 -23
- package/dist/vite.d.mts +4 -4
- package/dist/vite.d.ts +4 -4
- package/dist/vite.mjs +24 -22
- package/dist/workflows.cjs +4 -4
- package/dist/workflows.mjs +3 -3
- package/package.json +8 -3
- package/dist/base-path-leyrqXbX.d.mts +0 -19
- package/dist/base-path-leyrqXbX.d.ts +0 -19
- package/dist/chunk-OTOOJIUB.mjs +0 -34
- package/dist/search-client-QCYAL6AY.cjs +0 -13
|
@@ -382,4 +382,5 @@ function throwIfAborted(signal) {
|
|
|
382
382
|
|
|
383
383
|
|
|
384
384
|
|
|
385
|
-
|
|
385
|
+
|
|
386
|
+
exports.FARM_SERVER_FN_FAILURE_SYMBOL = FARM_SERVER_FN_FAILURE_SYMBOL; exports.ServerFnFailure = ServerFnFailure; exports.ServerActionError = ServerActionError; exports.isServerFnFailure = isServerFnFailure; exports.serializeServerFnFailure = serializeServerFnFailure; exports.createServerFnTransportError = createServerFnTransportError; exports.DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT; exports.ServerActionRequestError = ServerActionRequestError; exports.resolveServerActionsConfig = resolveServerActionsConfig; exports.validateServerActionRequest = validateServerActionRequest; exports.prepareServerActionRequest = prepareServerActionRequest; exports.createServerActionRequestErrorResponse = createServerActionRequestErrorResponse; exports.sanitizeServerActionError = sanitizeServerActionError; exports.runWithServerActionRequest = runWithServerActionRequest; exports.getServerActionExecutionContext = getServerActionExecutionContext; exports.getServerActionSignal = getServerActionSignal; exports.getServerActionInvalidations = getServerActionInvalidations;
|
|
@@ -52,10 +52,11 @@ async function findProgrammaticRouteSourceFiles(srcRoot) {
|
|
|
52
52
|
return [];
|
|
53
53
|
}
|
|
54
54
|
try {
|
|
55
|
-
const glob = await import("
|
|
56
|
-
return await glob
|
|
55
|
+
const { glob } = await import("tinyglobby");
|
|
56
|
+
return await glob("**/*.{ts,tsx,js,jsx}", {
|
|
57
57
|
cwd: srcRoot,
|
|
58
58
|
absolute: true,
|
|
59
|
+
expandDirectories: false,
|
|
59
60
|
ignore: [
|
|
60
61
|
"**/*.d.ts",
|
|
61
62
|
"**/node_modules/**",
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
// src/server-fn-transform.ts
|
|
2
|
+
var SERVER_FUNCTION_FACTORY_IMPORT_RE = /\bimport\s+(?:type\s+)?(?:[A-Za-z_$][\w$]*\s*,\s*)?(\{[^}]*\})\s+from\s*["']@farm.js\/core(?:\/(?:server-fn|server-query))?["']\s*;?/g;
|
|
3
|
+
var EXPORT_SERVER_FUNCTION_FACTORY_RE = /\bexport\s+(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*([A-Za-z_$][\w$]*)\s*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>)?\s*\(/g;
|
|
4
|
+
var EXPORT_DEFAULT_SERVER_FUNCTION_FACTORY_RE = /\bexport\s+default\s+([A-Za-z_$][\w$]*)\s*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>)?\s*\(/g;
|
|
5
|
+
var SERVER_FUNCTION_DECLARATION_RE = /(?<![.\w$])([A-Za-z_$][\w$]*)\s*=\s*([A-Za-z_$][\w$]*)\s*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>)?\s*\(/g;
|
|
6
|
+
var LOCAL_EXPORT_CLAUSE_RE = /\bexport\s*\{([^}]*)\}/g;
|
|
7
|
+
var EXPORT_DEFAULT_ALIAS_RE = /\bexport\s+default\s+([A-Za-z_$][\w$]*)\s*(?:;|(?=[\r\n])|$)/g;
|
|
8
|
+
var EXPORT_BINDING_ALIAS_RE = /\bexport\s+(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*([A-Za-z_$][\w$]*)\s*(?:;|(?=[,\r\n])|$)/g;
|
|
9
|
+
var MODULE_EXT_RE = /\.[cm]?[jt]sx?$/;
|
|
10
|
+
var DECLARATION_RE = /(^|\n)\s*["']([^"']+)["']\s*;?/g;
|
|
11
|
+
var FARM_SERVER_FN_BOUNDARY_QUERY = "?farm-server-fns";
|
|
12
|
+
function transformFarmServerFns(code, id, options = {}) {
|
|
13
|
+
const analysis = analyzeServerFnModule(code, id);
|
|
14
|
+
if (!analysis) return null;
|
|
15
|
+
const { replacements } = analysis;
|
|
16
|
+
const exports = replacements.map((replacement) => replacement.exportName);
|
|
17
|
+
if (hasModuleDirective(code, "use server")) {
|
|
18
|
+
return { code: applyReplacements(code, replacements, "wrapper"), exports };
|
|
19
|
+
}
|
|
20
|
+
const boundaryId = JSON.stringify(serverFnBoundaryId(id));
|
|
21
|
+
if (options.environment !== void 0 && options.environment !== "rsc") {
|
|
22
|
+
return {
|
|
23
|
+
code: `export { ${exports.join(", ")} } from ${boundaryId};
|
|
24
|
+
`,
|
|
25
|
+
exports
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const imports = replacements.map(
|
|
29
|
+
(replacement) => replacement.exportName === "default" ? "default as $$farm_server_fn_boundary_default" : replacement.exportName
|
|
30
|
+
);
|
|
31
|
+
const reExports = replacements.map(
|
|
32
|
+
(replacement) => replacement.exportName === "default" ? "$$farm_server_fn_boundary_default as default" : replacement.exportName
|
|
33
|
+
);
|
|
34
|
+
const privateNames = replacements.map((replacement) => replacement.privateName);
|
|
35
|
+
return {
|
|
36
|
+
code: applyReplacements(code, replacements, "private") + `
|
|
37
|
+
import { ${imports.join(", ")} } from ${boundaryId};
|
|
38
|
+
export { ${[...reExports, ...privateNames].join(", ")} };
|
|
39
|
+
`,
|
|
40
|
+
exports
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function createFarmServerFnBoundaryModule(code, id) {
|
|
44
|
+
if (hasModuleDirective(code, "use server")) return null;
|
|
45
|
+
const analysis = analyzeServerFnModule(code, id);
|
|
46
|
+
if (!analysis) return null;
|
|
47
|
+
const sourceId = JSON.stringify(id.split("?", 1)[0].replace(/\\/g, "/"));
|
|
48
|
+
const privateNames = analysis.replacements.map((replacement) => replacement.privateName);
|
|
49
|
+
let output = `"use server";
|
|
50
|
+
import { ${privateNames.join(", ")} } from ${sourceId};
|
|
51
|
+
`;
|
|
52
|
+
for (const replacement of analysis.replacements) {
|
|
53
|
+
const declaration = replacement.exportName === "default" ? "export default async function" : "export async function";
|
|
54
|
+
output += `${declaration} ${replacement.wrapperName}(input) {
|
|
55
|
+
return ${replacement.privateName}(input);
|
|
56
|
+
}
|
|
57
|
+
${copyServerFunctionDescriptor(replacement.wrapperName, replacement.privateName, true)}
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
return output;
|
|
61
|
+
}
|
|
62
|
+
function isFarmServerFnBoundaryId(id) {
|
|
63
|
+
return /[?&]farm-server-fns(?:&|$)/.test(id);
|
|
64
|
+
}
|
|
65
|
+
function serverFnBoundaryId(id) {
|
|
66
|
+
return `${id.split("?", 1)[0].replace(/\\/g, "/")}${FARM_SERVER_FN_BOUNDARY_QUERY}`;
|
|
67
|
+
}
|
|
68
|
+
function applyReplacements(code, replacements, mode) {
|
|
69
|
+
let output = code;
|
|
70
|
+
for (const replacement of [...replacements].sort((a, b) => b.start - a.start)) {
|
|
71
|
+
const declaration = `const ${replacement.privateName} = ${replacement.callExpression};
|
|
72
|
+
`;
|
|
73
|
+
const wrapper = mode === "private" ? "" : `${replacement.exportName === "default" ? "export default async function" : "export async function"} ${replacement.wrapperName}(input) {
|
|
74
|
+
return ${replacement.privateName}(input);
|
|
75
|
+
}
|
|
76
|
+
${copyServerFunctionDescriptor(replacement.wrapperName, replacement.privateName, false)}`;
|
|
77
|
+
output = output.slice(0, replacement.start) + declaration + wrapper + output.slice(replacement.end);
|
|
78
|
+
}
|
|
79
|
+
return output;
|
|
80
|
+
}
|
|
81
|
+
function analyzeServerFnModule(code, id) {
|
|
82
|
+
if (!isTransformableModule(id) || !code.includes("createServerFn") && !code.includes("createServerQuery")) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const factoryNames = findServerFunctionFactoryImportNames(code);
|
|
86
|
+
if (factoryNames.size === 0) return null;
|
|
87
|
+
const reExport = findServerFnReExport(code, factoryNames);
|
|
88
|
+
if (reExport) {
|
|
89
|
+
const factoryName = reExport.factory === "fn" ? "createServerFn" : "createServerQuery";
|
|
90
|
+
const escape = reExport.form === "clause" ? "with an export clause" : reExport.form === "default" ? "as the default export" : "through another exported binding";
|
|
91
|
+
const inlineForm = reExport.form === "default" ? `export default ${factoryName}(...)` : `export const ${reExport.exportName} = ${factoryName}(...)`;
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Server function "${reExport.localName}" cannot be re-exported ${escape}. Export it inline instead: ${inlineForm}.`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
const replacements = findServerFnExportReplacements(code, factoryNames);
|
|
97
|
+
if (replacements.length === 0) return null;
|
|
98
|
+
if (hasModuleDirective(code, "use client")) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
"createServerFn and createServerQuery exports must live in a server module. Move them out of the 'use client' file."
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return { replacements };
|
|
104
|
+
}
|
|
105
|
+
function isTransformableModule(id) {
|
|
106
|
+
const cleanId = id.split("?", 1)[0];
|
|
107
|
+
return MODULE_EXT_RE.test(cleanId) && !/\.d\.[cm]?ts$/.test(cleanId);
|
|
108
|
+
}
|
|
109
|
+
function findServerFunctionFactoryImportNames(code) {
|
|
110
|
+
const names = /* @__PURE__ */ new Map();
|
|
111
|
+
for (const match of code.matchAll(SERVER_FUNCTION_FACTORY_IMPORT_RE)) {
|
|
112
|
+
const importClause = match[1] ?? "";
|
|
113
|
+
const namedStart = importClause.indexOf("{");
|
|
114
|
+
const namedEnd = importClause.lastIndexOf("}");
|
|
115
|
+
if (namedStart === -1 || namedEnd === -1 || namedEnd <= namedStart) continue;
|
|
116
|
+
const namedImports = importClause.slice(namedStart + 1, namedEnd).split(",");
|
|
117
|
+
for (const specifier of namedImports) {
|
|
118
|
+
const normalized = specifier.trim().replace(/^type\s+/, "");
|
|
119
|
+
const specifierMatch = normalized.match(
|
|
120
|
+
/^(createServerFn|createServerQuery)(?:\s+as\s+([A-Za-z_$][\w$]*))?$/
|
|
121
|
+
);
|
|
122
|
+
if (specifierMatch) {
|
|
123
|
+
const factory = specifierMatch[1];
|
|
124
|
+
names.set(specifierMatch[2] ?? factory, factory === "createServerFn" ? "fn" : "query");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return names;
|
|
129
|
+
}
|
|
130
|
+
function findServerFnReExport(code, factoryNames) {
|
|
131
|
+
const scannable = stripCommentsAndStrings(code);
|
|
132
|
+
const declarations = /* @__PURE__ */ new Map();
|
|
133
|
+
for (const match of scannable.matchAll(SERVER_FUNCTION_DECLARATION_RE)) {
|
|
134
|
+
const localName = match[1];
|
|
135
|
+
const factoryName = match[2];
|
|
136
|
+
const factory = factoryName ? factoryNames.get(factoryName) : void 0;
|
|
137
|
+
if (localName && factory) declarations.set(localName, factory);
|
|
138
|
+
}
|
|
139
|
+
if (declarations.size === 0) return null;
|
|
140
|
+
for (const match of scannable.matchAll(LOCAL_EXPORT_CLAUSE_RE)) {
|
|
141
|
+
const clause = match[1] ?? "";
|
|
142
|
+
const clauseEnd = (match.index ?? 0) + match[0].length;
|
|
143
|
+
if (scannable.slice(clauseEnd).trimStart().startsWith("from")) continue;
|
|
144
|
+
for (const specifier of clause.split(",")) {
|
|
145
|
+
const parts = specifier.trim().split(/\s+as\s+/);
|
|
146
|
+
const localName = parts[0]?.trim();
|
|
147
|
+
if (!localName || !declarations.has(localName)) continue;
|
|
148
|
+
return {
|
|
149
|
+
localName,
|
|
150
|
+
exportName: parts[1]?.trim() || localName,
|
|
151
|
+
factory: declarations.get(localName),
|
|
152
|
+
form: "clause"
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const match of scannable.matchAll(EXPORT_DEFAULT_ALIAS_RE)) {
|
|
157
|
+
const localName = match[1];
|
|
158
|
+
if (!localName || !declarations.has(localName)) continue;
|
|
159
|
+
return {
|
|
160
|
+
localName,
|
|
161
|
+
exportName: "default",
|
|
162
|
+
factory: declarations.get(localName),
|
|
163
|
+
form: "default"
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
for (const match of scannable.matchAll(EXPORT_BINDING_ALIAS_RE)) {
|
|
167
|
+
const exportName = match[1];
|
|
168
|
+
const localName = match[2];
|
|
169
|
+
if (!exportName || !localName || !declarations.has(localName)) continue;
|
|
170
|
+
return {
|
|
171
|
+
localName,
|
|
172
|
+
exportName,
|
|
173
|
+
factory: declarations.get(localName),
|
|
174
|
+
form: "binding"
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
function stripCommentsAndStrings(code) {
|
|
180
|
+
const output = code.split("");
|
|
181
|
+
let quote = null;
|
|
182
|
+
let lineComment = false;
|
|
183
|
+
let blockComment = false;
|
|
184
|
+
let escaped = false;
|
|
185
|
+
for (let index = 0; index < code.length; index++) {
|
|
186
|
+
const char = code[index];
|
|
187
|
+
const next = code[index + 1];
|
|
188
|
+
if (lineComment) {
|
|
189
|
+
if (char === "\n" || char === "\r") lineComment = false;
|
|
190
|
+
else output[index] = " ";
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (blockComment) {
|
|
194
|
+
if (char === "*" && next === "/") {
|
|
195
|
+
blockComment = false;
|
|
196
|
+
output[index] = " ";
|
|
197
|
+
output[index + 1] = " ";
|
|
198
|
+
index++;
|
|
199
|
+
} else if (char !== "\n") {
|
|
200
|
+
output[index] = " ";
|
|
201
|
+
}
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (quote) {
|
|
205
|
+
if (escaped) {
|
|
206
|
+
escaped = false;
|
|
207
|
+
output[index] = " ";
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (char === "\\") {
|
|
211
|
+
escaped = true;
|
|
212
|
+
output[index] = " ";
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (char === quote) {
|
|
216
|
+
quote = null;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (char !== "\n") output[index] = " ";
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (char === "/" && next === "/") {
|
|
223
|
+
lineComment = true;
|
|
224
|
+
output[index] = " ";
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (char === "/" && next === "*") {
|
|
228
|
+
blockComment = true;
|
|
229
|
+
output[index] = " ";
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
233
|
+
quote = char;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return output.join("");
|
|
237
|
+
}
|
|
238
|
+
function findServerFnExportReplacements(code, factoryNames) {
|
|
239
|
+
const replacements = [];
|
|
240
|
+
for (const match of code.matchAll(EXPORT_SERVER_FUNCTION_FACTORY_RE)) {
|
|
241
|
+
const exportName = match[1];
|
|
242
|
+
const calleeName = match[2];
|
|
243
|
+
const factory = calleeName ? factoryNames.get(calleeName) : void 0;
|
|
244
|
+
if (!exportName || !calleeName || !factory) continue;
|
|
245
|
+
const openParenIndex = (match.index ?? 0) + match[0].length - 1;
|
|
246
|
+
const callEnd = findMatchingParen(code, openParenIndex);
|
|
247
|
+
if (callEnd === -1) continue;
|
|
248
|
+
let declarationEnd = callEnd + 1;
|
|
249
|
+
while (/\s/.test(code[declarationEnd] ?? "")) declarationEnd++;
|
|
250
|
+
if (code[declarationEnd] === ";") declarationEnd++;
|
|
251
|
+
const calleeIndex = code.indexOf(calleeName, match.index);
|
|
252
|
+
replacements.push({
|
|
253
|
+
start: match.index ?? 0,
|
|
254
|
+
end: declarationEnd,
|
|
255
|
+
exportName,
|
|
256
|
+
privateName: `$$farm_server_${factory}_${exportName}`,
|
|
257
|
+
wrapperName: exportName,
|
|
258
|
+
callExpression: code.slice(calleeIndex, callEnd + 1)
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
for (const match of code.matchAll(EXPORT_DEFAULT_SERVER_FUNCTION_FACTORY_RE)) {
|
|
262
|
+
const calleeName = match[1];
|
|
263
|
+
const factory = calleeName ? factoryNames.get(calleeName) : void 0;
|
|
264
|
+
if (!calleeName || !factory) continue;
|
|
265
|
+
const openParenIndex = (match.index ?? 0) + match[0].length - 1;
|
|
266
|
+
const callEnd = findMatchingParen(code, openParenIndex);
|
|
267
|
+
if (callEnd === -1) continue;
|
|
268
|
+
let declarationEnd = callEnd + 1;
|
|
269
|
+
while (/\s/.test(code[declarationEnd] ?? "")) declarationEnd++;
|
|
270
|
+
if (code[declarationEnd] === ";") declarationEnd++;
|
|
271
|
+
const calleeIndex = code.indexOf(calleeName, match.index);
|
|
272
|
+
const privateName = `$$farm_server_${factory}_default`;
|
|
273
|
+
replacements.push({
|
|
274
|
+
start: match.index ?? 0,
|
|
275
|
+
end: declarationEnd,
|
|
276
|
+
exportName: "default",
|
|
277
|
+
privateName,
|
|
278
|
+
wrapperName: `${privateName}_export`,
|
|
279
|
+
callExpression: code.slice(calleeIndex, callEnd + 1)
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return replacements;
|
|
283
|
+
}
|
|
284
|
+
function copyServerFunctionDescriptor(target, source, lazy) {
|
|
285
|
+
const key = 'Symbol.for("farm.server-function.descriptor")';
|
|
286
|
+
return lazy ? `Object.defineProperty(${target}, ${key}, { get: () => ${source}[${key}] });` : `Object.defineProperty(${target}, ${key}, { value: ${source}[${key}] });`;
|
|
287
|
+
}
|
|
288
|
+
function hasModuleDirective(code, directive) {
|
|
289
|
+
for (const match of code.matchAll(DECLARATION_RE)) {
|
|
290
|
+
const value = match[2];
|
|
291
|
+
if (value === directive) return true;
|
|
292
|
+
if (value !== "use strict" && value !== "use client" && value !== "use server") return false;
|
|
293
|
+
}
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
function findMatchingParen(code, openParenIndex) {
|
|
297
|
+
let depth = 0;
|
|
298
|
+
let quote = null;
|
|
299
|
+
let lineComment = false;
|
|
300
|
+
let blockComment = false;
|
|
301
|
+
let escaped = false;
|
|
302
|
+
for (let index = openParenIndex; index < code.length; index++) {
|
|
303
|
+
const char = code[index];
|
|
304
|
+
const next = code[index + 1];
|
|
305
|
+
if (lineComment) {
|
|
306
|
+
if (char === "\n" || char === "\r") lineComment = false;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (blockComment) {
|
|
310
|
+
if (char === "*" && next === "/") {
|
|
311
|
+
blockComment = false;
|
|
312
|
+
index++;
|
|
313
|
+
}
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (quote) {
|
|
317
|
+
if (escaped) {
|
|
318
|
+
escaped = false;
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (char === "\\") {
|
|
322
|
+
escaped = true;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (char === quote) {
|
|
326
|
+
quote = null;
|
|
327
|
+
}
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
if (char === "/" && next === "/") {
|
|
331
|
+
lineComment = true;
|
|
332
|
+
index++;
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (char === "/" && next === "*") {
|
|
336
|
+
blockComment = true;
|
|
337
|
+
index++;
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
341
|
+
quote = char;
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
if (char === "(") depth++;
|
|
345
|
+
if (char === ")") {
|
|
346
|
+
depth--;
|
|
347
|
+
if (depth === 0) return index;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return -1;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export {
|
|
354
|
+
FARM_SERVER_FN_BOUNDARY_QUERY,
|
|
355
|
+
transformFarmServerFns,
|
|
356
|
+
createFarmServerFnBoundaryModule,
|
|
357
|
+
isFarmServerFnBoundaryId
|
|
358
|
+
};
|
|
@@ -16,7 +16,27 @@ function searchParamsToObject(searchParams) {
|
|
|
16
16
|
});
|
|
17
17
|
return output;
|
|
18
18
|
}
|
|
19
|
+
var RESERVED_SEARCH_KEYS = /* @__PURE__ */ new Set([
|
|
20
|
+
"then",
|
|
21
|
+
"catch",
|
|
22
|
+
"finally",
|
|
23
|
+
"__proto__",
|
|
24
|
+
"constructor",
|
|
25
|
+
"prototype"
|
|
26
|
+
]);
|
|
27
|
+
function createFarmSearchParams(search) {
|
|
28
|
+
const promise = Promise.resolve(search);
|
|
29
|
+
for (const key of Object.keys(search)) {
|
|
30
|
+
if (RESERVED_SEARCH_KEYS.has(key)) continue;
|
|
31
|
+
Object.defineProperty(promise, key, {
|
|
32
|
+
value: search[key],
|
|
33
|
+
enumerable: true
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return promise;
|
|
37
|
+
}
|
|
19
38
|
|
|
20
39
|
export {
|
|
21
|
-
searchParamsToObject
|
|
40
|
+
searchParamsToObject,
|
|
41
|
+
createFarmSearchParams
|
|
22
42
|
};
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunk2IAPKPEBcjs = require('./chunk-2IAPKPEB.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
var _chunkMPU5DOXXcjs = require('./chunk-MPU5DOXX.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _chunkFK25QSVCcjs = require('./chunk-FK25QSVC.cjs');
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
@@ -32,7 +32,7 @@ function createServerQuery(options) {
|
|
|
32
32
|
throw new TypeError("createServerQuery requires a key function");
|
|
33
33
|
}
|
|
34
34
|
const staleTime = normalizeServerQueryStaleTime(options.staleTime);
|
|
35
|
-
const execute =
|
|
35
|
+
const execute = _chunk2IAPKPEBcjs.createServerFn.call(void 0, {
|
|
36
36
|
input: options.input,
|
|
37
37
|
middleware: options.middleware,
|
|
38
38
|
handler: async (context) => {
|
|
@@ -42,7 +42,7 @@ function createServerQuery(options) {
|
|
|
42
42
|
const cacheKey = _chunkDXUXQP2Tcjs.createFarmCacheKey.call(void 0, ["route-data", routeKey]);
|
|
43
43
|
const producer = async () => {
|
|
44
44
|
const value = await options.handler(context);
|
|
45
|
-
return
|
|
45
|
+
return _chunk2IAPKPEBcjs._parseServerFnSchema.call(void 0, options.output, value, "output", "createServerQuery");
|
|
46
46
|
};
|
|
47
47
|
let data;
|
|
48
48
|
let updatedAt;
|
|
@@ -67,7 +67,7 @@ function createServerQuery(options) {
|
|
|
67
67
|
});
|
|
68
68
|
const query = async (input) => {
|
|
69
69
|
const result = await execute(input);
|
|
70
|
-
return
|
|
70
|
+
return _chunkFK25QSVCcjs.getServerActionExecutionContext.call(void 0, ) ? result : result.data;
|
|
71
71
|
};
|
|
72
72
|
Object.defineProperties(query, {
|
|
73
73
|
[FARM_SERVER_QUERY_SYMBOL]: {
|
|
@@ -87,10 +87,10 @@ function createServerQuery(options) {
|
|
|
87
87
|
enumerable: false
|
|
88
88
|
}
|
|
89
89
|
});
|
|
90
|
-
|
|
90
|
+
_chunk2IAPKPEBcjs._attachServerFunctionDescriptor.call(void 0,
|
|
91
91
|
query,
|
|
92
|
-
|
|
93
|
-
const result = await
|
|
92
|
+
_chunk2IAPKPEBcjs.createServerFunctionDescriptor.call(void 0, "query", options, async (value) => {
|
|
93
|
+
const result = await _chunk2IAPKPEBcjs._runServerFunctionForCaller.call(void 0,
|
|
94
94
|
execute,
|
|
95
95
|
value
|
|
96
96
|
);
|