{"_id":"@deniz-blue/vite-plugins","_rev":"4-5fb82fbc19ed6a1562b0594b13d0dee6","name":"@deniz-blue/vite-plugins","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@deniz-blue/vite-plugins","version":"1.0.0","keywords":["vite-plugin"],"author":{"name":"deniz.blue"},"license":"MIT","_id":"@deniz-blue/vite-plugins@1.0.0","maintainers":[{"name":"deniz.blue","email":"deniz@deniz.blue"}],"dist":{"shasum":"6c731f0c759d937fbe6a1ec2ed8029b30a1e5aeb","tarball":"https://registry.npmjs.org/@deniz-blue/vite-plugins/-/vite-plugins-1.0.0.tgz","fileCount":18,"integrity":"sha512-/5I3qGfjQRgOYYkXoGWKoKJvH4ulwehVqXQHtHnCivYHivSaMCCohFDSjiJMymlgv4SNW+xs0p6r2cpilXTSmg==","signatures":[{"sig":"MEUCIE/2qPUz+NcnSgMl1URbBd0E0FTM4VSpYfo9I5/CmRtbAiEAyPuUroev2Yf/QB+tlkOv4i9WxcCDx45Z5OWLmT08xrc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15476},"main":"dist/index.js","type":"module","_from":"file:deniz-blue-vite-plugins-1.0.0.tgz","types":"dist/index.d.ts","scripts":{"build":"tsc"},"_npmUser":{"name":"deniz.blue","email":"deniz@deniz.blue"},"_resolved":"/tmp/6f0b0e2248020ecc8351466f2cc5dec7/deniz-blue-vite-plugins-1.0.0.tgz","_integrity":"sha512-/5I3qGfjQRgOYYkXoGWKoKJvH4ulwehVqXQHtHnCivYHivSaMCCohFDSjiJMymlgv4SNW+xs0p6r2cpilXTSmg==","_npmVersion":"11.12.0","description":"A collection of Vite plugins for various purposes","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","typescript":"^5.9.3","@types/node":"^25.5.0"},"peerDependencies":{"vite":"^8.0.1"},"_npmOperationalInternal":{"tmp":"tmp/vite-plugins_1.0.0_1774290555411_0.3361964755808504","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@deniz-blue/vite-plugins","version":"1.0.1","keywords":["vite-plugin"],"author":{"name":"deniz.blue"},"license":"MIT","_id":"@deniz-blue/vite-plugins@1.0.1","maintainers":[{"name":"deniz.blue","email":"deniz@deniz.blue"}],"dist":{"shasum":"e6fa893479cf4e0dfe26529e501579d3c9066fb0","tarball":"https://registry.npmjs.org/@deniz-blue/vite-plugins/-/vite-plugins-1.0.1.tgz","fileCount":18,"integrity":"sha512-s9aNP/kcNTYYVJONH77HcF7f4jvFpV+XJBxd+Yq0rBUbhukjKtzJckS/QAtq36ZJXTNafUtc5Be8lBGmzHb9Mw==","signatures":[{"sig":"MEUCICoF8ipBFjqgrb1bbKjRW8p/8fj9bHrV48HkTDgNZnuuAiEAqHReGCNG3uJSHD2rF0MOR/Nu2eQtcOJk6pjqoqiDj54=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15718},"main":"dist/index.js","type":"module","_from":"file:deniz-blue-vite-plugins-1.0.1.tgz","types":"dist/index.d.ts","scripts":{"build":"tsc"},"_npmUser":{"name":"deniz.blue","email":"deniz@deniz.blue"},"_resolved":"/tmp/12ddefab3047a675343175dd3b4476f2/deniz-blue-vite-plugins-1.0.1.tgz","_integrity":"sha512-s9aNP/kcNTYYVJONH77HcF7f4jvFpV+XJBxd+Yq0rBUbhukjKtzJckS/QAtq36ZJXTNafUtc5Be8lBGmzHb9Mw==","_npmVersion":"11.12.0","description":"A collection of Vite plugins for various purposes","directories":{},"_nodeVersion":"25.8.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","typescript":"^5.9.3","@types/node":"^25.5.0"},"peerDependencies":{"vite":"^8.0.1"},"_npmOperationalInternal":{"tmp":"tmp/vite-plugins_1.0.1_1774433739363_0.629552732551877","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@deniz-blue/vite-plugins","version":"1.0.2","keywords":["vite-plugin"],"author":{"name":"deniz.blue"},"license":"MIT","_id":"@deniz-blue/vite-plugins@1.0.2","maintainers":[{"name":"deniz.blue","email":"deniz@deniz.blue"}],"dist":{"shasum":"13c42dd7ae6d58a177dd6f10e076ec202c070996","tarball":"https://registry.npmjs.org/@deniz-blue/vite-plugins/-/vite-plugins-1.0.2.tgz","fileCount":18,"integrity":"sha512-z+o/UueiGksmPNM8w2qKjA5M3IdnK8ZuFA0IzKeZ1YktzhXfRxAfLMF24k53M0skVZc2Z6d9kIBOvHm3+7Q/Tg==","signatures":[{"sig":"MEUCIGPZMIXJ3GvlyFSMK2a13Bi3CnJAz1jwb4n94A0nZvGqAiEA5n3EqRnCwZrseK9xEwmO+aH/HkwZOimfAxB3b4Mlsmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16398},"main":"dist/index.js","type":"module","_from":"file:deniz-blue-vite-plugins-1.0.2.tgz","types":"dist/index.d.ts","scripts":{"build":"tsc"},"_npmUser":{"name":"deniz.blue","email":"deniz@deniz.blue"},"_resolved":"/tmp/24762014586741eca63c6b37cd275091/deniz-blue-vite-plugins-1.0.2.tgz","_integrity":"sha512-z+o/UueiGksmPNM8w2qKjA5M3IdnK8ZuFA0IzKeZ1YktzhXfRxAfLMF24k53M0skVZc2Z6d9kIBOvHm3+7Q/Tg==","_npmVersion":"11.13.0","description":"A collection of Vite plugins for various purposes","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","typescript":"^6.0.3","@types/node":"^25.6.0"},"peerDependencies":{"vite":"^8.0.1"},"_npmOperationalInternal":{"tmp":"tmp/vite-plugins_1.0.2_1777012560142_0.6104745251623342","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@deniz-blue/vite-plugins","version":"1.0.3","description":"A collection of Vite plugins for various purposes","main":"dist/index.js","types":"dist/index.d.ts","type":"module","keywords":["vite-plugin"],"author":{"name":"deniz.blue"},"license":"MIT","devDependencies":{"@types/node":"^25.6.0","typescript":"^6.0.3","vite":"^8.0.10"},"peerDependencies":{"vite":"^8.0.10"},"scripts":{"build":"tsc"},"_id":"@deniz-blue/vite-plugins@1.0.3","_integrity":"sha512-zU8+C2D6NhzMActAzLM59wtKafC7V9NrhJhyZhP6Ezqv3hMY2xSh+5tbsJYm/QZ3KFNe2ydj2gI0wM4y8MBmIA==","_resolved":"/tmp/7dafa03f79dd4072a3f57c9d407130c6/deniz-blue-vite-plugins-1.0.3.tgz","_from":"file:deniz-blue-vite-plugins-1.0.3.tgz","_nodeVersion":"25.9.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-zU8+C2D6NhzMActAzLM59wtKafC7V9NrhJhyZhP6Ezqv3hMY2xSh+5tbsJYm/QZ3KFNe2ydj2gI0wM4y8MBmIA==","shasum":"ceebe667ac73d523ca5040d95bea9fa6c71eab53","tarball":"https://registry.npmjs.org/@deniz-blue/vite-plugins/-/vite-plugins-1.0.3.tgz","fileCount":18,"unpackedSize":15688,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIELm257a1AXq97lS+7eBHP9y/3DNBkbwZm1QN9MXNyItAiB9ipdU26obl3BNFAvT1Doyvp1qje20/Gdo2WvS/mPHCA=="}]},"_npmUser":{"name":"deniz.blue","email":"deniz@deniz.blue"},"directories":{},"maintainers":[{"name":"deniz.blue","email":"deniz@deniz.blue"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vite-plugins_1.0.3_1777013431923_0.48150297398779274"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-23T18:29:15.279Z","modified":"2026-04-24T06:50:32.167Z","1.0.0":"2026-03-23T18:29:15.595Z","1.0.1":"2026-03-25T10:15:39.499Z","1.0.2":"2026-04-24T06:36:00.285Z","1.0.3":"2026-04-24T06:50:32.056Z"},"author":{"name":"deniz.blue"},"license":"MIT","keywords":["vite-plugin"],"description":"A collection of Vite plugins for various purposes","maintainers":[{"name":"deniz.blue","email":"deniz@deniz.blue"}],"readme":"# @denizblue/vite-plugins\n\nA couple plugins I use for my projects\n\nList of plugins:\n- [@denizblue/vite-plugins](#denizbluevite-plugins)\n\t- [`SimpleSSG`](#simplessg)\n\t- [`VirtualModule`](#virtualmodule)\n\t- [`AtprotoOAuth`](#atprotooauth)\n\n## `SimpleSSG`\n\nBasically allows you to do pre-rendering. Example below uses React, but it should work with any framework as long as you export a `render` function that returns a string of HTML.\n\n1. Create a `src/entry.server.tsx` that exports a function called `render` that returns a string of HTML. You can use ReactDOMServer to render your app to a string.\n\n```tsx\nimport { renderToString } from \"react-dom/server\";\nimport { Root } from \"./root\";\n\nexport const render = () => renderToString(<Root />);\n```\n\n2. Add the \"slot\" in your `index.html` where the rendered HTML should go:\n\n```html\n<body>\n\t<div id=\"root\">\n\t\t<!-- @ -->\n\t</div>\n</body>\n```\n\n3. Add the plugin to your `vite.config.ts`:\n\n```ts\nimport { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\nimport { SimpleSSG } from \"@denizblue/vite-plugins\";\n\nexport default defineConfig({\n\tplugins: [\n\t\treact(),\n\t\tSimpleSSG(),\n\t],\n});\n```\n\n4. (React-only) Add a `src/entry.client.tsx` that hydrates your app:\n\n```tsx\nimport { hydrateRoot } from \"react-dom/client\";\nimport { Root } from \"./root\";\n\nconst rootElement = document.getElementById(\"root\")!;\nhydrateRoot(rootElement, <Root />);\n```\n\n## `VirtualModule`\n\nAllows you to create virtual modules that can be imported in your code. Useful for SSG. Example:\n\n```ts\nimport { defineConfig } from \"vite\";\nimport { VirtualModule } from \"@denizblue/vite-plugins\";\n\nexport default defineConfig({\n\tplugins: [\n\t\tVirtualModule({\n\t\t\tname: \"hello\",\n\t\t\tcode: `export const message = \"Hello, world!\";`,\n\t\t}),\n\n\t\tVirtualModule({\n\t\t\tname: \"remote-data\",\n\t\t\tcode: async () => {\n\t\t\t\tconst response = await fetch(\"https://jsonplaceholder.typicode.com/todos/1\");\n\t\t\t\tconst data = await response.json();\n\t\t\t\treturn `export const data = ${JSON.stringify(data)};`;\n\t\t\t},\n\t\t}),\n\t],\n});\n```\n\nThen you can import these modules in your code:\n\n```ts\nimport { message } from \"virtual:hello\";\nimport { data } from \"virtual:remote-data\";\n```\n\n## `AtprotoOAuth`\n\nAutomatically resolves your `public/oauth-client-metadata.json` for you. Uses localhost oauth client for development and the actual client for production. Example:\n\n```ts\nimport { defineConfig } from \"vite\";\nimport { AtprotoOAuth } from \"@denizblue/vite-plugins\";\n\nexport default defineConfig({\n\tplugins: [\n\t\tAtprotoOAuth(),\n\t],\n});\n```\n\nThen you can import your oauth client metadata in your code:\n\n```ts\nimport { createAuthorizationUrl, configureOAuth } from \"@atcute/oauth-browser-client\";\n\nconfigureOAuth({\n\tmetadata: {\n\t\tclient_id: import.meta.env.VITE_OAUTH_CLIENT_ID,\n\t\tredirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URI,\n\t},\n});\n\nlet url = createAuthorizationUrl({\n\ttarget,\n\tscope: import.meta.env.VITE_OAUTH_SCOPE,\n});\n\n// == or if you want to import the whole metadata\n\nimport metadata, { CLIENT_ID, REDIRECT_URI, SCOPE } from \"virtual:oauth-client-metadata\";\n// metadata is the same as the original JSON file\n// CLIENT_ID and REDIRECT_URI may be localhost values in development, and the actual client values in production\n```\n","readmeFilename":"README.md"}