major: statically-generated resume with Vike
parent
0d820466d0
commit
3b47596a57
@ -0,0 +1,142 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
# Cloudflare
|
||||
.wrangler/
|
||||
|
||||
# Vercel
|
||||
.vercel/
|
||||
|
||||
# Sentry Vite Plugin
|
||||
.env.sentry-build-plugin
|
||||
|
||||
# aws-cdk
|
||||
.cdk.staging
|
||||
cdk.out
|
@ -0,0 +1,2 @@
|
||||
nodejs 22.15.0
|
||||
pnpm 9.7.1
|
@ -0,0 +1,53 @@
|
||||
Generated with [vike.dev/new](https://vike.dev/new) ([version 471](https://www.npmjs.com/package/create-vike/v/0.0.471)) using this command:
|
||||
|
||||
```sh
|
||||
pnpm create vike@latest --react --compiled-css --cloudflare --eslint
|
||||
```
|
||||
|
||||
## Contents
|
||||
|
||||
* [React](#react)
|
||||
|
||||
* [`/pages/+config.ts`](#pagesconfigts)
|
||||
* [Routing](#routing)
|
||||
* [`/pages/_error/+Page.jsx`](#pages_errorpagejsx)
|
||||
* [`/pages/+onPageTransitionStart.ts` and `/pages/+onPageTransitionEnd.ts`](#pagesonpagetransitionstartts-and-pagesonpagetransitionendts)
|
||||
* [SSR](#ssr)
|
||||
* [HTML Streaming](#html-streaming)
|
||||
|
||||
## React
|
||||
|
||||
This app is ready to start. It's powered by [Vike](https://vike.dev) and [React](https://react.dev/learn).
|
||||
|
||||
### `/pages/+config.ts`
|
||||
|
||||
Such `+` files are [the interface](https://vike.dev/config) between Vike and your code. It defines:
|
||||
|
||||
* A default [`<Layout>` component](https://vike.dev/Layout) (that wraps your [`<Page>` components](https://vike.dev/Page)).
|
||||
* A default [`title`](https://vike.dev/title).
|
||||
* Global [`<head>` tags](https://vike.dev/head-tags).
|
||||
|
||||
### Routing
|
||||
|
||||
[Vike's built-in router](https://vike.dev/routing) lets you choose between:
|
||||
|
||||
* [Filesystem Routing](https://vike.dev/filesystem-routing) (the URL of a page is determined based on where its `+Page.jsx` file is located on the filesystem)
|
||||
* [Route Strings](https://vike.dev/route-string)
|
||||
* [Route Functions](https://vike.dev/route-function)
|
||||
|
||||
### `/pages/_error/+Page.jsx`
|
||||
|
||||
The [error page](https://vike.dev/error-page) which is rendered when errors occur.
|
||||
|
||||
### `/pages/+onPageTransitionStart.ts` and `/pages/+onPageTransitionEnd.ts`
|
||||
|
||||
The [`onPageTransitionStart()` hook](https://vike.dev/onPageTransitionStart), together with [`onPageTransitionEnd()`](https://vike.dev/onPageTransitionEnd), enables you to implement page transition animations.
|
||||
|
||||
### SSR
|
||||
|
||||
SSR is enabled by default. You can [disable it](https://vike.dev/ssr) for all your pages or only for some pages.
|
||||
|
||||
### HTML Streaming
|
||||
|
||||
You can enable/disable [HTML streaming](https://vike.dev/stream) for all your pages, or only for some pages while still using it for others.
|
||||
|
Binary file not shown.
After Width: | Height: | Size: 87 KiB |
@ -1,44 +0,0 @@
|
||||
@import url("https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400..800;1,400..800&display=swap");
|
||||
|
||||
/* @font-face {
|
||||
font-family: Lato;
|
||||
src: url("Lato2OFL/Lato-Regular.ttf");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Lato;
|
||||
src: url("Lato2OFL/Lato-Bold.ttf");
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Lato;
|
||||
src: url("Lato2OFL/Lato-Italic.ttf");
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Lato;
|
||||
src: url("Lato2OFL/Lato-BoldItalic.ttf");
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
} */
|
||||
|
||||
/* @page {
|
||||
@bottom-center {
|
||||
content: "https://sakal.us";
|
||||
font-size: 0.8em;
|
||||
color: #aaa;
|
||||
font-family: Lato;
|
||||
}
|
||||
@top-center {
|
||||
content: "CSS Paged Media Tutorial by Andreas Jung";
|
||||
font-size: 0.8em;
|
||||
color: #aaa;
|
||||
font-family: Lato;
|
||||
}
|
||||
} */
|
||||
|
||||
/* body {
|
||||
font-family: Lato;
|
||||
} */
|
@ -0,0 +1,179 @@
|
||||
export const contactInfo = {
|
||||
name: "Brian Sakal",
|
||||
email: "brian@sakal.us",
|
||||
phone: "305-930-0248",
|
||||
website: "https://git.sakal.us/avraham",
|
||||
location: "Passaic, NJ",
|
||||
};
|
||||
|
||||
export const mainSkills = [
|
||||
"Javascript/Typescript",
|
||||
"React",
|
||||
"Next.js",
|
||||
"Node.js",
|
||||
"Express.js",
|
||||
"Docker",
|
||||
"MySQL",
|
||||
"Clickhouse",
|
||||
"DevOps",
|
||||
"Kubernetes",
|
||||
"Linux",
|
||||
"Cloudflare",
|
||||
"Vercel",
|
||||
"S3",
|
||||
];
|
||||
|
||||
export const exposedSkills = [
|
||||
"PostgreSQL",
|
||||
"Elasticsearch",
|
||||
"Redis",
|
||||
"RethinkDB",
|
||||
"Helm",
|
||||
"nginx",
|
||||
"React Native",
|
||||
"Swagger",
|
||||
];
|
||||
|
||||
export const employment = [
|
||||
{
|
||||
title: "Lead Developer (Full-Stack)",
|
||||
company: "TorahAnytime.com",
|
||||
location: "Flushing, NY",
|
||||
start: "June 2022",
|
||||
end: "Present",
|
||||
highlights: [
|
||||
// From old resume:
|
||||
// "Fixed/troubleshooted bugs and added features across multiple legacy codebases",
|
||||
// "Consolidated cloud resources by using Kubernetes.",
|
||||
// "Transitioned a legacy Cloudflare/nginx TLD site to Vercel, while maintaining custom nginx routes on the TLD, plus the entire legacy site under a subdomain.",
|
||||
// "Reduced time-to-deployment from 5 minutes to 15 seconds with locally-runnable deploy scripts; besides setting up Drone/Gitlab CI/CD pipelines.",
|
||||
// "Architected custom analytics backend w/ Clickhouse. Reduced query times from minutes to milliseconds.",
|
||||
// "Implemented a custom IVR phone system to dynamically browse content.",
|
||||
// "Deployed and configured various supporting/ancillary services in Kubernetes, including Gitlab, private Docker & NPM registries.",
|
||||
// "Implemented OpenTelemetry tracing visualized in Grafana, decreasing transcoder troubleshooting by 50%.",
|
||||
// "Implemented various asynchronous workflows, including a new video transcoder, in Temporal; thus completely severing our dependence on Vimeo, reducing costs by $40k/year.",
|
||||
// From Otta resume:
|
||||
"General full-stack work (frontend implementation in Next.js, adding endpoints to api, running database migrations in MySQL, updating Clickhouse with those schema changes, etc.)",
|
||||
"Architected and implemented an in-house transcoding/content-delivery system based on Temporal, Cloudflare, and Backblaze B2 to replace Vimeo; saving $70k/year.",
|
||||
"Setup generic events analytics system in Clickhouse to replace MySQL, Redis, and (eventually) Google Analytics, for faster and more granular analytics over arbitrary events and event payloads; significantly improving query times from minutes to milliseconds",
|
||||
"Legacy code maintenance/incremental refactoring",
|
||||
"Consolidated various async jobs (e.g. notifications, daily/weekly digest, delayed release, etc.) into type-safe Temporal workflows, enhancing developer experience and setting conventions for easy implementation of future workflows",
|
||||
"Designed and deployed a multi-instance tRPC server for type-safe endpoints for the frontend",
|
||||
`Adapted Agile/Scrum to accomodate stakeholder expectations of simultaneous planned and unplanned (i.e. during a Sprint) throughput and turnaround, while keeping longer-term goals predictable.`,
|
||||
"Crafted multi-stage Dockerfiles to leverage layer caching in various projects",
|
||||
"Reduced deployment time from 5 minutes to 15 seconds by implementing locally-runnable deploy scripts, besides setting up Github Actions CI/CD pipelines.",
|
||||
"Developed a custom IVR phone system for dynamically browsing our content.",
|
||||
"Deployed and configured various supporting services in Kubernetes such as Grafana, private Docker & NPM registries.",
|
||||
"Implemented OpenTelemetry tracing visualized in Grafana, resulting in 50% decrease in legacy transcoder troubleshooting time.",
|
||||
"Designed various parameterized Grafana dashboards for at-a-glance analysis of user stats.",
|
||||
"Implemented two integrations: MySQL-Clickhouse sync (using Clickhouse primitives), and MySQL-Salesforce sync (on Temporal).",
|
||||
"Transitioned legacy Cloudflare/nginx TLD site to Vercel, while maintaining custom nginx routes on the TLD and hosting the entire legacy site under a subdomain.",
|
||||
],
|
||||
},
|
||||
// {
|
||||
// title: "Assistant Manager",
|
||||
// company: "Sureknit Inc. Property Management",
|
||||
// location: "East Flatbush, NY",
|
||||
// start: "February 2020",
|
||||
// end: "June 2022",
|
||||
// highlights: [
|
||||
// "Kept accurate records of tenant rent payments.",
|
||||
// "Balanced and monitored bank accounts for all subsidiary companies.",
|
||||
// "Furnished necessary documentation for various real estate operations, such as new leases, property sales, etc.",
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// title: "Architect Intern",
|
||||
// company: "Sandy Hacohen",
|
||||
// location: "Flushing, NY",
|
||||
// start: "July 2018",
|
||||
// end: "November 2018",
|
||||
// highlights: [
|
||||
// "Produced architectural drawings of various points-of-view based on given floorplans.",
|
||||
// "Adjusted existing floorplans to spec.",
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// title: "Operations Manager",
|
||||
// company: "Tax Opportunities America",
|
||||
// location: "Flushing, NY",
|
||||
// start: "April 2014",
|
||||
// end: "May 2015",
|
||||
// highlights: [
|
||||
// "Interfaced with clients, prepared necessary documentation and submitted applications to government programs on behalf of clients.",
|
||||
// "Monitored and accommodated deadlines, missing client data, and when client promised to have the data available",
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// title: "Representative",
|
||||
// company: "Computer-Aided Engineering Network (CAEN) Hotline",
|
||||
// location: "U. of Michigan",
|
||||
// start: "2007",
|
||||
// end: "2009, 2010",
|
||||
// highlights: [
|
||||
// "Provided first-response assistance to students and collecting pertinent information to arrange for involvement of specialized staff.",
|
||||
// ],
|
||||
// },
|
||||
];
|
||||
|
||||
export const projectsHobbies = [
|
||||
{
|
||||
title: "Self-host email for the sakal.us domain",
|
||||
highlights: ["Vultr-Hosted", "Postfix for SMTP", "Dovecot for IMAP"],
|
||||
},
|
||||
{
|
||||
title: "Self-host a Kubernetes cluster",
|
||||
highlights: [
|
||||
"k3s",
|
||||
"Private Docker image registry",
|
||||
"cert-manager",
|
||||
"Private coding projects",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Self-host a Gitea code repository",
|
||||
highlights: [
|
||||
"Deployed within the above Kubernetes cluster. Available at https://git.sakal.us",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Personal coding blog",
|
||||
highlights: ["Astro", "Cloudflare Pages", "https://blog.sakal.us"],
|
||||
},
|
||||
{
|
||||
title: "Calendar Optimizer project",
|
||||
highlights: [
|
||||
"Stock options research platform",
|
||||
"Preact",
|
||||
"trpc",
|
||||
"Clickhouse",
|
||||
"https://calendar-optimizer-frontend.sakal.us",
|
||||
],
|
||||
},
|
||||
// {
|
||||
// title: "Custom From-Scratch Full-Stack eCommerce website",
|
||||
// highlights: [
|
||||
// "Previously at piazzaoptical.com",
|
||||
// "mithril.js",
|
||||
// "nginx as reverse proxy and TLS termination",
|
||||
// "lua-http on LuaJIT",
|
||||
// "LMDB",
|
||||
// ],
|
||||
// },
|
||||
];
|
||||
|
||||
export const education = [
|
||||
{
|
||||
title: "B.S. in Aerospace Engineering",
|
||||
location: "University of Michigan, Ann Arbor, MI",
|
||||
start: "Sept. 2006",
|
||||
end: "April 2009, Sept. 2010, April 2011",
|
||||
gpa: "3.185",
|
||||
},
|
||||
// {
|
||||
// title: "Ph.D. in Rabbinics",
|
||||
// location: "Rabbinical Seminary of America, Flushing, NY",
|
||||
// start: "April 2009",
|
||||
// end: "April 2010, April 2011, January 2020",
|
||||
// },
|
||||
];
|
@ -0,0 +1,72 @@
|
||||
import eslint from "@eslint/js";
|
||||
import react from "eslint-plugin-react";
|
||||
import globals from "globals";
|
||||
import tseslint, { type ConfigArray } from "typescript-eslint";
|
||||
|
||||
export default tseslint.config(
|
||||
{
|
||||
ignores: [
|
||||
"dist/*",
|
||||
// Temporary compiled files
|
||||
"**/*.ts.build-*.mjs",
|
||||
|
||||
// JS files at the root of the project
|
||||
"*.js",
|
||||
"*.cjs",
|
||||
"*.mjs",
|
||||
],
|
||||
},
|
||||
eslint.configs.recommended,
|
||||
...tseslint.configs.recommended,
|
||||
{
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
warnOnUnsupportedTypeScriptVersion: false,
|
||||
sourceType: "module",
|
||||
ecmaVersion: "latest",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
rules: {
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
1,
|
||||
{
|
||||
argsIgnorePattern: "^_",
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/no-namespace": 0,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
|
||||
...react.configs.flat.recommended,
|
||||
languageOptions: {
|
||||
...react.configs.flat.recommended.languageOptions,
|
||||
globals: {
|
||||
...globals.serviceworker,
|
||||
...globals.browser,
|
||||
},
|
||||
},
|
||||
|
||||
settings: {
|
||||
react: {
|
||||
version: "detect",
|
||||
},
|
||||
},
|
||||
} as ConfigArray[number],
|
||||
|
||||
react.configs.flat["jsx-runtime"] as ConfigArray[number],
|
||||
|
||||
{
|
||||
rules: {
|
||||
"react/no-unknown-property": [
|
||||
"error",
|
||||
{
|
||||
ignore: ["css"],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
);
|
@ -0,0 +1,19 @@
|
||||
import "./style.css";
|
||||
|
||||
export default function LayoutDefault({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<div
|
||||
css={{
|
||||
display: "flex",
|
||||
maxWidth: 1024,
|
||||
margin: "auto",
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
/* Reset */
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
@import url("./common.css");
|
||||
@page {
|
||||
size: letter;
|
||||
margin: 0.5in;
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
{
|
||||
"scripts": {
|
||||
"dev": "vike dev",
|
||||
"build": "vike build",
|
||||
"preview": "run-s build preview:wrangler",
|
||||
"lint": "eslint .",
|
||||
"preview:wrangler": "wrangler pages dev",
|
||||
"deploy:wrangler": "wrangler pages deploy",
|
||||
"deploy": "run-s build deploy:wrangler"
|
||||
},
|
||||
"dependencies": {
|
||||
"vike": "^0.4.237",
|
||||
"@compiled/react": "^0.18.6",
|
||||
"@vitejs/plugin-react": "^5.0.0",
|
||||
"react": "^19.1.1",
|
||||
"react-dom": "^19.1.1",
|
||||
"vike-react": "^0.6.5",
|
||||
"vike-cloudflare": "^0.1.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.9.2",
|
||||
"vite": "^7.1.2",
|
||||
"vite-plugin-compiled-react": "^1.3.1",
|
||||
"eslint": "^9.33.0",
|
||||
"@eslint/js": "^9.33.0",
|
||||
"typescript-eslint": "^8.39.1",
|
||||
"globals": "^16.3.0",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"@types/react": "^19.1.10",
|
||||
"@types/react-dom": "^19.1.7",
|
||||
"@cloudflare/workers-types": "^4.20250816.0",
|
||||
"wrangler": "^4.30.0",
|
||||
"npm-run-all2": "^8.0.4"
|
||||
},
|
||||
"type": "module"
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
import type { Config } from "vike/types";
|
||||
import vikeReact from "vike-react/config";
|
||||
import Layout from "../layouts/LayoutDefault.js";
|
||||
|
||||
// Default config (can be overridden by pages)
|
||||
// https://vike.dev/config
|
||||
|
||||
export default {
|
||||
// https://vike.dev/Layout
|
||||
Layout,
|
||||
|
||||
// https://vike.dev/head-tags
|
||||
title: "Brian Sakal | Resume",
|
||||
description: "Resume Auto-Generated from Metadata",
|
||||
|
||||
extends: vikeReact,
|
||||
} satisfies Config;
|
@ -0,0 +1,19 @@
|
||||
import { usePageContext } from "vike-react/usePageContext";
|
||||
|
||||
export default function Page() {
|
||||
const { is404 } = usePageContext();
|
||||
if (is404) {
|
||||
return (
|
||||
<>
|
||||
<h1>404 Page Not Found</h1>
|
||||
<p>This page could not be found.</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<h1>500 Internal Server Error</h1>
|
||||
<p>Something went wrong.</p>
|
||||
</>
|
||||
);
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
import * as resumeData from "../../database/resume.js";
|
||||
|
||||
export default function data() {
|
||||
return resumeData;
|
||||
}
|
||||
|
||||
export type Data = ReturnType<typeof data>;
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,29 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"sourceMap": true,
|
||||
"module": "ESNext",
|
||||
"noEmit": true,
|
||||
"moduleResolution": "Bundler",
|
||||
"target": "ES2022",
|
||||
"lib": [
|
||||
"DOM",
|
||||
"DOM.Iterable",
|
||||
"ESNext"
|
||||
],
|
||||
"types": [
|
||||
"vite/client",
|
||||
"vike-react",
|
||||
"vike-cloudflare/types"
|
||||
],
|
||||
"jsx": "react-jsx",
|
||||
"jsxImportSource": "react"
|
||||
},
|
||||
"exclude": [
|
||||
"dist"
|
||||
]
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
import { pages } from "vike-cloudflare";
|
||||
import react from "@vitejs/plugin-react";
|
||||
import { compiled } from "vite-plugin-compiled-react";
|
||||
import vike from "vike/plugin";
|
||||
import { defineConfig } from "vite";
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
vike(),
|
||||
compiled({
|
||||
extract: true,
|
||||
}),
|
||||
react(),
|
||||
pages(),
|
||||
],
|
||||
build: {
|
||||
target: "es2022",
|
||||
},
|
||||
});
|
@ -0,0 +1,4 @@
|
||||
name = "my-app"
|
||||
compatibility_date = "2024-09-29"
|
||||
pages_build_output_dir = "./dist/cloudflare"
|
||||
compatibility_flags = [ "nodejs_compat" ]
|
Loading…
Reference in New Issue