diff --git a/boilerplates/eslint/files/eslint.config.js b/boilerplates/eslint/files/eslint.config.js index 9b3fd3015..61c1dcee0 100644 --- a/boilerplates/eslint/files/eslint.config.js +++ b/boilerplates/eslint/files/eslint.config.js @@ -30,6 +30,7 @@ export default tseslint.config( { languageOptions: { parserOptions: { + warnOnUnsupportedTypeScriptVersion: false, sourceType: "module", ecmaVersion: "latest", }, diff --git a/boilerplates/plain-sentry/files/$package.json.ts b/boilerplates/plain-sentry/files/$package.json.ts deleted file mode 100644 index 36e04532e..000000000 --- a/boilerplates/plain-sentry/files/$package.json.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { addDependency, loadAsJson, type TransformerProps } from "@batijs/core"; - -export default async function getPackageJson(props: TransformerProps) { - const packageJson = await loadAsJson(props); - - return addDependency(packageJson, await import("../package.json").then((x) => x.default), { - dependencies: ["@sentry/browser"] as const, - }); -} diff --git a/boilerplates/plain-sentry/files/pages/sentry/+Page.js b/boilerplates/plain-sentry/files/pages/sentry/+Page.js deleted file mode 100644 index 6b89b164b..000000000 --- a/boilerplates/plain-sentry/files/pages/sentry/+Page.js +++ /dev/null @@ -1,19 +0,0 @@ -export { Page }; - -function Page() { - // language=HTML - return ` -

Sentry Test Page

-

- Sentry Client is not initialized! Vite Mode: ${import.meta.env.PROD ? "PROD" : "DEV"} -

-

- Sentry Client DSN is missing! Vite Mode: ${import.meta.env.PROD ? "PROD" : "DEV"} -

-
- -
-`; -} diff --git a/boilerplates/plain-sentry/files/pages/sentry/+client.js b/boilerplates/plain-sentry/files/pages/sentry/+client.js deleted file mode 100644 index 4c3b15ee7..000000000 --- a/boilerplates/plain-sentry/files/pages/sentry/+client.js +++ /dev/null @@ -1,37 +0,0 @@ -import "../+client"; -/** - * @typedef {Object} SentryClient - * @property {function(): SentryOptions} getOptions - */ - -/** - * @typedef {Object} SentryOptions - * @property {string} dsn - */ - -/** - * @type {Window & { Sentry?: { getClient: () => SentryClient } }} - */ -const globalWindow = globalThis?.window; - -if (typeof window !== "undefined") { - const window = globalThis?.window; - - window.onload = function () { - const options = globalWindow?.Sentry?.getClient()?.getOptions(); - if (options) { - const elmSentryState = document?.getElementById("sentry_state"); - if (elmSentryState) elmSentryState.hidden = true; - if (options?.dsn?.length > 1) { - const elmSentryDSN = document?.getElementById("sentry_dsn"); - if (elmSentryDSN) elmSentryDSN.hidden = true; - } - } - - const elmSentryButton = document?.getElementById("errorButton"); - if (elmSentryButton) - elmSentryButton.addEventListener("click", function () { - throw new Error("This is a SENTRY Browser Test!"); - }); - }; -} diff --git a/boilerplates/plain-sentry/files/sentry.browser.config.ts b/boilerplates/plain-sentry/files/sentry.browser.config.ts deleted file mode 100644 index 4a4cae40c..000000000 --- a/boilerplates/plain-sentry/files/sentry.browser.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as Sentry from "@sentry/browser"; - -export const sentryBrowserConfig = () => { - // eslint-disable-next-line - import.meta.env.PROD === true && - Sentry.init({ - dsn: import.meta.env.PUBLIC_ENV__SENTRY_DSN, - environment: "production-frontend", - //enabled: import.meta.env.DEV ? false : true, - integrations: [Sentry.replayIntegration()], - autoSessionTracking: globalThis?.window?.document ? true : false, // disable autoSessionTracking in SSR - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled - tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], - // Capture Replay for 10% of all sessions, - // plus for 100% of sessions with an error - replaysSessionSampleRate: 0.1, - replaysOnErrorSampleRate: 1.0, - }); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (window as any).Sentry = Sentry; -}; diff --git a/boilerplates/plain-sentry/files/vite-env.d.ts b/boilerplates/plain-sentry/files/vite-env.d.ts deleted file mode 100644 index 11f02fe2a..000000000 --- a/boilerplates/plain-sentry/files/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/boilerplates/plain-sentry/package.json b/boilerplates/plain-sentry/package.json deleted file mode 100644 index 56b22d8d6..000000000 --- a/boilerplates/plain-sentry/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "@batijs/plain-sentry", - "private": true, - "version": "0.0.1", - "description": "", - "type": "module", - "scripts": { - "check-types": "tsc --noEmit", - "build": "bati-compile-boilerplate" - }, - "keywords": [], - "author": "", - "license": "MIT", - "devDependencies": { - "@batijs/compile": "workspace:*", - "@sentry/browser": "^8.30.0", - "@types/node": "^18.19.14", - "vite": "^5.4.5" - }, - "dependencies": { - "@batijs/core": "workspace:*" - }, - "files": [ - "dist/" - ], - "bati": { - "if": { - "$and": [ - { - "flag": "sentry" - }, - { - "flag": { - "$not": { - "$in": [ - "react", - "vue", - "solid", - "svelte", - "preact", - "angular" - ] - } - } - } - ] - } - }, - "exports": { - "./sentry.browser.config": { - "types": "./dist/types/sentry.browser.config.d.ts" - }, - "./pages/sentry/+Page": { - "types": "./dist/types/pages/sentry/+Page.d.ts" - }, - "./pages/sentry/+client": { - "types": "./dist/types/pages/sentry/+client.d.ts" - } - }, - "typesVersions": { - "*": { - "sentry.browser.config": [ - "./dist/types/sentry.browser.config.d.ts" - ], - "pages/sentry/+Page": [ - "./dist/types/pages/sentry/+Page.d.ts" - ], - "pages/sentry/+client": [ - "./dist/types/pages/sentry/+client.d.ts" - ] - } - } -} \ No newline at end of file diff --git a/boilerplates/plain-sentry/tsconfig.json b/boilerplates/plain-sentry/tsconfig.json deleted file mode 100644 index 2c2d73546..000000000 --- a/boilerplates/plain-sentry/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": ["../tsconfig.base.json"], - "compilerOptions": { - "types": ["vite/client", "@batijs/core/types"], - "lib": ["DOM", "DOM.Iterable", "ES2022"] - } -} diff --git a/boilerplates/shared-plain/files/pages/index/+Page.ts b/boilerplates/shared-plain/files/pages/index/+Page.ts deleted file mode 100644 index e0dbc1ed1..000000000 --- a/boilerplates/shared-plain/files/pages/index/+Page.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { Page }; - -/** - * An empty page - * @see {@link https://vike.dev/render-modes#html-only} - */ -function Page() { - return "Created with Bâti"; -} diff --git a/boilerplates/shared-plain/files/renderer/+config.ts b/boilerplates/shared-plain/files/renderer/+config.ts deleted file mode 100644 index 69684c582..000000000 --- a/boilerplates/shared-plain/files/renderer/+config.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Environment: config - -/** - * @see {@link https://vike.dev/render-modes#html-only} - */ -export default { - meta: { - Page: { - env: { server: true, client: false }, // HTML-only for all pages - }, - }, -}; diff --git a/boilerplates/shared-plain/files/renderer/+onRenderHtml.ts b/boilerplates/shared-plain/files/renderer/+onRenderHtml.ts deleted file mode 100644 index 0ae52469e..000000000 --- a/boilerplates/shared-plain/files/renderer/+onRenderHtml.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Environment: server - -import { dangerouslySkipEscape, escapeInject } from "vike/server"; -import type { OnRenderHtmlAsync } from "vike/types"; - -export { onRenderHtml }; - -/** - * The onRenderHtml() hook defines how pages are rendered to HTML. - * @see {@link https://vike.dev/onRenderHtml} - */ -const onRenderHtml: OnRenderHtmlAsync = async (pageContext): ReturnType => { - // Retrieve contextual data here and call your rendering framework - - // const { Page, pageProps } = pageContext; - const { Page } = pageContext; - // const pageHtml = await renderToHtml(createElement(Page, pageProps)); - const pageHtml = (Page as () => string)(); - - const documentHtml = escapeInject` - - - - - - My App - - -
${dangerouslySkipEscape(pageHtml)}
- - `; - - return { - documentHtml, - pageContext: { - // We can define pageContext values here - }, - }; -}; diff --git a/boilerplates/shared-plain/package.json b/boilerplates/shared-plain/package.json deleted file mode 100644 index 02e3fc5f4..000000000 --- a/boilerplates/shared-plain/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@batijs/shared-plain", - "private": true, - "version": "0.0.1", - "description": "", - "type": "module", - "scripts": { - "check-types": "tsc --noEmit", - "build": "bati-compile-boilerplate" - }, - "keywords": [], - "author": "", - "license": "MIT", - "devDependencies": { - "@batijs/compile": "workspace:*", - "@types/node": "^18.19.14", - "vike": "^0.4.195", - "vite": "^5.4.5" - }, - "dependencies": { - "@batijs/core": "workspace:*" - }, - "files": [ - "dist/" - ], - "bati": { - "if": { - "flag": { - "$not": { - "$in": [ - "react", - "vue", - "solid", - "svelte", - "preact", - "angular" - ] - } - } - } - }, - "exports": { - "./pages/index/+Page": { - "types": "./dist/types/pages/index/+Page.d.ts" - }, - "./renderer/+config": { - "types": "./dist/types/renderer/+config.d.ts" - }, - "./renderer/+onRenderHtml": { - "types": "./dist/types/renderer/+onRenderHtml.d.ts" - } - }, - "typesVersions": { - "*": { - "pages/index/+Page": [ - "./dist/types/pages/index/+Page.d.ts" - ], - "renderer/+config": [ - "./dist/types/renderer/+config.d.ts" - ], - "renderer/+onRenderHtml": [ - "./dist/types/renderer/+onRenderHtml.d.ts" - ] - } - } -} \ No newline at end of file diff --git a/boilerplates/shared-plain/tsconfig.json b/boilerplates/shared-plain/tsconfig.json deleted file mode 100644 index 8b62c8bdd..000000000 --- a/boilerplates/shared-plain/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["../tsconfig.base.json"] -} diff --git a/packages/cli/index.ts b/packages/cli/index.ts index d189439df..08ef25cca 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -214,6 +214,21 @@ async function checkArguments(args: ParsedArgs) { } } +function checkFlagsIncludesUiFramework(flags: string[]) { + const uiFlags: string[] = features.filter((fs) => fs.category === "UI Framework").map((fs) => fs.flag); + const uiFlagFound = flags.some((f) => uiFlags.includes(f)); + + if (!uiFlagFound) { + const lf = new Intl.ListFormat("en", { + type: "disjunction", + }); + console.error( + `${red("⚠")} A ${yellow("UI Framework")} is required when using Bati. Choose one of ${lf.format(uiFlags.map((f) => bold(`--${f}`)))}`, + ); + process.exit(5); + } +} + function checkFlagsExist(flags: string[]) { const inValidOptions = flags.reduce((acc: string[], flag: string) => { if (!Object.prototype.hasOwnProperty.call(defaultDef, flag) && !features.some((f) => f.flag === flag)) { @@ -361,6 +376,7 @@ async function run() { ]; checkFlagsExist(flags); + checkFlagsIncludesUiFramework(flags); checkRules(flags); // `enforce: "pre"` boilerplates first, then `enforce: undefined`, then `enforce: "post"` diff --git a/packages/cli/turbo.json b/packages/cli/turbo.json index b54daa062..15780a91c 100644 --- a/packages/cli/turbo.json +++ b/packages/cli/turbo.json @@ -25,7 +25,6 @@ "@batijs/hono#build", "@batijs/lucia-auth#build", "@batijs/mantine#build", - "@batijs/plain-sentry#build", "@batijs/prettier#build", "@batijs/prisma#build", "@batijs/react#build", @@ -37,7 +36,6 @@ "@batijs/shared#build", "@batijs/shared-db#build", "@batijs/shared-no-db#build", - "@batijs/shared-plain#build", "@batijs/shared-server#build", "@batijs/shared-todo#build", "@batijs/solid#build", diff --git a/packages/core/src/parse/linters/linter-ts.ts b/packages/core/src/parse/linters/linter-ts.ts index 607b07d51..1a2b7fc02 100644 --- a/packages/core/src/parse/linters/linter-ts.ts +++ b/packages/core/src/parse/linters/linter-ts.ts @@ -66,6 +66,9 @@ export default function tsLinterConfig(meta: VikeMeta) { }, languageOptions: { parser: tsParseForESLint, + parserOptions: { + warnOnUnsupportedTypeScriptVersion: false, + }, }, rules: { "batiTs/ts": "error", diff --git a/packages/features/src/categories.ts b/packages/features/src/categories.ts index 995dad5b3..41fad08c1 100644 --- a/packages/features/src/categories.ts +++ b/packages/features/src/categories.ts @@ -6,6 +6,7 @@ export const categories = [ label: "Frontend Framework", group: categoriesGroups.Frontend, description: `Flexible, robust, community-driven, and fast Vite-based frontend framework.`, + required: true, }, { label: "UI Framework", @@ -13,6 +14,7 @@ export const categories = [ description: `It’s recommended to choose a frontend lib to kickstart a new Vike project, as they each come with a wide range of integrations. You can at any time eject and take control over integration code so that it doesn’t get in your way.`, + required: true, }, { label: "CSS", diff --git a/packages/features/src/features.ts b/packages/features/src/features.ts index 78bbee1b2..bdef203c1 100644 --- a/packages/features/src/features.ts +++ b/packages/features/src/features.ts @@ -36,6 +36,7 @@ export const features = [ spectrum: "beaten_path", tagline: "The library for web and native user interfaces", repo: "facebook/react", + selected: true, links: [ { label: "Learn", @@ -403,6 +404,43 @@ export const features = [ }, // Database + { + category: "Database", + label: "Drizzle", + flag: "drizzle", + image: + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI4MHB4IiBoZWlnaHQ9IjI4MHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iIzAwMDAwMCIgZD0iTSAtMC41LC0wLjUgQyA5Mi44MzMzLC0wLjUgMTg2LjE2NywtMC41IDI3OS41LC0wLjVDIDI3OS41LDkyLjgzMzMgMjc5LjUsMTg2LjE2NyAyNzkuNSwyNzkuNUMgMTg2LjE2NywyNzkuNSA5Mi44MzMzLDI3OS41IC0wLjUsMjc5LjVDIC0wLjUsMTg2LjE2NyAtMC41LDkyLjgzMzMgLTAuNSwtMC41IFoiLz48L2c+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNjMWYyNGQiIGQ9Ik0gMTMzLjUsODQuNSBDIDE0Mi44MTQsODIuNzI2OSAxNDYuNjQ3LDg2LjM5MzUgMTQ1LDk1LjVDIDEzNS45MDYsMTEyLjAyOCAxMjYuNTcyLDEyOC4zNjIgMTE3LDE0NC41QyAxMTEuMjQ5LDE0OS45ODQgMTA2LjI0OSwxNDkuMzE3IDEwMiwxNDIuNUMgMTAxLjMzMywxNDAuODMzIDEwMS4zMzMsMTM5LjE2NyAxMDIsMTM3LjVDIDExMS41NDcsMTE5LjA0MSAxMjIuMDQ3LDEwMS4zNzUgMTMzLjUsODQuNSBaIi8+PC9nPgo8Zz48cGF0aCBzdHlsZT0ib3BhY2l0eToxIiBmaWxsPSIjYzBmMTRkIiBkPSJNIDIyMy41LDg0LjUgQyAyMzMuNTM5LDgzLjY5NzIgMjM3LjAzOSw4OC4wMzA1IDIzNCw5Ny41QyAyMjUuMzQ3LDExMi44MDEgMjE2LjY4MSwxMjguMTM1IDIwOCwxNDMuNUMgMjAzLjM4NywxNDkuNzM3IDE5OC4zODcsMTUwLjA3MSAxOTMsMTQ0LjVDIDE5MS41NzgsMTQxLjk3IDE5MS4yNDUsMTM5LjMwMyAxOTIsMTM2LjVDIDIwMC41MiwxMjIuNzk0IDIwOC41MiwxMDguNzk0IDIxNiw5NC41QyAyMTguMjg5LDkwLjg4MTIgMjIwLjc4OSw4Ny41NDc5IDIyMy41LDg0LjUgWiIvPjwvZz4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2MwZjE0ZCIgZD0iTSA3NS41LDEyMC41IEMgODMuOTg4NSwxMTkuNjE4IDg3LjgyMTgsMTIzLjI4NSA4NywxMzEuNUMgNzcuOTA1NywxNDguMDI4IDY4LjU3MjQsMTY0LjM2MiA1OSwxODAuNUMgNTYuMDQ1MywxODQuMjc3IDUyLjIxMiwxODUuNDQzIDQ3LjUsMTg0QyA0My44Njk3LDE4MC45NSA0Mi43MDMsMTc3LjExNyA0NCwxNzIuNUMgNTMsMTU2LjUgNjIsMTQwLjUgNzEsMTI0LjVDIDcyLjM5NjgsMTIyLjkzIDczLjg5NjgsMTIxLjU5NiA3NS41LDEyMC41IFoiLz48L2c+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNjMWYyNGQiIGQ9Ik0gMTY1LjUsMTIwLjUgQyAxNzQuMTY0LDExOS4zMzIgMTc3Ljk5NywxMjIuOTk5IDE3NywxMzEuNUMgMTY3LjQxNCwxNDcuNjcxIDE1OC4wOCwxNjQuMDA0IDE0OSwxODAuNUMgMTQ2LjM5OCwxODQuMjEyIDE0Mi44OTgsMTg1LjM3OCAxMzguNSwxODRDIDEzMy45MzEsMTgxLjQ1OSAxMzIuNDMxLDE3Ny42MjUgMTM0LDE3Mi41QyAxNDMuNTcyLDE1Ni4zNjIgMTUyLjkwNiwxNDAuMDI4IDE2MiwxMjMuNUMgMTYzLjE0NSwxMjIuMzY0IDE2NC4zMTIsMTIxLjM2NCAxNjUuNSwxMjAuNSBaIi8+PC9nPgo8L3N2Zz4K", + url: "https://orm.drizzle.team/", + tagline: "Headless TypeScript ORM that feels like SPA with SSR", + repo: "drizzle-team/drizzle-orm", + links: [ + { + label: "Docs & Getting started", + href: "https://orm.drizzle.team/docs/overview", + }, + ], + }, + { + category: "Database", + label: "SQLite", + flag: "sqlite", + image: + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImRldmljb25TcWxpdGUwIiB4MT0iLTE1LjYxNSIgeDI9Ii02Ljc0MSIgeTE9Ii05LjEwOCIgeTI9Ii05LjEwOCIgZ3JhZGllbnRUcmFuc2Zvcm09InJvdGF0ZSg5MCAtOTAuNDg2IDY0LjYzNClzY2FsZSg5LjI3MTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzk1ZDdmNCIgLz4KCQkJPHN0b3Agb2Zmc2V0PSIuOTIiIHN0b3AtY29sb3I9IiMwZjdmY2MiIC8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzBmN2ZjYyIgLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggZmlsbD0iIzBiN2ZjYyIgZD0iTTY5LjUgOTkuMTc2Yy0uMDU5LS43My0uMDk0LTEuMi0uMDk0LTEuMlM2Ny4yIDgzLjA4NyA2NC41NyA3OC42NDJjLS40MTQtLjcwNy4wNDMtMy41OTQgMS4yMDctNy44OGMuNjggMS4xNjkgMy41NCA2LjE5MiA0LjExOCA3LjgxYy42NDggMS44MjQuNzggMi4zNDcuNzggMi4zNDdzLTEuNTctOC4wODItNC4xNDQtMTIuNzk3YTE2MiAxNjIgMCAwIDEgMi4wMDQtNi4yNjVjLjk3MyAxLjcxIDMuMzEzIDUuODU5IDMuODI4IDcuM2MuMTAyLjI5My4xOTIuNTQzLjI3Ljc3NGwuMDc0LS40MTRjLS41OS0yLjUwNC0xLjc1LTYuODYtMy4zMzYtMTAuMDgyYzMuNTItMTguMzI4IDE1LjUzMS00Mi44MjQgMjcuODQtNTMuNzU0SDE2LjljLTUuMzg3IDAtOS43ODkgNC40MDYtOS43ODkgOS43ODl2ODguNTdjMCA1LjM4MyA0LjQwNiA5Ljc4OSA5Ljc5IDkuNzg5aDUyLjg5N2ExMTkgMTE5IDAgMCAxLS4yOTctMTQuNjUyIiAvPgoJPHBhdGggZmlsbD0idXJsKCNkZXZpY29uU3FsaXRlMCkiIGQ9Ik02NS43NzcgNzAuNzYyYy42OCAxLjE2OCAzLjU0IDYuMTg4IDQuMTE3IDcuODA5Yy42NDkgMS44MjQuNzgxIDIuMzQ3Ljc4MSAyLjM0N3MtMS41Ny04LjA4Mi00LjE0NC0xMi43OTdhMTY1IDE2NSAwIDAgMSAyLjAwNC02LjI3Yy44ODcgMS41NjcgMi45MjIgNS4xNjkgMy42NTIgNi44NzJsLjA4Mi0uOTYxYy0uNjQ4LTIuNDk2LTEuNjMzLTUuNzY2LTIuODk4LTguMzI4YzMuMjQyLTE2Ljg3MSAxMy42OC0zOC45NyAyNC45MjYtNTAuODk4SDE2Ljg5OWE2Ljk0IDYuOTQgMCAwIDAtNi45MzQgNi45MzN2ODIuMTFjMTcuNTI3LTYuNzMxIDM4LjY2NC0xMi44OCA1Ni44NTUtMTIuNjE0Yy0uNjcyLTIuNjA1LTEuNDQxLTQuOTYtMi4yNS02LjMyNGMtLjQxNC0uNzA3LjA0My0zLjU5NyAxLjIwNy03Ljg3OSIgLz4KCTxwYXRoIGZpbGw9IiMwMDM5NTYiIGQ9Ik0xMTUuOTUgMi43ODFjLTUuNS00LjkwNi0xMi4xNjQtMi45MzMtMTguNzM0IDIuODk5YTQ0IDQ0IDAgMCAwLTIuOTE0IDIuODU5Yy0xMS4yNSAxMS45MjYtMjEuNjg0IDM0LjAyMy0yNC45MjYgNTAuODk1YzEuMjYyIDIuNTYzIDIuMjUgNS44MzIgMi44OTQgOC4zMjhjLjE2OC42NC4zMiAxLjI0Mi40NDIgMS43NTRjLjI4NSAxLjIwNy40MzcgMS45OTYuNDM3IDEuOTk2cy0uMTAxLS4zODMtLjUxNS0xLjU4MmMtLjA3OC0uMjMtLjE2OC0uNDg0LS4yNy0uNzczYTggOCAwIDAgMC0uMTcyLS40MzRjLS43MzQtMS43MDMtMi43NjUtNS4zMDUtMy42NTYtNi44NjdjLS43NjIgMi4yNS0xLjQzNyA0LjM2LTIuMDA0IDYuMjY1YzIuNTc4IDQuNzE1IDQuMTQ5IDEyLjc5NyA0LjE0OSAxMi43OTdzLS4xMzctLjUyMy0uNzgyLTIuMzQ3Yy0uNTc4LTEuNjIxLTMuNDQxLTYuNjQtNC4xMTctNy44MDljLTEuMTY0IDQuMjgxLTEuNjI1IDcuMTcyLTEuMjA3IDcuODhjLjgwOSAxLjM2MiAxLjU3NCAzLjcyMiAyLjI1IDYuMzIzYzEuNTI0IDUuODY3IDIuNTg2IDEzLjAxMiAyLjU4NiAxMy4wMTJzLjAzMS40NjkuMDk0IDEuMmExMTkgMTE5IDAgMCAwIC4yOTcgMTQuNjUxYy41MDQgNi4xMSAxLjQ1MyAxMS4zNjMgMi42NjQgMTQuMTcybC44MjgtLjQ0OWMtMS43ODEtNS41MzUtMi41MDQtMTIuNzkzLTIuMTg4LTIxLjE1NmMuNDgtMTIuNzkzIDMuNDIyLTI4LjIxNSA4Ljg1Ni00NC4yODljOS4xOTEtMjQuMjcgMjEuOTM4LTQzLjczOCAzMy42MDItNTMuMDM1Yy0xMC42MzMgOS42MDItMjUuMDIzIDQwLjY4NC0yOS4zMzIgNTIuMTk1Yy00LjgyIDEyLjg5MS04LjIzOCAyNC45ODQtMTAuMzAxIDM2LjU3NGMzLjU1LTEwLjg2MyAxNS4wNDctMTUuNTMgMTUuMDQ3LTE1LjUzczUuNjM3LTYuOTU4IDEyLjIyNy0xNi44ODhjLTMuOTUuOTAzLTEwLjQzIDIuNDQyLTEyLjU5OCAzLjM1MmMtMy4yIDEuMzQ0LTQuMDY3IDEuOC00LjA2NyAxLjhzMTAuMzcxLTYuMzEyIDE5LjI3LTkuMTcxYzEyLjIzNC0xOS4yNyAyNS41NjItNDYuNjQ4IDEyLjE0MS01OC42MjEiIC8+Cjwvc3ZnPg==", + url: "https://www.sqlite.org/", + tagline: + "SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine", + repo: "sqlite/sqlite", + links: [ + { + label: "better-sqlite3: API", + href: "https://github.com/WiseLibs/better-sqlite3/blob/master/docs/api.md", + }, + { + label: "D1: Getting started", + href: "https://developers.cloudflare.com/d1/get-started/", + }, + ], + }, { category: "Database", label: "Prisma", @@ -445,43 +483,6 @@ export const features = [ }, ], }, - { - category: "Database", - label: "Drizzle", - flag: "drizzle", - image: - "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI4MHB4IiBoZWlnaHQ9IjI4MHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iIzAwMDAwMCIgZD0iTSAtMC41LC0wLjUgQyA5Mi44MzMzLC0wLjUgMTg2LjE2NywtMC41IDI3OS41LC0wLjVDIDI3OS41LDkyLjgzMzMgMjc5LjUsMTg2LjE2NyAyNzkuNSwyNzkuNUMgMTg2LjE2NywyNzkuNSA5Mi44MzMzLDI3OS41IC0wLjUsMjc5LjVDIC0wLjUsMTg2LjE2NyAtMC41LDkyLjgzMzMgLTAuNSwtMC41IFoiLz48L2c+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNjMWYyNGQiIGQ9Ik0gMTMzLjUsODQuNSBDIDE0Mi44MTQsODIuNzI2OSAxNDYuNjQ3LDg2LjM5MzUgMTQ1LDk1LjVDIDEzNS45MDYsMTEyLjAyOCAxMjYuNTcyLDEyOC4zNjIgMTE3LDE0NC41QyAxMTEuMjQ5LDE0OS45ODQgMTA2LjI0OSwxNDkuMzE3IDEwMiwxNDIuNUMgMTAxLjMzMywxNDAuODMzIDEwMS4zMzMsMTM5LjE2NyAxMDIsMTM3LjVDIDExMS41NDcsMTE5LjA0MSAxMjIuMDQ3LDEwMS4zNzUgMTMzLjUsODQuNSBaIi8+PC9nPgo8Zz48cGF0aCBzdHlsZT0ib3BhY2l0eToxIiBmaWxsPSIjYzBmMTRkIiBkPSJNIDIyMy41LDg0LjUgQyAyMzMuNTM5LDgzLjY5NzIgMjM3LjAzOSw4OC4wMzA1IDIzNCw5Ny41QyAyMjUuMzQ3LDExMi44MDEgMjE2LjY4MSwxMjguMTM1IDIwOCwxNDMuNUMgMjAzLjM4NywxNDkuNzM3IDE5OC4zODcsMTUwLjA3MSAxOTMsMTQ0LjVDIDE5MS41NzgsMTQxLjk3IDE5MS4yNDUsMTM5LjMwMyAxOTIsMTM2LjVDIDIwMC41MiwxMjIuNzk0IDIwOC41MiwxMDguNzk0IDIxNiw5NC41QyAyMTguMjg5LDkwLjg4MTIgMjIwLjc4OSw4Ny41NDc5IDIyMy41LDg0LjUgWiIvPjwvZz4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2MwZjE0ZCIgZD0iTSA3NS41LDEyMC41IEMgODMuOTg4NSwxMTkuNjE4IDg3LjgyMTgsMTIzLjI4NSA4NywxMzEuNUMgNzcuOTA1NywxNDguMDI4IDY4LjU3MjQsMTY0LjM2MiA1OSwxODAuNUMgNTYuMDQ1MywxODQuMjc3IDUyLjIxMiwxODUuNDQzIDQ3LjUsMTg0QyA0My44Njk3LDE4MC45NSA0Mi43MDMsMTc3LjExNyA0NCwxNzIuNUMgNTMsMTU2LjUgNjIsMTQwLjUgNzEsMTI0LjVDIDcyLjM5NjgsMTIyLjkzIDczLjg5NjgsMTIxLjU5NiA3NS41LDEyMC41IFoiLz48L2c+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNjMWYyNGQiIGQ9Ik0gMTY1LjUsMTIwLjUgQyAxNzQuMTY0LDExOS4zMzIgMTc3Ljk5NywxMjIuOTk5IDE3NywxMzEuNUMgMTY3LjQxNCwxNDcuNjcxIDE1OC4wOCwxNjQuMDA0IDE0OSwxODAuNUMgMTQ2LjM5OCwxODQuMjEyIDE0Mi44OTgsMTg1LjM3OCAxMzguNSwxODRDIDEzMy45MzEsMTgxLjQ1OSAxMzIuNDMxLDE3Ny42MjUgMTM0LDE3Mi41QyAxNDMuNTcyLDE1Ni4zNjIgMTUyLjkwNiwxNDAuMDI4IDE2MiwxMjMuNUMgMTYzLjE0NSwxMjIuMzY0IDE2NC4zMTIsMTIxLjM2NCAxNjUuNSwxMjAuNSBaIi8+PC9nPgo8L3N2Zz4K", - url: "https://orm.drizzle.team/", - tagline: "Headless TypeScript ORM that feels like SPA with SSR", - repo: "drizzle-team/drizzle-orm", - links: [ - { - label: "Docs & Getting started", - href: "https://orm.drizzle.team/docs/overview", - }, - ], - }, - { - category: "Database", - label: "SQLite", - flag: "sqlite", - image: - "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImRldmljb25TcWxpdGUwIiB4MT0iLTE1LjYxNSIgeDI9Ii02Ljc0MSIgeTE9Ii05LjEwOCIgeTI9Ii05LjEwOCIgZ3JhZGllbnRUcmFuc2Zvcm09InJvdGF0ZSg5MCAtOTAuNDg2IDY0LjYzNClzY2FsZSg5LjI3MTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzk1ZDdmNCIgLz4KCQkJPHN0b3Agb2Zmc2V0PSIuOTIiIHN0b3AtY29sb3I9IiMwZjdmY2MiIC8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzBmN2ZjYyIgLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggZmlsbD0iIzBiN2ZjYyIgZD0iTTY5LjUgOTkuMTc2Yy0uMDU5LS43My0uMDk0LTEuMi0uMDk0LTEuMlM2Ny4yIDgzLjA4NyA2NC41NyA3OC42NDJjLS40MTQtLjcwNy4wNDMtMy41OTQgMS4yMDctNy44OGMuNjggMS4xNjkgMy41NCA2LjE5MiA0LjExOCA3LjgxYy42NDggMS44MjQuNzggMi4zNDcuNzggMi4zNDdzLTEuNTctOC4wODItNC4xNDQtMTIuNzk3YTE2MiAxNjIgMCAwIDEgMi4wMDQtNi4yNjVjLjk3MyAxLjcxIDMuMzEzIDUuODU5IDMuODI4IDcuM2MuMTAyLjI5My4xOTIuNTQzLjI3Ljc3NGwuMDc0LS40MTRjLS41OS0yLjUwNC0xLjc1LTYuODYtMy4zMzYtMTAuMDgyYzMuNTItMTguMzI4IDE1LjUzMS00Mi44MjQgMjcuODQtNTMuNzU0SDE2LjljLTUuMzg3IDAtOS43ODkgNC40MDYtOS43ODkgOS43ODl2ODguNTdjMCA1LjM4MyA0LjQwNiA5Ljc4OSA5Ljc5IDkuNzg5aDUyLjg5N2ExMTkgMTE5IDAgMCAxLS4yOTctMTQuNjUyIiAvPgoJPHBhdGggZmlsbD0idXJsKCNkZXZpY29uU3FsaXRlMCkiIGQ9Ik02NS43NzcgNzAuNzYyYy42OCAxLjE2OCAzLjU0IDYuMTg4IDQuMTE3IDcuODA5Yy42NDkgMS44MjQuNzgxIDIuMzQ3Ljc4MSAyLjM0N3MtMS41Ny04LjA4Mi00LjE0NC0xMi43OTdhMTY1IDE2NSAwIDAgMSAyLjAwNC02LjI3Yy44ODcgMS41NjcgMi45MjIgNS4xNjkgMy42NTIgNi44NzJsLjA4Mi0uOTYxYy0uNjQ4LTIuNDk2LTEuNjMzLTUuNzY2LTIuODk4LTguMzI4YzMuMjQyLTE2Ljg3MSAxMy42OC0zOC45NyAyNC45MjYtNTAuODk4SDE2Ljg5OWE2Ljk0IDYuOTQgMCAwIDAtNi45MzQgNi45MzN2ODIuMTFjMTcuNTI3LTYuNzMxIDM4LjY2NC0xMi44OCA1Ni44NTUtMTIuNjE0Yy0uNjcyLTIuNjA1LTEuNDQxLTQuOTYtMi4yNS02LjMyNGMtLjQxNC0uNzA3LjA0My0zLjU5NyAxLjIwNy03Ljg3OSIgLz4KCTxwYXRoIGZpbGw9IiMwMDM5NTYiIGQ9Ik0xMTUuOTUgMi43ODFjLTUuNS00LjkwNi0xMi4xNjQtMi45MzMtMTguNzM0IDIuODk5YTQ0IDQ0IDAgMCAwLTIuOTE0IDIuODU5Yy0xMS4yNSAxMS45MjYtMjEuNjg0IDM0LjAyMy0yNC45MjYgNTAuODk1YzEuMjYyIDIuNTYzIDIuMjUgNS44MzIgMi44OTQgOC4zMjhjLjE2OC42NC4zMiAxLjI0Mi40NDIgMS43NTRjLjI4NSAxLjIwNy40MzcgMS45OTYuNDM3IDEuOTk2cy0uMTAxLS4zODMtLjUxNS0xLjU4MmMtLjA3OC0uMjMtLjE2OC0uNDg0LS4yNy0uNzczYTggOCAwIDAgMC0uMTcyLS40MzRjLS43MzQtMS43MDMtMi43NjUtNS4zMDUtMy42NTYtNi44NjdjLS43NjIgMi4yNS0xLjQzNyA0LjM2LTIuMDA0IDYuMjY1YzIuNTc4IDQuNzE1IDQuMTQ5IDEyLjc5NyA0LjE0OSAxMi43OTdzLS4xMzctLjUyMy0uNzgyLTIuMzQ3Yy0uNTc4LTEuNjIxLTMuNDQxLTYuNjQtNC4xMTctNy44MDljLTEuMTY0IDQuMjgxLTEuNjI1IDcuMTcyLTEuMjA3IDcuODhjLjgwOSAxLjM2MiAxLjU3NCAzLjcyMiAyLjI1IDYuMzIzYzEuNTI0IDUuODY3IDIuNTg2IDEzLjAxMiAyLjU4NiAxMy4wMTJzLjAzMS40NjkuMDk0IDEuMmExMTkgMTE5IDAgMCAwIC4yOTcgMTQuNjUxYy41MDQgNi4xMSAxLjQ1MyAxMS4zNjMgMi42NjQgMTQuMTcybC44MjgtLjQ0OWMtMS43ODEtNS41MzUtMi41MDQtMTIuNzkzLTIuMTg4LTIxLjE1NmMuNDgtMTIuNzkzIDMuNDIyLTI4LjIxNSA4Ljg1Ni00NC4yODljOS4xOTEtMjQuMjcgMjEuOTM4LTQzLjczOCAzMy42MDItNTMuMDM1Yy0xMC42MzMgOS42MDItMjUuMDIzIDQwLjY4NC0yOS4zMzIgNTIuMTk1Yy00LjgyIDEyLjg5MS04LjIzOCAyNC45ODQtMTAuMzAxIDM2LjU3NGMzLjU1LTEwLjg2MyAxNS4wNDctMTUuNTMgMTUuMDQ3LTE1LjUzczUuNjM3LTYuOTU4IDEyLjIyNy0xNi44ODhjLTMuOTUuOTAzLTEwLjQzIDIuNDQyLTEyLjU5OCAzLjM1MmMtMy4yIDEuMzQ0LTQuMDY3IDEuOC00LjA2NyAxLjhzMTAuMzcxLTYuMzEyIDE5LjI3LTkuMTcxYzEyLjIzNC0xOS4yNyAyNS41NjItNDYuNjQ4IDEyLjE0MS01OC42MjEiIC8+Cjwvc3ZnPg==", - url: "https://www.sqlite.org/", - tagline: - "SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine", - repo: "sqlite/sqlite", - links: [ - { - label: "better-sqlite3: API", - href: "https://github.com/WiseLibs/better-sqlite3/blob/master/docs/api.md", - }, - { - label: "D1: Getting started", - href: "https://developers.cloudflare.com/d1/get-started/", - }, - ], - }, // Analytics { diff --git a/packages/features/src/types.ts b/packages/features/src/types.ts index 8491e985a..8e4fc2893 100644 --- a/packages/features/src/types.ts +++ b/packages/features/src/types.ts @@ -18,6 +18,7 @@ export interface Feature { invisibleCli?: boolean; // if true, cannot be toggled off (implies selected by default, otherwise use `disabled`) readonly?: boolean; + selected?: boolean; } export interface FeatureLink { @@ -30,5 +31,6 @@ export interface Category { group: categoriesGroups; // like