From 0decc55210c9a96dd3a29df9e13a1f307fc5b849 Mon Sep 17 00:00:00 2001
From: Andrei Luca <1881266+iamandrewluca@users.noreply.github.com>
Date: Thu, 18 Jul 2024 09:08:50 +0300
Subject: [PATCH] Move create-keystone-app package inside the monorepo (#9102)
Co-authored-by: Daniel Cousens <413395+dcousens@users.noreply.github.com>
---
packages/create/LICENSE | 21 ++
packages/create/README.md | 10 +
packages/create/cli.js | 2 +
packages/create/package.json | 35 ++
packages/create/src/index.ts | 111 +++++++
packages/create/starter/README.md | 52 +++
packages/create/starter/_gitignore | 4 +
packages/create/starter/auth.ts | 66 ++++
packages/create/starter/keystone.ts | 29 ++
packages/create/starter/package.json | 17 +
packages/create/starter/schema.graphql | 424 +++++++++++++++++++++++++
packages/create/starter/schema.prisma | 38 +++
packages/create/starter/schema.ts | 149 +++++++++
packages/create/starter/tsconfig.json | 10 +
pnpm-lock.yaml | 177 +++++++++++
tsconfig.json | 2 +-
16 files changed, 1146 insertions(+), 1 deletion(-)
create mode 100644 packages/create/LICENSE
create mode 100644 packages/create/README.md
create mode 100755 packages/create/cli.js
create mode 100644 packages/create/package.json
create mode 100644 packages/create/src/index.ts
create mode 100644 packages/create/starter/README.md
create mode 100644 packages/create/starter/_gitignore
create mode 100644 packages/create/starter/auth.ts
create mode 100644 packages/create/starter/keystone.ts
create mode 100644 packages/create/starter/package.json
create mode 100644 packages/create/starter/schema.graphql
create mode 100644 packages/create/starter/schema.prisma
create mode 100644 packages/create/starter/schema.ts
create mode 100644 packages/create/starter/tsconfig.json
diff --git a/packages/create/LICENSE b/packages/create/LICENSE
new file mode 100644
index 00000000000..8f0e5cd3917
--- /dev/null
+++ b/packages/create/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Thinkmill Labs Pty Ltd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/create/README.md b/packages/create/README.md
new file mode 100644
index 00000000000..22485528341
--- /dev/null
+++ b/packages/create/README.md
@@ -0,0 +1,10 @@
+# create-keystone-app
+
+
+
Keystone helps you build faster and scale further than any other CMS or App Framework. Describe your schema, and get a powerful GraphQL API & beautiful Management UI for your content and data.
+No boilerplate or bootstrapping – just elegant APIs to help you ship the code that matters without sacrificing the flexibility or power of a bespoke back-end.
+
+
+For help with this package join the conversation in [Slack](https://community.keystonejs.com/), or on [GitHub](https://github.com/keystonejs/keystone/).
+
+Visit for docs, and [follow @keystonejs on Twitter](https://twitter.com/keystonejs) for the latest updates.
diff --git a/packages/create/cli.js b/packages/create/cli.js
new file mode 100755
index 00000000000..cb2feef55b7
--- /dev/null
+++ b/packages/create/cli.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+import './dist/create-keystone-app.esm.js'
diff --git a/packages/create/package.json b/packages/create/package.json
new file mode 100644
index 00000000000..732ad45e3ea
--- /dev/null
+++ b/packages/create/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "create-keystone-app",
+ "version": "9.0.1",
+ "license": "MIT",
+ "type": "module",
+ "main": "dist/create-keystone-app.cjs.js",
+ "module": "dist/create-keystone-app.esm.js",
+ "repository": "https://github.com/keystonejs/keystone/tree/main/packages/create",
+ "bin": "./cli.js",
+ "exports": {
+ ".": {
+ "module": "./dist/create-keystone-app.esm.js",
+ "default": "./dist/create-keystone-app.cjs.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "preconstruct": {
+ "entrypoints": [
+ "index.ts"
+ ]
+ },
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "enquirer": "^2.4.1",
+ "execa": "^5.1.1",
+ "meow": "^9.0.0",
+ "ora": "^8.0.1",
+ "package-json": "^10.0.0"
+ },
+ "files": [
+ "dist",
+ "starter",
+ "cli.js"
+ ]
+}
diff --git a/packages/create/src/index.ts b/packages/create/src/index.ts
new file mode 100644
index 00000000000..15457feab44
--- /dev/null
+++ b/packages/create/src/index.ts
@@ -0,0 +1,111 @@
+import fs from 'node:fs/promises'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+import c from 'chalk'
+import enquirer from 'enquirer'
+import execa from 'execa'
+import getPackageJson from 'package-json'
+import meow from 'meow'
+import ora from 'ora'
+
+import thisPackage from '../package.json'
+
+async function checkVersion () {
+ const { version: upstream } = await getPackageJson('create-keystone-app')
+ if (upstream === thisPackage.version) return
+
+ console.error(`⚠️ You're running an old version of create-keystone-app, please update to ${upstream}`)
+}
+
+class UserError extends Error {}
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url))
+const starterDir = path.normalize(`${__dirname}/../starter`)
+
+const cli = meow(`
+Usage
+ $ create-keystone-app [directory]
+`)
+
+async function normalizeArgs () {
+ let directory = cli.input[0]
+ if (!directory) {
+ ({ directory } = await enquirer.prompt({
+ type: 'input',
+ name: 'directory',
+ message: 'What directory should create-keystone-app generate your app into?',
+ validate: (x) => !!x,
+ }))
+ process.stdout.write('\n')
+ }
+
+ return {
+ directory: path.resolve(directory),
+ }
+}
+
+(async () => {
+ process.stdout.write('\n')
+ console.log(`✨ You're about to generate a project using ${c.bold('Keystone 6')} packages.`)
+
+ await checkVersion()
+ const normalizedArgs = await normalizeArgs()
+ const nextCwd = normalizedArgs.directory
+
+ await fs.mkdir(nextCwd)
+ await Promise.all([
+ '_gitignore',
+ 'schema.ts',
+ 'package.json',
+ 'tsconfig.json',
+ 'schema.graphql',
+ 'schema.prisma',
+ 'keystone.ts',
+ 'auth.ts',
+ 'README.md',
+ ].map((filename) =>
+ fs.copyFile(
+ path.join(starterDir, filename),
+ path.join(normalizedArgs.directory, filename.replace(/^_/, '.'))
+ )
+ ))
+
+ const [packageManager] = process.env.npm_config_user_agent?.split('/', 1) ?? ['npm']
+ const spinner = ora(`Installing dependencies with ${packageManager}. This may take a few minutes.`).start()
+ try {
+ await execa(packageManager, ['install'], { cwd: nextCwd })
+ spinner.succeed(`Installed dependencies with ${packageManager}.`)
+ } catch (err) {
+ spinner.fail(`Failed to install with ${packageManager}.`)
+ throw err
+ }
+
+ const relativeProjectDir = path.relative(process.cwd(), normalizedArgs.directory)
+ process.stdout.write('\n')
+ console.log(`🎉 Keystone created a starter project in: ${c.bold(relativeProjectDir)}
+
+ ${c.bold('To launch your app, run:')}
+
+ - cd ${relativeProjectDir}
+ - ${packageManager} run dev
+
+ ${c.bold('Next steps:')}
+
+ - Read ${c.bold(
+ `${relativeProjectDir}${path.sep}README.md`
+ )} for additional getting started details.
+ - Edit ${c.bold(
+ `${relativeProjectDir}${path.sep}keystone.ts`
+ )} to customize your app.
+ - Star Keystone on GitHub (https://github.com/keystonejs/keystone)
+ )}
+`)
+})().catch((err) => {
+ if (err instanceof UserError) {
+ console.error(err.message)
+ } else {
+ console.error(err)
+ }
+ process.exit(1)
+})
diff --git a/packages/create/starter/README.md b/packages/create/starter/README.md
new file mode 100644
index 00000000000..9d75dd2f3ac
--- /dev/null
+++ b/packages/create/starter/README.md
@@ -0,0 +1,52 @@
+# Keystone Project Starter
+
+Welcome to Keystone!
+
+Run
+
+```
+yarn dev
+```
+
+To view the config for your new app, look at [./keystone.ts](./keystone.ts)
+
+This project starter is designed to give you a sense of the power Keystone can offer you, and show off some of its main features. It's also a pretty simple setup if you want to build out from it.
+
+We recommend you use this alongside our [getting started walkthrough](https://keystonejs.com/docs/walkthroughs/getting-started-with-create-keystone-app) which will walk you through what you get as part of this starter.
+
+If you want an overview of all the features Keystone offers, check out our [features](https://keystonejs.com/why-keystone#features) page.
+
+## Some Quick Notes On Getting Started
+
+### Changing the database
+
+We've set you up with an [SQLite database](https://keystonejs.com/docs/apis/config#sqlite) for ease-of-use. If you're wanting to use PostgreSQL, you can!
+
+Just change the `db` property on line 16 of the Keystone file [./keystone.ts](./keystone.ts) to
+
+```typescript
+db: {
+ provider: 'postgresql',
+ url: process.env.DATABASE_URL || 'DATABASE_URL_TO_REPLACE',
+}
+```
+
+And provide your database url from PostgreSQL.
+
+For more on database configuration, check out or [DB API Docs](https://keystonejs.com/docs/apis/config#db)
+
+### Auth
+
+We've put auth into its own file to make this humble starter easier to navigate. To explore it without auth turned on, comment out the `isAccessAllowed` on line 21 of the Keystone file [./keystone.ts](./keystone.ts).
+
+For more on auth, check out our [Authentication API Docs](https://keystonejs.com/docs/apis/auth#authentication-api)
+
+### Adding a frontend
+
+As a Headless CMS, Keystone can be used with any frontend that uses GraphQL. It provides a GraphQL endpoint you can write queries against at `/api/graphql` (by default [http://localhost:3000/api/graphql](http://localhost:3000/api/graphql)). At Thinkmill, we tend to use [Next.js](https://nextjs.org/) and [Apollo GraphQL](https://www.apollographql.com/docs/react/get-started/) as our frontend and way to write queries, but if you have your own favourite, feel free to use it.
+
+A walkthrough on how to do this is forthcoming, but in the meantime our [todo example](https://github.com/keystonejs/keystone-react-todo-demo) shows a Keystone set up with a frontend. For a more full example, you can also look at an example app we built for [Prisma Day 2021](https://github.com/keystonejs/prisma-day-2021-workshop)
+
+### Embedding Keystone in a Next.js frontend
+
+While Keystone works as a standalone app, you can embed your Keystone app into a [Next.js](https://nextjs.org/) app. This is quite a different setup to the starter, and we recommend checking out our walkthrough for that [here](https://keystonejs.com/docs/walkthroughs/embedded-mode-with-sqlite-nextjs#how-to-embed-keystone-sq-lite-in-a-next-js-app).
diff --git a/packages/create/starter/_gitignore b/packages/create/starter/_gitignore
new file mode 100644
index 00000000000..d6622384d8b
--- /dev/null
+++ b/packages/create/starter/_gitignore
@@ -0,0 +1,4 @@
+node_modules
+.keystone/
+keystone.db
+*.log
diff --git a/packages/create/starter/auth.ts b/packages/create/starter/auth.ts
new file mode 100644
index 00000000000..fecb62720cd
--- /dev/null
+++ b/packages/create/starter/auth.ts
@@ -0,0 +1,66 @@
+// Welcome to some authentication for Keystone
+//
+// This is using @keystone-6/auth to add the following
+// - A sign-in page for your Admin UI
+// - A cookie-based stateless session strategy
+// - Using a User email as the identifier
+// - 30 day cookie expiration
+//
+// This file does not configure what Users can do, and the default for this starter
+// project is to allow anyone - logged-in or not - to do anything.
+//
+// If you want to prevent random people on the internet from accessing your data,
+// you can find out how by reading https://keystonejs.com/docs/guides/auth-and-access-control
+//
+// If you want to learn more about how our out-of-the-box authentication works, please
+// read https://keystonejs.com/docs/apis/auth#authentication-api
+
+import { randomBytes } from 'node:crypto'
+import { createAuth } from '@keystone-6/auth'
+
+// see https://keystonejs.com/docs/apis/session for the session docs
+import { statelessSessions } from '@keystone-6/core/session'
+
+// for a stateless session, a SESSION_SECRET should always be provided
+// especially in production (statelessSessions will throw if SESSION_SECRET is undefined)
+let sessionSecret = process.env.SESSION_SECRET
+if (!sessionSecret && process.env.NODE_ENV !== 'production') {
+ sessionSecret = randomBytes(32).toString('hex')
+}
+
+// withAuth is a function we can use to wrap our base configuration
+const { withAuth } = createAuth({
+ listKey: 'User',
+ identityField: 'email',
+
+ // this is a GraphQL query fragment for fetching what data will be attached to a context.session
+ // this can be helpful for when you are writing your access control functions
+ // you can find out more at https://keystonejs.com/docs/guides/auth-and-access-control
+ sessionData: 'name createdAt',
+ secretField: 'password',
+
+ // WARNING: remove initFirstItem functionality in production
+ // see https://keystonejs.com/docs/config/auth#init-first-item for more
+ initFirstItem: {
+ // if there are no items in the database, by configuring this field
+ // you are asking the Keystone AdminUI to create a new user
+ // providing inputs for these fields
+ fields: ['name', 'email', 'password'],
+
+ // it uses context.sudo() to do this, which bypasses any access control you might have
+ // you shouldn't use this in production
+ },
+})
+
+// statelessSessions uses cookies for session tracking
+// these cookies have an expiry, in seconds
+// we use an expiry of 30 days for this starter
+const sessionMaxAge = 60 * 60 * 24 * 30
+
+// you can find out more at https://keystonejs.com/docs/apis/session#session-api
+const session = statelessSessions({
+ maxAge: sessionMaxAge,
+ secret: sessionSecret!,
+})
+
+export { withAuth, session }
diff --git a/packages/create/starter/keystone.ts b/packages/create/starter/keystone.ts
new file mode 100644
index 00000000000..2ae9ee1db23
--- /dev/null
+++ b/packages/create/starter/keystone.ts
@@ -0,0 +1,29 @@
+// Welcome to Keystone!
+//
+// This file is what Keystone uses as the entry-point to your headless backend
+//
+// Keystone imports the default export of this file, expecting a Keystone configuration object
+// you can find out more at https://keystonejs.com/docs/apis/config
+
+import { config } from '@keystone-6/core'
+
+// to keep this file tidy, we define our schema in a different file
+import { lists } from './schema'
+
+// authentication is configured separately here too, but you might move this elsewhere
+// when you write your list-level access control functions, as they typically rely on session data
+import { withAuth, session } from './auth'
+
+export default withAuth(
+ config({
+ db: {
+ // we're using sqlite for the fastest startup experience
+ // for more information on what database might be appropriate for you
+ // see https://keystonejs.com/docs/guides/choosing-a-database#title
+ provider: 'sqlite',
+ url: 'file:./keystone.db',
+ },
+ lists,
+ session,
+ })
+)
diff --git a/packages/create/starter/package.json b/packages/create/starter/package.json
new file mode 100644
index 00000000000..88a8c7c3a2a
--- /dev/null
+++ b/packages/create/starter/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "keystone-app",
+ "version": "1.0.3",
+ "private": true,
+ "scripts": {
+ "dev": "keystone dev",
+ "start": "keystone start",
+ "build": "keystone build",
+ "postinstall": "keystone build --no-ui --frozen"
+ },
+ "dependencies": {
+ "@keystone-6/auth": "^8.0.0",
+ "@keystone-6/core": "^6.0.0",
+ "@keystone-6/fields-document": "^9.0.0",
+ "typescript": "^5.5.0"
+ }
+}
diff --git a/packages/create/starter/schema.graphql b/packages/create/starter/schema.graphql
new file mode 100644
index 00000000000..51d80f30050
--- /dev/null
+++ b/packages/create/starter/schema.graphql
@@ -0,0 +1,424 @@
+# This file is automatically generated by Keystone, do not modify it manually.
+# Modify your Keystone config when you want to change this.
+
+type User {
+ id: ID!
+ name: String
+ email: String
+ password: PasswordState
+ posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!]
+ postsCount(where: PostWhereInput! = {}): Int
+ createdAt: DateTime
+}
+
+type PasswordState {
+ isSet: Boolean!
+}
+
+scalar DateTime @specifiedBy(url: "https://datatracker.ietf.org/doc/html/rfc3339#section-5.6")
+
+input UserWhereUniqueInput {
+ id: ID
+ email: String
+}
+
+input UserWhereInput {
+ AND: [UserWhereInput!]
+ OR: [UserWhereInput!]
+ NOT: [UserWhereInput!]
+ id: IDFilter
+ name: StringFilter
+ email: StringFilter
+ posts: PostManyRelationFilter
+ createdAt: DateTimeNullableFilter
+}
+
+input IDFilter {
+ equals: ID
+ in: [ID!]
+ notIn: [ID!]
+ lt: ID
+ lte: ID
+ gt: ID
+ gte: ID
+ not: IDFilter
+}
+
+input StringFilter {
+ equals: String
+ in: [String!]
+ notIn: [String!]
+ lt: String
+ lte: String
+ gt: String
+ gte: String
+ contains: String
+ startsWith: String
+ endsWith: String
+ not: NestedStringFilter
+}
+
+input NestedStringFilter {
+ equals: String
+ in: [String!]
+ notIn: [String!]
+ lt: String
+ lte: String
+ gt: String
+ gte: String
+ contains: String
+ startsWith: String
+ endsWith: String
+ not: NestedStringFilter
+}
+
+input PostManyRelationFilter {
+ every: PostWhereInput
+ some: PostWhereInput
+ none: PostWhereInput
+}
+
+input DateTimeNullableFilter {
+ equals: DateTime
+ in: [DateTime!]
+ notIn: [DateTime!]
+ lt: DateTime
+ lte: DateTime
+ gt: DateTime
+ gte: DateTime
+ not: DateTimeNullableFilter
+}
+
+input UserOrderByInput {
+ id: OrderDirection
+ name: OrderDirection
+ email: OrderDirection
+ createdAt: OrderDirection
+}
+
+enum OrderDirection {
+ asc
+ desc
+}
+
+input UserUpdateInput {
+ name: String
+ email: String
+ password: String
+ posts: PostRelateToManyForUpdateInput
+ createdAt: DateTime
+}
+
+input PostRelateToManyForUpdateInput {
+ disconnect: [PostWhereUniqueInput!]
+ set: [PostWhereUniqueInput!]
+ create: [PostCreateInput!]
+ connect: [PostWhereUniqueInput!]
+}
+
+input UserUpdateArgs {
+ where: UserWhereUniqueInput!
+ data: UserUpdateInput!
+}
+
+input UserCreateInput {
+ name: String
+ email: String
+ password: String
+ posts: PostRelateToManyForCreateInput
+ createdAt: DateTime
+}
+
+input PostRelateToManyForCreateInput {
+ create: [PostCreateInput!]
+ connect: [PostWhereUniqueInput!]
+}
+
+type Post {
+ id: ID!
+ title: String
+ content: Post_content_Document
+ author: User
+ tags(where: TagWhereInput! = {}, orderBy: [TagOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: TagWhereUniqueInput): [Tag!]
+ tagsCount(where: TagWhereInput! = {}): Int
+}
+
+type Post_content_Document {
+ document(hydrateRelationships: Boolean! = false): JSON!
+}
+
+input PostWhereUniqueInput {
+ id: ID
+}
+
+input PostWhereInput {
+ AND: [PostWhereInput!]
+ OR: [PostWhereInput!]
+ NOT: [PostWhereInput!]
+ id: IDFilter
+ title: StringFilter
+ author: UserWhereInput
+ tags: TagManyRelationFilter
+}
+
+input TagManyRelationFilter {
+ every: TagWhereInput
+ some: TagWhereInput
+ none: TagWhereInput
+}
+
+input PostOrderByInput {
+ id: OrderDirection
+ title: OrderDirection
+}
+
+input PostUpdateInput {
+ title: String
+ content: JSON
+ author: UserRelateToOneForUpdateInput
+ tags: TagRelateToManyForUpdateInput
+}
+
+input UserRelateToOneForUpdateInput {
+ create: UserCreateInput
+ connect: UserWhereUniqueInput
+ disconnect: Boolean
+}
+
+input TagRelateToManyForUpdateInput {
+ disconnect: [TagWhereUniqueInput!]
+ set: [TagWhereUniqueInput!]
+ create: [TagCreateInput!]
+ connect: [TagWhereUniqueInput!]
+}
+
+input PostUpdateArgs {
+ where: PostWhereUniqueInput!
+ data: PostUpdateInput!
+}
+
+input PostCreateInput {
+ title: String
+ content: JSON
+ author: UserRelateToOneForCreateInput
+ tags: TagRelateToManyForCreateInput
+}
+
+input UserRelateToOneForCreateInput {
+ create: UserCreateInput
+ connect: UserWhereUniqueInput
+}
+
+input TagRelateToManyForCreateInput {
+ create: [TagCreateInput!]
+ connect: [TagWhereUniqueInput!]
+}
+
+type Tag {
+ id: ID!
+ name: String
+ posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!]
+ postsCount(where: PostWhereInput! = {}): Int
+}
+
+input TagWhereUniqueInput {
+ id: ID
+}
+
+input TagWhereInput {
+ AND: [TagWhereInput!]
+ OR: [TagWhereInput!]
+ NOT: [TagWhereInput!]
+ id: IDFilter
+ name: StringFilter
+ posts: PostManyRelationFilter
+}
+
+input TagOrderByInput {
+ id: OrderDirection
+ name: OrderDirection
+}
+
+input TagUpdateInput {
+ name: String
+ posts: PostRelateToManyForUpdateInput
+}
+
+input TagUpdateArgs {
+ where: TagWhereUniqueInput!
+ data: TagUpdateInput!
+}
+
+input TagCreateInput {
+ name: String
+ posts: PostRelateToManyForCreateInput
+}
+
+"""
+The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
+"""
+scalar JSON @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf")
+
+type Mutation {
+ createUser(data: UserCreateInput!): User
+ createUsers(data: [UserCreateInput!]!): [User]
+ updateUser(where: UserWhereUniqueInput!, data: UserUpdateInput!): User
+ updateUsers(data: [UserUpdateArgs!]!): [User]
+ deleteUser(where: UserWhereUniqueInput!): User
+ deleteUsers(where: [UserWhereUniqueInput!]!): [User]
+ createPost(data: PostCreateInput!): Post
+ createPosts(data: [PostCreateInput!]!): [Post]
+ updatePost(where: PostWhereUniqueInput!, data: PostUpdateInput!): Post
+ updatePosts(data: [PostUpdateArgs!]!): [Post]
+ deletePost(where: PostWhereUniqueInput!): Post
+ deletePosts(where: [PostWhereUniqueInput!]!): [Post]
+ createTag(data: TagCreateInput!): Tag
+ createTags(data: [TagCreateInput!]!): [Tag]
+ updateTag(where: TagWhereUniqueInput!, data: TagUpdateInput!): Tag
+ updateTags(data: [TagUpdateArgs!]!): [Tag]
+ deleteTag(where: TagWhereUniqueInput!): Tag
+ deleteTags(where: [TagWhereUniqueInput!]!): [Tag]
+ endSession: Boolean!
+ authenticateUserWithPassword(email: String!, password: String!): UserAuthenticationWithPasswordResult
+ createInitialUser(data: CreateInitialUserInput!): UserAuthenticationWithPasswordSuccess!
+}
+
+union UserAuthenticationWithPasswordResult = UserAuthenticationWithPasswordSuccess | UserAuthenticationWithPasswordFailure
+
+type UserAuthenticationWithPasswordSuccess {
+ sessionToken: String!
+ item: User!
+}
+
+type UserAuthenticationWithPasswordFailure {
+ message: String!
+}
+
+input CreateInitialUserInput {
+ name: String
+ email: String
+ password: String
+}
+
+type Query {
+ users(where: UserWhereInput! = {}, orderBy: [UserOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: UserWhereUniqueInput): [User!]
+ user(where: UserWhereUniqueInput!): User
+ usersCount(where: UserWhereInput! = {}): Int
+ posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!]
+ post(where: PostWhereUniqueInput!): Post
+ postsCount(where: PostWhereInput! = {}): Int
+ tags(where: TagWhereInput! = {}, orderBy: [TagOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: TagWhereUniqueInput): [Tag!]
+ tag(where: TagWhereUniqueInput!): Tag
+ tagsCount(where: TagWhereInput! = {}): Int
+ keystone: KeystoneMeta!
+ authenticatedItem: AuthenticatedItem
+}
+
+union AuthenticatedItem = User
+
+type KeystoneMeta {
+ adminMeta: KeystoneAdminMeta!
+}
+
+type KeystoneAdminMeta {
+ lists: [KeystoneAdminUIListMeta!]!
+ list(key: String!): KeystoneAdminUIListMeta
+}
+
+type KeystoneAdminUIListMeta {
+ key: String!
+ itemQueryName: String!
+ listQueryName: String!
+ hideCreate: Boolean!
+ hideDelete: Boolean!
+ path: String!
+ label: String!
+ singular: String!
+ plural: String!
+ description: String
+ initialColumns: [String!]!
+ pageSize: Int!
+ labelField: String!
+ fields: [KeystoneAdminUIFieldMeta!]!
+ groups: [KeystoneAdminUIFieldGroupMeta!]!
+ initialSort: KeystoneAdminUISort
+ isHidden: Boolean!
+ isSingleton: Boolean!
+}
+
+type KeystoneAdminUIFieldMeta {
+ path: String!
+ label: String!
+ description: String
+ isOrderable: Boolean!
+ isFilterable: Boolean!
+ isNonNull: [KeystoneAdminUIFieldMetaIsNonNull!]
+ fieldMeta: JSON
+ viewsIndex: Int!
+ customViewsIndex: Int
+ createView: KeystoneAdminUIFieldMetaCreateView!
+ listView: KeystoneAdminUIFieldMetaListView!
+ itemView(id: ID): KeystoneAdminUIFieldMetaItemView
+ search: QueryMode
+}
+
+enum KeystoneAdminUIFieldMetaIsNonNull {
+ read
+ create
+ update
+}
+
+type KeystoneAdminUIFieldMetaCreateView {
+ fieldMode: KeystoneAdminUIFieldMetaCreateViewFieldMode!
+}
+
+enum KeystoneAdminUIFieldMetaCreateViewFieldMode {
+ edit
+ hidden
+}
+
+type KeystoneAdminUIFieldMetaListView {
+ fieldMode: KeystoneAdminUIFieldMetaListViewFieldMode!
+}
+
+enum KeystoneAdminUIFieldMetaListViewFieldMode {
+ read
+ hidden
+}
+
+type KeystoneAdminUIFieldMetaItemView {
+ fieldMode: KeystoneAdminUIFieldMetaItemViewFieldMode
+ fieldPosition: KeystoneAdminUIFieldMetaItemViewFieldPosition
+}
+
+enum KeystoneAdminUIFieldMetaItemViewFieldMode {
+ edit
+ read
+ hidden
+}
+
+enum KeystoneAdminUIFieldMetaItemViewFieldPosition {
+ form
+ sidebar
+}
+
+enum QueryMode {
+ default
+ insensitive
+}
+
+type KeystoneAdminUIFieldGroupMeta {
+ label: String!
+ description: String
+ fields: [KeystoneAdminUIFieldMeta!]!
+}
+
+type KeystoneAdminUISort {
+ field: String!
+ direction: KeystoneAdminUISortDirection!
+}
+
+enum KeystoneAdminUISortDirection {
+ ASC
+ DESC
+}
diff --git a/packages/create/starter/schema.prisma b/packages/create/starter/schema.prisma
new file mode 100644
index 00000000000..255dba6ff31
--- /dev/null
+++ b/packages/create/starter/schema.prisma
@@ -0,0 +1,38 @@
+// This file is automatically generated by Keystone, do not modify it manually.
+// Modify your Keystone config when you want to change this.
+
+datasource sqlite {
+ url = env("DATABASE_URL")
+ shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
+ provider = "sqlite"
+}
+
+generator client {
+ provider = "prisma-client-js"
+}
+
+model User {
+ id String @id @default(cuid())
+ name String @default("")
+ email String @unique @default("")
+ password String
+ posts Post[] @relation("Post_author")
+ createdAt DateTime? @default(now())
+}
+
+model Post {
+ id String @id @default(cuid())
+ title String @default("")
+ content String @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]")
+ author User? @relation("Post_author", fields: [authorId], references: [id])
+ authorId String? @map("author")
+ tags Tag[] @relation("Post_tags")
+
+ @@index([authorId])
+}
+
+model Tag {
+ id String @id @default(cuid())
+ name String @default("")
+ posts Post[] @relation("Post_tags")
+}
diff --git a/packages/create/starter/schema.ts b/packages/create/starter/schema.ts
new file mode 100644
index 00000000000..4fecd920a49
--- /dev/null
+++ b/packages/create/starter/schema.ts
@@ -0,0 +1,149 @@
+// Welcome to your schema
+// Schema driven development is Keystone's modus operandi
+//
+// This file is where we define the lists, fields and hooks for our data.
+// If you want to learn more about how lists are configured, please read
+// - https://keystonejs.com/docs/config/lists
+
+import { list } from '@keystone-6/core'
+import { allowAll } from '@keystone-6/core/access'
+
+// see https://keystonejs.com/docs/fields/overview for the full list of fields
+// this is a few common fields for an example
+import {
+ text,
+ relationship,
+ password,
+ timestamp,
+ select,
+} from '@keystone-6/core/fields'
+
+// the document field is a more complicated field, so it has it's own package
+import { document } from '@keystone-6/fields-document'
+// if you want to make your own fields, see https://keystonejs.com/docs/guides/custom-fields
+
+// when using Typescript, you can refine your types to a stricter subset by importing
+// the generated types from '.keystone/types'
+import { type Lists } from '.keystone/types'
+
+export const lists = {
+ User: list({
+ // WARNING
+ // for this starter project, anyone can create, query, update and delete anything
+ // if you want to prevent random people on the internet from accessing your data,
+ // you can find out more at https://keystonejs.com/docs/guides/auth-and-access-control
+ access: allowAll,
+
+ // this is the fields for our User list
+ fields: {
+ // by adding isRequired, we enforce that every User should have a name
+ // if no name is provided, an error will be displayed
+ name: text({ validation: { isRequired: true } }),
+
+ email: text({
+ validation: { isRequired: true },
+ // by adding isIndexed: 'unique', we're saying that no user can have the same
+ // email as another user - this may or may not be a good idea for your project
+ isIndexed: 'unique',
+ }),
+
+ password: password({ validation: { isRequired: true } }),
+
+ // we can use this field to see what Posts this User has authored
+ // more on that in the Post list below
+ posts: relationship({ ref: 'Post.author', many: true }),
+
+ createdAt: timestamp({
+ // this sets the timestamp to Date.now() when the user is first created
+ defaultValue: { kind: 'now' },
+ }),
+ },
+ }),
+
+ Post: list({
+ // WARNING
+ // for this starter project, anyone can create, query, update and delete anything
+ // if you want to prevent random people on the internet from accessing your data,
+ // you can find out more at https://keystonejs.com/docs/guides/auth-and-access-control
+ access: allowAll,
+
+ // this is the fields for our Post list
+ fields: {
+ title: text({ validation: { isRequired: true } }),
+
+ // the document field can be used for making rich editable content
+ // you can find out more at https://keystonejs.com/docs/guides/document-fields
+ content: document({
+ formatting: true,
+ layouts: [
+ [1, 1],
+ [1, 1, 1],
+ [2, 1],
+ [1, 2],
+ [1, 2, 1],
+ ],
+ links: true,
+ dividers: true,
+ }),
+
+ // with this field, you can set a User as the author for a Post
+ author: relationship({
+ // we could have used 'User', but then the relationship would only be 1-way
+ ref: 'User.posts',
+
+ // this is some customisations for changing how this will look in the AdminUI
+ ui: {
+ displayMode: 'cards',
+ cardFields: ['name', 'email'],
+ inlineEdit: { fields: ['name', 'email'] },
+ linkToItem: true,
+ inlineConnect: true,
+ },
+
+ // a Post can only have one author
+ // this is the default, but we show it here for verbosity
+ many: false,
+ }),
+
+ // with this field, you can add some Tags to Posts
+ tags: relationship({
+ // we could have used 'Tag', but then the relationship would only be 1-way
+ ref: 'Tag.posts',
+
+ // a Post can have many Tags, not just one
+ many: true,
+
+ // this is some customisations for changing how this will look in the AdminUI
+ ui: {
+ displayMode: 'cards',
+ cardFields: ['name'],
+ inlineEdit: { fields: ['name'] },
+ linkToItem: true,
+ inlineConnect: true,
+ inlineCreate: { fields: ['name'] },
+ },
+ }),
+ },
+ }),
+
+ // this last list is our Tag list, it only has a name field for now
+ Tag: list({
+ // WARNING
+ // for this starter project, anyone can create, query, update and delete anything
+ // if you want to prevent random people on the internet from accessing your data,
+ // you can find out more at https://keystonejs.com/docs/guides/auth-and-access-control
+ access: allowAll,
+
+ // setting this to isHidden for the user interface prevents this list being visible in the Admin UI
+ ui: {
+ isHidden: true,
+ },
+
+ // this is the fields for our Tag list
+ fields: {
+ name: text(),
+ // this can be helpful to find out all the Posts associated with a Tag
+ posts: relationship({ ref: 'Post.tags', many: true }),
+ },
+ }),
+} satisfies Lists
diff --git a/packages/create/starter/tsconfig.json b/packages/create/starter/tsconfig.json
new file mode 100644
index 00000000000..c54cd916c60
--- /dev/null
+++ b/packages/create/starter/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "commonjs",
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9466687956f..d0504df5fe9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2201,6 +2201,27 @@ importers:
specifier: ^10.0.0
version: 10.0.0
+ packages/create:
+ dependencies:
+ chalk:
+ specifier: ^4.1.2
+ version: 4.1.2
+ enquirer:
+ specifier: ^2.4.1
+ version: 2.4.1
+ execa:
+ specifier: ^5.1.1
+ version: 5.1.1
+ meow:
+ specifier: ^9.0.0
+ version: 9.0.0
+ ora:
+ specifier: ^8.0.1
+ version: 8.0.1
+ package-json:
+ specifier: ^10.0.0
+ version: 10.0.1
+
packages/document-renderer:
devDependencies:
react:
@@ -5024,6 +5045,18 @@ packages:
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ '@pnpm/config.env-replace@1.1.0':
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/network.ca-file@1.0.2':
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/npm-conf@2.2.2':
+ resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==}
+ engines: {node: '>=12'}
+
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
@@ -7346,6 +7379,9 @@ packages:
confbox@0.1.7:
resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
+ config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
constant-case@3.0.4:
resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
@@ -7574,6 +7610,10 @@ packages:
babel-plugin-macros:
optional: true
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
@@ -8271,6 +8311,10 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
+ get-east-asian-width@1.2.0:
+ resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==}
+ engines: {node: '>=18'}
+
get-intrinsic@1.2.4:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
@@ -8369,6 +8413,9 @@ packages:
resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
engines: {node: '>=10.19.0'}
+ graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -8660,6 +8707,9 @@ packages:
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
inline-style-parser@0.1.1:
resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
@@ -8938,6 +8988,10 @@ packages:
resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
engines: {node: '>=12'}
+ is-unicode-supported@2.0.0:
+ resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==}
+ engines: {node: '>=18'}
+
is-upper-case@2.0.2:
resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==}
@@ -9265,6 +9319,10 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
+ ky@1.4.0:
+ resolution: {integrity: sha512-tPhhoGUiEiU/WXR4rt8klIoLdnTtyu+9jVKHd/wauEjYud32jyn63mzKWQweaQrHWxBQtYoVtdcEnYX1LosnFQ==}
+ engines: {node: '>=18'}
+
lazy-require.macro@0.1.0:
resolution: {integrity: sha512-MSksx43fU15VGBNhyWtgCITiMVCkzy4Z59KFTUxsf3vLTxm6RlldTV3/Mud7yi6aIZd6LU/w3xCuIK4o2ClvUg==}
@@ -9369,6 +9427,10 @@ packages:
resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
engines: {node: '>=12'}
+ log-symbols@6.0.0:
+ resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+ engines: {node: '>=18'}
+
loglevel@1.9.1:
resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==}
engines: {node: '>= 0.6.0'}
@@ -10230,6 +10292,10 @@ packages:
resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ ora@8.0.1:
+ resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==}
+ engines: {node: '>=18'}
+
orderedmap@2.1.1:
resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==}
@@ -10299,6 +10365,10 @@ packages:
resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==}
engines: {node: '>= 14'}
+ package-json@10.0.1:
+ resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==}
+ engines: {node: '>=18'}
+
pako@0.2.9:
resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
@@ -10662,6 +10732,9 @@ packages:
prosemirror-view@1.33.8:
resolution: {integrity: sha512-4PhMr/ufz2cdvFgpUAnZfs+0xij3RsFysreeG9V/utpwX7AJtYCDVyuRxzWoMJIEf4C7wVihuBNMPpFLPCiLQw==}
+ proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
@@ -10746,6 +10819,10 @@ packages:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
+ rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+
react-clientside-effect@1.2.6:
resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==}
peerDependencies:
@@ -10912,6 +10989,14 @@ packages:
resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
engines: {node: '>=4'}
+ registry-auth-token@5.0.2:
+ resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
+ engines: {node: '>=14'}
+
+ registry-url@6.0.1:
+ resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
+ engines: {node: '>=12'}
+
regjsparser@0.9.1:
resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
hasBin: true
@@ -11408,6 +11493,10 @@ packages:
resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ stdin-discarder@0.2.2:
+ resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+ engines: {node: '>=18'}
+
stream-browserify@3.0.0:
resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
@@ -11436,6 +11525,10 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
string.prototype.codepointat@0.2.1:
resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==}
@@ -11487,6 +11580,10 @@ packages:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
+ strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+
strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@@ -15674,6 +15771,18 @@ snapshots:
'@pkgr/core@0.1.1': {}
+ '@pnpm/config.env-replace@1.1.0': {}
+
+ '@pnpm/network.ca-file@1.0.2':
+ dependencies:
+ graceful-fs: 4.2.10
+
+ '@pnpm/npm-conf@2.2.2':
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+
'@popperjs/core@2.11.8': {}
'@preconstruct/cli@2.8.7':
@@ -19001,6 +19110,11 @@ snapshots:
confbox@0.1.7: {}
+ config-chain@1.1.13:
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
constant-case@3.0.4:
dependencies:
no-case: 3.0.4
@@ -19227,6 +19341,8 @@ snapshots:
optionalDependencies:
babel-plugin-macros: 3.1.0
+ deep-extend@0.6.0: {}
+
deep-is@0.1.4: {}
deep-object-diff@1.1.9: {}
@@ -20162,6 +20278,8 @@ snapshots:
get-caller-file@2.0.5: {}
+ get-east-asian-width@1.2.0: {}
+
get-intrinsic@1.2.4:
dependencies:
es-errors: 1.3.0
@@ -20288,6 +20406,8 @@ snapshots:
p-cancelable: 2.1.1
responselike: 2.0.1
+ graceful-fs@4.2.10: {}
+
graceful-fs@4.2.11: {}
graphemer@1.4.0: {}
@@ -20637,6 +20757,8 @@ snapshots:
inherits@2.0.4: {}
+ ini@1.3.8: {}
+
inline-style-parser@0.1.1: {}
inquirer@8.2.6:
@@ -20873,6 +20995,8 @@ snapshots:
is-unicode-supported@1.3.0: {}
+ is-unicode-supported@2.0.0: {}
+
is-upper-case@2.0.2:
dependencies:
tslib: 2.4.1
@@ -21431,6 +21555,8 @@ snapshots:
kleur@4.1.5: {}
+ ky@1.4.0: {}
+
lazy-require.macro@0.1.0:
dependencies:
babel-plugin-macros: 2.8.0
@@ -21526,6 +21652,11 @@ snapshots:
chalk: 5.3.0
is-unicode-supported: 1.3.0
+ log-symbols@6.0.0:
+ dependencies:
+ chalk: 5.3.0
+ is-unicode-supported: 1.3.0
+
loglevel@1.9.1: {}
long@4.0.0: {}
@@ -22966,6 +23097,18 @@ snapshots:
strip-ansi: 7.1.0
wcwidth: 1.0.1
+ ora@8.0.1:
+ dependencies:
+ chalk: 5.3.0
+ cli-cursor: 4.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 2.0.0
+ log-symbols: 6.0.0
+ stdin-discarder: 0.2.2
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
orderedmap@2.1.1: {}
os-tmpdir@1.0.2: {}
@@ -23032,6 +23175,13 @@ snapshots:
degenerator: 5.0.1
netmask: 2.0.2
+ package-json@10.0.1:
+ dependencies:
+ ky: 1.4.0
+ registry-auth-token: 5.0.2
+ registry-url: 6.0.1
+ semver: 7.6.3
+
pako@0.2.9: {}
param-case@3.0.4:
@@ -23411,6 +23561,8 @@ snapshots:
prosemirror-state: 1.4.3
prosemirror-transform: 1.9.0
+ proto-list@1.2.4: {}
+
proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
@@ -23494,6 +23646,13 @@ snapshots:
iconv-lite: 0.4.24
unpipe: 1.0.0
+ rc@1.2.8:
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+
react-clientside-effect@1.2.6(react@18.3.1):
dependencies:
'@babel/runtime': 7.24.8
@@ -23707,6 +23866,14 @@ snapshots:
unicode-match-property-ecmascript: 2.0.0
unicode-match-property-value-ecmascript: 2.1.0
+ registry-auth-token@5.0.2:
+ dependencies:
+ '@pnpm/npm-conf': 2.2.2
+
+ registry-url@6.0.1:
+ dependencies:
+ rc: 1.2.8
+
regjsparser@0.9.1:
dependencies:
jsesc: 0.5.0
@@ -24316,6 +24483,8 @@ snapshots:
dependencies:
bl: 5.1.0
+ stdin-discarder@0.2.2: {}
+
stream-browserify@3.0.0:
dependencies:
inherits: 2.0.4
@@ -24346,6 +24515,12 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.0
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.3.0
+ get-east-asian-width: 1.2.0
+ strip-ansi: 7.1.0
+
string.prototype.codepointat@0.2.1: {}
string_decoder@0.10.31: {}
@@ -24387,6 +24562,8 @@ snapshots:
dependencies:
min-indent: 1.0.1
+ strip-json-comments@2.0.1: {}
+
strip-json-comments@3.1.1: {}
strnum@1.0.5: {}
diff --git a/tsconfig.json b/tsconfig.json
index fe43bf9c644..8816c6a701f 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -16,5 +16,5 @@
"target": "esnext"
},
"include": ["**/*"],
- "exclude": ["docs/", "**/node_modules/**/*"]
+ "exclude": ["docs/", "**/node_modules/**/*", "packages/create/starter"]
}