void 0.1.6 → 0.7.1
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/AGENT_PROMPT.md +15 -0
- package/README.md +62 -123
- package/dist/auth-BdsJ0Aff.d.mts +43 -0
- package/dist/auth-cmd-DVKi6dzh.mjs +43 -0
- package/dist/auth-migrations-BAtAck2g.mjs +117 -0
- package/dist/better-auth-shared-C9_GHSkR.d.mts +71 -0
- package/dist/better-auth-shared-CdYmQGry.mjs +163 -0
- package/dist/cache-B0BgSTZi.mjs +47 -0
- package/dist/cancel-deploy-D9OFt5gA.mjs +59 -0
- package/dist/cf-access-Dee5cXxL.mjs +22 -0
- package/dist/chunk-DJd-R1mw.mjs +34 -0
- package/dist/cli/cli.d.mts +1 -0
- package/dist/cli/cli.mjs +1814 -0
- package/dist/client-BUdfE3QJ.mjs +622 -0
- package/dist/collect-CjeZgz5D.mjs +55 -0
- package/dist/config-BIa9HwVX.mjs +573 -0
- package/dist/config-BzM9Dy7T.mjs +37 -0
- package/dist/config-CvHtTM0q.mjs +30 -0
- package/dist/create-project-CN1pF-OQ.mjs +90 -0
- package/dist/db-BIP2kuEt.mjs +895 -0
- package/dist/defer-DcxEsVH1.mjs +49 -0
- package/dist/delete-DJTvwbr-.mjs +64 -0
- package/dist/deploy-BqXz1ycW.mjs +2723 -0
- package/dist/discover-B7FkXBLB.mjs +40 -0
- package/dist/dist-DUyXJLkq.mjs +2667 -0
- package/dist/dist-Dayj3gCK.mjs +1287 -0
- package/dist/domain-B-fIU3VE.mjs +79 -0
- package/dist/dotenv-DwO4ti0Z.mjs +173 -0
- package/dist/drizzle-NnudE_UN.mjs +232 -0
- package/dist/env-BwbZJd2x.mjs +301 -0
- package/dist/env-helpers-Dr9Y7RnE.d.mts +52 -0
- package/dist/env-raw-BDL4TvdN.mjs +32 -0
- package/dist/env-types-DknSA4SO.mjs +64 -0
- package/dist/env-validation-DJKjR_8q.mjs +163 -0
- package/dist/fetch-error-BQ8sZ5Nd.mjs +266 -0
- package/dist/fetch-error-CVZ5CGA-.d.mts +20 -0
- package/dist/gen-U0Ktr4Zd.mjs +761 -0
- package/dist/handler-B0ds0OHJ.d.mts +269 -0
- package/dist/head-P-egrtFE.d.mts +45 -0
- package/dist/headers-DCXc7mDs.mjs +279 -0
- package/dist/index.d.mts +32 -0
- package/dist/index.mjs +4695 -0
- package/dist/init-Bb_Qsdq6.mjs +2625 -0
- package/dist/link-D4d26PCm.mjs +49 -0
- package/dist/list-bQc1eQCZ.mjs +113 -0
- package/dist/log-DXdqnmhF.mjs +26 -0
- package/dist/login-RWUDCfdx.mjs +72 -0
- package/dist/logs-DrkTklop.mjs +98 -0
- package/dist/magic-string.es-D6g9UnIy.mjs +1011 -0
- package/dist/mcp-kZ4zg13a.mjs +373 -0
- package/dist/node-DDfXj10V.mjs +54 -0
- package/dist/output-BwlcIYSR.mjs +139 -0
- package/dist/pages/client.d.mts +198 -0
- package/dist/pages/client.mjs +980 -0
- package/dist/pages/head-client.d.mts +15 -0
- package/dist/pages/head-client.mjs +90 -0
- package/dist/pages/head.d.mts +2 -0
- package/dist/pages/head.mjs +112 -0
- package/dist/pages/index.d.mts +38 -0
- package/dist/pages/index.mjs +76 -0
- package/dist/pages/islands-plugin.d.mts +50 -0
- package/dist/pages/islands-plugin.mjs +195 -0
- package/dist/pages/prefetch.d.mts +31 -0
- package/dist/pages/prefetch.mjs +90 -0
- package/dist/pages/protocol.d.mts +3 -0
- package/dist/pages/protocol.mjs +193 -0
- package/dist/pages/serialize.d.mts +10 -0
- package/dist/pages/serialize.mjs +14 -0
- package/dist/pathe.M-eThtNZ-D-kmWkCS.mjs +150 -0
- package/dist/plugin-inference-oZ6Ybu2_.mjs +2447 -0
- package/dist/prepare-BAtWufvm.mjs +99 -0
- package/dist/preset-D4I73kT4.mjs +221 -0
- package/dist/project-TqORyHn8.mjs +72 -0
- package/dist/project-cmd-ATFi3kRm.mjs +67 -0
- package/dist/project-slug-CKam8lF9.mjs +11 -0
- package/dist/project-tsconfig-DfkESbDL.mjs +63 -0
- package/dist/protocol-BWzXs2A2.d.mts +34 -0
- package/dist/providers-B3aMxWzP.mjs +67 -0
- package/dist/resolve-project-Br5BR03U.mjs +29 -0
- package/dist/rollback-BSyita3C.mjs +92 -0
- package/dist/route-types-DReF1gUY.mjs +255 -0
- package/dist/routes-stub.d.mts +55 -0
- package/dist/routes-stub.mjs +1 -0
- package/dist/runner-6Ep3fNQu.mjs +123 -0
- package/dist/runner-pg-D0wWHYnr.mjs +57 -0
- package/dist/runtime/ai.d.mts +127 -0
- package/dist/runtime/ai.mjs +348 -0
- package/dist/runtime/auth-client-react.d.mts +8 -0
- package/dist/runtime/auth-client-react.mjs +6 -0
- package/dist/runtime/auth-client-solid.d.mts +8 -0
- package/dist/runtime/auth-client-solid.mjs +6 -0
- package/dist/runtime/auth-client-svelte.d.mts +8 -0
- package/dist/runtime/auth-client-svelte.mjs +6 -0
- package/dist/runtime/auth-client-vue.d.mts +8 -0
- package/dist/runtime/auth-client-vue.mjs +6 -0
- package/dist/runtime/auth-client.d.mts +8 -0
- package/dist/runtime/auth-client.mjs +6 -0
- package/dist/runtime/auth.d.mts +2 -0
- package/dist/runtime/auth.mjs +22 -0
- package/dist/runtime/better-auth-pg.d.mts +11 -0
- package/dist/runtime/better-auth-pg.mjs +51 -0
- package/dist/runtime/better-auth.d.mts +11 -0
- package/dist/runtime/better-auth.mjs +33 -0
- package/dist/runtime/client.d.mts +6 -0
- package/dist/runtime/client.mjs +5 -0
- package/dist/runtime/db-pg.d.mts +2 -0
- package/dist/runtime/db-pg.mjs +1 -0
- package/dist/runtime/db.d.mts +17 -0
- package/dist/runtime/db.mjs +30 -0
- package/dist/runtime/drizzle-arktype.d.mts +1 -0
- package/dist/runtime/drizzle-arktype.mjs +2 -0
- package/dist/runtime/drizzle-valibot.d.mts +1 -0
- package/dist/runtime/drizzle-valibot.mjs +2 -0
- package/dist/runtime/drizzle-zod.d.mts +1 -0
- package/dist/runtime/drizzle-zod.mjs +2 -0
- package/dist/runtime/env-helpers.d.mts +2 -0
- package/dist/runtime/env-helpers.mjs +173 -0
- package/dist/runtime/env-public-client.d.mts +22 -0
- package/dist/runtime/env-public-client.mjs +54 -0
- package/dist/runtime/env-public.d.mts +143 -0
- package/dist/runtime/env-public.mjs +366 -0
- package/dist/runtime/env.d.mts +13 -0
- package/dist/runtime/env.mjs +51 -0
- package/dist/runtime/fetch-stream.d.mts +51 -0
- package/dist/runtime/fetch-stream.mjs +81 -0
- package/dist/runtime/fetch.d.mts +59 -0
- package/dist/runtime/fetch.mjs +18 -0
- package/dist/runtime/handler.d.mts +3 -0
- package/dist/runtime/handler.mjs +85 -0
- package/dist/runtime/isr.d.mts +26 -0
- package/dist/runtime/isr.mjs +43 -0
- package/dist/runtime/kv.d.mts +48 -0
- package/dist/runtime/kv.mjs +106 -0
- package/dist/runtime/log.d.mts +24 -0
- package/dist/runtime/log.mjs +31 -0
- package/dist/runtime/migration-handler-pg.d.mts +6 -0
- package/dist/runtime/migration-handler-pg.mjs +85 -0
- package/dist/runtime/migration-handler.d.mts +19 -0
- package/dist/runtime/migration-handler.mjs +92 -0
- package/dist/runtime/queues.d.mts +7 -0
- package/dist/runtime/queues.mjs +8 -0
- package/dist/runtime/remote/binding-handler.d.mts +15 -0
- package/dist/runtime/remote/binding-handler.mjs +208 -0
- package/dist/runtime/remote/index.d.mts +8 -0
- package/dist/runtime/remote/index.mjs +461 -0
- package/dist/runtime/response.d.mts +14 -0
- package/dist/runtime/response.mjs +30 -0
- package/dist/runtime/sandbox.d.mts +17 -0
- package/dist/runtime/sandbox.mjs +19 -0
- package/dist/runtime/schema-d1.d.mts +1 -0
- package/dist/runtime/schema-d1.mjs +2 -0
- package/dist/runtime/schema-pg.d.mts +1 -0
- package/dist/runtime/schema-pg.mjs +2 -0
- package/dist/runtime/seed.d.mts +30 -0
- package/dist/runtime/seed.mjs +6 -0
- package/dist/runtime/storage.d.mts +7 -0
- package/dist/runtime/storage.mjs +14 -0
- package/dist/runtime/validator.d.mts +2 -0
- package/dist/runtime/validator.mjs +72 -0
- package/dist/runtime/ws-server.d.mts +26 -0
- package/dist/runtime/ws-server.mjs +296 -0
- package/dist/runtime/ws.d.mts +123 -0
- package/dist/runtime/ws.mjs +103 -0
- package/dist/scan-Ba4hFwlH.mjs +324 -0
- package/dist/scan-C6HMEIdW.mjs +318 -0
- package/dist/secret-DmjBDxB1.mjs +109 -0
- package/dist/skills-ipldjlKE.mjs +62 -0
- package/dist/standard-schema-9CRjx-uR.d.mts +42 -0
- package/dist/subcommand-prompt-BKjuNAPb.mjs +349 -0
- package/dist/sveltekit.d.mts +20 -0
- package/dist/sveltekit.mjs +61 -0
- package/dist/types-mHOEwpW4.d.mts +57 -0
- package/dist/validate-CaMavMxu.mjs +146 -0
- package/dist/yarn-pnp-BFqMV_bl.mjs +196 -0
- package/getting-started-prompt.txt +26 -0
- package/package.json +322 -30
- package/schema.json +364 -0
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +175 -0
- package/skills/void/SKILL.md +75 -0
- package/skills/void/command/void.md +7 -0
- package/skills/void/docs/guide/ai.md +235 -0
- package/skills/void/docs/guide/app-types.md +103 -0
- package/skills/void/docs/guide/auth.md +257 -0
- package/skills/void/docs/guide/database/d1.md +106 -0
- package/skills/void/docs/guide/database/postgresql.md +106 -0
- package/skills/void/docs/guide/database.md +418 -0
- package/skills/void/docs/guide/deployment.md +98 -0
- package/skills/void/docs/guide/edge/headers.md +79 -0
- package/skills/void/docs/guide/edge/prerendering.md +83 -0
- package/skills/void/docs/guide/edge/redirects.md +116 -0
- package/skills/void/docs/guide/edge/revalidation.md +131 -0
- package/skills/void/docs/guide/edge/rewrites.md +354 -0
- package/skills/void/docs/guide/edge/static-assets.md +72 -0
- package/skills/void/docs/guide/env-vars.md +298 -0
- package/skills/void/docs/guide/index.md +80 -0
- package/skills/void/docs/guide/jobs.md +91 -0
- package/skills/void/docs/guide/kv.md +107 -0
- package/skills/void/docs/guide/pages-routing/actions-and-forms.md +419 -0
- package/skills/void/docs/guide/pages-routing/head.md +130 -0
- package/skills/void/docs/guide/pages-routing/islands.md +405 -0
- package/skills/void/docs/guide/pages-routing/layouts.md +362 -0
- package/skills/void/docs/guide/pages-routing/loaders.md +267 -0
- package/skills/void/docs/guide/pages-routing/markdown.md +625 -0
- package/skills/void/docs/guide/pages-routing/overview.md +236 -0
- package/skills/void/docs/guide/pages-routing/view-transitions.md +140 -0
- package/skills/void/docs/guide/queues.md +140 -0
- package/skills/void/docs/guide/quickstart.md +233 -0
- package/skills/void/docs/guide/remote-dev.md +67 -0
- package/skills/void/docs/guide/sandboxes.md +82 -0
- package/skills/void/docs/guide/server-routing.md +246 -0
- package/skills/void/docs/guide/ssg.md +74 -0
- package/skills/void/docs/guide/ssr.md +105 -0
- package/skills/void/docs/guide/storage.md +67 -0
- package/skills/void/docs/guide/type-safety.md +179 -0
- package/skills/void/docs/guide/typed-fetch.md +113 -0
- package/skills/void/docs/guide/websockets.md +190 -0
- package/skills/void/docs/index.md +48 -0
- package/skills/void/docs/integrations/agents.md +84 -0
- package/skills/void/docs/integrations/cloudflare.md +284 -0
- package/skills/void/docs/integrations/frameworks/analog.md +182 -0
- package/skills/void/docs/integrations/frameworks/astro.md +197 -0
- package/skills/void/docs/integrations/frameworks/nuxt.md +164 -0
- package/skills/void/docs/integrations/frameworks/overview.md +136 -0
- package/skills/void/docs/integrations/frameworks/react-router.md +137 -0
- package/skills/void/docs/integrations/frameworks/sveltekit.md +191 -0
- package/skills/void/docs/integrations/frameworks/tanstack-start.md +140 -0
- package/skills/void/docs/integrations/hono.md +97 -0
- package/skills/void/docs/integrations/nodejs-bun-deno.md +210 -0
- package/skills/void/docs/node_modules/@iconify/vue/README.md +408 -0
- package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +5 -0
- package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +103 -0
- package/skills/void/docs/node_modules/oxc-minify/README.md +78 -0
- package/skills/void/docs/node_modules/reka-ui/README.md +80 -0
- package/skills/void/docs/node_modules/vitepress/README.md +28 -0
- package/skills/void/docs/node_modules/vitepress/template/api-examples.md +49 -0
- package/skills/void/docs/node_modules/vitepress/template/index.md +28 -0
- package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +85 -0
- package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +101 -0
- package/skills/void/docs/node_modules/void/AGENTS.md +204 -0
- package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +15 -0
- package/skills/void/docs/node_modules/void/README.md +89 -0
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +591 -0
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +375 -0
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +174 -0
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +37 -0
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +135 -0
- package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +189 -0
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +143 -0
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +1272 -0
- package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +19 -0
- package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +22 -0
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +69 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +152 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +9 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +9 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +24 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +565 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +124 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +600 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +386 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +95 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +101 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathe/README.md +73 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +25 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tsdown/README.md +55 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite/LICENSE.md +2230 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite/README.md +20 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +58 -0
- package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +165 -0
- package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +20 -0
- package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +32 -0
- package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +99 -0
- package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +108 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +51 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +79 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +44 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +51 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +65 -0
- package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +390 -0
- package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +48 -0
- package/skills/void/docs/node_modules/void/node_modules/hono/README.md +85 -0
- package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +452 -0
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +76 -0
- package/{LICENSE → skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md} +21 -21
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +364 -0
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +41 -0
- package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +325 -0
- package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +398 -0
- package/skills/void/docs/node_modules/void/node_modules/pathe/README.md +73 -0
- package/skills/void/docs/node_modules/void/node_modules/pg/README.md +95 -0
- package/skills/void/docs/node_modules/void/node_modules/pglite-server/LICENSE.md +21 -0
- package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +135 -0
- package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +21 -0
- package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +25 -0
- package/skills/void/docs/node_modules/void/node_modules/tsdown/README.md +55 -0
- package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +9 -0
- package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +94 -0
- package/skills/void/docs/node_modules/void/node_modules/vite/LICENSE.md +2230 -0
- package/skills/void/docs/node_modules/void/node_modules/vite/README.md +20 -0
- package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +63 -0
- package/skills/void/docs/node_modules/void/node_modules/zod/README.md +191 -0
- package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +175 -0
- package/skills/void/docs/node_modules/void/skills/void/SKILL.md +75 -0
- package/skills/void/docs/node_modules/void/skills/void/command/void.md +7 -0
- package/skills/void/docs/reference/api.md +917 -0
- package/skills/void/docs/reference/cli.md +564 -0
- package/skills/void/docs/reference/config.md +408 -0
- package/skills/void/docs/reference/resource-inference.md +149 -0
- package/skills/void/docs/reference/structure.md +176 -0
- package/.npmignore +0 -29
- package/.travis.yml +0 -9
- package/favicon.ico +0 -0
- package/index.js +0 -14
- package/lib/Job.js +0 -150
- package/lib/Void.js +0 -99
- package/lib/scan.js +0 -19
- package/test/credentials.js +0 -20
- package/test/job.js +0 -64
- package/test/static/dir1/test6.html +0 -0
- package/test/static/dir2/test7.html +0 -0
- package/test/static/dir2/test8.html +0 -0
- package/test/static/dir2/test9.html +0 -0
- package/test/static/test1.html +0 -0
- package/test/static/test2.html +0 -0
- package/test/static/test3.html +0 -0
- package/test/void.js +0 -31
- /package/{test/static/dir1/test4.html → skills/void/docs/integrations/auth-providers.md} +0 -0
- /package/{test/static/dir1/test5.html → skills/void/docs/integrations/payment-processors.md} +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
//#region src/pages/prefetch.ts
|
|
2
|
+
const UNITS = {
|
|
3
|
+
ms: 1,
|
|
4
|
+
s: 1e3,
|
|
5
|
+
m: 6e4,
|
|
6
|
+
h: 36e5,
|
|
7
|
+
d: 864e5
|
|
8
|
+
};
|
|
9
|
+
function parseUnit(value) {
|
|
10
|
+
const match = value.match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/);
|
|
11
|
+
if (!match) throw new Error(`prefetch: Invalid cacheFor value '${value}'. Use a number with ms, s, m, h, or d.`);
|
|
12
|
+
return Number(match[1]) * UNITS[match[2]];
|
|
13
|
+
}
|
|
14
|
+
function parseCacheFor(value) {
|
|
15
|
+
if (typeof value === "number") return {
|
|
16
|
+
stale: value,
|
|
17
|
+
expires: value
|
|
18
|
+
};
|
|
19
|
+
if (Array.isArray(value)) return {
|
|
20
|
+
stale: parseUnit(value[0]),
|
|
21
|
+
expires: parseUnit(value[1])
|
|
22
|
+
};
|
|
23
|
+
const ms = parseUnit(value);
|
|
24
|
+
return {
|
|
25
|
+
stale: ms,
|
|
26
|
+
expires: ms
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
var PrefetchCache = class {
|
|
30
|
+
entries = /* @__PURE__ */ new Map();
|
|
31
|
+
key(url, method = "GET") {
|
|
32
|
+
return `${method}:${url}`;
|
|
33
|
+
}
|
|
34
|
+
has(url, method = "GET") {
|
|
35
|
+
return this.get(url, method) !== null;
|
|
36
|
+
}
|
|
37
|
+
get(url, method = "GET") {
|
|
38
|
+
const entry = this.entries.get(this.key(url, method));
|
|
39
|
+
if (!entry) return null;
|
|
40
|
+
if (Date.now() >= entry.expiresAt && !entry.singleUse) {
|
|
41
|
+
this.entries.delete(this.key(url, method));
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return entry;
|
|
45
|
+
}
|
|
46
|
+
isFresh(entry) {
|
|
47
|
+
return Date.now() < entry.staleAt;
|
|
48
|
+
}
|
|
49
|
+
isUsable(entry) {
|
|
50
|
+
return Date.now() < entry.expiresAt || entry.singleUse;
|
|
51
|
+
}
|
|
52
|
+
set(url, method, response, ttl) {
|
|
53
|
+
const k = this.key(url, method);
|
|
54
|
+
const existing = this.entries.get(k);
|
|
55
|
+
if (existing && this.isUsable(existing)) return;
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
const singleUse = ttl.stale === 0 && ttl.expires === 0;
|
|
58
|
+
const entry = {
|
|
59
|
+
url,
|
|
60
|
+
method,
|
|
61
|
+
response,
|
|
62
|
+
staleAt: now + ttl.stale,
|
|
63
|
+
expiresAt: now + ttl.expires,
|
|
64
|
+
singleUse,
|
|
65
|
+
timer: null
|
|
66
|
+
};
|
|
67
|
+
if (!singleUse && ttl.expires > 0) entry.timer = setTimeout(() => this.entries.delete(k), ttl.expires);
|
|
68
|
+
this.entries.set(k, entry);
|
|
69
|
+
}
|
|
70
|
+
/** Mark entry as consumed — removes it if singleUse. */
|
|
71
|
+
consume(url, method = "GET") {
|
|
72
|
+
const entry = this.entries.get(this.key(url, method));
|
|
73
|
+
if (entry?.singleUse) {
|
|
74
|
+
if (entry.timer) clearTimeout(entry.timer);
|
|
75
|
+
this.entries.delete(this.key(url, method));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
flush(url, method = "GET") {
|
|
79
|
+
const k = this.key(url, method);
|
|
80
|
+
const entry = this.entries.get(k);
|
|
81
|
+
if (entry?.timer) clearTimeout(entry.timer);
|
|
82
|
+
this.entries.delete(k);
|
|
83
|
+
}
|
|
84
|
+
flushAll() {
|
|
85
|
+
for (const entry of this.entries.values()) if (entry.timer) clearTimeout(entry.timer);
|
|
86
|
+
this.entries.clear();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
//#endregion
|
|
90
|
+
export { PrefetchCache, parseCacheFor };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { S as ValidationError } from "../handler-B0ds0OHJ.mjs";
|
|
2
|
+
import { a as handlePageMutation, i as handlePageGet, n as PageRenderResult, o as safeJsonStringify, r as flattenValidationErrors, t as PageObject } from "../protocol-BWzXs2A2.mjs";
|
|
3
|
+
export { PageObject, PageRenderResult, ValidationError, flattenValidationErrors, handlePageGet, handlePageMutation, safeJsonStringify };
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { isConvertedResponse } from "../runtime/response.mjs";
|
|
2
|
+
import { i as ValidationError, r as separateDeferred, t as DEFERRED } from "../defer-DcxEsVH1.mjs";
|
|
3
|
+
import { resolveHead } from "./head.mjs";
|
|
4
|
+
//#region src/pages/protocol.ts
|
|
5
|
+
const POWERED_BY = { "X-Powered-By": "Void" };
|
|
6
|
+
/** Escape characters that are unsafe inside inline <script> tags to prevent XSS. */
|
|
7
|
+
function safeJsonStringify(value) {
|
|
8
|
+
return (JSON.stringify(value) ?? "null").replaceAll("<", "\\u003c").replaceAll(">", "\\u003e").replaceAll("&", "\\u0026").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
|
|
9
|
+
}
|
|
10
|
+
function isPagesRequest(c) {
|
|
11
|
+
return c.req.header("x-voidpages") === "true";
|
|
12
|
+
}
|
|
13
|
+
function pageJsonResponse(pageObj) {
|
|
14
|
+
return Response.json(pageObj, { headers: {
|
|
15
|
+
"X-VoidPages": "true",
|
|
16
|
+
Vary: "X-VoidPages",
|
|
17
|
+
...POWERED_BY
|
|
18
|
+
} });
|
|
19
|
+
}
|
|
20
|
+
function requestPathWithSearch(c) {
|
|
21
|
+
return c.req.path + new URL(c.req.url).search;
|
|
22
|
+
}
|
|
23
|
+
/** Extract props from a handler result, handling Response wrapping from withValidator */
|
|
24
|
+
async function extractProps(result) {
|
|
25
|
+
if (result instanceof Response) {
|
|
26
|
+
if ((result.headers.get("content-type") || "").includes("application/json")) return await result.json();
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
return result ?? {};
|
|
30
|
+
}
|
|
31
|
+
/** Flatten withValidator's { issues: [{ slot, issues: [{ message, path }] }] } into { field: message } */
|
|
32
|
+
function flattenValidationErrors(body) {
|
|
33
|
+
const errors = {};
|
|
34
|
+
const issues = body?.issues;
|
|
35
|
+
if (issues) for (const slotIssue of issues) for (const issue of slotIssue.issues ?? []) {
|
|
36
|
+
const key = typeof issue.path === "string" ? issue.path : slotIssue.slot;
|
|
37
|
+
if (typeof key === "string") errors[key] = issue.message ?? "Invalid value";
|
|
38
|
+
}
|
|
39
|
+
return errors;
|
|
40
|
+
}
|
|
41
|
+
/** Strip deferred sentinels from props, setting their keys to null. Used by mutations. */
|
|
42
|
+
function stripDeferred(props) {
|
|
43
|
+
const result = {};
|
|
44
|
+
for (const [key, value] of Object.entries(props)) if (value && typeof value === "object" && DEFERRED in value) result[key] = null;
|
|
45
|
+
else result[key] = value;
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
async function writeRenderResult(writer, encoder, result) {
|
|
49
|
+
if (typeof result === "string") {
|
|
50
|
+
await writer.write(encoder.encode(result));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const reader = result.getReader();
|
|
54
|
+
while (true) {
|
|
55
|
+
const { done, value } = await reader.read();
|
|
56
|
+
if (done) return;
|
|
57
|
+
await writer.write(value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function renderedResponse(result, contentType) {
|
|
61
|
+
return new Response(result, { headers: {
|
|
62
|
+
"content-type": contentType,
|
|
63
|
+
...POWERED_BY
|
|
64
|
+
} });
|
|
65
|
+
}
|
|
66
|
+
/** Build a streaming response that sends an initial chunk then streams deferred results. */
|
|
67
|
+
function streamDeferredResponse(initialChunk, deferredMap, c, contentType, formatResolved, formatRejected) {
|
|
68
|
+
const encoder = new TextEncoder();
|
|
69
|
+
const { readable, writable } = new TransformStream();
|
|
70
|
+
const writer = writable.getWriter();
|
|
71
|
+
const pendingChunks = Object.entries(deferredMap).map(([group, { resolver }]) => resolver(c).then((data) => formatResolved(group, data)).catch((err) => formatRejected(group, err instanceof Error ? err.message : String(err))));
|
|
72
|
+
(async () => {
|
|
73
|
+
await writeRenderResult(writer, encoder, initialChunk);
|
|
74
|
+
await Promise.all(pendingChunks.map(async (chunk) => writer.write(encoder.encode(await chunk))));
|
|
75
|
+
await writer.close();
|
|
76
|
+
})().catch((error) => {
|
|
77
|
+
writer.abort(error).catch(() => {});
|
|
78
|
+
});
|
|
79
|
+
return new Response(readable, { headers: {
|
|
80
|
+
"content-type": contentType,
|
|
81
|
+
...POWERED_BY
|
|
82
|
+
} });
|
|
83
|
+
}
|
|
84
|
+
/** Handle GET page request — run handler, return page object or SSR HTML */
|
|
85
|
+
async function handlePageGet(handler, headFn, c, componentId, renderFn, getAssetTags, configHead, island) {
|
|
86
|
+
const shared = c.get("shared") ?? {};
|
|
87
|
+
let props = {};
|
|
88
|
+
if (handler) {
|
|
89
|
+
const result = await handler(c);
|
|
90
|
+
if (result instanceof Response && !isConvertedResponse(result)) {
|
|
91
|
+
const ct = result.headers.get("content-type") || "";
|
|
92
|
+
if (result.status >= 300 || !ct.includes("application/json")) return result;
|
|
93
|
+
}
|
|
94
|
+
props = await extractProps(result);
|
|
95
|
+
}
|
|
96
|
+
const pageHead = headFn ? headFn(c, props) : void 0;
|
|
97
|
+
const head = resolveHead(configHead, c.get("headDefaults"), pageHead);
|
|
98
|
+
const { immediateProps, deferredMap } = separateDeferred(props);
|
|
99
|
+
const hasDeferred = Object.keys(deferredMap).length > 0;
|
|
100
|
+
const deferredKeys = {};
|
|
101
|
+
if (hasDeferred) for (const [group, { keys }] of Object.entries(deferredMap)) for (const key of keys) deferredKeys[key] = group;
|
|
102
|
+
const pageObj = {
|
|
103
|
+
component: componentId,
|
|
104
|
+
props: immediateProps,
|
|
105
|
+
shared,
|
|
106
|
+
url: requestPathWithSearch(c),
|
|
107
|
+
errors: null,
|
|
108
|
+
...head && { head },
|
|
109
|
+
...hasDeferred && {
|
|
110
|
+
deferred: Object.keys(deferredMap),
|
|
111
|
+
deferredKeys
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
if (!island && isPagesRequest(c)) {
|
|
115
|
+
if (c.req.header("purpose") === "prefetch" && hasDeferred) {
|
|
116
|
+
const resolvedProps = { ...immediateProps };
|
|
117
|
+
await Promise.all(Object.entries(deferredMap).map(async ([, { resolver, keys }]) => {
|
|
118
|
+
try {
|
|
119
|
+
const data = await resolver(c);
|
|
120
|
+
if (keys.length === 1) resolvedProps[keys[0]] = data;
|
|
121
|
+
else {
|
|
122
|
+
const obj = data;
|
|
123
|
+
for (const key of keys) resolvedProps[key] = obj[key];
|
|
124
|
+
}
|
|
125
|
+
} catch {
|
|
126
|
+
for (const key of keys) resolvedProps[key] = null;
|
|
127
|
+
}
|
|
128
|
+
}));
|
|
129
|
+
return pageJsonResponse({
|
|
130
|
+
...pageObj,
|
|
131
|
+
props: resolvedProps,
|
|
132
|
+
deferred: void 0
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (!hasDeferred) return pageJsonResponse(pageObj);
|
|
136
|
+
return streamDeferredResponse(JSON.stringify(pageObj) + "\n", deferredMap, c, "application/x-ndjson", (group, data) => JSON.stringify({
|
|
137
|
+
__deferred: group,
|
|
138
|
+
data
|
|
139
|
+
}) + "\n", (group, error) => JSON.stringify({
|
|
140
|
+
__deferred: group,
|
|
141
|
+
error
|
|
142
|
+
}) + "\n");
|
|
143
|
+
}
|
|
144
|
+
const html = await renderFn(pageObj, await getAssetTags(c.req.raw, c.env, componentId));
|
|
145
|
+
if (!hasDeferred) return renderedResponse(html, "text/html; charset=utf-8");
|
|
146
|
+
return streamDeferredResponse(html, deferredMap, c, "text/html; charset=utf-8", (group, data) => `\n<script>window.__resolveDeferred?window.__resolveDeferred(${safeJsonStringify(group)},${safeJsonStringify(data)}):(window.__deferredQueue??=[]).push([${safeJsonStringify(group)},${safeJsonStringify(data)}])<\/script>`, (group, error) => `\n<script>window.__rejectDeferred?window.__rejectDeferred(${safeJsonStringify(group)},${safeJsonStringify(error)}):(window.__deferredQueue??=[]).push([${safeJsonStringify(group)},0,${safeJsonStringify(error)}])<\/script>`);
|
|
147
|
+
}
|
|
148
|
+
/** Handle POST/PUT/DELETE page request — run mutation, then re-run GET or redirect */
|
|
149
|
+
async function handlePageMutation(mutationHandler, getHandler, headFn, c, componentId, renderFn, getAssetTags, configHead, island) {
|
|
150
|
+
const shared = c.get("shared") ?? {};
|
|
151
|
+
const middlewareHead = c.get("headDefaults");
|
|
152
|
+
function buildMutationPageObj(props, errors) {
|
|
153
|
+
const head = resolveHead(configHead, middlewareHead, headFn ? headFn(c, props) : void 0);
|
|
154
|
+
return {
|
|
155
|
+
component: componentId,
|
|
156
|
+
props,
|
|
157
|
+
shared,
|
|
158
|
+
url: requestPathWithSearch(c),
|
|
159
|
+
errors,
|
|
160
|
+
...head && { head }
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
let result;
|
|
164
|
+
try {
|
|
165
|
+
result = mutationHandler ? await mutationHandler(c) : void 0;
|
|
166
|
+
} catch (e) {
|
|
167
|
+
if (e instanceof ValidationError) {
|
|
168
|
+
if (island) return Response.json({ errors: e.errors }, { status: 422 });
|
|
169
|
+
const pageObj = buildMutationPageObj(stripDeferred(getHandler ? await extractProps(await getHandler(c)) : {}), e.errors);
|
|
170
|
+
if (isPagesRequest(c)) return pageJsonResponse(pageObj);
|
|
171
|
+
return renderedResponse(await renderFn(pageObj, await getAssetTags(c.req.raw, c.env, componentId)), "text/html; charset=utf-8");
|
|
172
|
+
}
|
|
173
|
+
throw e;
|
|
174
|
+
}
|
|
175
|
+
if (result instanceof Response) {
|
|
176
|
+
const status = result.status;
|
|
177
|
+
if (status >= 300 && status < 400) return result;
|
|
178
|
+
if (status === 400) {
|
|
179
|
+
const errors = flattenValidationErrors(await result.json());
|
|
180
|
+
if (island) return Response.json({ errors }, { status: 422 });
|
|
181
|
+
const pageObj = buildMutationPageObj(stripDeferred(getHandler ? await extractProps(await getHandler(c)) : {}), errors);
|
|
182
|
+
if (isPagesRequest(c)) return pageJsonResponse(pageObj);
|
|
183
|
+
return renderedResponse(await renderFn(pageObj, await getAssetTags(c.req.raw, c.env, componentId)), "text/html; charset=utf-8");
|
|
184
|
+
}
|
|
185
|
+
if (status !== 204) return result;
|
|
186
|
+
}
|
|
187
|
+
if (island) return Response.json({ success: true });
|
|
188
|
+
const pageObj = buildMutationPageObj(stripDeferred(getHandler ? await extractProps(await getHandler(c)) : {}), null);
|
|
189
|
+
if (isPagesRequest(c)) return pageJsonResponse(pageObj);
|
|
190
|
+
return renderedResponse(await renderFn(pageObj, await getAssetTags(c.req.raw, c.env, componentId)), "text/html; charset=utf-8");
|
|
191
|
+
}
|
|
192
|
+
//#endregion
|
|
193
|
+
export { ValidationError, flattenValidationErrors, handlePageGet, handlePageMutation, safeJsonStringify };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/pages/serialize.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Escape JSON for embedding inside an inline `<script type="application/json">`
|
|
4
|
+
* tag. Replaces `<`, `>`, `&`, U+2028, U+2029 with their `\uXXXX` JSON escape
|
|
5
|
+
* sequences so the script tag cannot be closed early and the payload survives
|
|
6
|
+
* `JSON.parse` on hydration.
|
|
7
|
+
*/
|
|
8
|
+
declare function serializePageData(pageObj: unknown): string;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { serializePageData };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/pages/serialize.ts
|
|
2
|
+
/**
|
|
3
|
+
* Escape JSON for embedding inside an inline `<script type="application/json">`
|
|
4
|
+
* tag. Replaces `<`, `>`, `&`, U+2028, U+2029 with their `\uXXXX` JSON escape
|
|
5
|
+
* sequences so the script tag cannot be closed early and the payload survives
|
|
6
|
+
* `JSON.parse` on hydration.
|
|
7
|
+
*/
|
|
8
|
+
function serializePageData(pageObj) {
|
|
9
|
+
return JSON.stringify(pageObj).replace(/[<>&\u2028\u2029]/g, (c) => {
|
|
10
|
+
return `\\u${c.charCodeAt(0).toString(16).padStart(4, "0")}`;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { serializePageData };
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs
|
|
2
|
+
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
3
|
+
function normalizeWindowsPath(input = "") {
|
|
4
|
+
if (!input) return input;
|
|
5
|
+
return input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
|
6
|
+
}
|
|
7
|
+
const _UNC_REGEX = /^[/\\]{2}/;
|
|
8
|
+
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
|
|
9
|
+
const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
|
|
10
|
+
const _ROOT_FOLDER_RE = /^\/([A-Za-z]:)?$/;
|
|
11
|
+
const _EXTNAME_RE = /.(\.[^./]+|\.)$/;
|
|
12
|
+
const normalize = function(path) {
|
|
13
|
+
if (path.length === 0) return ".";
|
|
14
|
+
path = normalizeWindowsPath(path);
|
|
15
|
+
const isUNCPath = path.match(_UNC_REGEX);
|
|
16
|
+
const isPathAbsolute = isAbsolute(path);
|
|
17
|
+
const trailingSeparator = path[path.length - 1] === "/";
|
|
18
|
+
path = normalizeString(path, !isPathAbsolute);
|
|
19
|
+
if (path.length === 0) {
|
|
20
|
+
if (isPathAbsolute) return "/";
|
|
21
|
+
return trailingSeparator ? "./" : ".";
|
|
22
|
+
}
|
|
23
|
+
if (trailingSeparator) path += "/";
|
|
24
|
+
if (_DRIVE_LETTER_RE.test(path)) path += "/";
|
|
25
|
+
if (isUNCPath) {
|
|
26
|
+
if (!isPathAbsolute) return `//./${path}`;
|
|
27
|
+
return `//${path}`;
|
|
28
|
+
}
|
|
29
|
+
return isPathAbsolute && !isAbsolute(path) ? `/${path}` : path;
|
|
30
|
+
};
|
|
31
|
+
const join = function(...segments) {
|
|
32
|
+
let path = "";
|
|
33
|
+
for (const seg of segments) {
|
|
34
|
+
if (!seg) continue;
|
|
35
|
+
if (path.length > 0) {
|
|
36
|
+
const pathTrailing = path[path.length - 1] === "/";
|
|
37
|
+
const segLeading = seg[0] === "/";
|
|
38
|
+
if (pathTrailing && segLeading) path += seg.slice(1);
|
|
39
|
+
else path += pathTrailing || segLeading ? seg : `/${seg}`;
|
|
40
|
+
} else path += seg;
|
|
41
|
+
}
|
|
42
|
+
return normalize(path);
|
|
43
|
+
};
|
|
44
|
+
function cwd() {
|
|
45
|
+
if (typeof process !== "undefined" && typeof process.cwd === "function") return process.cwd().replace(/\\/g, "/");
|
|
46
|
+
return "/";
|
|
47
|
+
}
|
|
48
|
+
const resolve = function(...arguments_) {
|
|
49
|
+
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
|
50
|
+
let resolvedPath = "";
|
|
51
|
+
let resolvedAbsolute = false;
|
|
52
|
+
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
|
53
|
+
const path = index >= 0 ? arguments_[index] : cwd();
|
|
54
|
+
if (!path || path.length === 0) continue;
|
|
55
|
+
resolvedPath = `${path}/${resolvedPath}`;
|
|
56
|
+
resolvedAbsolute = isAbsolute(path);
|
|
57
|
+
}
|
|
58
|
+
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);
|
|
59
|
+
if (resolvedAbsolute && !isAbsolute(resolvedPath)) return `/${resolvedPath}`;
|
|
60
|
+
return resolvedPath.length > 0 ? resolvedPath : ".";
|
|
61
|
+
};
|
|
62
|
+
function normalizeString(path, allowAboveRoot) {
|
|
63
|
+
let res = "";
|
|
64
|
+
let lastSegmentLength = 0;
|
|
65
|
+
let lastSlash = -1;
|
|
66
|
+
let dots = 0;
|
|
67
|
+
let char = null;
|
|
68
|
+
for (let index = 0; index <= path.length; ++index) {
|
|
69
|
+
if (index < path.length) char = path[index];
|
|
70
|
+
else if (char === "/") break;
|
|
71
|
+
else char = "/";
|
|
72
|
+
if (char === "/") {
|
|
73
|
+
if (lastSlash === index - 1 || dots === 1);
|
|
74
|
+
else if (dots === 2) {
|
|
75
|
+
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
|
76
|
+
if (res.length > 2) {
|
|
77
|
+
const lastSlashIndex = res.lastIndexOf("/");
|
|
78
|
+
if (lastSlashIndex === -1) {
|
|
79
|
+
res = "";
|
|
80
|
+
lastSegmentLength = 0;
|
|
81
|
+
} else {
|
|
82
|
+
res = res.slice(0, lastSlashIndex);
|
|
83
|
+
lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
|
|
84
|
+
}
|
|
85
|
+
lastSlash = index;
|
|
86
|
+
dots = 0;
|
|
87
|
+
continue;
|
|
88
|
+
} else if (res.length > 0) {
|
|
89
|
+
res = "";
|
|
90
|
+
lastSegmentLength = 0;
|
|
91
|
+
lastSlash = index;
|
|
92
|
+
dots = 0;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (allowAboveRoot) {
|
|
97
|
+
res += res.length > 0 ? "/.." : "..";
|
|
98
|
+
lastSegmentLength = 2;
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
if (res.length > 0) res += `/${path.slice(lastSlash + 1, index)}`;
|
|
102
|
+
else res = path.slice(lastSlash + 1, index);
|
|
103
|
+
lastSegmentLength = index - lastSlash - 1;
|
|
104
|
+
}
|
|
105
|
+
lastSlash = index;
|
|
106
|
+
dots = 0;
|
|
107
|
+
} else if (char === "." && dots !== -1) ++dots;
|
|
108
|
+
else dots = -1;
|
|
109
|
+
}
|
|
110
|
+
return res;
|
|
111
|
+
}
|
|
112
|
+
const isAbsolute = function(p) {
|
|
113
|
+
return _IS_ABSOLUTE_RE.test(p);
|
|
114
|
+
};
|
|
115
|
+
const extname = function(p) {
|
|
116
|
+
if (p === "..") return "";
|
|
117
|
+
const match = _EXTNAME_RE.exec(normalizeWindowsPath(p));
|
|
118
|
+
return match && match[1] || "";
|
|
119
|
+
};
|
|
120
|
+
const relative = function(from, to) {
|
|
121
|
+
const _from = resolve(from).replace(_ROOT_FOLDER_RE, "$1").split("/");
|
|
122
|
+
const _to = resolve(to).replace(_ROOT_FOLDER_RE, "$1").split("/");
|
|
123
|
+
if (_to[0][1] === ":" && _from[0][1] === ":" && _from[0] !== _to[0]) return _to.join("/");
|
|
124
|
+
const _fromCopy = [..._from];
|
|
125
|
+
for (const segment of _fromCopy) {
|
|
126
|
+
if (_to[0] !== segment) break;
|
|
127
|
+
_from.shift();
|
|
128
|
+
_to.shift();
|
|
129
|
+
}
|
|
130
|
+
return [..._from.map(() => ".."), ..._to].join("/");
|
|
131
|
+
};
|
|
132
|
+
const dirname = function(p) {
|
|
133
|
+
const segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
|
|
134
|
+
if (segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0])) segments[0] += "/";
|
|
135
|
+
return segments.join("/") || (isAbsolute(p) ? "/" : ".");
|
|
136
|
+
};
|
|
137
|
+
const basename = function(p, extension) {
|
|
138
|
+
const segments = normalizeWindowsPath(p).split("/");
|
|
139
|
+
let lastSegment = "";
|
|
140
|
+
for (let i = segments.length - 1; i >= 0; i--) {
|
|
141
|
+
const val = segments[i];
|
|
142
|
+
if (val) {
|
|
143
|
+
lastSegment = val;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return extension && lastSegment.endsWith(extension) ? lastSegment.slice(0, -extension.length) : lastSegment;
|
|
148
|
+
};
|
|
149
|
+
//#endregion
|
|
150
|
+
export { join as a, isAbsolute as i, dirname as n, relative as o, extname as r, resolve as s, basename as t };
|