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"] }