├── .gitignore ├── ReadMe.md ├── demo ├── functions │ ├── _middleware.ts │ ├── dashboard │ │ ├── [paramId] │ │ │ ├── _middleware.ts │ │ │ └── index.ts │ │ ├── _middleware.ts │ │ └── index.ts │ ├── index.ts │ ├── logging-in.ts │ ├── logout.ts │ └── verify.ts ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── schema.sql ├── src │ ├── components │ │ ├── NavBar.ts │ │ ├── Spinner.ts │ │ ├── Stat.ts │ │ ├── Table.ts │ │ └── Toast.ts │ ├── layouts │ │ ├── DashLayout.ts │ │ ├── RootLayout.ts │ │ └── SubLayout.ts │ └── lib │ │ └── html.ts ├── static │ └── assets │ │ ├── css │ │ └── output.css │ │ ├── img │ │ ├── avatar-brice.png │ │ ├── avatar-hart.png │ │ ├── avatar-marjy.png │ │ └── avatar-yancy.png │ │ └── js │ │ ├── _hyperscript.min.js │ │ └── htmx.min.js ├── tailwind.config.js ├── tailwind.css ├── tsconfig.json └── wrangler.toml ├── index.ts ├── install.js ├── package-lock.json ├── package.json ├── screenshot.png ├── templates └── basic │ ├── functions │ ├── _middleware.ts │ └── index.ts │ ├── package.json │ ├── src │ └── layouts │ │ └── RootLayout.ts │ ├── static │ ├── css │ │ └── main.css │ └── js │ │ ├── _hyperscript.min.js │ │ └── htmx.min.js │ └── tsconfig.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | 3 | logs 4 | _.log 5 | npm-debug.log_ 6 | yarn-debug.log* 7 | yarn-error.log* 8 | lerna-debug.log* 9 | .pnpm-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | 13 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 14 | 15 | # Runtime data 16 | 17 | pids 18 | _.pid 19 | _.seed 20 | \*.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | 28 | coverage 29 | \*.lcov 30 | 31 | # nyc test coverage 32 | 33 | .nyc_output 34 | 35 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 36 | 37 | .grunt 38 | 39 | # Bower dependency directory (https://bower.io/) 40 | 41 | bower_components 42 | 43 | # node-waf configuration 44 | 45 | .lock-wscript 46 | 47 | # Compiled binary addons (https://nodejs.org/api/addons.html) 48 | 49 | build/Release 50 | 51 | # Dependency directories 52 | 53 | node_modules/ 54 | demo/node_modules/ 55 | jspm_packages/ 56 | 57 | # Snowpack dependency directory (https://snowpack.dev/) 58 | 59 | web_modules/ 60 | 61 | # TypeScript cache 62 | 63 | \*.tsbuildinfo 64 | 65 | # Optional npm cache directory 66 | 67 | .npm 68 | 69 | # Optional eslint cache 70 | 71 | .eslintcache 72 | 73 | # Optional stylelint cache 74 | 75 | .stylelintcache 76 | 77 | # Microbundle cache 78 | 79 | .rpt2_cache/ 80 | .rts2_cache_cjs/ 81 | .rts2_cache_es/ 82 | .rts2_cache_umd/ 83 | 84 | # Optional REPL history 85 | 86 | .node_repl_history 87 | 88 | # Output of 'npm pack' 89 | 90 | \*.tgz 91 | 92 | # Yarn Integrity file 93 | 94 | .yarn-integrity 95 | 96 | # dotenv environment variable files 97 | 98 | .env 99 | .env.development.local 100 | .env.test.local 101 | .env.production.local 102 | .env.local 103 | 104 | # parcel-bundler cache (https://parceljs.org/) 105 | 106 | .cache 107 | .parcel-cache 108 | 109 | # Next.js build output 110 | 111 | .next 112 | out 113 | 114 | # Nuxt.js build / generate output 115 | 116 | .nuxt 117 | dist 118 | 119 | # Gatsby files 120 | 121 | .cache/ 122 | 123 | # Comment in the public line in if your project uses Gatsby and not Next.js 124 | 125 | # https://nextjs.org/blog/next-9-1#public-directory-support 126 | 127 | # public 128 | 129 | # vuepress build output 130 | 131 | .vuepress/dist 132 | 133 | # vuepress v2.x temp and cache directory 134 | 135 | .temp 136 | .cache 137 | 138 | # Docusaurus cache and generated files 139 | 140 | .docusaurus 141 | 142 | # Serverless directories 143 | 144 | .serverless/ 145 | 146 | # FuseBox cache 147 | 148 | .fusebox/ 149 | 150 | # DynamoDB Local files 151 | 152 | .dynamodb/ 153 | 154 | # TernJS port file 155 | 156 | .tern-port 157 | 158 | # Stores VSCode versions used for testing VSCode extensions 159 | 160 | .vscode-test 161 | 162 | # yarn v2 163 | 164 | .yarn/cache 165 | .yarn/unplugged 166 | .yarn/build-state.yml 167 | .yarn/install-state.gz 168 | .pnp.\* 169 | 170 | # wrangler project 171 | 172 | .dev.vars 173 | .wrangler/ 174 | -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | # Cloudflare Pages + HTMX 2 | 3 | This is a starter project to create a zero-build web-app using [HTMX](https://htmx.org/) on [Cloudflare](https://dash.cloudflare.com/). It uses [\_hyperscript](https://hyperscript.org) for additional (rare) client side JS and [TailwindCSS](https://tailwindcss.com/) and [DaisyUI](https://daisyui.com/) for styling and theme. 4 | 5 | ## Live Demo 6 | 7 | ![Cloudflare-HTMX demo](screenshot.png 'Demo Screenshot') 8 | 9 | [https://cloudflare-htmx.pages.dev/](https://cloudflare-htmx.pages.dev/) 10 | 11 | ## Getting Started 12 | 13 | ```bash 14 | $ git clone https://github.com/stukennedy/cloudflare-htmx.git 15 | $ cd cloudflare-htmx 16 | $ npm i 17 | $ npm run dev 18 | ``` 19 | 20 | - NextJS-style routing files, written in Typescript, are found in the `functions` folder. 21 | - Endpoints should return HTML strings wrapped in a `new Response()`. 22 | - `import { html, view } from "@lib/html"` declaration allows a string template to be syntax highlighted in VS Code 23 | - Use `_middleware.ts` files at any level of the folder structure to apply a layout. You should use this to at least apply your root level HTML wrapper. 24 | e.g. 25 | 26 | ```typescript 27 | // functions/_middleware.ts 28 | import RootLayout from '@layouts/RootLayout'; 29 | import { applyLayout } from '@lib/html'; 30 | 31 | export const onRequestGet = [applyLayout(RootLayout)]; 32 | ``` 33 | 34 | This makes sure that the `RootLayout` which is of type `LayoutFunction` wraps all `GET` requests throughout the app. 35 | Our `RootLayout.ts` looks like this: 36 | 37 | ```typescript 38 | import SupabaseAuth from '@components/SupabaseAuth'; 39 | import { html, LayoutFunction } from '@lib/html'; 40 | 41 | // this is the layout for the entire site 42 | const _layout: LayoutFunction = ({ children }) => { 43 | const title = 'Cloudflare Pages + HTMX + Hyperscript'; 44 | return html` 45 | 46 | 47 | 48 | 49 | 50 | ${title} 51 | 52 | 53 | 54 | 55 | 56 | ${children} 57 |
58 | 59 | ${SupabaseAuth('/dashboard')} 60 | 61 | 62 | `; 63 | }; 64 | export default _layout; 65 | ``` 66 | 67 | A layout function can be `async` too if needed. 68 | 69 | Other layouts can be handled a similar way throughout the folder structure. e.g. to Apply the Navbar to just anything under route `/dashboard` we use this 70 | 71 | ```typescript 72 | // functions/dashboard/_middleware.ts 73 | import DashLayout from '@layouts/DashLayout'; 74 | import { applyLayout } from '@lib/html'; 75 | import { getSupabase } from '@model/supabase'; 76 | 77 | const authentication: PagesFunction = async ({ request, next }) => { 78 | const url = new URL(request.url); 79 | const supabase = await getSupabase(request); 80 | const { 81 | data: { user }, 82 | } = await supabase.auth.getUser(); 83 | if (!user) { 84 | console.error('authentication: redirect to login', url.origin); 85 | return Response.redirect(url.origin, 303); 86 | } else { 87 | return next(); 88 | } 89 | }; 90 | 91 | export const onRequestGet = [authentication, applyLayout(DashLayout)]; 92 | ``` 93 | 94 | This chains both the authentication function and the layout. If the authentication fails, it redirects to the login screen before getting to process the layout. 95 | 96 | ### HTMX 97 | 98 | [HTMX](https://htmx.org/) is a lightweight javascript library that encourages webapps to be built using HATEOAS. 99 | 100 | HATEOAS (Hypermedia as the Engine of Application State) is a constraint of the REST application architecture. It keeps the REST style architecture unique from most other network application architectures. 101 | 102 | This means we return HTML from every endpoint request and never JSON. HTMX makes it easy to trigger asynchronous requests for data e.g. directly from a button click or page load ... and then allows you the control on where to place the HTML that the backend responds with. 103 | 104 | ### Cloudflare Pages 105 | 106 | [Cloudflare Pages](https://developers.cloudflare.com/pages/) utilise the Cloudflare CDN to provide Typescript Edge Functions in the cloud and provides a simple framework for developing and deploying serverless webapps. 107 | This allows us to build scalable web-apps that are server rendered, whilst maintaining the dynamic asynchronous experience that Single Page Applications have enjoyed. 108 | 109 | ### \_hyperscript 110 | 111 | [\_hyperscript](https://hyperscript.org/docs) is a small library that allows javascript to be executed on dom tags in a more functional way without writing scripts with code. This is useful for bits of dynamic UI e.g. multi-selecting rows of checkboxes. 112 | -------------------------------------------------------------------------------- /demo/functions/_middleware.ts: -------------------------------------------------------------------------------- 1 | import RootLayout from '@layouts/RootLayout'; 2 | import { applyLayout } from '@lib/html'; 3 | 4 | export const onRequest = [applyLayout(RootLayout, true)]; 5 | -------------------------------------------------------------------------------- /demo/functions/dashboard/[paramId]/_middleware.ts: -------------------------------------------------------------------------------- 1 | import SubLayout from '@layouts/SubLayout'; 2 | import { applyLayout } from '@lib/html'; 3 | 4 | export const onRequest = [applyLayout(SubLayout, false)]; 5 | -------------------------------------------------------------------------------- /demo/functions/dashboard/[paramId]/index.ts: -------------------------------------------------------------------------------- 1 | import { html, view } from '@lib/html'; 2 | 3 | export const onRequestPost: PagesFunction = async ({ request }) => { 4 | const url = new URL(request.url); 5 | return view(html`
6 |
${url}
7 |
npm i daisyui
8 |
installing...
9 |
Done!
10 |
`); 11 | }; 12 | 13 | export const onRequestGet: PagesFunction = async ({ params }) => { 14 | return view(html`
15 |
16 |
17 |
18 |
19 |
24 | Get content 25 |
26 |
27 |
28 |
29 |
`); 30 | }; 31 | -------------------------------------------------------------------------------- /demo/functions/dashboard/_middleware.ts: -------------------------------------------------------------------------------- 1 | import DashLayout from '@layouts/DashLayout'; 2 | import { applyLayout } from '@lib/html'; 3 | import { middlewareGuard } from 'cloudflare-auth'; 4 | 5 | export const onRequest = [middlewareGuard, applyLayout(DashLayout, false)]; 6 | -------------------------------------------------------------------------------- /demo/functions/dashboard/index.ts: -------------------------------------------------------------------------------- 1 | import Stat from '@components/Stat'; 2 | import Table from '@components/Table'; 3 | 4 | import { html, view } from '@lib/html'; 5 | 6 | const timer = (ms: number) => new Promise((res) => setTimeout(res, ms)); 7 | 8 | // return the Table component with the items after 1 second 9 | export const onRequestPost: PagesFunction = async () => { 10 | await timer(1000); 11 | const items = [ 12 | { 13 | name: 'Hart Hagerty', 14 | country: 'United States', 15 | avatar: '/assets/img/avatar-hart.png', 16 | company: "Hart's Company", 17 | job: 'Desktop Support Technician', 18 | color: 'Purple', 19 | }, 20 | { 21 | name: 'Brice Hagenes', 22 | country: 'China', 23 | avatar: '/assets/img/avatar-brice.png', 24 | company: 'Carroll Group', 25 | job: 'Senior Quality Engineer', 26 | color: 'Red', 27 | }, 28 | { 29 | name: 'Lavada Hickle', 30 | country: 'Russia', 31 | avatar: '/assets/img/avatar-marjy.png', 32 | company: 'Hickle, Hickle and Hickle', 33 | job: 'Internal Intranet Assistant', 34 | color: 'Green', 35 | }, 36 | { 37 | name: 'Loyce Hane', 38 | country: 'Brazil', 39 | avatar: '/assets/img/avatar-yancy.png', 40 | company: 'Wyman-Ledner', 41 | job: 'Dynamic Usability Consultant', 42 | color: 'Red', 43 | }, 44 | ]; 45 | return view(Table(items)); 46 | }; 47 | 48 | // show the loading state of the Table component and trigger a POST request 49 | export const onRequestGet: PagesFunction = async ({ request }) => { 50 | const url = new URL(request.url); 51 | return view(html` 52 |
53 |
Cloudflare + HTMX
54 | ${Stat()} 55 |
56 |
57 | ${Table([null, null, null, null])} 58 |
59 |
60 | `); 61 | }; 62 | -------------------------------------------------------------------------------- /demo/functions/index.ts: -------------------------------------------------------------------------------- 1 | import Toast from '@components/Toast'; 2 | import { Env, isAuthorised, loginWithToken } from 'cloudflare-auth'; 3 | 4 | import { html, view } from '@lib/html'; 5 | 6 | export const onRequestPost: PagesFunction = async ({ request, env }) => { 7 | const url = new URL(request.url); 8 | const data = await request.formData(); 9 | const email = data.get('email') as string; 10 | if (!email) { 11 | return view(Toast('Email not specified')); 12 | } 13 | const magicLink = await loginWithToken(email, env, url.origin, true); 14 | try { 15 | return view( 16 | Toast( 17 | 'Click to login: ' + magicLink + '', 18 | 'alert-success' 19 | ) 20 | ); 21 | } catch { 22 | return view(Toast('Magic link failed to send!', 'alert-failure')); 23 | } 24 | }; 25 | 26 | export const onRequestGet: PagesFunction = async ({ env, request }) => { 27 | const loggedIn = await isAuthorised(request, env); 28 | if (loggedIn) { 29 | console.log('redirect to dashboard'); 30 | const url = new URL(request.url); 31 | return Response.redirect(url.origin + '/dashboard', 303); 32 | } 33 | return view(html` 34 |
35 |
36 |
37 |
38 |
Login
39 |
40 | 48 |
49 |
50 | 56 |
57 |
58 |
59 |
60 |
61 | `); 62 | }; 63 | -------------------------------------------------------------------------------- /demo/functions/logging-in.ts: -------------------------------------------------------------------------------- 1 | import Spinner from '@components/Spinner'; 2 | import { html, view } from '@lib/html'; 3 | 4 | export const onRequestGet: PagesFunction = async () => 5 | view(html`
${Spinner('Logging in ...')}
`); 6 | -------------------------------------------------------------------------------- /demo/functions/logout.ts: -------------------------------------------------------------------------------- 1 | import { Env, logout } from 'cloudflare-auth'; 2 | 3 | export const onRequestPost: PagesFunction = async ({ env }) => { 4 | return logout(env, '/'); 5 | }; 6 | -------------------------------------------------------------------------------- /demo/functions/verify.ts: -------------------------------------------------------------------------------- 1 | import Spinner from '@components/Spinner'; 2 | import { html, view } from '@lib/html'; 3 | import { verify, Env } from 'cloudflare-auth'; 4 | 5 | export const onRequestPost: PagesFunction = async ({ request, env }) => { 6 | const url = new URL(request.url); 7 | const data = await request.formData(); 8 | const token = data.get('token') as string; 9 | try { 10 | return await verify(token!, env, '/dashboard'); 11 | } catch (e) { 12 | console.log(e); 13 | return Response.redirect(url.origin, 303); 14 | } 15 | }; 16 | 17 | export const onRequestGet: PagesFunction = async ({ request }) => { 18 | const url = new URL(request.url); 19 | return view(html` 20 |
21 | 26 | ${Spinner('Logging in ...')} 27 |
28 | `); 29 | }; 30 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-htmx-demo", 3 | "version": "1.0.0", 4 | "description": "Cloudflare Pages + HTMX + _hyperscript + TailwindCSS", 5 | "scripts": { 6 | "dev": "wrangler pages dev ./static --compatibility-date=2023-05-01", 7 | "publish": "wrangler pages publish ./static", 8 | "tailwind": "tailwindcss build -i ./tailwind.css -o ./static/assets/css/output.css --watch", 9 | "db:create": "wrangler d1 create auth --experimental-backend", 10 | "db:init": "wrangler d1 execute auth --local --file=./schema.sql" 11 | }, 12 | "devDependencies": { 13 | "@cloudflare/workers-types": "^4.20231016.0", 14 | "@types/cookie": "^0.5.3", 15 | "tailwindcss": "^3.3.3", 16 | "wrangler": "^3.14.0" 17 | }, 18 | "private": true, 19 | "dependencies": { 20 | "cloudflare-auth": "^1.5.0", 21 | "cookie": "^0.5.0", 22 | "daisyui": "^2.52.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /demo/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | cloudflare-auth: 9 | specifier: ^1.5.0 10 | version: 1.5.0 11 | cookie: 12 | specifier: ^0.5.0 13 | version: 0.5.0 14 | daisyui: 15 | specifier: ^2.52.0 16 | version: 2.52.0(autoprefixer@10.4.16)(postcss@8.4.31) 17 | 18 | devDependencies: 19 | '@cloudflare/workers-types': 20 | specifier: ^4.20231016.0 21 | version: 4.20231016.0 22 | '@types/cookie': 23 | specifier: ^0.5.3 24 | version: 0.5.3 25 | tailwindcss: 26 | specifier: ^3.3.3 27 | version: 3.3.3 28 | wrangler: 29 | specifier: ^3.14.0 30 | version: 3.14.0 31 | 32 | packages: 33 | 34 | /@alloc/quick-lru@5.2.0: 35 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 36 | engines: {node: '>=10'} 37 | 38 | /@cfworker/uuid@1.12.4: 39 | resolution: {integrity: sha512-aw4lxCT4NLbGqlTScWPtPrZrg4TO6HCZCnNUAeC4yTOvkXjJGdJP6S5NCY9vtP2FruLIC+vYCvUP98fHXtF7kg==} 40 | dev: false 41 | 42 | /@cloudflare/kv-asset-handler@0.2.0: 43 | resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} 44 | dependencies: 45 | mime: 3.0.0 46 | dev: true 47 | 48 | /@cloudflare/workerd-darwin-64@1.20231016.0: 49 | resolution: {integrity: sha512-rPAnF8Q25+eHEsAopihWeftPW/P0QapY9d7qaUmtOXztWdd6YPQ7JuiWVj4Nvjphge1BleehxAbo4I3Z4L2H1g==} 50 | engines: {node: '>=16'} 51 | cpu: [x64] 52 | os: [darwin] 53 | requiresBuild: true 54 | dev: true 55 | optional: true 56 | 57 | /@cloudflare/workerd-darwin-arm64@1.20231016.0: 58 | resolution: {integrity: sha512-MvydDdiLXt+jy57vrVZ2lU6EQwCdpieyZoN8uBXSWzfG3zR/6dxU1+okvPQPlHN0jtlufqPeHrpJyAqqgLHUKA==} 59 | engines: {node: '>=16'} 60 | cpu: [arm64] 61 | os: [darwin] 62 | requiresBuild: true 63 | dev: true 64 | optional: true 65 | 66 | /@cloudflare/workerd-linux-64@1.20231016.0: 67 | resolution: {integrity: sha512-y6Sj37yTzM8QbAghG9LRqoSBrsREnQz8NkcmpjSxeK6KMc2g0L5A/OemCdugNlIiv+zRv9BYX1aosaoxY5JbeQ==} 68 | engines: {node: '>=16'} 69 | cpu: [x64] 70 | os: [linux] 71 | requiresBuild: true 72 | dev: true 73 | optional: true 74 | 75 | /@cloudflare/workerd-linux-arm64@1.20231016.0: 76 | resolution: {integrity: sha512-LqMIRUHD1YeRg2TPIfIQEhapSKMFSq561RypvJoXZvTwSbaROxGdW6Ku+PvButqTkEvuAtfzN/kGje7fvfQMHg==} 77 | engines: {node: '>=16'} 78 | cpu: [arm64] 79 | os: [linux] 80 | requiresBuild: true 81 | dev: true 82 | optional: true 83 | 84 | /@cloudflare/workerd-windows-64@1.20231016.0: 85 | resolution: {integrity: sha512-96ojBwIHyiUAbsWlzBqo9P/cvH8xUh8SuBboFXtwAeXcJ6/urwKN2AqPa/QzOGUTCdsurWYiieARHT5WWWPhKw==} 86 | engines: {node: '>=16'} 87 | cpu: [x64] 88 | os: [win32] 89 | requiresBuild: true 90 | dev: true 91 | optional: true 92 | 93 | /@cloudflare/workers-types@4.20231016.0: 94 | resolution: {integrity: sha512-eGB0cRVyoJpeyGJx2re5sbd9R316a61sY73xwnqm4cwGpb+OxCK2gc651RxGiN7H4w6LY1RpysUgeGLmj5B3+g==} 95 | dev: true 96 | 97 | /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): 98 | resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} 99 | peerDependencies: 100 | esbuild: '*' 101 | dependencies: 102 | esbuild: 0.17.19 103 | dev: true 104 | 105 | /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): 106 | resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} 107 | peerDependencies: 108 | esbuild: '*' 109 | dependencies: 110 | esbuild: 0.17.19 111 | escape-string-regexp: 4.0.0 112 | rollup-plugin-node-polyfills: 0.2.1 113 | dev: true 114 | 115 | /@esbuild/android-arm64@0.17.19: 116 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 117 | engines: {node: '>=12'} 118 | cpu: [arm64] 119 | os: [android] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/android-arm@0.17.19: 125 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 126 | engines: {node: '>=12'} 127 | cpu: [arm] 128 | os: [android] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/android-x64@0.17.19: 134 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 135 | engines: {node: '>=12'} 136 | cpu: [x64] 137 | os: [android] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/darwin-arm64@0.17.19: 143 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 144 | engines: {node: '>=12'} 145 | cpu: [arm64] 146 | os: [darwin] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/darwin-x64@0.17.19: 152 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 153 | engines: {node: '>=12'} 154 | cpu: [x64] 155 | os: [darwin] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/freebsd-arm64@0.17.19: 161 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 162 | engines: {node: '>=12'} 163 | cpu: [arm64] 164 | os: [freebsd] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/freebsd-x64@0.17.19: 170 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 171 | engines: {node: '>=12'} 172 | cpu: [x64] 173 | os: [freebsd] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-arm64@0.17.19: 179 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 180 | engines: {node: '>=12'} 181 | cpu: [arm64] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/linux-arm@0.17.19: 188 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 189 | engines: {node: '>=12'} 190 | cpu: [arm] 191 | os: [linux] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/linux-ia32@0.17.19: 197 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 198 | engines: {node: '>=12'} 199 | cpu: [ia32] 200 | os: [linux] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/linux-loong64@0.17.19: 206 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 207 | engines: {node: '>=12'} 208 | cpu: [loong64] 209 | os: [linux] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/linux-mips64el@0.17.19: 215 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 216 | engines: {node: '>=12'} 217 | cpu: [mips64el] 218 | os: [linux] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/linux-ppc64@0.17.19: 224 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 225 | engines: {node: '>=12'} 226 | cpu: [ppc64] 227 | os: [linux] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/linux-riscv64@0.17.19: 233 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 234 | engines: {node: '>=12'} 235 | cpu: [riscv64] 236 | os: [linux] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@esbuild/linux-s390x@0.17.19: 242 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 243 | engines: {node: '>=12'} 244 | cpu: [s390x] 245 | os: [linux] 246 | requiresBuild: true 247 | dev: true 248 | optional: true 249 | 250 | /@esbuild/linux-x64@0.17.19: 251 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 252 | engines: {node: '>=12'} 253 | cpu: [x64] 254 | os: [linux] 255 | requiresBuild: true 256 | dev: true 257 | optional: true 258 | 259 | /@esbuild/netbsd-x64@0.17.19: 260 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 261 | engines: {node: '>=12'} 262 | cpu: [x64] 263 | os: [netbsd] 264 | requiresBuild: true 265 | dev: true 266 | optional: true 267 | 268 | /@esbuild/openbsd-x64@0.17.19: 269 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 270 | engines: {node: '>=12'} 271 | cpu: [x64] 272 | os: [openbsd] 273 | requiresBuild: true 274 | dev: true 275 | optional: true 276 | 277 | /@esbuild/sunos-x64@0.17.19: 278 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 279 | engines: {node: '>=12'} 280 | cpu: [x64] 281 | os: [sunos] 282 | requiresBuild: true 283 | dev: true 284 | optional: true 285 | 286 | /@esbuild/win32-arm64@0.17.19: 287 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 288 | engines: {node: '>=12'} 289 | cpu: [arm64] 290 | os: [win32] 291 | requiresBuild: true 292 | dev: true 293 | optional: true 294 | 295 | /@esbuild/win32-ia32@0.17.19: 296 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 297 | engines: {node: '>=12'} 298 | cpu: [ia32] 299 | os: [win32] 300 | requiresBuild: true 301 | dev: true 302 | optional: true 303 | 304 | /@esbuild/win32-x64@0.17.19: 305 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 306 | engines: {node: '>=12'} 307 | cpu: [x64] 308 | os: [win32] 309 | requiresBuild: true 310 | dev: true 311 | optional: true 312 | 313 | /@fastify/busboy@2.0.0: 314 | resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} 315 | engines: {node: '>=14'} 316 | dev: true 317 | 318 | /@jridgewell/gen-mapping@0.3.3: 319 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 320 | engines: {node: '>=6.0.0'} 321 | dependencies: 322 | '@jridgewell/set-array': 1.1.2 323 | '@jridgewell/sourcemap-codec': 1.4.15 324 | '@jridgewell/trace-mapping': 0.3.20 325 | 326 | /@jridgewell/resolve-uri@3.1.1: 327 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 328 | engines: {node: '>=6.0.0'} 329 | 330 | /@jridgewell/set-array@1.1.2: 331 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 332 | engines: {node: '>=6.0.0'} 333 | 334 | /@jridgewell/sourcemap-codec@1.4.15: 335 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 336 | 337 | /@jridgewell/trace-mapping@0.3.20: 338 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 339 | dependencies: 340 | '@jridgewell/resolve-uri': 3.1.1 341 | '@jridgewell/sourcemap-codec': 1.4.15 342 | 343 | /@nodelib/fs.scandir@2.1.5: 344 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 345 | engines: {node: '>= 8'} 346 | dependencies: 347 | '@nodelib/fs.stat': 2.0.5 348 | run-parallel: 1.2.0 349 | 350 | /@nodelib/fs.stat@2.0.5: 351 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 352 | engines: {node: '>= 8'} 353 | 354 | /@nodelib/fs.walk@1.2.8: 355 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 356 | engines: {node: '>= 8'} 357 | dependencies: 358 | '@nodelib/fs.scandir': 2.1.5 359 | fastq: 1.15.0 360 | 361 | /@types/cookie@0.5.3: 362 | resolution: {integrity: sha512-SLg07AS9z1Ab2LU+QxzU8RCmzsja80ywjf/t5oqw+4NSH20gIGlhLOrBDm1L3PBWzPa4+wkgFQVZAjE6Ioj2ug==} 363 | dev: true 364 | 365 | /acorn-walk@8.2.0: 366 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 367 | engines: {node: '>=0.4.0'} 368 | dev: true 369 | 370 | /acorn@8.10.0: 371 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 372 | engines: {node: '>=0.4.0'} 373 | hasBin: true 374 | dev: true 375 | 376 | /any-promise@1.3.0: 377 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 378 | 379 | /anymatch@3.1.3: 380 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 381 | engines: {node: '>= 8'} 382 | dependencies: 383 | normalize-path: 3.0.0 384 | picomatch: 2.3.1 385 | 386 | /arg@5.0.2: 387 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 388 | 389 | /as-table@1.0.55: 390 | resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} 391 | dependencies: 392 | printable-characters: 1.0.42 393 | dev: true 394 | 395 | /autoprefixer@10.4.16(postcss@8.4.31): 396 | resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} 397 | engines: {node: ^10 || ^12 || >=14} 398 | hasBin: true 399 | peerDependencies: 400 | postcss: ^8.1.0 401 | dependencies: 402 | browserslist: 4.22.1 403 | caniuse-lite: 1.0.30001553 404 | fraction.js: 4.3.7 405 | normalize-range: 0.1.2 406 | picocolors: 1.0.0 407 | postcss: 8.4.31 408 | postcss-value-parser: 4.2.0 409 | dev: false 410 | 411 | /balanced-match@1.0.2: 412 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 413 | 414 | /binary-extensions@2.2.0: 415 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 416 | engines: {node: '>=8'} 417 | 418 | /blake3-wasm@2.1.5: 419 | resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 420 | dev: true 421 | 422 | /brace-expansion@1.1.11: 423 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 424 | dependencies: 425 | balanced-match: 1.0.2 426 | concat-map: 0.0.1 427 | 428 | /braces@3.0.2: 429 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 430 | engines: {node: '>=8'} 431 | dependencies: 432 | fill-range: 7.0.1 433 | 434 | /browserslist@4.22.1: 435 | resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} 436 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 437 | hasBin: true 438 | dependencies: 439 | caniuse-lite: 1.0.30001553 440 | electron-to-chromium: 1.4.563 441 | node-releases: 2.0.13 442 | update-browserslist-db: 1.0.13(browserslist@4.22.1) 443 | dev: false 444 | 445 | /buffer-equal-constant-time@1.0.1: 446 | resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} 447 | dev: false 448 | 449 | /buffer-from@1.1.2: 450 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 451 | dev: true 452 | 453 | /camelcase-css@2.0.1: 454 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 455 | engines: {node: '>= 6'} 456 | 457 | /caniuse-lite@1.0.30001553: 458 | resolution: {integrity: sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==} 459 | dev: false 460 | 461 | /capnp-ts@0.7.0: 462 | resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} 463 | dependencies: 464 | debug: 4.3.4 465 | tslib: 2.6.2 466 | transitivePeerDependencies: 467 | - supports-color 468 | dev: true 469 | 470 | /chokidar@3.5.3: 471 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 472 | engines: {node: '>= 8.10.0'} 473 | dependencies: 474 | anymatch: 3.1.3 475 | braces: 3.0.2 476 | glob-parent: 5.1.2 477 | is-binary-path: 2.1.0 478 | is-glob: 4.0.3 479 | normalize-path: 3.0.0 480 | readdirp: 3.6.0 481 | optionalDependencies: 482 | fsevents: 2.3.3 483 | 484 | /cloudflare-auth@1.5.0: 485 | resolution: {integrity: sha512-Ro+FGNk0CxgkmOM8YtaNDQdJ8FbXhcdT1BF2qr4z/Gp5MiFEgI/y1RUYx++3mnyTVR8aqTXLAjBnH+zSB0R8mA==} 486 | dependencies: 487 | '@cfworker/uuid': 1.12.4 488 | cookie: 0.5.0 489 | jose: 4.15.4 490 | jsonwebtoken: 9.0.2 491 | kysely: 0.25.0 492 | kysely-d1: 0.3.0(kysely@0.25.0) 493 | dev: false 494 | 495 | /color-convert@2.0.1: 496 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 497 | engines: {node: '>=7.0.0'} 498 | dependencies: 499 | color-name: 1.1.4 500 | dev: false 501 | 502 | /color-name@1.1.4: 503 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 504 | dev: false 505 | 506 | /color-string@1.9.1: 507 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 508 | dependencies: 509 | color-name: 1.1.4 510 | simple-swizzle: 0.2.2 511 | dev: false 512 | 513 | /color@4.2.3: 514 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 515 | engines: {node: '>=12.5.0'} 516 | dependencies: 517 | color-convert: 2.0.1 518 | color-string: 1.9.1 519 | dev: false 520 | 521 | /commander@4.1.1: 522 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 523 | engines: {node: '>= 6'} 524 | 525 | /concat-map@0.0.1: 526 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 527 | 528 | /cookie@0.5.0: 529 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 530 | engines: {node: '>= 0.6'} 531 | 532 | /css-selector-tokenizer@0.8.0: 533 | resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} 534 | dependencies: 535 | cssesc: 3.0.0 536 | fastparse: 1.1.2 537 | dev: false 538 | 539 | /cssesc@3.0.0: 540 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 541 | engines: {node: '>=4'} 542 | hasBin: true 543 | 544 | /daisyui@2.52.0(autoprefixer@10.4.16)(postcss@8.4.31): 545 | resolution: {integrity: sha512-LQTA5/IVXAJHBMFoeaEMfd7/akAFPPcdQPR3O9fzzcFiczneJFM73CFPnScmW2sOgn/D83cvkP854ep2T9OfTg==} 546 | peerDependencies: 547 | autoprefixer: ^10.0.2 548 | postcss: ^8.1.6 549 | dependencies: 550 | autoprefixer: 10.4.16(postcss@8.4.31) 551 | color: 4.2.3 552 | css-selector-tokenizer: 0.8.0 553 | postcss: 8.4.31 554 | postcss-js: 4.0.1(postcss@8.4.31) 555 | tailwindcss: 3.3.3 556 | transitivePeerDependencies: 557 | - ts-node 558 | dev: false 559 | 560 | /data-uri-to-buffer@2.0.2: 561 | resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} 562 | dev: true 563 | 564 | /debug@4.3.4: 565 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 566 | engines: {node: '>=6.0'} 567 | peerDependencies: 568 | supports-color: '*' 569 | peerDependenciesMeta: 570 | supports-color: 571 | optional: true 572 | dependencies: 573 | ms: 2.1.2 574 | dev: true 575 | 576 | /didyoumean@1.2.2: 577 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 578 | 579 | /dlv@1.1.3: 580 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 581 | 582 | /ecdsa-sig-formatter@1.0.11: 583 | resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} 584 | dependencies: 585 | safe-buffer: 5.2.1 586 | dev: false 587 | 588 | /electron-to-chromium@1.4.563: 589 | resolution: {integrity: sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==} 590 | dev: false 591 | 592 | /esbuild@0.17.19: 593 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 594 | engines: {node: '>=12'} 595 | hasBin: true 596 | requiresBuild: true 597 | optionalDependencies: 598 | '@esbuild/android-arm': 0.17.19 599 | '@esbuild/android-arm64': 0.17.19 600 | '@esbuild/android-x64': 0.17.19 601 | '@esbuild/darwin-arm64': 0.17.19 602 | '@esbuild/darwin-x64': 0.17.19 603 | '@esbuild/freebsd-arm64': 0.17.19 604 | '@esbuild/freebsd-x64': 0.17.19 605 | '@esbuild/linux-arm': 0.17.19 606 | '@esbuild/linux-arm64': 0.17.19 607 | '@esbuild/linux-ia32': 0.17.19 608 | '@esbuild/linux-loong64': 0.17.19 609 | '@esbuild/linux-mips64el': 0.17.19 610 | '@esbuild/linux-ppc64': 0.17.19 611 | '@esbuild/linux-riscv64': 0.17.19 612 | '@esbuild/linux-s390x': 0.17.19 613 | '@esbuild/linux-x64': 0.17.19 614 | '@esbuild/netbsd-x64': 0.17.19 615 | '@esbuild/openbsd-x64': 0.17.19 616 | '@esbuild/sunos-x64': 0.17.19 617 | '@esbuild/win32-arm64': 0.17.19 618 | '@esbuild/win32-ia32': 0.17.19 619 | '@esbuild/win32-x64': 0.17.19 620 | dev: true 621 | 622 | /escalade@3.1.1: 623 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 624 | engines: {node: '>=6'} 625 | dev: false 626 | 627 | /escape-string-regexp@4.0.0: 628 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 629 | engines: {node: '>=10'} 630 | dev: true 631 | 632 | /estree-walker@0.6.1: 633 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 634 | dev: true 635 | 636 | /exit-hook@2.2.1: 637 | resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} 638 | engines: {node: '>=6'} 639 | dev: true 640 | 641 | /fast-glob@3.3.1: 642 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 643 | engines: {node: '>=8.6.0'} 644 | dependencies: 645 | '@nodelib/fs.stat': 2.0.5 646 | '@nodelib/fs.walk': 1.2.8 647 | glob-parent: 5.1.2 648 | merge2: 1.4.1 649 | micromatch: 4.0.5 650 | 651 | /fastparse@1.1.2: 652 | resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} 653 | dev: false 654 | 655 | /fastq@1.15.0: 656 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 657 | dependencies: 658 | reusify: 1.0.4 659 | 660 | /fill-range@7.0.1: 661 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 662 | engines: {node: '>=8'} 663 | dependencies: 664 | to-regex-range: 5.0.1 665 | 666 | /fraction.js@4.3.7: 667 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 668 | dev: false 669 | 670 | /fs.realpath@1.0.0: 671 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 672 | 673 | /fsevents@2.3.3: 674 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 675 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 676 | os: [darwin] 677 | requiresBuild: true 678 | optional: true 679 | 680 | /function-bind@1.1.2: 681 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 682 | 683 | /get-source@2.0.12: 684 | resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} 685 | dependencies: 686 | data-uri-to-buffer: 2.0.2 687 | source-map: 0.6.1 688 | dev: true 689 | 690 | /glob-parent@5.1.2: 691 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 692 | engines: {node: '>= 6'} 693 | dependencies: 694 | is-glob: 4.0.3 695 | 696 | /glob-parent@6.0.2: 697 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 698 | engines: {node: '>=10.13.0'} 699 | dependencies: 700 | is-glob: 4.0.3 701 | 702 | /glob-to-regexp@0.4.1: 703 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 704 | dev: true 705 | 706 | /glob@7.1.6: 707 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 708 | dependencies: 709 | fs.realpath: 1.0.0 710 | inflight: 1.0.6 711 | inherits: 2.0.4 712 | minimatch: 3.1.2 713 | once: 1.4.0 714 | path-is-absolute: 1.0.1 715 | 716 | /hasown@2.0.0: 717 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 718 | engines: {node: '>= 0.4'} 719 | dependencies: 720 | function-bind: 1.1.2 721 | 722 | /inflight@1.0.6: 723 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 724 | dependencies: 725 | once: 1.4.0 726 | wrappy: 1.0.2 727 | 728 | /inherits@2.0.4: 729 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 730 | 731 | /is-arrayish@0.3.2: 732 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 733 | dev: false 734 | 735 | /is-binary-path@2.1.0: 736 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 737 | engines: {node: '>=8'} 738 | dependencies: 739 | binary-extensions: 2.2.0 740 | 741 | /is-core-module@2.13.1: 742 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 743 | dependencies: 744 | hasown: 2.0.0 745 | 746 | /is-extglob@2.1.1: 747 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 748 | engines: {node: '>=0.10.0'} 749 | 750 | /is-glob@4.0.3: 751 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 752 | engines: {node: '>=0.10.0'} 753 | dependencies: 754 | is-extglob: 2.1.1 755 | 756 | /is-number@7.0.0: 757 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 758 | engines: {node: '>=0.12.0'} 759 | 760 | /jiti@1.20.0: 761 | resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} 762 | hasBin: true 763 | 764 | /jose@4.15.4: 765 | resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} 766 | dev: false 767 | 768 | /jsonwebtoken@9.0.2: 769 | resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} 770 | engines: {node: '>=12', npm: '>=6'} 771 | dependencies: 772 | jws: 3.2.2 773 | lodash.includes: 4.3.0 774 | lodash.isboolean: 3.0.3 775 | lodash.isinteger: 4.0.4 776 | lodash.isnumber: 3.0.3 777 | lodash.isplainobject: 4.0.6 778 | lodash.isstring: 4.0.1 779 | lodash.once: 4.1.1 780 | ms: 2.1.3 781 | semver: 7.5.4 782 | dev: false 783 | 784 | /jwa@1.4.1: 785 | resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} 786 | dependencies: 787 | buffer-equal-constant-time: 1.0.1 788 | ecdsa-sig-formatter: 1.0.11 789 | safe-buffer: 5.2.1 790 | dev: false 791 | 792 | /jws@3.2.2: 793 | resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} 794 | dependencies: 795 | jwa: 1.4.1 796 | safe-buffer: 5.2.1 797 | dev: false 798 | 799 | /kysely-d1@0.3.0(kysely@0.25.0): 800 | resolution: {integrity: sha512-9wTbE6ooLiYtBa4wPg9e4fjfcmvRtgE/2j9pAjYrIq+iz+EsH/Hj9YbtxpEXA6JoRgfulVQ1EtGj6aycGGRpYw==} 801 | peerDependencies: 802 | kysely: '*' 803 | dependencies: 804 | kysely: 0.25.0 805 | dev: false 806 | 807 | /kysely@0.25.0: 808 | resolution: {integrity: sha512-srn0efIMu5IoEBk0tBmtGnoUss4uwvxtbFQWG/U2MosfqIace1l43IFP1PmEpHRDp+Z79xIcKEqmHH3dAvQdQA==} 809 | engines: {node: '>=14.0.0'} 810 | dev: false 811 | 812 | /lilconfig@2.1.0: 813 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 814 | engines: {node: '>=10'} 815 | 816 | /lines-and-columns@1.2.4: 817 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 818 | 819 | /lodash.includes@4.3.0: 820 | resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} 821 | dev: false 822 | 823 | /lodash.isboolean@3.0.3: 824 | resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} 825 | dev: false 826 | 827 | /lodash.isinteger@4.0.4: 828 | resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} 829 | dev: false 830 | 831 | /lodash.isnumber@3.0.3: 832 | resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} 833 | dev: false 834 | 835 | /lodash.isplainobject@4.0.6: 836 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 837 | dev: false 838 | 839 | /lodash.isstring@4.0.1: 840 | resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} 841 | dev: false 842 | 843 | /lodash.once@4.1.1: 844 | resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} 845 | dev: false 846 | 847 | /lru-cache@6.0.0: 848 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 849 | engines: {node: '>=10'} 850 | dependencies: 851 | yallist: 4.0.0 852 | dev: false 853 | 854 | /magic-string@0.25.9: 855 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 856 | dependencies: 857 | sourcemap-codec: 1.4.8 858 | dev: true 859 | 860 | /merge2@1.4.1: 861 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 862 | engines: {node: '>= 8'} 863 | 864 | /micromatch@4.0.5: 865 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 866 | engines: {node: '>=8.6'} 867 | dependencies: 868 | braces: 3.0.2 869 | picomatch: 2.3.1 870 | 871 | /mime@3.0.0: 872 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 873 | engines: {node: '>=10.0.0'} 874 | hasBin: true 875 | dev: true 876 | 877 | /miniflare@3.20231016.0: 878 | resolution: {integrity: sha512-AmlqI89zsnBJfC+nKKZdCB/fuu0q/br24Kqt9NZwcT6yJEpO5NytNKfjl6nJROHROwuJSRQR1T3yopCtG1/0DA==} 879 | engines: {node: '>=16.13'} 880 | dependencies: 881 | acorn: 8.10.0 882 | acorn-walk: 8.2.0 883 | capnp-ts: 0.7.0 884 | exit-hook: 2.2.1 885 | glob-to-regexp: 0.4.1 886 | source-map-support: 0.5.21 887 | stoppable: 1.1.0 888 | undici: 5.26.5 889 | workerd: 1.20231016.0 890 | ws: 8.14.2 891 | youch: 3.3.2 892 | zod: 3.22.4 893 | transitivePeerDependencies: 894 | - bufferutil 895 | - supports-color 896 | - utf-8-validate 897 | dev: true 898 | 899 | /minimatch@3.1.2: 900 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 901 | dependencies: 902 | brace-expansion: 1.1.11 903 | 904 | /ms@2.1.2: 905 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 906 | dev: true 907 | 908 | /ms@2.1.3: 909 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 910 | dev: false 911 | 912 | /mustache@4.2.0: 913 | resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 914 | hasBin: true 915 | dev: true 916 | 917 | /mz@2.7.0: 918 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 919 | dependencies: 920 | any-promise: 1.3.0 921 | object-assign: 4.1.1 922 | thenify-all: 1.6.0 923 | 924 | /nanoid@3.3.6: 925 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 926 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 927 | hasBin: true 928 | 929 | /node-forge@1.3.1: 930 | resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} 931 | engines: {node: '>= 6.13.0'} 932 | dev: true 933 | 934 | /node-releases@2.0.13: 935 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 936 | dev: false 937 | 938 | /normalize-path@3.0.0: 939 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 940 | engines: {node: '>=0.10.0'} 941 | 942 | /normalize-range@0.1.2: 943 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 944 | engines: {node: '>=0.10.0'} 945 | dev: false 946 | 947 | /object-assign@4.1.1: 948 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 949 | engines: {node: '>=0.10.0'} 950 | 951 | /object-hash@3.0.0: 952 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 953 | engines: {node: '>= 6'} 954 | 955 | /once@1.4.0: 956 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 957 | dependencies: 958 | wrappy: 1.0.2 959 | 960 | /path-is-absolute@1.0.1: 961 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 962 | engines: {node: '>=0.10.0'} 963 | 964 | /path-parse@1.0.7: 965 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 966 | 967 | /path-to-regexp@6.2.1: 968 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 969 | dev: true 970 | 971 | /picocolors@1.0.0: 972 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 973 | 974 | /picomatch@2.3.1: 975 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 976 | engines: {node: '>=8.6'} 977 | 978 | /pify@2.3.0: 979 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 980 | engines: {node: '>=0.10.0'} 981 | 982 | /pirates@4.0.6: 983 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 984 | engines: {node: '>= 6'} 985 | 986 | /postcss-import@15.1.0(postcss@8.4.31): 987 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 988 | engines: {node: '>=14.0.0'} 989 | peerDependencies: 990 | postcss: ^8.0.0 991 | dependencies: 992 | postcss: 8.4.31 993 | postcss-value-parser: 4.2.0 994 | read-cache: 1.0.0 995 | resolve: 1.22.8 996 | 997 | /postcss-js@4.0.1(postcss@8.4.31): 998 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 999 | engines: {node: ^12 || ^14 || >= 16} 1000 | peerDependencies: 1001 | postcss: ^8.4.21 1002 | dependencies: 1003 | camelcase-css: 2.0.1 1004 | postcss: 8.4.31 1005 | 1006 | /postcss-load-config@4.0.1(postcss@8.4.31): 1007 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} 1008 | engines: {node: '>= 14'} 1009 | peerDependencies: 1010 | postcss: '>=8.0.9' 1011 | ts-node: '>=9.0.0' 1012 | peerDependenciesMeta: 1013 | postcss: 1014 | optional: true 1015 | ts-node: 1016 | optional: true 1017 | dependencies: 1018 | lilconfig: 2.1.0 1019 | postcss: 8.4.31 1020 | yaml: 2.3.3 1021 | 1022 | /postcss-nested@6.0.1(postcss@8.4.31): 1023 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1024 | engines: {node: '>=12.0'} 1025 | peerDependencies: 1026 | postcss: ^8.2.14 1027 | dependencies: 1028 | postcss: 8.4.31 1029 | postcss-selector-parser: 6.0.13 1030 | 1031 | /postcss-selector-parser@6.0.13: 1032 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} 1033 | engines: {node: '>=4'} 1034 | dependencies: 1035 | cssesc: 3.0.0 1036 | util-deprecate: 1.0.2 1037 | 1038 | /postcss-value-parser@4.2.0: 1039 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1040 | 1041 | /postcss@8.4.31: 1042 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1043 | engines: {node: ^10 || ^12 || >=14} 1044 | dependencies: 1045 | nanoid: 3.3.6 1046 | picocolors: 1.0.0 1047 | source-map-js: 1.0.2 1048 | 1049 | /printable-characters@1.0.42: 1050 | resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} 1051 | dev: true 1052 | 1053 | /queue-microtask@1.2.3: 1054 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1055 | 1056 | /read-cache@1.0.0: 1057 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1058 | dependencies: 1059 | pify: 2.3.0 1060 | 1061 | /readdirp@3.6.0: 1062 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1063 | engines: {node: '>=8.10.0'} 1064 | dependencies: 1065 | picomatch: 2.3.1 1066 | 1067 | /resolve@1.22.8: 1068 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1069 | hasBin: true 1070 | dependencies: 1071 | is-core-module: 2.13.1 1072 | path-parse: 1.0.7 1073 | supports-preserve-symlinks-flag: 1.0.0 1074 | 1075 | /reusify@1.0.4: 1076 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1077 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1078 | 1079 | /rollup-plugin-inject@3.0.2: 1080 | resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} 1081 | deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. 1082 | dependencies: 1083 | estree-walker: 0.6.1 1084 | magic-string: 0.25.9 1085 | rollup-pluginutils: 2.8.2 1086 | dev: true 1087 | 1088 | /rollup-plugin-node-polyfills@0.2.1: 1089 | resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} 1090 | dependencies: 1091 | rollup-plugin-inject: 3.0.2 1092 | dev: true 1093 | 1094 | /rollup-pluginutils@2.8.2: 1095 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 1096 | dependencies: 1097 | estree-walker: 0.6.1 1098 | dev: true 1099 | 1100 | /run-parallel@1.2.0: 1101 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1102 | dependencies: 1103 | queue-microtask: 1.2.3 1104 | 1105 | /safe-buffer@5.2.1: 1106 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1107 | dev: false 1108 | 1109 | /selfsigned@2.1.1: 1110 | resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} 1111 | engines: {node: '>=10'} 1112 | dependencies: 1113 | node-forge: 1.3.1 1114 | dev: true 1115 | 1116 | /semver@7.5.4: 1117 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1118 | engines: {node: '>=10'} 1119 | hasBin: true 1120 | dependencies: 1121 | lru-cache: 6.0.0 1122 | dev: false 1123 | 1124 | /simple-swizzle@0.2.2: 1125 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1126 | dependencies: 1127 | is-arrayish: 0.3.2 1128 | dev: false 1129 | 1130 | /source-map-js@1.0.2: 1131 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1132 | engines: {node: '>=0.10.0'} 1133 | 1134 | /source-map-support@0.5.21: 1135 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1136 | dependencies: 1137 | buffer-from: 1.1.2 1138 | source-map: 0.6.1 1139 | dev: true 1140 | 1141 | /source-map@0.6.1: 1142 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1143 | engines: {node: '>=0.10.0'} 1144 | dev: true 1145 | 1146 | /sourcemap-codec@1.4.8: 1147 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1148 | deprecated: Please use @jridgewell/sourcemap-codec instead 1149 | dev: true 1150 | 1151 | /stacktracey@2.1.8: 1152 | resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} 1153 | dependencies: 1154 | as-table: 1.0.55 1155 | get-source: 2.0.12 1156 | dev: true 1157 | 1158 | /stoppable@1.1.0: 1159 | resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} 1160 | engines: {node: '>=4', npm: '>=6'} 1161 | dev: true 1162 | 1163 | /sucrase@3.34.0: 1164 | resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} 1165 | engines: {node: '>=8'} 1166 | hasBin: true 1167 | dependencies: 1168 | '@jridgewell/gen-mapping': 0.3.3 1169 | commander: 4.1.1 1170 | glob: 7.1.6 1171 | lines-and-columns: 1.2.4 1172 | mz: 2.7.0 1173 | pirates: 4.0.6 1174 | ts-interface-checker: 0.1.13 1175 | 1176 | /supports-preserve-symlinks-flag@1.0.0: 1177 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1178 | engines: {node: '>= 0.4'} 1179 | 1180 | /tailwindcss@3.3.3: 1181 | resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} 1182 | engines: {node: '>=14.0.0'} 1183 | hasBin: true 1184 | dependencies: 1185 | '@alloc/quick-lru': 5.2.0 1186 | arg: 5.0.2 1187 | chokidar: 3.5.3 1188 | didyoumean: 1.2.2 1189 | dlv: 1.1.3 1190 | fast-glob: 3.3.1 1191 | glob-parent: 6.0.2 1192 | is-glob: 4.0.3 1193 | jiti: 1.20.0 1194 | lilconfig: 2.1.0 1195 | micromatch: 4.0.5 1196 | normalize-path: 3.0.0 1197 | object-hash: 3.0.0 1198 | picocolors: 1.0.0 1199 | postcss: 8.4.31 1200 | postcss-import: 15.1.0(postcss@8.4.31) 1201 | postcss-js: 4.0.1(postcss@8.4.31) 1202 | postcss-load-config: 4.0.1(postcss@8.4.31) 1203 | postcss-nested: 6.0.1(postcss@8.4.31) 1204 | postcss-selector-parser: 6.0.13 1205 | resolve: 1.22.8 1206 | sucrase: 3.34.0 1207 | transitivePeerDependencies: 1208 | - ts-node 1209 | 1210 | /thenify-all@1.6.0: 1211 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1212 | engines: {node: '>=0.8'} 1213 | dependencies: 1214 | thenify: 3.3.1 1215 | 1216 | /thenify@3.3.1: 1217 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1218 | dependencies: 1219 | any-promise: 1.3.0 1220 | 1221 | /to-regex-range@5.0.1: 1222 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1223 | engines: {node: '>=8.0'} 1224 | dependencies: 1225 | is-number: 7.0.0 1226 | 1227 | /ts-interface-checker@0.1.13: 1228 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1229 | 1230 | /tslib@2.6.2: 1231 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1232 | dev: true 1233 | 1234 | /undici@5.26.5: 1235 | resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} 1236 | engines: {node: '>=14.0'} 1237 | dependencies: 1238 | '@fastify/busboy': 2.0.0 1239 | dev: true 1240 | 1241 | /update-browserslist-db@1.0.13(browserslist@4.22.1): 1242 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 1243 | hasBin: true 1244 | peerDependencies: 1245 | browserslist: '>= 4.21.0' 1246 | dependencies: 1247 | browserslist: 4.22.1 1248 | escalade: 3.1.1 1249 | picocolors: 1.0.0 1250 | dev: false 1251 | 1252 | /util-deprecate@1.0.2: 1253 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1254 | 1255 | /workerd@1.20231016.0: 1256 | resolution: {integrity: sha512-v2GDb5XitSqgub/xm7EWHVAlAK4snxQu3itdMQxXstGtUG9hl79fQbXS/8fNFbmms2R2bAxUwSv47q8k5T5Erw==} 1257 | engines: {node: '>=16'} 1258 | hasBin: true 1259 | requiresBuild: true 1260 | optionalDependencies: 1261 | '@cloudflare/workerd-darwin-64': 1.20231016.0 1262 | '@cloudflare/workerd-darwin-arm64': 1.20231016.0 1263 | '@cloudflare/workerd-linux-64': 1.20231016.0 1264 | '@cloudflare/workerd-linux-arm64': 1.20231016.0 1265 | '@cloudflare/workerd-windows-64': 1.20231016.0 1266 | dev: true 1267 | 1268 | /wrangler@3.14.0: 1269 | resolution: {integrity: sha512-4vzw11yG1/KXpYKbumvRJ61Iyhm/yKXb/ayOw/2xiIRdKdpsfN9/796d2l525+CDaGwZWswpLENe6ZMS0p/Ghg==} 1270 | engines: {node: '>=16.13.0'} 1271 | hasBin: true 1272 | dependencies: 1273 | '@cloudflare/kv-asset-handler': 0.2.0 1274 | '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) 1275 | '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) 1276 | blake3-wasm: 2.1.5 1277 | chokidar: 3.5.3 1278 | esbuild: 0.17.19 1279 | miniflare: 3.20231016.0 1280 | nanoid: 3.3.6 1281 | path-to-regexp: 6.2.1 1282 | selfsigned: 2.1.1 1283 | source-map: 0.6.1 1284 | source-map-support: 0.5.21 1285 | xxhash-wasm: 1.0.2 1286 | optionalDependencies: 1287 | fsevents: 2.3.3 1288 | transitivePeerDependencies: 1289 | - bufferutil 1290 | - supports-color 1291 | - utf-8-validate 1292 | dev: true 1293 | 1294 | /wrappy@1.0.2: 1295 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1296 | 1297 | /ws@8.14.2: 1298 | resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} 1299 | engines: {node: '>=10.0.0'} 1300 | peerDependencies: 1301 | bufferutil: ^4.0.1 1302 | utf-8-validate: '>=5.0.2' 1303 | peerDependenciesMeta: 1304 | bufferutil: 1305 | optional: true 1306 | utf-8-validate: 1307 | optional: true 1308 | dev: true 1309 | 1310 | /xxhash-wasm@1.0.2: 1311 | resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} 1312 | dev: true 1313 | 1314 | /yallist@4.0.0: 1315 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1316 | dev: false 1317 | 1318 | /yaml@2.3.3: 1319 | resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} 1320 | engines: {node: '>= 14'} 1321 | 1322 | /youch@3.3.2: 1323 | resolution: {integrity: sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==} 1324 | dependencies: 1325 | cookie: 0.5.0 1326 | mustache: 4.2.0 1327 | stacktracey: 2.1.8 1328 | dev: true 1329 | 1330 | /zod@3.22.4: 1331 | resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} 1332 | dev: true 1333 | -------------------------------------------------------------------------------- /demo/schema.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS auth_tokens; 2 | CREATE TABLE auth_tokens (email TEXT PRIMARY KEY, token TEXT, type TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP); 3 | 4 | DROP TABLE IF EXISTS users; 5 | CREATE TABLE users ( 6 | uid TEXT PRIMARY KEY, 7 | email TEXT, 8 | first_name TEXT, 9 | last_name TEXT, 10 | password TEXT, 11 | role TEXT DEFAULT 'user', 12 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 13 | active BOOLEAN DEFAULT 1, 14 | verified BOOLEAN DEFAULT 1 15 | ); 16 | -------------------------------------------------------------------------------- /demo/src/components/NavBar.ts: -------------------------------------------------------------------------------- 1 | import { html, view } from '@lib/html'; 2 | 3 | /* 4 | * In this Navbar component, we want to add the "active" class to the 5 | * current link. 6 | * Because this component is used by the _layout.ts file, we can't use 7 | * the request object to get the current path (which will be a _layout path). 8 | * Instead, we'll use the location object, which is available in the browser. 9 | * To do this, we'll use the _hyperscript "on load" event to 10 | * check the current path and add the "active" class if the path matches. 11 | */ 12 | export default () => { 13 | const links = [ 14 | { text: 'Home', href: '/dashboard' }, 15 | { text: 'Page', href: '/dashboard/4' }, 16 | ]; 17 | return html` `; 99 | }; 100 | -------------------------------------------------------------------------------- /demo/src/components/Spinner.ts: -------------------------------------------------------------------------------- 1 | import { html } from '@lib/html'; 2 | 3 | export default (message: string) => html` 4 |
5 |
6 |
7 |
${message}
8 |
11 |
12 |
13 |
14 | `; 15 | -------------------------------------------------------------------------------- /demo/src/components/Stat.ts: -------------------------------------------------------------------------------- 1 | import { html, view } from '@lib/html'; 2 | 3 | export default () => html` 4 |
5 |
6 |
7 | 13 | 19 | 20 |
21 |
Downloads
22 |
31K
23 |
Jan 1st - Feb 1st
24 |
25 | 26 |
27 |
28 | 34 | 40 | 41 |
42 |
New Users
43 |
4,200
44 |
↗︎ 400 (22%)
45 |
46 | 47 |
48 |
49 | 55 | 61 | 62 |
63 |
New Registers
64 |
1,200
65 |
↘︎ 90 (14%)
66 |
67 |
68 | `; 69 | -------------------------------------------------------------------------------- /demo/src/components/Table.ts: -------------------------------------------------------------------------------- 1 | import { html, view } from '@lib/html'; 2 | 3 | type Item = { 4 | name: string; 5 | avatar: string; 6 | country: string; 7 | company: string; 8 | color: string; 9 | job: string; 10 | }; 11 | 12 | // an array of null items is used to show the loading state 13 | export default (items: Item[] | null[]) => { 14 | return html` 15 |

16 | Using _hyperscript to do multi-select 17 |

18 |
19 | 20 | 21 | 22 | 23 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | ${items 40 | .map((item) => 41 | item 42 | ? html` 43 | 44 | 49 | 67 | 74 | 75 | 78 | 79 | ` 80 | : html` 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | ` 89 | ) 90 | .join('\n')} 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |
24 | 31 | NameJobFavorite Color
45 | 48 | 50 |
51 |
52 |
53 | Avatar Tailwind CSS Component 57 |
58 |
59 |
60 |
${item.name}
61 |
62 | ${item.country} 63 |
64 |
65 |
66 |
68 | ${item.company} 69 |
70 | ${item.job} 73 |
${item.color} 76 | 77 |
NameJobFavorite Color
103 |
104 | `; 105 | }; 106 | -------------------------------------------------------------------------------- /demo/src/components/Toast.ts: -------------------------------------------------------------------------------- 1 | import { html } from '@lib/html'; 2 | 3 | export default ( 4 | message: string, 5 | alertClass = 'alert-success', 6 | remove = true 7 | ) => { 8 | return html` 9 |
13 |
14 | ${message} 15 |
16 |
17 | `; 18 | }; 19 | -------------------------------------------------------------------------------- /demo/src/layouts/DashLayout.ts: -------------------------------------------------------------------------------- 1 | import NavBar from '@components/NavBar'; 2 | import { LayoutFunction, html } from '@lib/html'; 3 | 4 | const _layout: LayoutFunction = async ({ children }) => { 5 | return html`${NavBar()} ${children} `; 6 | }; 7 | export default _layout; 8 | -------------------------------------------------------------------------------- /demo/src/layouts/RootLayout.ts: -------------------------------------------------------------------------------- 1 | import { html, LayoutFunction } from '@lib/html'; 2 | 3 | // this is the layout for the entire site 4 | const _layout: LayoutFunction = ({ children }) => { 5 | const title = 'Cloudflare Pages + HTMX + Hyperscript'; 6 | return html` 7 | 8 | 9 | 10 | 11 | 12 | ${title} 13 | 14 | 15 | 16 | 17 | 18 | ${children} 19 |
20 | 21 | 22 | 23 | `; 24 | }; 25 | export default _layout; 26 | -------------------------------------------------------------------------------- /demo/src/layouts/SubLayout.ts: -------------------------------------------------------------------------------- 1 | import { html, LayoutFunction } from '@lib/html'; 2 | 3 | // this is the layout for all pages inside the [paramId] folder and its subfolders 4 | const _layout: LayoutFunction = ({ children, request }) => { 5 | return html` 6 |

Sub-page layout

7 | ${children} 8 | `; 9 | }; 10 | export default _layout; 11 | -------------------------------------------------------------------------------- /demo/src/lib/html.ts: -------------------------------------------------------------------------------- 1 | export * from '../../../index'; 2 | -------------------------------------------------------------------------------- /demo/static/assets/img/avatar-brice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stukennedy/cloudflare-htmx/975b1c1f661f16cab84cb61b3f322499fb6a14c2/demo/static/assets/img/avatar-brice.png -------------------------------------------------------------------------------- /demo/static/assets/img/avatar-hart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stukennedy/cloudflare-htmx/975b1c1f661f16cab84cb61b3f322499fb6a14c2/demo/static/assets/img/avatar-hart.png -------------------------------------------------------------------------------- /demo/static/assets/img/avatar-marjy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stukennedy/cloudflare-htmx/975b1c1f661f16cab84cb61b3f322499fb6a14c2/demo/static/assets/img/avatar-marjy.png -------------------------------------------------------------------------------- /demo/static/assets/img/avatar-yancy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stukennedy/cloudflare-htmx/975b1c1f661f16cab84cb61b3f322499fb6a14c2/demo/static/assets/img/avatar-yancy.png -------------------------------------------------------------------------------- /demo/static/assets/js/htmx.min.js: -------------------------------------------------------------------------------- 1 | (function (e, t) { 2 | if (typeof define === 'function' && define.amd) { 3 | define([], t); 4 | } else { 5 | e.htmx = t(); 6 | } 7 | })(typeof self !== 'undefined' ? self : this, function () { 8 | return (function () { 9 | 'use strict'; 10 | var v = { 11 | onLoad: b, 12 | process: tt, 13 | on: z, 14 | off: V, 15 | trigger: ut, 16 | ajax: _t, 17 | find: S, 18 | findAll: E, 19 | closest: T, 20 | values: function (e, t) { 21 | var r = At(e, t || 'post'); 22 | return r.values; 23 | }, 24 | remove: C, 25 | addClass: L, 26 | removeClass: O, 27 | toggleClass: A, 28 | takeClass: R, 29 | defineExtension: Gt, 30 | removeExtension: Yt, 31 | logAll: w, 32 | logger: null, 33 | config: { 34 | historyEnabled: true, 35 | historyCacheSize: 10, 36 | refreshOnHistoryMiss: false, 37 | defaultSwapStyle: 'innerHTML', 38 | defaultSwapDelay: 0, 39 | defaultSettleDelay: 100, 40 | includeIndicatorStyles: true, 41 | indicatorClass: 'htmx-indicator', 42 | requestClass: 'htmx-request', 43 | settlingClass: 'htmx-settling', 44 | swappingClass: 'htmx-swapping', 45 | allowEval: true, 46 | attributesToSettle: ['class', 'style', 'width', 'height'], 47 | }, 48 | parseInterval: f, 49 | _: e, 50 | createEventSource: function (e) { 51 | return new EventSource(e, { withCredentials: true }); 52 | }, 53 | createWebSocket: function (e) { 54 | return new WebSocket(e, []); 55 | }, 56 | }; 57 | var t = ['get', 'post', 'put', 'delete', 'patch']; 58 | var n = t 59 | .map(function (e) { 60 | return '[hx-' + e + '], [data-hx-' + e + ']'; 61 | }) 62 | .join(', '); 63 | function f(e) { 64 | if (e == undefined) { 65 | return undefined; 66 | } 67 | if (e.slice(-2) == 'ms') { 68 | return parseFloat(e.slice(0, -2)) || undefined; 69 | } 70 | if (e.slice(-1) == 's') { 71 | return parseFloat(e.slice(0, -1)) * 1e3 || undefined; 72 | } 73 | return parseFloat(e) || undefined; 74 | } 75 | function l(e, t) { 76 | return e.getAttribute && e.getAttribute(t); 77 | } 78 | function o(e, t) { 79 | return ( 80 | e.hasAttribute && (e.hasAttribute(t) || e.hasAttribute('data-' + t)) 81 | ); 82 | } 83 | function I(e, t) { 84 | return l(e, t) || l(e, 'data-' + t); 85 | } 86 | function c(e) { 87 | return e.parentElement; 88 | } 89 | function k() { 90 | return document; 91 | } 92 | function h(e, t) { 93 | if (t(e)) { 94 | return e; 95 | } else if (c(e)) { 96 | return h(c(e), t); 97 | } else { 98 | return null; 99 | } 100 | } 101 | function M(e, t) { 102 | var r = null; 103 | h(e, function (e) { 104 | return (r = I(e, t)); 105 | }); 106 | return r; 107 | } 108 | function d(e, t) { 109 | var r = 110 | e.matches || 111 | e.matchesSelector || 112 | e.msMatchesSelector || 113 | e.mozMatchesSelector || 114 | e.webkitMatchesSelector || 115 | e.oMatchesSelector; 116 | return r && r.call(e, t); 117 | } 118 | function r(e) { 119 | var t = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; 120 | var r = t.exec(e); 121 | if (r) { 122 | return r[1].toLowerCase(); 123 | } else { 124 | return ''; 125 | } 126 | } 127 | function i(e, t) { 128 | var r = new DOMParser(); 129 | var n = r.parseFromString(e, 'text/html'); 130 | var i = n.body; 131 | while (t > 0) { 132 | t--; 133 | i = i.firstChild; 134 | } 135 | if (i == null) { 136 | i = k().createDocumentFragment(); 137 | } 138 | return i; 139 | } 140 | function u(e) { 141 | var t = r(e); 142 | switch (t) { 143 | case 'thead': 144 | case 'tbody': 145 | case 'tfoot': 146 | case 'colgroup': 147 | case 'caption': 148 | return i('' + e + '
', 1); 149 | case 'col': 150 | return i('' + e + '
', 2); 151 | case 'tr': 152 | return i('' + e + '
', 2); 153 | case 'td': 154 | case 'th': 155 | return i('' + e + '
', 3); 156 | case 'script': 157 | return i('
' + e + '
', 1); 158 | default: 159 | return i(e, 0); 160 | } 161 | } 162 | function D(e) { 163 | if (e) { 164 | e(); 165 | } 166 | } 167 | function a(e, t) { 168 | return Object.prototype.toString.call(e) === '[object ' + t + ']'; 169 | } 170 | function s(e) { 171 | return a(e, 'Function'); 172 | } 173 | function g(e) { 174 | return a(e, 'Object'); 175 | } 176 | function F(e) { 177 | var t = 'htmx-internal-data'; 178 | var r = e[t]; 179 | if (!r) { 180 | r = e[t] = {}; 181 | } 182 | return r; 183 | } 184 | function p(e) { 185 | var t = []; 186 | if (e) { 187 | for (var r = 0; r < e.length; r++) { 188 | t.push(e[r]); 189 | } 190 | } 191 | return t; 192 | } 193 | function X(e, t) { 194 | if (e) { 195 | for (var r = 0; r < e.length; r++) { 196 | t(e[r]); 197 | } 198 | } 199 | } 200 | function m(e) { 201 | var t = e.getBoundingClientRect(); 202 | var r = t.top; 203 | var n = t.bottom; 204 | return r < window.innerHeight && n >= 0; 205 | } 206 | function P(e) { 207 | return k().body.contains(e); 208 | } 209 | function y(e) { 210 | return e.trim().split(/\s+/); 211 | } 212 | function U(e, t) { 213 | for (var r in t) { 214 | if (t.hasOwnProperty(r)) { 215 | e[r] = t[r]; 216 | } 217 | } 218 | return e; 219 | } 220 | function x(e) { 221 | try { 222 | return JSON.parse(e); 223 | } catch (e) { 224 | st(e); 225 | return null; 226 | } 227 | } 228 | function e(e) { 229 | return Xt(k().body, function () { 230 | return eval(e); 231 | }); 232 | } 233 | function b(t) { 234 | var e = v.on('htmx:load', function (e) { 235 | t(e.detail.elt); 236 | }); 237 | return e; 238 | } 239 | function w() { 240 | v.logger = function (e, t, r) { 241 | if (console) { 242 | console.log(t, e, r); 243 | } 244 | }; 245 | } 246 | function S(e, t) { 247 | if (t) { 248 | return e.querySelector(t); 249 | } else { 250 | return S(k(), e); 251 | } 252 | } 253 | function E(e, t) { 254 | if (t) { 255 | return e.querySelectorAll(t); 256 | } else { 257 | return E(k(), e); 258 | } 259 | } 260 | function C(e, t) { 261 | e = N(e); 262 | if (t) { 263 | setTimeout(function () { 264 | C(e); 265 | }, t); 266 | } else { 267 | e.parentElement.removeChild(e); 268 | } 269 | } 270 | function L(e, t, r) { 271 | e = N(e); 272 | if (r) { 273 | setTimeout(function () { 274 | L(e, t); 275 | }, r); 276 | } else { 277 | e.classList.add(t); 278 | } 279 | } 280 | function O(e, t, r) { 281 | e = N(e); 282 | if (r) { 283 | setTimeout(function () { 284 | O(e, t); 285 | }, r); 286 | } else { 287 | e.classList.remove(t); 288 | } 289 | } 290 | function A(e, t) { 291 | e = N(e); 292 | e.classList.toggle(t); 293 | } 294 | function R(e, t) { 295 | e = N(e); 296 | X(e.parentElement.children, function (e) { 297 | O(e, t); 298 | }); 299 | L(e, t); 300 | } 301 | function T(e, t) { 302 | e = N(e); 303 | if (e.closest) { 304 | return e.closest(t); 305 | } else { 306 | do { 307 | if (e == null || d(e, t)) { 308 | return e; 309 | } 310 | } while ((e = e && c(e))); 311 | } 312 | } 313 | function q(e, t) { 314 | if (t.indexOf('closest ') === 0) { 315 | return [T(e, t.substr(8))]; 316 | } else if (t.indexOf('find ') === 0) { 317 | return [S(e, t.substr(5))]; 318 | } else { 319 | return k().querySelectorAll(t); 320 | } 321 | } 322 | function H(e, t) { 323 | return q(e, t)[0]; 324 | } 325 | function N(e) { 326 | if (a(e, 'String')) { 327 | return S(e); 328 | } else { 329 | return e; 330 | } 331 | } 332 | function j(e, t, r) { 333 | if (s(t)) { 334 | return { target: k().body, event: e, listener: t }; 335 | } else { 336 | return { target: N(e), event: t, listener: r }; 337 | } 338 | } 339 | function z(t, r, n) { 340 | Qt(function () { 341 | var e = j(t, r, n); 342 | e.target.addEventListener(e.event, e.listener); 343 | }); 344 | var e = s(r); 345 | return e ? r : n; 346 | } 347 | function V(t, r, n) { 348 | Qt(function () { 349 | var e = j(t, r, n); 350 | e.target.removeEventListener(e.event, e.listener); 351 | }); 352 | return s(r) ? r : n; 353 | } 354 | function W(e) { 355 | var t = h(e, function (e) { 356 | return I(e, 'hx-target') !== null; 357 | }); 358 | if (t) { 359 | var r = I(t, 'hx-target'); 360 | if (r === 'this') { 361 | return t; 362 | } else { 363 | return H(e, r); 364 | } 365 | } else { 366 | var n = F(e); 367 | if (n.boosted) { 368 | return k().body; 369 | } else { 370 | return e; 371 | } 372 | } 373 | } 374 | function _(e) { 375 | var t = v.config.attributesToSettle; 376 | for (var r = 0; r < t.length; r++) { 377 | if (e === t[r]) { 378 | return true; 379 | } 380 | } 381 | return false; 382 | } 383 | function B(t, r) { 384 | X(t.attributes, function (e) { 385 | if (!r.hasAttribute(e.name) && _(e.name)) { 386 | t.removeAttribute(e.name); 387 | } 388 | }); 389 | X(r.attributes, function (e) { 390 | if (_(e.name)) { 391 | t.setAttribute(e.name, e.value); 392 | } 393 | }); 394 | } 395 | function $(e, t) { 396 | var r = Kt(t); 397 | for (var n = 0; n < r.length; n++) { 398 | var i = r[n]; 399 | try { 400 | if (i.isInlineSwap(e)) { 401 | return true; 402 | } 403 | } catch (e) { 404 | st(e); 405 | } 406 | } 407 | return e === 'outerHTML'; 408 | } 409 | function J(e, t, r) { 410 | var n = '#' + t.id; 411 | var i = 'outerHTML'; 412 | if (e === 'true') { 413 | } else if (e.indexOf(':') > 0) { 414 | i = e.substr(0, e.indexOf(':')); 415 | n = e.substr(e.indexOf(':') + 1, e.length); 416 | } else { 417 | i = e; 418 | } 419 | var a = k().querySelector(n); 420 | if (a) { 421 | var o; 422 | o = k().createDocumentFragment(); 423 | o.appendChild(t); 424 | if (!$(i, a)) { 425 | o = t; 426 | } 427 | le(i, a, a, o, r); 428 | } else { 429 | t.parentNode.removeChild(t); 430 | it(k().body, 'htmx:oobErrorNoTarget', { content: t }); 431 | } 432 | return e; 433 | } 434 | function Z(e, r) { 435 | X(E(e, '[hx-swap-oob], [data-hx-swap-oob]'), function (e) { 436 | var t = I(e, 'hx-swap-oob'); 437 | if (t != null) { 438 | J(t, e, r); 439 | } 440 | }); 441 | } 442 | function G(e) { 443 | X(E(e, '[hx-preserve], [data-hx-preserve]'), function (e) { 444 | var t = I(e, 'id'); 445 | var r = k().getElementById(t); 446 | if (r != null) { 447 | e.parentNode.replaceChild(r, e); 448 | } 449 | }); 450 | } 451 | function Y(n, e, i) { 452 | X(e.querySelectorAll('[id]'), function (e) { 453 | if (e.id && e.id.length > 0) { 454 | var t = n.querySelector(e.tagName + "[id='" + e.id + "']"); 455 | if (t && t !== n) { 456 | var r = e.cloneNode(); 457 | B(e, t); 458 | i.tasks.push(function () { 459 | B(e, r); 460 | }); 461 | } 462 | } 463 | }); 464 | } 465 | function K(e) { 466 | return function () { 467 | tt(e); 468 | Ye(e); 469 | Q(e); 470 | ut(e, 'htmx:load'); 471 | }; 472 | } 473 | function Q(e) { 474 | var t = '[autofocus]'; 475 | var r = d(e, t) ? e : e.querySelector(t); 476 | if (r != null) { 477 | r.focus(); 478 | } 479 | } 480 | function ee(e, t, r, n) { 481 | Y(e, r, n); 482 | while (r.childNodes.length > 0) { 483 | var i = r.firstChild; 484 | e.insertBefore(i, t); 485 | if (i.nodeType !== Node.TEXT_NODE && i.nodeType !== Node.COMMENT_NODE) { 486 | n.tasks.push(K(i)); 487 | } 488 | } 489 | } 490 | function te(t) { 491 | var e = F(t); 492 | if (e.webSocket) { 493 | e.webSocket.close(); 494 | } 495 | if (e.sseEventSource) { 496 | e.sseEventSource.close(); 497 | } 498 | if (e.listenerInfos) { 499 | X(e.listenerInfos, function (e) { 500 | if (t !== e.on) { 501 | e.on.removeEventListener(e.trigger, e.listener); 502 | } 503 | }); 504 | } 505 | if (t.children) { 506 | X(t.children, function (e) { 507 | te(e); 508 | }); 509 | } 510 | } 511 | function re(e, t, r) { 512 | if (e.tagName === 'BODY') { 513 | return se(e, t); 514 | } else { 515 | var n = e.previousSibling; 516 | ee(c(e), e, t, r); 517 | if (n == null) { 518 | var i = c(e).firstChild; 519 | } else { 520 | var i = n.nextSibling; 521 | } 522 | F(e).replacedWith = i; 523 | r.elts = []; 524 | while (i && i !== e) { 525 | if (i.nodeType === Node.ELEMENT_NODE) { 526 | r.elts.push(i); 527 | } 528 | i = i.nextElementSibling; 529 | } 530 | te(e); 531 | c(e).removeChild(e); 532 | } 533 | } 534 | function ne(e, t, r) { 535 | return ee(e, e.firstChild, t, r); 536 | } 537 | function ie(e, t, r) { 538 | return ee(c(e), e, t, r); 539 | } 540 | function ae(e, t, r) { 541 | return ee(e, null, t, r); 542 | } 543 | function oe(e, t, r) { 544 | return ee(c(e), e.nextSibling, t, r); 545 | } 546 | function se(e, t, r) { 547 | var n = e.firstChild; 548 | ee(e, n, t, r); 549 | if (n) { 550 | while (n.nextSibling) { 551 | te(n.nextSibling); 552 | e.removeChild(n.nextSibling); 553 | } 554 | te(n); 555 | e.removeChild(n); 556 | } 557 | } 558 | function ue(e, t) { 559 | var r = M(e, 'hx-select'); 560 | if (r) { 561 | var n = k().createDocumentFragment(); 562 | X(t.querySelectorAll(r), function (e) { 563 | n.appendChild(e); 564 | }); 565 | t = n; 566 | } 567 | return t; 568 | } 569 | function le(e, t, r, n, i) { 570 | switch (e) { 571 | case 'none': 572 | return; 573 | case 'outerHTML': 574 | re(r, n, i); 575 | return; 576 | case 'afterbegin': 577 | ne(r, n, i); 578 | return; 579 | case 'beforebegin': 580 | ie(r, n, i); 581 | return; 582 | case 'beforeend': 583 | ae(r, n, i); 584 | return; 585 | case 'afterend': 586 | oe(r, n, i); 587 | return; 588 | default: 589 | var a = Kt(t); 590 | for (var o = 0; o < a.length; o++) { 591 | var s = a[o]; 592 | try { 593 | var u = s.handleSwap(e, r, n, i); 594 | if (u) { 595 | if (typeof u.length !== 'undefined') { 596 | for (var l = 0; l < u.length; l++) { 597 | var f = u[l]; 598 | if ( 599 | f.nodeType !== Node.TEXT_NODE && 600 | f.nodeType !== Node.COMMENT_NODE 601 | ) { 602 | i.tasks.push(K(f)); 603 | } 604 | } 605 | } 606 | return; 607 | } 608 | } catch (e) { 609 | st(e); 610 | } 611 | } 612 | se(r, n, i); 613 | } 614 | } 615 | var fe = /([\s\S]+?)<\/title>/im; 616 | function ce(e) { 617 | var t = fe.exec(e); 618 | if (t) { 619 | return t[1]; 620 | } 621 | } 622 | function he(e, t, r, n, i) { 623 | var a = ce(n); 624 | if (a) { 625 | var o = S('title'); 626 | if (o) { 627 | o.innerHTML = a; 628 | } else { 629 | window.document.title = a; 630 | } 631 | } 632 | var s = u(n); 633 | if (s) { 634 | Z(s, i); 635 | s = ue(r, s); 636 | G(s); 637 | return le(e, r, t, s, i); 638 | } 639 | } 640 | function ve(e, t, r) { 641 | var n = e.getResponseHeader(t); 642 | if (n.indexOf('{') === 0) { 643 | var i = x(n); 644 | for (var a in i) { 645 | if (i.hasOwnProperty(a)) { 646 | var o = i[a]; 647 | if (!g(o)) { 648 | o = { value: o }; 649 | } 650 | ut(r, a, o); 651 | } 652 | } 653 | } else { 654 | ut(r, n, []); 655 | } 656 | } 657 | var de = /\s/; 658 | var ge = /[\s,]/; 659 | var pe = /[_$a-zA-Z]/; 660 | var me = /[_$a-zA-Z0-9]/; 661 | var ye = ['"', "'", '/']; 662 | var xe = /[^\s]/; 663 | function be(e) { 664 | var t = []; 665 | var r = 0; 666 | while (r < e.length) { 667 | if (pe.exec(e.charAt(r))) { 668 | var n = r; 669 | while (me.exec(e.charAt(r + 1))) { 670 | r++; 671 | } 672 | t.push(e.substr(n, r - n + 1)); 673 | } else if (ye.indexOf(e.charAt(r)) !== -1) { 674 | var i = e.charAt(r); 675 | var n = r; 676 | r++; 677 | while (r < e.length && e.charAt(r) !== i) { 678 | if (e.charAt(r) === '\\') { 679 | r++; 680 | } 681 | r++; 682 | } 683 | t.push(e.substr(n, r - n + 1)); 684 | } else { 685 | var a = e.charAt(r); 686 | t.push(a); 687 | } 688 | r++; 689 | } 690 | return t; 691 | } 692 | function we(e, t, r) { 693 | return ( 694 | pe.exec(e.charAt(0)) && 695 | e !== 'true' && 696 | e !== 'false' && 697 | e !== 'this' && 698 | e !== r && 699 | t !== '.' 700 | ); 701 | } 702 | function Se(e, t, r) { 703 | if (t[0] === '[') { 704 | t.shift(); 705 | var n = 1; 706 | var i = ' return (function(' + r + '){ return ('; 707 | var a = null; 708 | while (t.length > 0) { 709 | var o = t[0]; 710 | if (o === ']') { 711 | n--; 712 | if (n === 0) { 713 | if (a === null) { 714 | i = i + 'true'; 715 | } 716 | t.shift(); 717 | i += ')})'; 718 | try { 719 | var s = Xt( 720 | e, 721 | function () { 722 | return Function(i)(); 723 | }, 724 | function () { 725 | return true; 726 | } 727 | ); 728 | s.source = i; 729 | return s; 730 | } catch (e) { 731 | it(k().body, 'htmx:syntax:error', { error: e, source: i }); 732 | return null; 733 | } 734 | } 735 | } else if (o === '[') { 736 | n++; 737 | } 738 | if (we(o, a, r)) { 739 | i += 740 | '((' + 741 | r + 742 | '.' + 743 | o + 744 | ') ? (' + 745 | r + 746 | '.' + 747 | o + 748 | ') : (window.' + 749 | o + 750 | '))'; 751 | } else { 752 | i = i + o; 753 | } 754 | a = t.shift(); 755 | } 756 | } 757 | } 758 | function Ee(e, t) { 759 | var r = ''; 760 | while (e.length > 0 && !e[0].match(t)) { 761 | r += e.shift(); 762 | } 763 | return r; 764 | } 765 | var Ce = 'input, textarea, select'; 766 | function Le(e) { 767 | var t = I(e, 'hx-trigger'); 768 | var r = []; 769 | if (t) { 770 | var n = be(t); 771 | do { 772 | Ee(n, xe); 773 | var i = n.length; 774 | var a = Ee(n, /[,\[\s]/); 775 | if (a !== '') { 776 | if (a === 'every') { 777 | var o = { trigger: 'every' }; 778 | Ee(n, xe); 779 | o.pollInterval = f(Ee(n, de)); 780 | r.push(o); 781 | } else if (a.indexOf('sse:') === 0) { 782 | r.push({ trigger: 'sse', sseEvent: a.substr(4) }); 783 | } else { 784 | var s = { trigger: a }; 785 | var u = Se(e, n, 'event'); 786 | if (u) { 787 | s.eventFilter = u; 788 | } 789 | while (n.length > 0 && n[0] !== ',') { 790 | Ee(n, xe); 791 | var l = n.shift(); 792 | if (l === 'changed') { 793 | s.changed = true; 794 | } else if (l === 'once') { 795 | s.once = true; 796 | } else if (l === 'consume') { 797 | s.consume = true; 798 | } else if (l === 'delay' && n[0] === ':') { 799 | n.shift(); 800 | s.delay = f(Ee(n, ge)); 801 | } else if (l === 'from' && n[0] === ':') { 802 | n.shift(); 803 | s.from = Ee(n, ge); 804 | } else if (l === 'target' && n[0] === ':') { 805 | n.shift(); 806 | s.target = Ee(n, ge); 807 | } else if (l === 'throttle' && n[0] === ':') { 808 | n.shift(); 809 | s.throttle = f(Ee(n, ge)); 810 | } else { 811 | it(e, 'htmx:syntax:error', { token: n.shift() }); 812 | } 813 | } 814 | r.push(s); 815 | } 816 | } 817 | if (n.length === i) { 818 | it(e, 'htmx:syntax:error', { token: n.shift() }); 819 | } 820 | Ee(n, xe); 821 | } while (n[0] === ',' && n.shift()); 822 | } 823 | if (r.length > 0) { 824 | return r; 825 | } else if (d(e, 'form')) { 826 | return [{ trigger: 'submit' }]; 827 | } else if (d(e, Ce)) { 828 | return [{ trigger: 'change' }]; 829 | } else { 830 | return [{ trigger: 'click' }]; 831 | } 832 | } 833 | function Oe(e) { 834 | F(e).cancelled = true; 835 | } 836 | function Ae(e, t, r, n) { 837 | var i = F(e); 838 | i.timeout = setTimeout(function () { 839 | if (P(e) && i.cancelled !== true) { 840 | Bt(t, r, e); 841 | Ae(e, t, I(e, 'hx-' + t), n); 842 | } 843 | }, n); 844 | } 845 | function Re(e) { 846 | return ( 847 | location.hostname === e.hostname && 848 | l(e, 'href') && 849 | l(e, 'href').indexOf('#') !== 0 850 | ); 851 | } 852 | function Te(t, r, e) { 853 | if ((t.tagName === 'A' && Re(t)) || t.tagName === 'FORM') { 854 | r.boosted = true; 855 | var n, i; 856 | if (t.tagName === 'A') { 857 | n = 'get'; 858 | i = l(t, 'href'); 859 | } else { 860 | var a = l(t, 'method'); 861 | n = a ? a.toLowerCase() : 'get'; 862 | i = l(t, 'action'); 863 | } 864 | e.forEach(function (e) { 865 | Ie(t, n, i, r, e, true); 866 | }); 867 | } 868 | } 869 | function qe(e) { 870 | return ( 871 | e.tagName === 'FORM' || 872 | (d(e, 'input[type="submit"], button') && T(e, 'form') !== null) || 873 | (e.tagName === 'A' && 874 | e.href && 875 | e.getAttribute('href').indexOf('#') !== 0) 876 | ); 877 | } 878 | function He(e, t) { 879 | return ( 880 | F(e).boosted && e.tagName === 'A' && t.type === 'click' && t.ctrlKey 881 | ); 882 | } 883 | function Ne(e, t) { 884 | var r = e.eventFilter; 885 | if (r) { 886 | try { 887 | return r(t) !== true; 888 | } catch (e) { 889 | it(k().body, 'htmx:eventFilter:error', { 890 | error: e, 891 | source: r.source, 892 | }); 893 | return true; 894 | } 895 | } 896 | return false; 897 | } 898 | function Ie(n, i, a, e, o, s) { 899 | var u = n; 900 | if (o.from) { 901 | u = S(o.from); 902 | } 903 | var l = function (e) { 904 | if (!P(n)) { 905 | u.removeEventListener(o.trigger, l); 906 | return; 907 | } 908 | if (He(n, e)) { 909 | return; 910 | } 911 | if (s || qe(n)) { 912 | e.preventDefault(); 913 | } 914 | if (Ne(o, e)) { 915 | return; 916 | } 917 | var t = F(e); 918 | if (t.handledFor == null) { 919 | t.handledFor = []; 920 | } 921 | var r = F(n); 922 | if (t.handledFor.indexOf(n) < 0) { 923 | t.handledFor.push(n); 924 | if (o.consume) { 925 | e.stopPropagation(); 926 | } 927 | if (o.target && e.target) { 928 | if (!d(e.target, o.target)) { 929 | return; 930 | } 931 | } 932 | if (o.once) { 933 | if (r.triggeredOnce) { 934 | return; 935 | } else { 936 | r.triggeredOnce = true; 937 | } 938 | } 939 | if (o.changed) { 940 | if (r.lastValue === n.value) { 941 | return; 942 | } else { 943 | r.lastValue = n.value; 944 | } 945 | } 946 | if (r.delayed) { 947 | clearTimeout(r.delayed); 948 | } 949 | if (r.throttle) { 950 | return; 951 | } 952 | if (o.throttle) { 953 | r.throttle = setTimeout(function () { 954 | Bt(i, a, n, e); 955 | r.throttle = null; 956 | }, o.throttle); 957 | } else if (o.delay) { 958 | r.delayed = setTimeout(function () { 959 | Bt(i, a, n, e); 960 | }, o.delay); 961 | } else { 962 | Bt(i, a, n, e); 963 | } 964 | } 965 | }; 966 | if (e.listenerInfos == null) { 967 | e.listenerInfos = []; 968 | } 969 | e.listenerInfos.push({ trigger: o.trigger, listener: l, on: u }); 970 | u.addEventListener(o.trigger, l); 971 | } 972 | var ke = false; 973 | var Me = null; 974 | function De() { 975 | if (!Me) { 976 | Me = function () { 977 | ke = true; 978 | }; 979 | window.addEventListener('scroll', Me); 980 | setInterval(function () { 981 | if (ke) { 982 | ke = false; 983 | X( 984 | k().querySelectorAll( 985 | "[hx-trigger='revealed'],[data-hx-trigger='revealed']" 986 | ), 987 | function (e) { 988 | Fe(e); 989 | } 990 | ); 991 | } 992 | }, 200); 993 | } 994 | } 995 | function Fe(e) { 996 | var t = F(e); 997 | if (!t.revealed && m(e)) { 998 | t.revealed = true; 999 | Bt(t.verb, t.path, e); 1000 | } 1001 | } 1002 | function Xe(e, t, r) { 1003 | var n = y(r); 1004 | for (var i = 0; i < n.length; i++) { 1005 | var a = n[i].split(/:(.+)/); 1006 | if (a[0] === 'connect') { 1007 | Pe(e, a[1]); 1008 | } 1009 | if (a[0] === 'send') { 1010 | je(e); 1011 | } 1012 | } 1013 | } 1014 | function Pe(s, e) { 1015 | if (e.indexOf('/') == 0) { 1016 | var t = location.hostname + (location.port ? ':' + location.port : ''); 1017 | if (location.protocol == 'https:') { 1018 | e = 'wss://' + t + e; 1019 | } else if (location.protocol == 'http:') { 1020 | e = 'ws://' + t + e; 1021 | } 1022 | } 1023 | var r = v.createWebSocket(e); 1024 | r.onerror = function (e) { 1025 | it(s, 'htmx:wsError', { error: e, socket: r }); 1026 | Ue(s); 1027 | }; 1028 | F(s).webSocket = r; 1029 | r.addEventListener('message', function (e) { 1030 | if (Ue(s)) { 1031 | return; 1032 | } 1033 | var t = e.data; 1034 | ot(s, function (e) { 1035 | t = e.transformResponse(t, null, s); 1036 | }); 1037 | var r = Mt(s); 1038 | var n = u(t); 1039 | var i = p(n.children); 1040 | for (var a = 0; a < i.length; a++) { 1041 | var o = i[a]; 1042 | J(I(o, 'hx-swap-oob') || 'true', o, r); 1043 | } 1044 | pt(r.tasks); 1045 | }); 1046 | } 1047 | function Ue(e) { 1048 | if (!P(e)) { 1049 | F(e).webSocket.close(); 1050 | return true; 1051 | } 1052 | } 1053 | function je(u) { 1054 | var l = h(u, function (e) { 1055 | return F(e).webSocket != null; 1056 | }); 1057 | if (l) { 1058 | var f = F(l).webSocket; 1059 | u.addEventListener(Le(u)[0].trigger, function (e) { 1060 | var t = Ht(u, l); 1061 | var r = At(u, 'post'); 1062 | var n = r.errors; 1063 | var i = r.values; 1064 | var a = jt(u); 1065 | var o = U(i, a); 1066 | var s = Nt(o, u); 1067 | s['HEADERS'] = t; 1068 | if (n && n.length > 0) { 1069 | ut(u, 'htmx:validation:halted', n); 1070 | return; 1071 | } 1072 | f.send(JSON.stringify(s)); 1073 | if (qe(u)) { 1074 | e.preventDefault(); 1075 | } 1076 | }); 1077 | } else { 1078 | it(u, 'htmx:noWebSocketSourceError'); 1079 | } 1080 | } 1081 | function ze(e, t, r) { 1082 | var n = y(r); 1083 | for (var i = 0; i < n.length; i++) { 1084 | var a = n[i].split(/:(.+)/); 1085 | if (a[0] === 'connect') { 1086 | Ve(e, a[1]); 1087 | } 1088 | if (a[0] === 'swap') { 1089 | We(e, a[1]); 1090 | } 1091 | } 1092 | } 1093 | function Ve(t, e) { 1094 | var r = v.createEventSource(e); 1095 | r.onerror = function (e) { 1096 | it(t, 'htmx:sseError', { error: e, source: r }); 1097 | Be(t); 1098 | }; 1099 | F(t).sseEventSource = r; 1100 | } 1101 | function We(a, o) { 1102 | var s = h(a, $e); 1103 | if (s) { 1104 | var u = F(s).sseEventSource; 1105 | var l = function (e) { 1106 | if (Be(s)) { 1107 | u.removeEventListener(o, l); 1108 | return; 1109 | } 1110 | var t = e.data; 1111 | ot(a, function (e) { 1112 | t = e.transformResponse(t, null, a); 1113 | }); 1114 | var r = It(a); 1115 | var n = W(a); 1116 | var i = Mt(a); 1117 | he(r.swapStyle, a, n, t, i); 1118 | pt(i.tasks); 1119 | ut(a, 'htmx:sseMessage', e); 1120 | }; 1121 | F(a).sseListener = l; 1122 | u.addEventListener(o, l); 1123 | } else { 1124 | it(a, 'htmx:noSSESourceError'); 1125 | } 1126 | } 1127 | function _e(e, t, r, n) { 1128 | var i = h(e, $e); 1129 | if (i) { 1130 | var a = F(i).sseEventSource; 1131 | var o = function () { 1132 | if (!Be(i)) { 1133 | if (P(e)) { 1134 | Bt(t, r, e); 1135 | } else { 1136 | a.removeEventListener(n, o); 1137 | } 1138 | } 1139 | }; 1140 | F(e).sseListener = o; 1141 | a.addEventListener(n, o); 1142 | } else { 1143 | it(e, 'htmx:noSSESourceError'); 1144 | } 1145 | } 1146 | function Be(e) { 1147 | if (!P(e)) { 1148 | F(e).sseEventSource.close(); 1149 | return true; 1150 | } 1151 | } 1152 | function $e(e) { 1153 | return F(e).sseEventSource != null; 1154 | } 1155 | function Je(e, t, r, n, i) { 1156 | var a = function () { 1157 | if (!n.loaded) { 1158 | n.loaded = true; 1159 | Bt(t, r, e); 1160 | } 1161 | }; 1162 | if (i) { 1163 | setTimeout(a, i); 1164 | } else { 1165 | a(); 1166 | } 1167 | } 1168 | function Ze(n, i, e) { 1169 | var a = false; 1170 | X(t, function (t) { 1171 | if (o(n, 'hx-' + t)) { 1172 | var r = I(n, 'hx-' + t); 1173 | a = true; 1174 | i.path = r; 1175 | i.verb = t; 1176 | e.forEach(function (e) { 1177 | if (e.sseEvent) { 1178 | _e(n, t, r, e.sseEvent); 1179 | } else if (e.trigger === 'revealed') { 1180 | De(); 1181 | Fe(n); 1182 | } else if (e.trigger === 'load') { 1183 | Je(n, t, r, i, e.delay); 1184 | } else if (e.pollInterval) { 1185 | i.polling = true; 1186 | Ae(n, t, r, e.pollInterval); 1187 | } else { 1188 | Ie(n, t, r, i, e); 1189 | } 1190 | }); 1191 | } 1192 | }); 1193 | return a; 1194 | } 1195 | function Ge(e) { 1196 | if (e.type === 'text/javascript' || e.type === '') { 1197 | try { 1198 | Xt(e, function () { 1199 | Function(e.innerText)(); 1200 | }); 1201 | } catch (e) { 1202 | st(e); 1203 | } 1204 | } 1205 | } 1206 | function Ye(e) { 1207 | if (d(e, 'script')) { 1208 | Ge(e); 1209 | } 1210 | X(E(e, 'script'), function (e) { 1211 | Ge(e); 1212 | }); 1213 | } 1214 | function Ke() { 1215 | return document.querySelector('[hx-boost], [data-hx-boost]'); 1216 | } 1217 | function Qe(e) { 1218 | if (e.querySelectorAll) { 1219 | var t = Ke() ? ', a, form' : ''; 1220 | var r = e.querySelectorAll( 1221 | n + t + ', [hx-sse], [data-hx-sse], [hx-ws],' + ' [data-hx-ws]' 1222 | ); 1223 | return r; 1224 | } else { 1225 | return []; 1226 | } 1227 | } 1228 | function et(e) { 1229 | var t = F(e); 1230 | if (!t.initialized) { 1231 | t.initialized = true; 1232 | ut(e, 'htmx:beforeProcessNode'); 1233 | if (e.value) { 1234 | t.lastValue = e.value; 1235 | } 1236 | var r = Le(e); 1237 | var n = Ze(e, t, r); 1238 | if (!n && M(e, 'hx-boost') === 'true') { 1239 | Te(e, t, r); 1240 | } 1241 | var i = I(e, 'hx-sse'); 1242 | if (i) { 1243 | ze(e, t, i); 1244 | } 1245 | var a = I(e, 'hx-ws'); 1246 | if (a) { 1247 | Xe(e, t, a); 1248 | } 1249 | ut(e, 'htmx:afterProcessNode'); 1250 | } 1251 | } 1252 | function tt(e) { 1253 | e = N(e); 1254 | et(e); 1255 | X(Qe(e), function (e) { 1256 | et(e); 1257 | }); 1258 | } 1259 | function rt(e) { 1260 | return e.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); 1261 | } 1262 | function nt(e, t) { 1263 | var r; 1264 | if (window.CustomEvent && typeof window.CustomEvent === 'function') { 1265 | r = new CustomEvent(e, { bubbles: true, cancelable: true, detail: t }); 1266 | } else { 1267 | r = k().createEvent('CustomEvent'); 1268 | r.initCustomEvent(e, true, true, t); 1269 | } 1270 | return r; 1271 | } 1272 | function it(e, t, r) { 1273 | ut(e, t, U({ error: t }, r)); 1274 | } 1275 | function at(e) { 1276 | return e === 'htmx:afterProcessNode'; 1277 | } 1278 | function ot(e, t) { 1279 | X(Kt(e), function (e) { 1280 | try { 1281 | t(e); 1282 | } catch (e) { 1283 | st(e); 1284 | } 1285 | }); 1286 | } 1287 | function st(e) { 1288 | if (console.error) { 1289 | console.error(e); 1290 | } else if (console.log) { 1291 | console.log('ERROR: ', e); 1292 | } 1293 | } 1294 | function ut(e, t, r) { 1295 | e = N(e); 1296 | if (r == null) { 1297 | r = {}; 1298 | } 1299 | r['elt'] = e; 1300 | var n = nt(t, r); 1301 | if (v.logger && !at(t)) { 1302 | v.logger(e, t, r); 1303 | } 1304 | if (r.error) { 1305 | st(r.error); 1306 | ut(e, 'htmx:error', { errorInfo: r }); 1307 | } 1308 | var i = e.dispatchEvent(n); 1309 | var a = rt(t); 1310 | if (i && a !== t) { 1311 | var o = nt(a, n.detail); 1312 | i = i && e.dispatchEvent(o); 1313 | } 1314 | ot(e, function (e) { 1315 | i = i && e.onEvent(t, n) !== false; 1316 | }); 1317 | return i; 1318 | } 1319 | var lt = null; 1320 | function ft() { 1321 | var e = k().querySelector('[hx-history-elt],[data-hx-history-elt]'); 1322 | return e || k().body; 1323 | } 1324 | function ct(e, t, r, n) { 1325 | var i = x(localStorage.getItem('htmx-history-cache')) || []; 1326 | for (var a = 0; a < i.length; a++) { 1327 | if (i[a].url === e) { 1328 | i.splice(a, 1); 1329 | break; 1330 | } 1331 | } 1332 | i.push({ url: e, content: t, title: r, scroll: n }); 1333 | while (i.length > v.config.historyCacheSize) { 1334 | i.shift(); 1335 | } 1336 | while (i.length > 0) { 1337 | try { 1338 | localStorage.setItem('htmx-history-cache', JSON.stringify(i)); 1339 | break; 1340 | } catch (e) { 1341 | it(k().body, 'htmx:historyCacheError', { cause: e, cache: i }); 1342 | i.shift(); 1343 | } 1344 | } 1345 | } 1346 | function ht(e) { 1347 | var t = x(localStorage.getItem('htmx-history-cache')) || []; 1348 | for (var r = 0; r < t.length; r++) { 1349 | if (t[r].url === e) { 1350 | return t[r]; 1351 | } 1352 | } 1353 | return null; 1354 | } 1355 | function vt(e) { 1356 | var t = v.config.requestClass; 1357 | var r = e.cloneNode(true); 1358 | X(E(r, '.' + t), function (e) { 1359 | O(e, t); 1360 | }); 1361 | return r.innerHTML; 1362 | } 1363 | function dt() { 1364 | var e = ft(); 1365 | var t = lt || location.pathname + location.search; 1366 | ut(k().body, 'htmx:beforeHistorySave', { path: t, historyElt: e }); 1367 | if (v.config.historyEnabled) 1368 | history.replaceState({ htmx: true }, k().title, window.location.href); 1369 | ct(t, vt(e), k().title, window.scrollY); 1370 | } 1371 | function gt(e) { 1372 | if (v.config.historyEnabled) history.pushState({ htmx: true }, '', e); 1373 | lt = e; 1374 | } 1375 | function pt(e) { 1376 | X(e, function (e) { 1377 | e.call(); 1378 | }); 1379 | } 1380 | function mt(n) { 1381 | var e = new XMLHttpRequest(); 1382 | var i = { path: n, xhr: e }; 1383 | ut(k().body, 'htmx:historyCacheMiss', i); 1384 | e.open('GET', n, true); 1385 | e.setRequestHeader('HX-History-Restore-Request', 'true'); 1386 | e.onload = function () { 1387 | if (this.status >= 200 && this.status < 400) { 1388 | ut(k().body, 'htmx:historyCacheMissLoad', i); 1389 | var e = u(this.response); 1390 | e = e.querySelector('[hx-history-elt],[data-hx-history-elt]') || e; 1391 | var t = ft(); 1392 | var r = Mt(t); 1393 | se(t, e, r); 1394 | pt(r.tasks); 1395 | lt = n; 1396 | } else { 1397 | it(k().body, 'htmx:historyCacheMissLoadError', i); 1398 | } 1399 | }; 1400 | e.send(); 1401 | } 1402 | function yt(e) { 1403 | dt(); 1404 | e = e || location.pathname + location.search; 1405 | ut(k().body, 'htmx:historyRestore', { path: e }); 1406 | var t = ht(e); 1407 | if (t) { 1408 | var r = u(t.content); 1409 | var n = ft(); 1410 | var i = Mt(n); 1411 | se(n, r, i); 1412 | pt(i.tasks); 1413 | document.title = t.title; 1414 | window.scrollTo(0, t.scroll); 1415 | lt = e; 1416 | } else { 1417 | if (v.config.refreshOnHistoryMiss) { 1418 | window.location.reload(true); 1419 | } else { 1420 | mt(e); 1421 | } 1422 | } 1423 | } 1424 | function xt(e) { 1425 | var t = M(e, 'hx-push-url'); 1426 | return (t && t !== 'false') || (e.tagName === 'A' && F(e).boosted); 1427 | } 1428 | function bt(e) { 1429 | var t = M(e, 'hx-push-url'); 1430 | return t === 'true' || t === 'false' ? null : t; 1431 | } 1432 | function wt(e) { 1433 | var t = M(e, 'hx-indicator'); 1434 | if (t) { 1435 | var r = q(e, t); 1436 | } else { 1437 | r = [e]; 1438 | } 1439 | X(r, function (e) { 1440 | e.classList['add'].call(e.classList, v.config.requestClass); 1441 | }); 1442 | return r; 1443 | } 1444 | function St(e) { 1445 | X(e, function (e) { 1446 | e.classList['remove'].call(e.classList, v.config.requestClass); 1447 | }); 1448 | } 1449 | function Et(e, t) { 1450 | for (var r = 0; r < e.length; r++) { 1451 | var n = e[r]; 1452 | if (n.isSameNode(t)) { 1453 | return true; 1454 | } 1455 | } 1456 | return false; 1457 | } 1458 | function Ct(e) { 1459 | if (e.name === '' || e.name == null || e.disabled) { 1460 | return false; 1461 | } 1462 | if ( 1463 | e.type === 'button' || 1464 | e.type === 'submit' || 1465 | e.tagName === 'image' || 1466 | e.tagName === 'reset' || 1467 | e.tagName === 'file' 1468 | ) { 1469 | return false; 1470 | } 1471 | if (e.type === 'checkbox' || e.type === 'radio') { 1472 | return e.checked; 1473 | } 1474 | return true; 1475 | } 1476 | function Lt(t, r, n, e, i) { 1477 | if (e == null || Et(t, e)) { 1478 | return; 1479 | } else { 1480 | t.push(e); 1481 | } 1482 | if (Ct(e)) { 1483 | var a = l(e, 'name'); 1484 | var o = e.value; 1485 | if (e.multiple) { 1486 | o = p(e.querySelectorAll('option:checked')).map(function (e) { 1487 | return e.value; 1488 | }); 1489 | } 1490 | if (e.files) { 1491 | o = p(e.files); 1492 | } 1493 | if (a != null && o != null) { 1494 | var s = r[a]; 1495 | if (s) { 1496 | if (Array.isArray(s)) { 1497 | if (Array.isArray(o)) { 1498 | r[a] = s.concat(o); 1499 | } else { 1500 | s.push(o); 1501 | } 1502 | } else { 1503 | if (Array.isArray(o)) { 1504 | r[a] = [s].concat(o); 1505 | } else { 1506 | r[a] = [s, o]; 1507 | } 1508 | } 1509 | } else { 1510 | r[a] = o; 1511 | } 1512 | } 1513 | if (i) { 1514 | Ot(e, n); 1515 | } 1516 | } 1517 | if (d(e, 'form')) { 1518 | var u = e.elements; 1519 | X(u, function (e) { 1520 | Lt(t, r, n, e, i); 1521 | }); 1522 | } 1523 | } 1524 | function Ot(e, t) { 1525 | if (e.willValidate) { 1526 | ut(e, 'htmx:validation:validate'); 1527 | if (!e.checkValidity()) { 1528 | t.push({ 1529 | elt: e, 1530 | message: e.validationMessage, 1531 | validity: e.validity, 1532 | }); 1533 | ut(e, 'htmx:validation:failed', { 1534 | message: e.validationMessage, 1535 | validity: e.validity, 1536 | }); 1537 | } 1538 | } 1539 | } 1540 | function At(e, t) { 1541 | var r = []; 1542 | var n = {}; 1543 | var i = {}; 1544 | var a = []; 1545 | var o = d(e, 'form') && e.noValidate !== true; 1546 | if (t !== 'get') { 1547 | Lt(r, i, a, T(e, 'form'), o); 1548 | } 1549 | Lt(r, n, a, e, o); 1550 | var s = M(e, 'hx-include'); 1551 | if (s) { 1552 | var u = q(e, s); 1553 | X(u, function (e) { 1554 | Lt(r, n, a, e, o); 1555 | if (!d(e, 'form')) { 1556 | X(e.querySelectorAll(Ce), function (e) { 1557 | Lt(r, n, a, e, o); 1558 | }); 1559 | } 1560 | }); 1561 | } 1562 | n = U(n, i); 1563 | return { errors: a, values: n }; 1564 | } 1565 | function Rt(e, t, r) { 1566 | if (e !== '') { 1567 | e += '&'; 1568 | } 1569 | e += encodeURIComponent(t) + '=' + encodeURIComponent(r); 1570 | return e; 1571 | } 1572 | function Tt(e) { 1573 | var t = ''; 1574 | for (var r in e) { 1575 | if (e.hasOwnProperty(r)) { 1576 | var n = e[r]; 1577 | if (Array.isArray(n)) { 1578 | X(n, function (e) { 1579 | t = Rt(t, r, e); 1580 | }); 1581 | } else { 1582 | t = Rt(t, r, n); 1583 | } 1584 | } 1585 | } 1586 | return t; 1587 | } 1588 | function qt(e) { 1589 | var t = new FormData(); 1590 | for (var r in e) { 1591 | if (e.hasOwnProperty(r)) { 1592 | var n = e[r]; 1593 | if (Array.isArray(n)) { 1594 | X(n, function (e) { 1595 | t.append(r, e); 1596 | }); 1597 | } else { 1598 | t.append(r, n); 1599 | } 1600 | } 1601 | } 1602 | return t; 1603 | } 1604 | function Ht(e, t, r) { 1605 | var n = { 1606 | 'HX-Request': 'true', 1607 | 'HX-Trigger': l(e, 'id'), 1608 | 'HX-Trigger-Name': l(e, 'name'), 1609 | 'HX-Target': I(t, 'id'), 1610 | 'HX-Current-URL': k().location.href, 1611 | }; 1612 | Ft(e, 'hx-headers', false, n); 1613 | if (r !== undefined) { 1614 | n['HX-Prompt'] = r; 1615 | } 1616 | return n; 1617 | } 1618 | function Nt(t, e) { 1619 | var r = M(e, 'hx-params'); 1620 | if (r) { 1621 | if (r === 'none') { 1622 | return {}; 1623 | } else if (r === '*') { 1624 | return t; 1625 | } else if (r.indexOf('not ') === 0) { 1626 | X(r.substr(4).split(','), function (e) { 1627 | e = e.trim(); 1628 | delete t[e]; 1629 | }); 1630 | return t; 1631 | } else { 1632 | var n = {}; 1633 | X(r.split(','), function (e) { 1634 | e = e.trim(); 1635 | n[e] = t[e]; 1636 | }); 1637 | return n; 1638 | } 1639 | } else { 1640 | return t; 1641 | } 1642 | } 1643 | function It(e) { 1644 | var t = M(e, 'hx-swap'); 1645 | var r = { 1646 | swapStyle: F(e).boosted ? 'innerHTML' : v.config.defaultSwapStyle, 1647 | swapDelay: v.config.defaultSwapDelay, 1648 | settleDelay: v.config.defaultSettleDelay, 1649 | }; 1650 | if (t) { 1651 | var n = y(t); 1652 | if (n.length > 0) { 1653 | r['swapStyle'] = n[0]; 1654 | for (var i = 1; i < n.length; i++) { 1655 | var a = n[i]; 1656 | if (a.indexOf('swap:') === 0) { 1657 | r['swapDelay'] = f(a.substr(5)); 1658 | } 1659 | if (a.indexOf('settle:') === 0) { 1660 | r['settleDelay'] = f(a.substr(7)); 1661 | } 1662 | if (a.indexOf('scroll:') === 0) { 1663 | r['scroll'] = a.substr(7); 1664 | } 1665 | if (a.indexOf('show:') === 0) { 1666 | r['show'] = a.substr(5); 1667 | } 1668 | } 1669 | } 1670 | } 1671 | return r; 1672 | } 1673 | function kt(t, r, n) { 1674 | var i = null; 1675 | ot(r, function (e) { 1676 | if (i == null) { 1677 | i = e.encodeParameters(t, n, r); 1678 | } 1679 | }); 1680 | if (i != null) { 1681 | return i; 1682 | } else { 1683 | if (M(r, 'hx-encoding') === 'multipart/form-data') { 1684 | return qt(n); 1685 | } else { 1686 | return Tt(n); 1687 | } 1688 | } 1689 | } 1690 | function Mt(e) { 1691 | return { tasks: [], elts: [e] }; 1692 | } 1693 | function Dt(e, t) { 1694 | var r = e[0]; 1695 | var n = e[e.length - 1]; 1696 | if (t.scroll) { 1697 | if (t.scroll === 'top' && r) { 1698 | r.scrollTop = 0; 1699 | } 1700 | if (t.scroll === 'bottom' && n) { 1701 | n.scrollTop = n.scrollHeight; 1702 | } 1703 | } 1704 | if (t.show) { 1705 | if (t.show === 'top' && r) { 1706 | r.scrollIntoView(true); 1707 | } 1708 | if (t.show === 'bottom' && n) { 1709 | n.scrollIntoView(false); 1710 | } 1711 | } 1712 | } 1713 | function Ft(e, t, r, n) { 1714 | if (n == null) { 1715 | n = {}; 1716 | } 1717 | if (e == null) { 1718 | return n; 1719 | } 1720 | var i = I(e, t); 1721 | if (i) { 1722 | var a = i.trim(); 1723 | var o = r; 1724 | if (a.indexOf('javascript:') === 0) { 1725 | a = a.substr(11); 1726 | o = true; 1727 | } 1728 | if (a.indexOf('{') !== 0) { 1729 | a = '{' + a + '}'; 1730 | } 1731 | var s; 1732 | if (o) { 1733 | s = Xt( 1734 | e, 1735 | function () { 1736 | return Function('return (' + a + ')')(); 1737 | }, 1738 | {} 1739 | ); 1740 | } else { 1741 | s = x(a); 1742 | } 1743 | for (var u in s) { 1744 | if (s.hasOwnProperty(u)) { 1745 | if (n[u] == null) { 1746 | n[u] = s[u]; 1747 | } 1748 | } 1749 | } 1750 | } 1751 | return Ft(c(e), t, r, n); 1752 | } 1753 | function Xt(e, t, r) { 1754 | if (v.config.allowEval) { 1755 | return t(); 1756 | } else { 1757 | it(e, 'htmx:evalDisallowedError'); 1758 | return r; 1759 | } 1760 | } 1761 | function Pt(e, t) { 1762 | return Ft(e, 'hx-vars', true, t); 1763 | } 1764 | function Ut(e, t) { 1765 | return Ft(e, 'hx-vals', false, t); 1766 | } 1767 | function jt(e) { 1768 | return U(Pt(e), Ut(e)); 1769 | } 1770 | function zt(t, r, n) { 1771 | if (n !== null) { 1772 | try { 1773 | t.setRequestHeader(r, n); 1774 | } catch (e) { 1775 | t.setRequestHeader(r, encodeURIComponent(n)); 1776 | t.setRequestHeader(r + '-URI-AutoEncoded', 'true'); 1777 | } 1778 | } 1779 | } 1780 | function Vt(t) { 1781 | if (t.responseURL && typeof URL !== 'undefined') { 1782 | try { 1783 | var e = new URL(t.responseURL); 1784 | return e.pathname + e.search; 1785 | } catch (e) { 1786 | it(k().body, 'htmx:badResponseUrl', { url: t.responseURL }); 1787 | } 1788 | } 1789 | } 1790 | function Wt(e, t) { 1791 | return e.getAllResponseHeaders().match(t); 1792 | } 1793 | function _t(e, t, r) { 1794 | if (r) { 1795 | if (r instanceof Element || a(r, 'String')) { 1796 | return Bt(e, t, null, null, { targetOverride: N(r) }); 1797 | } else { 1798 | return Bt(e, t, N(r.source), r.event, { 1799 | handler: r.handler, 1800 | headers: r.headers, 1801 | values: r.values, 1802 | targetOverride: N(r.target), 1803 | }); 1804 | } 1805 | } else { 1806 | return Bt(e, t); 1807 | } 1808 | } 1809 | function Bt(e, t, r, n, i) { 1810 | var a = null; 1811 | var o = null; 1812 | i = i != null ? i : {}; 1813 | if (typeof Promise !== 'undefined') { 1814 | var s = new Promise(function (e, t) { 1815 | a = e; 1816 | o = t; 1817 | }); 1818 | } 1819 | if (r == null) { 1820 | r = k().body; 1821 | } 1822 | var u = i.handler || $t; 1823 | if (!P(r)) { 1824 | return; 1825 | } 1826 | var l = i.targetOverride || W(r); 1827 | if (l == null) { 1828 | it(r, 'htmx:targetError', { target: I(r, 'hx-target') }); 1829 | return; 1830 | } 1831 | var f = F(r); 1832 | if (f.requestInFlight) { 1833 | f.queuedRequest = function () { 1834 | Bt(e, t, r, n); 1835 | }; 1836 | return; 1837 | } else { 1838 | f.requestInFlight = true; 1839 | } 1840 | var c = function () { 1841 | f.requestInFlight = false; 1842 | var e = f.queuedRequest; 1843 | f.queuedRequest = null; 1844 | if (e) { 1845 | e(); 1846 | } 1847 | }; 1848 | var h = M(r, 'hx-prompt'); 1849 | if (h) { 1850 | var v = prompt(h); 1851 | if (v === null || !ut(r, 'htmx:prompt', { prompt: v, target: l })) D(a); 1852 | c(); 1853 | return s; 1854 | } 1855 | var d = M(r, 'hx-confirm'); 1856 | if (d) { 1857 | if (!confirm(d)) { 1858 | D(a); 1859 | c(); 1860 | return s; 1861 | } 1862 | } 1863 | var g = new XMLHttpRequest(); 1864 | var p = Ht(r, l, v); 1865 | if (i.headers) { 1866 | p = U(p, i.values); 1867 | } 1868 | var m = At(r, e); 1869 | var y = m.errors; 1870 | var x = m.values; 1871 | if (i.values) { 1872 | x = U(x, i.values); 1873 | } 1874 | var b = jt(r); 1875 | var w = U(x, b); 1876 | var S = Nt(w, r); 1877 | if (e !== 'get' && M(r, 'hx-encoding') == null) { 1878 | p['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; 1879 | } 1880 | if (t == null || t === '') { 1881 | t = k().location.href; 1882 | } 1883 | var E = { 1884 | parameters: S, 1885 | unfilteredParameters: w, 1886 | headers: p, 1887 | target: l, 1888 | verb: e, 1889 | errors: y, 1890 | path: t, 1891 | triggeringEvent: n, 1892 | }; 1893 | if (!ut(r, 'htmx:configRequest', E)) return c(); 1894 | t = E.path; 1895 | e = E.verb; 1896 | p = E.headers; 1897 | S = E.parameters; 1898 | y = E.errors; 1899 | if (y && y.length > 0) { 1900 | ut(r, 'htmx:validation:halted', E); 1901 | D(a); 1902 | c(); 1903 | return s; 1904 | } 1905 | var C = t.split('#'); 1906 | var L = C[0]; 1907 | var O = C[1]; 1908 | if (e === 'get') { 1909 | var A = L; 1910 | var R = Object.keys(S).length !== 0; 1911 | if (R) { 1912 | if (A.indexOf('?') < 0) { 1913 | A += '?'; 1914 | } else { 1915 | A += '&'; 1916 | } 1917 | A += Tt(S); 1918 | if (O) { 1919 | A += '#' + O; 1920 | } 1921 | } 1922 | g.open('GET', A, true); 1923 | } else { 1924 | g.open(e.toUpperCase(), t, true); 1925 | } 1926 | g.overrideMimeType('text/html'); 1927 | for (var T in p) { 1928 | if (p.hasOwnProperty(T)) { 1929 | var q = p[T]; 1930 | zt(g, T, q); 1931 | } 1932 | } 1933 | var H = { 1934 | xhr: g, 1935 | target: l, 1936 | requestConfig: E, 1937 | pathInfo: { path: t, finalPath: A, anchor: O }, 1938 | }; 1939 | g.onload = function () { 1940 | try { 1941 | u(r, H); 1942 | } catch (e) { 1943 | it(r, 'htmx:onLoadError', U({ error: e }, H)); 1944 | throw e; 1945 | } finally { 1946 | St(N); 1947 | var e = r; 1948 | if (!P(r)) { 1949 | e = F(l).replacedWith || l; 1950 | } 1951 | ut(e, 'htmx:afterRequest', H); 1952 | ut(e, 'htmx:afterOnLoad', H); 1953 | D(a); 1954 | c(); 1955 | } 1956 | }; 1957 | g.onerror = function () { 1958 | St(N); 1959 | var e = r; 1960 | if (!P(r)) { 1961 | e = F(l).replacedWith || l; 1962 | } 1963 | it(e, 'htmx:afterRequest', H); 1964 | it(e, 'htmx:sendError', H); 1965 | D(o); 1966 | c(); 1967 | }; 1968 | g.onabort = function () { 1969 | St(N); 1970 | var e = r; 1971 | if (!P(r)) { 1972 | e = F(l).replacedWith || l; 1973 | } 1974 | it(e, 'htmx:afterRequest', H); 1975 | it(e, 'htmx:sendAbort', H); 1976 | D(o); 1977 | c(); 1978 | }; 1979 | if (!ut(r, 'htmx:beforeRequest', H)) { 1980 | D(a); 1981 | c(); 1982 | return s; 1983 | } 1984 | var N = wt(r); 1985 | X(['loadstart', 'loadend', 'progress', 'abort'], function (t) { 1986 | X([g, g.upload], function (e) { 1987 | e.addEventListener(t, function (e) { 1988 | ut(r, 'htmx:xhr:' + t, { 1989 | lengthComputable: e.lengthComputable, 1990 | loaded: e.loaded, 1991 | total: e.total, 1992 | }); 1993 | }); 1994 | }); 1995 | }); 1996 | ut(r, 'htmx:beforeSend', H); 1997 | g.send(e === 'get' ? null : kt(g, r, S)); 1998 | return s; 1999 | } 2000 | function $t(a, o) { 2001 | var s = o.xhr; 2002 | var u = o.target; 2003 | if (!ut(a, 'htmx:beforeOnLoad', o)) return; 2004 | if (Wt(s, /HX-Trigger:/i)) { 2005 | ve(s, 'HX-Trigger', a); 2006 | } 2007 | if (Wt(s, /HX-Push:/i)) { 2008 | var l = s.getResponseHeader('HX-Push'); 2009 | } 2010 | if (Wt(s, /HX-Redirect:/i)) { 2011 | window.location.href = s.getResponseHeader('HX-Redirect'); 2012 | return; 2013 | } 2014 | if (Wt(s, /HX-Refresh:/i)) { 2015 | if ('true' === s.getResponseHeader('HX-Refresh')) { 2016 | location.reload(); 2017 | return; 2018 | } 2019 | } 2020 | var f = xt(a) || l; 2021 | if (s.status >= 200 && s.status < 400) { 2022 | if (s.status === 286) { 2023 | Oe(a); 2024 | } 2025 | if (s.status !== 204) { 2026 | if (!ut(u, 'htmx:beforeSwap', o)) return; 2027 | var c = s.response; 2028 | ot(a, function (e) { 2029 | c = e.transformResponse(c, s, a); 2030 | }); 2031 | if (f) { 2032 | dt(); 2033 | } 2034 | var h = It(a); 2035 | u.classList.add(v.config.swappingClass); 2036 | var e = function () { 2037 | try { 2038 | var e = document.activeElement; 2039 | var t = { 2040 | elt: e, 2041 | start: e ? e.selectionStart : null, 2042 | end: e ? e.selectionEnd : null, 2043 | }; 2044 | var r = Mt(u); 2045 | he(h.swapStyle, u, a, c, r); 2046 | if (t.elt && !P(t.elt) && t.elt.id) { 2047 | var n = document.getElementById(t.elt.id); 2048 | if (n) { 2049 | if (t.start && n.setSelectionRange) { 2050 | n.setSelectionRange(t.start, t.end); 2051 | } 2052 | n.focus(); 2053 | } 2054 | } 2055 | u.classList.remove(v.config.swappingClass); 2056 | X(r.elts, function (e) { 2057 | if (e.classList) { 2058 | e.classList.add(v.config.settlingClass); 2059 | } 2060 | ut(e, 'htmx:afterSwap', o); 2061 | }); 2062 | if (o.pathInfo.anchor) { 2063 | location.hash = o.pathInfo.anchor; 2064 | } 2065 | if (Wt(s, /HX-Trigger-After-Swap:/i)) { 2066 | ve(s, 'HX-Trigger-After-Swap', a); 2067 | } 2068 | var i = function () { 2069 | X(r.tasks, function (e) { 2070 | e.call(); 2071 | }); 2072 | X(r.elts, function (e) { 2073 | if (e.classList) { 2074 | e.classList.remove(v.config.settlingClass); 2075 | } 2076 | ut(e, 'htmx:afterSettle', o); 2077 | }); 2078 | if (f) { 2079 | var e = 2080 | l || 2081 | bt(a) || 2082 | Vt(s) || 2083 | o.pathInfo.finalPath || 2084 | o.pathInfo.path; 2085 | gt(e); 2086 | ut(k().body, 'htmx:pushedIntoHistory', { path: e }); 2087 | } 2088 | Dt(r.elts, h); 2089 | if (Wt(s, /HX-Trigger-After-Settle:/i)) { 2090 | ve(s, 'HX-Trigger-After-Settle', a); 2091 | } 2092 | }; 2093 | if (h.settleDelay > 0) { 2094 | setTimeout(i, h.settleDelay); 2095 | } else { 2096 | i(); 2097 | } 2098 | } catch (e) { 2099 | it(a, 'htmx:swapError', o); 2100 | throw e; 2101 | } 2102 | }; 2103 | if (h.swapDelay > 0) { 2104 | setTimeout(e, h.swapDelay); 2105 | } else { 2106 | e(); 2107 | } 2108 | } 2109 | } else { 2110 | it( 2111 | a, 2112 | 'htmx:responseError', 2113 | U( 2114 | { 2115 | error: 2116 | 'Response Status Error Code ' + 2117 | s.status + 2118 | ' from ' + 2119 | o.pathInfo.path, 2120 | }, 2121 | o 2122 | ) 2123 | ); 2124 | } 2125 | } 2126 | var Jt = {}; 2127 | function Zt() { 2128 | return { 2129 | onEvent: function (e, t) { 2130 | return true; 2131 | }, 2132 | transformResponse: function (e, t, r) { 2133 | return e; 2134 | }, 2135 | isInlineSwap: function (e) { 2136 | return false; 2137 | }, 2138 | handleSwap: function (e, t, r, n) { 2139 | return false; 2140 | }, 2141 | encodeParameters: function (e, t, r) { 2142 | return null; 2143 | }, 2144 | }; 2145 | } 2146 | function Gt(e, t) { 2147 | Jt[e] = U(Zt(), t); 2148 | } 2149 | function Yt(e) { 2150 | delete Jt[e]; 2151 | } 2152 | function Kt(e, r, n) { 2153 | if (e == undefined) { 2154 | return r; 2155 | } 2156 | if (r == undefined) { 2157 | r = []; 2158 | } 2159 | if (n == undefined) { 2160 | n = []; 2161 | } 2162 | var t = I(e, 'hx-ext'); 2163 | if (t) { 2164 | X(t.split(','), function (e) { 2165 | e = e.replace(/ /g, ''); 2166 | if (e.slice(0, 7) == 'ignore:') { 2167 | n.push(e.slice(7)); 2168 | return; 2169 | } 2170 | if (n.indexOf(e) < 0) { 2171 | var t = Jt[e]; 2172 | if (t && r.indexOf(t) < 0) { 2173 | r.push(t); 2174 | } 2175 | } 2176 | }); 2177 | } 2178 | return Kt(c(e), r, n); 2179 | } 2180 | function Qt(e) { 2181 | if (k().readyState !== 'loading') { 2182 | e(); 2183 | } else { 2184 | k().addEventListener('DOMContentLoaded', e); 2185 | } 2186 | } 2187 | function er() { 2188 | if (v.config.includeIndicatorStyles !== false) { 2189 | k().head.insertAdjacentHTML( 2190 | 'beforeend', 2191 | '<style> .' + 2192 | v.config.indicatorClass + 2193 | '{opacity:0;transition: opacity 200ms ease-in;} .' + 2194 | v.config.requestClass + 2195 | ' .' + 2196 | v.config.indicatorClass + 2197 | '{opacity:1} .' + 2198 | v.config.requestClass + 2199 | '.' + 2200 | v.config.indicatorClass + 2201 | '{opacity:1} </style>' 2202 | ); 2203 | } 2204 | } 2205 | function tr() { 2206 | var e = k().querySelector('meta[name="htmx-config"]'); 2207 | if (e) { 2208 | return x(e.content); 2209 | } else { 2210 | return null; 2211 | } 2212 | } 2213 | function rr() { 2214 | var e = tr(); 2215 | if (e) { 2216 | v.config = U(v.config, e); 2217 | } 2218 | } 2219 | Qt(function () { 2220 | rr(); 2221 | er(); 2222 | var e = k().body; 2223 | tt(e); 2224 | window.onpopstate = function (e) { 2225 | if (e.state && e.state.htmx) { 2226 | yt(); 2227 | } 2228 | }; 2229 | setTimeout(function () { 2230 | ut(e, 'htmx:load', {}); 2231 | }, 0); 2232 | }); 2233 | return v; 2234 | })(); 2235 | }); 2236 | -------------------------------------------------------------------------------- /demo/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./functions/**/*.ts", "./src/**/*.ts"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | daisyui: { 8 | themes: [{ 9 | mytheme: { 10 | "primary": "#661AE6", 11 | "secondary": "#D926AA", 12 | "accent": "#1FB2A5", 13 | "neutral": "#191D24", 14 | "base-100": "#2A303C", 15 | "info": "#3ABFF8", 16 | "success": "#36D399", 17 | "warning": "#FBBD23", 18 | "error": "#F87272", 19 | }, 20 | }, ], 21 | }, 22 | plugins: [require("daisyui")], 23 | } -------------------------------------------------------------------------------- /demo/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2021", 4 | "lib": ["es2021"], 5 | "module": "es2022", 6 | "moduleResolution": "node", 7 | "types": ["@cloudflare/workers-types"], 8 | "resolveJsonModule": true, 9 | "allowJs": true, 10 | "checkJs": false, 11 | "noEmit": true, 12 | "isolatedModules": true, 13 | "allowSyntheticDefaultImports": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "strict": true, 16 | "skipLibCheck": true, 17 | "baseUrl": "src", 18 | "paths": { 19 | "@*": ["*"] 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /demo/wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "cloudflare-htmx" 2 | compatibility_date = "2023-04-23" 3 | 4 | [[d1_databases]] 5 | binding = "DB" # i.e. available in your Worker on env.DB 6 | database_name = "auth" 7 | database_id = "21200feb-9032-4c7a-8364-4a080dbbdf02" -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | const HEADERS = { headers: { 'content-type': 'text/html;charset=UTF-8' } }; 2 | 3 | export const html = String.raw; 4 | export const view = (...domArgs: string[]) => 5 | new Response(domArgs.join('\n'), HEADERS); 6 | export const redirect = (url: string, status = 303) => 7 | new Response(null, { status, headers: { 'HX-Redirect': url } }); 8 | 9 | export type LayoutFunction<Env = any, Params extends string = any> = ({ 10 | children, 11 | request, 12 | params, 13 | env, 14 | }: { 15 | children: string; 16 | request?: Request; 17 | params?: Params; 18 | env?: Env; 19 | }) => string | Promise<string>; 20 | 21 | export const applyLayout = 22 | (layout: LayoutFunction, isRoot: boolean): PagesFunction => 23 | async ({ request, env, params, next }) => { 24 | const url = new URL(request.url); 25 | const method = request.method; 26 | if ( 27 | url.pathname.match(/\.[^/]+$/) || 28 | method !== 'GET' || 29 | url.pathname.match(/_[^/]+$/) || 30 | (isRoot && request.headers.get('HX-Boosted') === 'true') 31 | ) { 32 | return next(); 33 | } 34 | 35 | const response = await next(); 36 | const children = await response.text(); 37 | if (response.ok) { 38 | return new Response( 39 | await layout({ children, request, params, env }), 40 | response 41 | ); 42 | } else { 43 | return new Response('NOT FOUND', response); 44 | } 45 | }; 46 | -------------------------------------------------------------------------------- /install.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs-extra'); 4 | const path = require('path'); 5 | 6 | console.log('Copying template files...'); 7 | const sourceDir = path.join(__dirname, 'templates', 'basic'); 8 | 9 | const argv = process.argv.slice(2); 10 | const rootDir = argv[0] || '.'; 11 | fs.mkdirSync(rootDir); 12 | process.chdir(rootDir); 13 | fs.copy(sourceDir, process.cwd()) 14 | .then(() => console.log('Template files copied successfully!')) 15 | .catch((err) => console.error(err)); 16 | 17 | const pkg = { name: rootDir, version: '0.0.0' }; 18 | fs.writeFileSync( 19 | path.resolve(process.cwd(), 'package.json'), 20 | JSON.stringify(pkg, null, 2) 21 | ); 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-htmx", 3 | "version": "1.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "cloudflare-htmx", 9 | "version": "1.0.1", 10 | "license": "ISC", 11 | "dependencies": { 12 | "fs-extra": "^11.1.1" 13 | }, 14 | "bin": { 15 | "my-command": "install.js" 16 | }, 17 | "devDependencies": { 18 | "@cloudflare/workers-types": "^4.20230404.0" 19 | } 20 | }, 21 | "node_modules/@cloudflare/workers-types": { 22 | "version": "4.20230518.0", 23 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230518.0.tgz", 24 | "integrity": "sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==", 25 | "dev": true 26 | }, 27 | "node_modules/fs-extra": { 28 | "version": "11.1.1", 29 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", 30 | "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", 31 | "dependencies": { 32 | "graceful-fs": "^4.2.0", 33 | "jsonfile": "^6.0.1", 34 | "universalify": "^2.0.0" 35 | }, 36 | "engines": { 37 | "node": ">=14.14" 38 | } 39 | }, 40 | "node_modules/graceful-fs": { 41 | "version": "4.2.11", 42 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 43 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 44 | }, 45 | "node_modules/jsonfile": { 46 | "version": "6.1.0", 47 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 48 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 49 | "dependencies": { 50 | "universalify": "^2.0.0" 51 | }, 52 | "optionalDependencies": { 53 | "graceful-fs": "^4.1.6" 54 | } 55 | }, 56 | "node_modules/universalify": { 57 | "version": "2.0.0", 58 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 59 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 60 | "engines": { 61 | "node": ">= 10.0.0" 62 | } 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-htmx", 3 | "version": "1.2.1", 4 | "description": "HTMX library for Cloudflare Pages", 5 | "main": "index.ts", 6 | "devDependencies": { 7 | "@cloudflare/workers-types": "^4.20230404.0" 8 | }, 9 | "scripts": { 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/stukennedy/cloudflare-htmx.git" 15 | }, 16 | "keywords": [ 17 | "cloudflare", 18 | "pages", 19 | "htmx", 20 | "hateos", 21 | "jamstack" 22 | ], 23 | "author": "Stu Kennedy", 24 | "license": "ISC", 25 | "bin": { 26 | "my-command": "./install.js" 27 | }, 28 | "bugs": { 29 | "url": "https://github.com/stukennedy/cloudflare-htmx/issues" 30 | }, 31 | "homepage": "https://github.com/stukennedy/cloudflare-htmx#readme", 32 | "dependencies": { 33 | "fs-extra": "^11.1.1" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stukennedy/cloudflare-htmx/975b1c1f661f16cab84cb61b3f322499fb6a14c2/screenshot.png -------------------------------------------------------------------------------- /templates/basic/functions/_middleware.ts: -------------------------------------------------------------------------------- 1 | import { applyLayout } from 'cloudflare-htmx'; 2 | import RootLayout from '@layouts/RootLayout'; 3 | 4 | export const onRequestGet = [applyLayout(RootLayout)]; 5 | -------------------------------------------------------------------------------- /templates/basic/functions/index.ts: -------------------------------------------------------------------------------- 1 | import { html, view } from 'cloudflare-htmx'; 2 | 3 | const timer = (ms: number) => new Promise((res) => setTimeout(res, ms)); 4 | export const onRequestPost: PagesFunction = async (event) => { 5 | await timer(1000); 6 | return view(html`<h2>Loaded!</h2>`); 7 | }; 8 | 9 | export const onRequestGet: PagesFunction = async ({ request }) => { 10 | return view(html` 11 | <h1>Welcome to HTMX</h1> 12 | <div hx-post="/">Loading...</div> 13 | `); 14 | }; 15 | -------------------------------------------------------------------------------- /templates/basic/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "version": "", 4 | "description": "", 5 | "private": true, 6 | "scripts": {} 7 | } 8 | -------------------------------------------------------------------------------- /templates/basic/src/layouts/RootLayout.ts: -------------------------------------------------------------------------------- 1 | import { html, LayoutFunction } from 'cloudflare-htmx'; 2 | 3 | // this is the layout for the entire site 4 | const _layout: LayoutFunction = ({ children }) => { 5 | const title = 'Cloudflare Pages + HTMX'; 6 | return html` 7 | <!DOCTYPE html> 8 | <html lang="en" data-theme="mytheme"> 9 | <head> 10 | <meta charset="utf-8" /> 11 | <meta name="viewport" content="width=device-width, initial-scale=1" /> 12 | <title>${title} 13 | 14 | 15 | 16 | 17 | 18 | ${children} 19 | 20 | 21 | `; 22 | }; 23 | export default _layout; 24 | -------------------------------------------------------------------------------- /templates/basic/static/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f3f3f3; 3 | } 4 | -------------------------------------------------------------------------------- /templates/basic/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2021", 4 | "lib": ["es2021"], 5 | "module": "es2022", 6 | "moduleResolution": "node", 7 | "types": ["@cloudflare/workers-types"], 8 | "resolveJsonModule": true, 9 | "allowJs": true, 10 | "checkJs": false, 11 | "noEmit": true, 12 | "isolatedModules": true, 13 | "allowSyntheticDefaultImports": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "strict": true, 16 | "skipLibCheck": true, 17 | "baseUrl": "src", 18 | "paths": { 19 | "@*": ["*"] 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2021", 4 | "lib": ["es2021"], 5 | "module": "es2022", 6 | "moduleResolution": "node", 7 | "types": ["@cloudflare/workers-types"], 8 | "resolveJsonModule": true, 9 | "allowJs": true, 10 | "checkJs": false, 11 | "noEmit": true, 12 | "isolatedModules": true, 13 | "allowSyntheticDefaultImports": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "strict": true, 16 | "skipLibCheck": true, 17 | "baseUrl": ".", 18 | "paths": { 19 | "cloudflare-htmx": ["/"] 20 | } 21 | } 22 | } 23 | --------------------------------------------------------------------------------