In Progress
[Plugin] - @db/mongoose
Add Mongoose as a NoSQL Database driver and plugin option. @[Plugin] - Add @db/driver options (1/4)

Thorr Stevens 5 months ago
In Progress
[Plugin] - @db/mongoose
Add Mongoose as a NoSQL Database driver and plugin option. @[Plugin] - Add @db/driver options (1/4)

Thorr Stevens 5 months ago
Planned
[Plugin] - with/nativewind-v5
Preview plugin branch for the upcoming Nativewind V5 More info & migration guide: https://www.nativewind.dev/blog/v5-migration-guide

Thorr Stevens 7 months ago
Planned
[Plugin] - with/nativewind-v5
Preview plugin branch for the upcoming Nativewind V5 More info & migration guide: https://www.nativewind.dev/blog/v5-migration-guide

Thorr Stevens 7 months ago
Completed
[Portability] - Workspace Drivers Architecture
Adds an ‘npm collect:drivers‘ script Scans for `{driverName}.{driverType}.ts` files Searches within ‘/drivers/‘ directories Supported {driverType} values: db - Data persistence (e.g. → ‘@db/mongoose‘) auth - Authentication (e.g. → ‘@auth/clerk‘) files - File Storage (e.g. → ‘@files/uploadthing‘) email - Sending emails (e.g. → ‘@email/resend‘) Provider selection is configured in ‘@app/config’ { db: 'mongoose', // from options 'mongoose' | 'supabase' | ... auth: 'clerk', // options 'clerk' | 'supabase' | 'workos' | ... } Driver packages ‘@{driverType}/driver’ re-export the selected provider’s core modules: ‘@db/driver‘ → insert / update / delete methods from ‘@db/mongoose‘ ‘@auth/driver‘ → SignIn / SignUp / useUser() / … from ‘@auth/clerk‘ All driver options must conform to a common driverType structure, enforced with Zod Key Benefits ❇️ Uses Zod to ensure a common interface for driver options Alternative to just Typescript for enforcing the driver “contract” ❇️ Swapping providers becomes a config change, not a rewrite Business logic stays mostly untouched ❇️ You can still use the drivers separately by importing from them directly e.g. ‘@db/mongoose‘ instead of ‘@db/driver‘ in some places Enables you to use different provider if required e.g. during a migration to a new provider 🚧 Caveats The architecture and script supporting this workspace driver architecture are finished, BUT, most of the actual drivers are still in progress: @[Plugin] - @db/driver @[Plugin] - @auth/driver You can already add your own custom drivers if you think this is an interesting approach Have a look at ‘mock.db.ts‘ as an example

Thorr Stevens 7 months ago
Completed
[Portability] - Workspace Drivers Architecture
Adds an ‘npm collect:drivers‘ script Scans for `{driverName}.{driverType}.ts` files Searches within ‘/drivers/‘ directories Supported {driverType} values: db - Data persistence (e.g. → ‘@db/mongoose‘) auth - Authentication (e.g. → ‘@auth/clerk‘) files - File Storage (e.g. → ‘@files/uploadthing‘) email - Sending emails (e.g. → ‘@email/resend‘) Provider selection is configured in ‘@app/config’ { db: 'mongoose', // from options 'mongoose' | 'supabase' | ... auth: 'clerk', // options 'clerk' | 'supabase' | 'workos' | ... } Driver packages ‘@{driverType}/driver’ re-export the selected provider’s core modules: ‘@db/driver‘ → insert / update / delete methods from ‘@db/mongoose‘ ‘@auth/driver‘ → SignIn / SignUp / useUser() / … from ‘@auth/clerk‘ All driver options must conform to a common driverType structure, enforced with Zod Key Benefits ❇️ Uses Zod to ensure a common interface for driver options Alternative to just Typescript for enforcing the driver “contract” ❇️ Swapping providers becomes a config change, not a rewrite Business logic stays mostly untouched ❇️ You can still use the drivers separately by importing from them directly e.g. ‘@db/mongoose‘ instead of ‘@db/driver‘ in some places Enables you to use different provider if required e.g. during a migration to a new provider 🚧 Caveats The architecture and script supporting this workspace driver architecture are finished, BUT, most of the actual drivers are still in progress: @[Plugin] - @db/driver @[Plugin] - @auth/driver You can already add your own custom drivers if you think this is an interesting approach Have a look at ‘mock.db.ts‘ as an example

Thorr Stevens 7 months ago
Completed
[Portability] - Reusable Features Architecture
Setup and Automations to ensure features are super portable between projects Using monorepo workspace folders as the ideal unit of “copy-pasteable“ work Saves you a lot more time in the long run: ❇️ Stop reinventing the wheel, just drag and drop between projects ❇️ No more annoying patchwork to be done after copy-pasting ❇️ Forces you to think about features in a reusable way (optional) More info: https://fullproduct.dev/docs/project-structure

Thorr Stevens 7 months ago
Completed
[Portability] - Reusable Features Architecture
Setup and Automations to ensure features are super portable between projects Using monorepo workspace folders as the ideal unit of “copy-pasteable“ work Saves you a lot more time in the long run: ❇️ Stop reinventing the wheel, just drag and drop between projects ❇️ No more annoying patchwork to be done after copy-pasting ❇️ Forces you to think about features in a reusable way (optional) More info: https://fullproduct.dev/docs/project-structure

Thorr Stevens 7 months ago
Completed
[Plugin] - Route, Form & API Generators
Expand the list of Turborepo Generators: ❇️ npm run add:route → New universal route & screen + link to data-fetcher? ❇️ npm run add:resolver → Add new API route & GraphQL resolver ❇️ npm run add:form → Add new Form State Hook All linked / linkable to the same resolver (DataBridge or input / output schemas) Interactive terminal UI to pick the destination / schema / resolver / … Single Source of Truth = Nothing gets out of sync, e.g. Recommended Workflow 💡 ❇️ Gen new schema → e.g. ‘/schemas/Post’ ⚙️ Turn schema into DB model → e.g. ‘/models/Posts’ Reuse ‘Post’ schema to create typed DB model ❇️ Gen new resolver → e.g. ‘getPost.resolver.ts‘ Reuse ‘Post’ schema as (DataBridge) output Reuse ‘Posts‘ model in actual business logic Choose option to also generate fetcher fn ❇️ Gen new route → e.g. ‘/posts/[id]‘ → Choose option to pick `getPost()` as initial data provider ❇️ Gen new form → e.g. `useUpdatePost()` Pick `Post` schema option to create form state hook for Updating the ‘Post‘ schema will now automatically update all the rest

Thorr Stevens 7 months ago
Completed
[Plugin] - Route, Form & API Generators
Expand the list of Turborepo Generators: ❇️ npm run add:route → New universal route & screen + link to data-fetcher? ❇️ npm run add:resolver → Add new API route & GraphQL resolver ❇️ npm run add:form → Add new Form State Hook All linked / linkable to the same resolver (DataBridge or input / output schemas) Interactive terminal UI to pick the destination / schema / resolver / … Single Source of Truth = Nothing gets out of sync, e.g. Recommended Workflow 💡 ❇️ Gen new schema → e.g. ‘/schemas/Post’ ⚙️ Turn schema into DB model → e.g. ‘/models/Posts’ Reuse ‘Post’ schema to create typed DB model ❇️ Gen new resolver → e.g. ‘getPost.resolver.ts‘ Reuse ‘Post’ schema as (DataBridge) output Reuse ‘Posts‘ model in actual business logic Choose option to also generate fetcher fn ❇️ Gen new route → e.g. ‘/posts/[id]‘ → Choose option to pick `getPost()` as initial data provider ❇️ Gen new form → e.g. `useUpdatePost()` Pick `Post` schema option to create form state hook for Updating the ‘Post‘ schema will now automatically update all the rest

Thorr Stevens 7 months ago
Completed
[Updates] - Maintain shared git history
The minimal universal base starter, demo and premium starters share git history Meaning you can upgrade and update from each by using git fetch and git pull Will add @[CLI] - @fullproduct/universal-app to attach git history even to: Custom starters you add yourself (e.g. in-house solution) Repos generated from the GitHub UI (e.g. template repo button)

Thorr Stevens 7 months ago
Completed
[Updates] - Maintain shared git history
The minimal universal base starter, demo and premium starters share git history Meaning you can upgrade and update from each by using git fetch and git pull Will add @[CLI] - @fullproduct/universal-app to attach git history even to: Custom starters you add yourself (e.g. in-house solution) Repos generated from the GitHub UI (e.g. template repo button)

Thorr Stevens 7 months ago
[Plugin] - Add @db/driver options (1/4)
Generic database driver Starts with mock / memory implementation (will warn you) Can also be hooked up to a custom implementation (e.g. → REST API) Merge a specific DB plugin to hook it up to an actual Database Solution, e.g. with/db-mongoose → ‘@db/mongoose‘ → (✅ done, but to be published) with/db-supabase → ‘@db/supabase‘ → (📆 planned) with/db-drizzle → ‘@db/drizzle‘ → (📆 planned) with/db-convex → ‘@db/convex‘ → (📆 planned) … Follows the “workspace driver“ pattern: Import DB essentials from @auth/driver (workspace) Create / Import DB models with common interfaces from Zod schemas insert(), insertOne(), insertMany(), … find(), findOne(), findMany(), … update(), updateOne(), updateMany(), … delete(), deleteOne(), deleteMany(), … findOrCreate(), upsertOne(), … … Can config / add / swap actual implementations without changing app code

Thorr Stevens 7 months ago
[Plugin] - Add @db/driver options (1/4)
Generic database driver Starts with mock / memory implementation (will warn you) Can also be hooked up to a custom implementation (e.g. → REST API) Merge a specific DB plugin to hook it up to an actual Database Solution, e.g. with/db-mongoose → ‘@db/mongoose‘ → (✅ done, but to be published) with/db-supabase → ‘@db/supabase‘ → (📆 planned) with/db-drizzle → ‘@db/drizzle‘ → (📆 planned) with/db-convex → ‘@db/convex‘ → (📆 planned) … Follows the “workspace driver“ pattern: Import DB essentials from @auth/driver (workspace) Create / Import DB models with common interfaces from Zod schemas insert(), insertOne(), insertMany(), … find(), findOne(), findMany(), … update(), updateOne(), updateMany(), … delete(), deleteOne(), deleteMany(), … findOrCreate(), upsertOne(), … … Can config / add / swap actual implementations without changing app code

Thorr Stevens 7 months ago
[Plugin] - More options for '@auth/driver' (1/3)
Generic authentication driver Starts off with mock implementation Can also be hooked up to a custom implementation Merge a specific auth plugin to hook it up to an actual universal auth provider, e.g. with/auth-clerk → (✅ done) with/auth-work-os → (📆 planned) with/auth-supabase → (📆 planned) Follows the “workspace driver“ pattern: Import auth essentials from `@auth/driver` (workspace) useAuth(), useUser(), useOrg() , , … Can config / app / swap actual implementations without changing app code

Thorr Stevens 7 months ago
[Plugin] - More options for '@auth/driver' (1/3)
Generic authentication driver Starts off with mock implementation Can also be hooked up to a custom implementation Merge a specific auth plugin to hook it up to an actual universal auth provider, e.g. with/auth-clerk → (✅ done) with/auth-work-os → (📆 planned) with/auth-supabase → (📆 planned) Follows the “workspace driver“ pattern: Import auth essentials from `@auth/driver` (workspace) useAuth(), useUser(), useOrg() , , … Can config / app / swap actual implementations without changing app code

Thorr Stevens 7 months ago
Completed
[CLI] - npx @fullproduct/universal-app
An official CLI to help you: Create new universal apps from your starters Because who starts new projects from the GitHub UI? Easily install git-based plugin branches and PRs Enables a pick-and-choose stack Sync your repo post-creation to attach the starter’s git history Enables easier updates from the starter through git pull

Thorr Stevens 7 months ago
Completed
[CLI] - npx @fullproduct/universal-app
An official CLI to help you: Create new universal apps from your starters Because who starts new projects from the GitHub UI? Easily install git-based plugin branches and PRs Enables a pick-and-choose stack Sync your repo post-creation to attach the starter’s git history Enables easier updates from the starter through git pull

Thorr Stevens 7 months ago
Completed
[Essentials] - Automated GraphQL API
Automatic GraphQL API → From linking Zod Input / Output schemas to resolver logic Creates ‘schema.graphql’ type & input defs from linked resolver zod schemas Automatically collects and links resolvers to their i/o schemas (👇) Builds an executable schema from them Sets up an `/api/graphql` endpoint using the Executable schema Fetchers automatically build their graphql query string from schemas as well Uses the Zod input & output schemas (DataBridge) as Single Source of Truth Automatically validates inputs → Executes the linkes resolver logic Basically, MOST of the GraphQL benefits without ANY of the hassle ✅ Strictly typed API contract between front-end & back-end ✅ Auto-documented API layer (using zod descriptions, etc.) 🙌 Never manually maintain graphql defs 🙌 Never manually write query definitions 🙌 Nothing can / will ever get out of sync this way More info: https://fullproduct.dev/docs/data-resolvers

Thorr Stevens 7 months ago
Completed
[Essentials] - Automated GraphQL API
Automatic GraphQL API → From linking Zod Input / Output schemas to resolver logic Creates ‘schema.graphql’ type & input defs from linked resolver zod schemas Automatically collects and links resolvers to their i/o schemas (👇) Builds an executable schema from them Sets up an `/api/graphql` endpoint using the Executable schema Fetchers automatically build their graphql query string from schemas as well Uses the Zod input & output schemas (DataBridge) as Single Source of Truth Automatically validates inputs → Executes the linkes resolver logic Basically, MOST of the GraphQL benefits without ANY of the hassle ✅ Strictly typed API contract between front-end & back-end ✅ Auto-documented API layer (using zod descriptions, etc.) 🙌 Never manually maintain graphql defs 🙌 Never manually write query definitions 🙌 Nothing can / will ever get out of sync this way More info: https://fullproduct.dev/docs/data-resolvers

Thorr Stevens 7 months ago
Completed
[Essentials] - Universal React-Query
Fetch data with ’@tanstack/react-query’ on server / browser / mobile createQueryBridge() routeDataFetcher = Fetcher Function to use with react-query routeParamsToQueryKey = Map route params to query key routeParamsToQueryInput = Map route params to fetcher fn inputs fetcherDataToProps = Map the resulting data to props executes the queryBridge fetching steps automatically in each env More info: https://fullproduct.dev/docs/data-fetching

Thorr Stevens 7 months ago
Completed
[Essentials] - Universal React-Query
Fetch data with ’@tanstack/react-query’ on server / browser / mobile createQueryBridge() routeDataFetcher = Fetcher Function to use with react-query routeParamsToQueryKey = Map route params to query key routeParamsToQueryInput = Map route params to fetcher fn inputs fetcherDataToProps = Map the resulting data to props executes the queryBridge fetching steps automatically in each env More info: https://fullproduct.dev/docs/data-fetching

Thorr Stevens 7 months ago
Completed
[Portability] - React Portability Patterns
Allow you to provide custom routers, link components, etc. through context Ensures common reusable components are not tied to a specific framework Meaning you can reuse your components outside of just Expo and Next.js Requires you to add a custom Link / useRouter / etc. in UniversalAppRouters ❇️ More info in this video by Jack Herrington: https://www.youtube.com/watch?v=yi8UCnXPu8U

Thorr Stevens 7 months ago
Completed
[Portability] - React Portability Patterns
Allow you to provide custom routers, link components, etc. through context Ensures common reusable components are not tied to a specific framework Meaning you can reuse your components outside of just Expo and Next.js Requires you to add a custom Link / useRouter / etc. in UniversalAppRouters ❇️ More info in this video by Jack Herrington: https://www.youtube.com/watch?v=yi8UCnXPu8U

Thorr Stevens 7 months ago
Completed
[Plugin] - with/automatic-docs
Adds automatic Nextra MDX docs generation from schemas npm run regenerate:docs Automatics MDX docs for Schemas (if put into a /schemas/ folder OR named .schema.ts) Resolvers (using DataBridges → linking Input & Output schemas to logic) Components (using Prop schemas → getDocumentationProps) Picks up additional developer notes or custom docs Look for {subject}.docs.mdx files If {subject} matches a schema / resolver / component with auto-docs Add the contents of .docs.mdx to the resulting Nextra MDX doc If {subject} is not one of the above, create its own Nextra MDX doc page Also sets the project up with `@app/docs` workspace Includes all the official docs from fullproduct.dev/docs /pages/ dir = Destination for all auto-generated docs ✅ Easy onboardings and handovers ✅ Docs will automatically grow as you build new features

Thorr Stevens 7 months ago
Completed
[Plugin] - with/automatic-docs
Adds automatic Nextra MDX docs generation from schemas npm run regenerate:docs Automatics MDX docs for Schemas (if put into a /schemas/ folder OR named .schema.ts) Resolvers (using DataBridges → linking Input & Output schemas to logic) Components (using Prop schemas → getDocumentationProps) Picks up additional developer notes or custom docs Look for {subject}.docs.mdx files If {subject} matches a schema / resolver / component with auto-docs Add the contents of .docs.mdx to the resulting Nextra MDX doc If {subject} is not one of the above, create its own Nextra MDX doc page Also sets the project up with `@app/docs` workspace Includes all the official docs from fullproduct.dev/docs /pages/ dir = Destination for all auto-generated docs ✅ Easy onboardings and handovers ✅ Docs will automatically grow as you build new features

Thorr Stevens 7 months ago
Completed
[Essentials] - with/turborepo
Adds the `with/turborepo` plugin branch to our universal base starter (mini) Makes Turborepo the default monorepo tool for demo and premium starter Adds preview turborepo generators (and setup) to GREEN stack starters npx turbo gen [generator name]

Thorr Stevens 7 months ago
Completed
[Essentials] - with/turborepo
Adds the `with/turborepo` plugin branch to our universal base starter (mini) Makes Turborepo the default monorepo tool for demo and premium starter Adds preview turborepo generators (and setup) to GREEN stack starters npx turbo gen [generator name]

Thorr Stevens 7 months ago