🗑️ Remove keystone stuff
This commit is contained in:
		
							
								
								
									
										4
									
								
								content/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								content/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +0,0 @@ | ||||
| node_modules | ||||
| .keystone/admin | ||||
| keystone.db | ||||
| *.log | ||||
| @@ -1,488 +0,0 @@ | ||||
| "use strict"; | ||||
| var __defProp = Object.defineProperty; | ||||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||||
| var __export = (target, all) => { | ||||
|   for (var name in all) | ||||
|     __defProp(target, name, { get: all[name], enumerable: true }); | ||||
| }; | ||||
| var __copyProps = (to, from, except, desc) => { | ||||
|   if (from && typeof from === "object" || typeof from === "function") { | ||||
|     for (let key of __getOwnPropNames(from)) | ||||
|       if (!__hasOwnProp.call(to, key) && key !== except) | ||||
|         __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||||
|   } | ||||
|   return to; | ||||
| }; | ||||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||||
|  | ||||
| // keystone.ts | ||||
| var keystone_exports = {}; | ||||
| __export(keystone_exports, { | ||||
|   default: () => keystone_default | ||||
| }); | ||||
| module.exports = __toCommonJS(keystone_exports); | ||||
| var import_core8 = require("@keystone-6/core"); | ||||
|  | ||||
| // schema/index.ts | ||||
| var import_core7 = require("@keystone-6/core"); | ||||
| var import_fields7 = require("@keystone-6/core/fields"); | ||||
|  | ||||
| // limit.ts | ||||
| var isUser = ({ session: session2 }) => session2?.data.id != null; | ||||
| var allowUser = { | ||||
|   operation: { | ||||
|     create: isUser, | ||||
|     update: isUser, | ||||
|     delete: isUser | ||||
|   } | ||||
| }; | ||||
| var isEditor = ({ session: session2 }) => session2?.data.isEditor || session2?.data.isAdmin; | ||||
| var allowEditor = { | ||||
|   operation: { | ||||
|     create: isEditor, | ||||
|     update: isEditor, | ||||
|     delete: isEditor | ||||
|   } | ||||
| }; | ||||
| var isAdmin = ({ session: session2 }) => session2?.data.isAdmin; | ||||
| var allowAdmin = { | ||||
|   operation: { | ||||
|     create: isAdmin, | ||||
|     update: isAdmin, | ||||
|     delete: isAdmin | ||||
|   } | ||||
| }; | ||||
|  | ||||
| // schema/assets.ts | ||||
| var import_fields = require("@keystone-6/core/fields"); | ||||
| var import_core = require("@keystone-6/core"); | ||||
| var Image = (0, import_core.list)({ | ||||
|   access: allowEditor, | ||||
|   fields: { | ||||
|     caption: (0, import_fields.text)(), | ||||
|     image: (0, import_fields.image)({ storage: "localImages" }), | ||||
|     createdAt: (0, import_fields.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
| }); | ||||
| var Asset = (0, import_core.list)({ | ||||
|   access: allowEditor, | ||||
|   fields: { | ||||
|     caption: (0, import_fields.text)(), | ||||
|     url: (0, import_fields.text)({ validation: { isRequired: true } }), | ||||
|     type: (0, import_fields.select)({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Video", value: "video" }, | ||||
|         { label: "Audio", value: "audio" } | ||||
|       ], | ||||
|       defaultValue: "video", | ||||
|       db: { map: "media_type" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" } | ||||
|     }), | ||||
|     createdAt: (0, import_fields.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
| }); | ||||
|  | ||||
| // schema/moments.ts | ||||
| var import_core2 = require("@keystone-6/core"); | ||||
| var import_fields_document = require("@keystone-6/fields-document"); | ||||
| var import_fields2 = require("@keystone-6/core/fields"); | ||||
| var Moment = (0, import_core2.list)({ | ||||
|   access: allowUser, | ||||
|   fields: { | ||||
|     title: (0, import_fields2.text)({ validation: { isRequired: true } }), | ||||
|     images: (0, import_fields2.relationship)({ ref: "Image", many: true }), | ||||
|     content: (0, import_fields_document.document)({ | ||||
|       formatting: true, | ||||
|       layouts: [ | ||||
|         [1, 1], | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1] | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true | ||||
|     }), | ||||
|     author: (0, import_fields2.relationship)({ | ||||
|       ref: "User.moments", | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true | ||||
|       }, | ||||
|       many: false | ||||
|     }), | ||||
|     categories: (0, import_fields2.relationship)({ | ||||
|       ref: "Category.moments", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|     }), | ||||
|     tags: (0, import_fields2.relationship)({ | ||||
|       ref: "Tag.moments", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|     }), | ||||
|     createdAt: (0, import_fields2.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
| }); | ||||
|  | ||||
| // schema/categories.ts | ||||
| var import_core3 = require("@keystone-6/core"); | ||||
| var import_fields3 = require("@keystone-6/core/fields"); | ||||
| var Category = (0, import_core3.list)({ | ||||
|   access: allowEditor, | ||||
|   fields: { | ||||
|     slug: (0, import_fields3.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|     }), | ||||
|     name: (0, import_fields3.text)(), | ||||
|     posts: (0, import_fields3.relationship)({ ref: "Post.categories", many: true }), | ||||
|     moments: (0, import_fields3.relationship)({ ref: "Moment.categories", many: true }), | ||||
|     events: (0, import_fields3.relationship)({ ref: "Event.categories", many: true }) | ||||
|   } | ||||
| }); | ||||
| var Tag = (0, import_core3.list)({ | ||||
|   access: allowEditor, | ||||
|   fields: { | ||||
|     slug: (0, import_fields3.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|     }), | ||||
|     name: (0, import_fields3.text)(), | ||||
|     posts: (0, import_fields3.relationship)({ ref: "Post.tags", many: true }), | ||||
|     moments: (0, import_fields3.relationship)({ ref: "Moment.tags", many: true }), | ||||
|     events: (0, import_fields3.relationship)({ ref: "Event.tags", many: true }) | ||||
|   } | ||||
| }); | ||||
|  | ||||
| // schema/projects.ts | ||||
| var import_fields4 = require("@keystone-6/core/fields"); | ||||
| var import_core4 = require("@keystone-6/core"); | ||||
| var Project = (0, import_core4.list)({ | ||||
|   access: { | ||||
|     ...allowAdmin, | ||||
|     filter: { | ||||
|       query: ({ session: session2 }) => { | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) | ||||
|           return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   fields: { | ||||
|     icon: (0, import_fields4.relationship)({ ref: "Image" }), | ||||
|     name: (0, import_fields4.text)({ validation: { isRequired: true } }), | ||||
|     description: (0, import_fields4.text)(), | ||||
|     link: (0, import_fields4.text)(), | ||||
|     isPublished: (0, import_fields4.checkbox)(), | ||||
|     status: (0, import_fields4.select)({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Pending", value: "pending" }, | ||||
|         { label: "Constructing", value: "constructing" }, | ||||
|         { label: "Published", value: "published" }, | ||||
|         { label: "Abandoned", value: "abandoned" } | ||||
|       ], | ||||
|       defaultValue: "pending", | ||||
|       db: { map: "project_status" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" } | ||||
|     }), | ||||
|     post: (0, import_fields4.relationship)({ ref: "Post" }), | ||||
|     createdAt: (0, import_fields4.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
| }); | ||||
|  | ||||
| // schema/posts.ts | ||||
| var import_fields5 = require("@keystone-6/core/fields"); | ||||
| var import_fields_document2 = require("@keystone-6/fields-document"); | ||||
| var import_core5 = require("@keystone-6/core"); | ||||
| var Post = (0, import_core5.list)({ | ||||
|   access: { | ||||
|     ...allowEditor, | ||||
|     filter: { | ||||
|       query: ({ session: session2 }) => { | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) | ||||
|           return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   fields: { | ||||
|     slug: (0, import_fields5.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|     }), | ||||
|     title: (0, import_fields5.text)({ validation: { isRequired: true } }), | ||||
|     cover: (0, import_fields5.relationship)({ ref: "Image" }), | ||||
|     description: (0, import_fields5.text)(), | ||||
|     assets: (0, import_fields5.relationship)({ ref: "Asset", many: true }), | ||||
|     images: (0, import_fields5.relationship)({ ref: "Image", many: true }), | ||||
|     content: (0, import_fields_document2.document)({ | ||||
|       formatting: true, | ||||
|       layouts: [ | ||||
|         [1, 1], | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1] | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true | ||||
|     }), | ||||
|     type: (0, import_fields5.select)({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Article", value: "article" }, | ||||
|         { label: "Podcast", value: "podcast" } | ||||
|       ], | ||||
|       defaultValue: "article", | ||||
|       db: { map: "post_type" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" } | ||||
|     }), | ||||
|     isPublished: (0, import_fields5.checkbox)(), | ||||
|     author: (0, import_fields5.relationship)({ | ||||
|       ref: "User.posts", | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true | ||||
|       }, | ||||
|       many: false | ||||
|     }), | ||||
|     categories: (0, import_fields5.relationship)({ | ||||
|       ref: "Category.posts", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|     }), | ||||
|     tags: (0, import_fields5.relationship)({ | ||||
|       ref: "Tag.posts", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|     }), | ||||
|     createdAt: (0, import_fields5.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
| }); | ||||
|  | ||||
| // schema/events.ts | ||||
| var import_fields6 = require("@keystone-6/core/fields"); | ||||
| var import_fields_document3 = require("@keystone-6/fields-document"); | ||||
| var import_core6 = require("@keystone-6/core"); | ||||
| var Event = (0, import_core6.list)({ | ||||
|   access: { | ||||
|     ...allowEditor, | ||||
|     filter: { | ||||
|       query: ({ session: session2 }) => { | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) | ||||
|           return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   fields: { | ||||
|     slug: (0, import_fields6.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|     }), | ||||
|     title: (0, import_fields6.text)({ validation: { isRequired: true } }), | ||||
|     description: (0, import_fields6.text)(), | ||||
|     content: (0, import_fields_document3.document)({ | ||||
|       formatting: true, | ||||
|       layouts: [ | ||||
|         [1, 1], | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1] | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true | ||||
|     }), | ||||
|     isPublished: (0, import_fields6.checkbox)(), | ||||
|     isHistory: (0, import_fields6.checkbox)(), | ||||
|     author: (0, import_fields6.relationship)({ | ||||
|       ref: "User.events", | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true | ||||
|       }, | ||||
|       many: false | ||||
|     }), | ||||
|     categories: (0, import_fields6.relationship)({ | ||||
|       ref: "Category.events", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|     }), | ||||
|     tags: (0, import_fields6.relationship)({ | ||||
|       ref: "Tag.events", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|     }), | ||||
|     createdAt: (0, import_fields6.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
| }); | ||||
|  | ||||
| // schema/index.ts | ||||
| var lists = { | ||||
|   User: (0, import_core7.list)({ | ||||
|     access: allowAdmin, | ||||
|     fields: { | ||||
|       name: (0, import_fields7.text)({ validation: { isRequired: true } }), | ||||
|       email: (0, import_fields7.text)({ | ||||
|         validation: { isRequired: true }, | ||||
|         isIndexed: "unique" | ||||
|       }), | ||||
|       password: (0, import_fields7.password)({ validation: { isRequired: true } }), | ||||
|       posts: (0, import_fields7.relationship)({ ref: "Post.author", many: true }), | ||||
|       moments: (0, import_fields7.relationship)({ ref: "Moment.author", many: true }), | ||||
|       events: (0, import_fields7.relationship)({ ref: "Event.author", many: true }), | ||||
|       isAdmin: (0, import_fields7.checkbox)(), | ||||
|       isEditor: (0, import_fields7.checkbox)(), | ||||
|       createdAt: (0, import_fields7.timestamp)({ | ||||
|         defaultValue: { kind: "now" } | ||||
|       }) | ||||
|     } | ||||
|   }), | ||||
|   Image, | ||||
|   Asset, | ||||
|   Post, | ||||
|   Moment, | ||||
|   Project, | ||||
|   Event, | ||||
|   Category, | ||||
|   Tag | ||||
| }; | ||||
|  | ||||
| // auth.ts | ||||
| var import_crypto = require("crypto"); | ||||
| var import_auth = require("@keystone-6/auth"); | ||||
| var import_session = require("@keystone-6/core/session"); | ||||
| var sessionSecret = process.env.SESSION_SECRET; | ||||
| if (!sessionSecret && process.env.NODE_ENV !== "production") { | ||||
|   sessionSecret = (0, import_crypto.randomBytes)(32).toString("hex"); | ||||
| } | ||||
| var { withAuth } = (0, import_auth.createAuth)({ | ||||
|   listKey: "User", | ||||
|   identityField: "email", | ||||
|   sessionData: "id name createdAt isAdmin isEditor", | ||||
|   secretField: "password", | ||||
|   initFirstItem: { | ||||
|     fields: ["name", "email", "password", "isAdmin"] | ||||
|   } | ||||
| }); | ||||
| var sessionMaxAge = 60 * 60 * 24 * 30; | ||||
| var session = (0, import_session.statelessSessions)({ | ||||
|   maxAge: sessionMaxAge, | ||||
|   secret: sessionSecret | ||||
| }); | ||||
|  | ||||
| // keystone.ts | ||||
| var baseUrl = process.env.BASE_URL ?? "http://localhost:3000"; | ||||
| var databaseUrl = process.env.DATABASE_URL ?? "postgresql://postgres:password@127.0.0.1:5432/capital"; | ||||
| var databaseProvider = process.env.DATABASE_PROVIDER ?? "postgresql"; | ||||
| var keystone_default = withAuth( | ||||
|   (0, import_core8.config)({ | ||||
|     ui: { | ||||
|       basePath: "/cms" | ||||
|     }, | ||||
|     db: { | ||||
|       provider: databaseProvider, | ||||
|       url: databaseUrl | ||||
|     }, | ||||
|     server: { | ||||
|       cors: { | ||||
|         origin: "*", | ||||
|         methods: "GET,HEAD,PUT,PATCH,POST,DELETE" | ||||
|       } | ||||
|     }, | ||||
|     storage: { | ||||
|       localImages: { | ||||
|         kind: "local", | ||||
|         type: "image", | ||||
|         generateUrl: (path) => `${baseUrl}/images${path}`, | ||||
|         serverRoute: { | ||||
|           path: "/images" | ||||
|         }, | ||||
|         storagePath: "public/images" | ||||
|       } | ||||
|     }, | ||||
|     lists, | ||||
|     session | ||||
|   }) | ||||
| ); | ||||
| //# sourceMappingURL=config.js.map | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,40 +0,0 @@ | ||||
| import { randomBytes } from "crypto"; | ||||
| import { createAuth } from "@keystone-6/auth"; | ||||
|  | ||||
| import { statelessSessions } from "@keystone-6/core/session"; | ||||
|  | ||||
| let sessionSecret = process.env.SESSION_SECRET; | ||||
| if (!sessionSecret && process.env.NODE_ENV !== "production") { | ||||
|   sessionSecret = randomBytes(32).toString("hex"); | ||||
| } | ||||
|  | ||||
| export type Session = { | ||||
|   data: { | ||||
|     id: string; | ||||
|     name: string; | ||||
|     isAdmin: boolean; | ||||
|     isEditor: boolean; | ||||
|     createdAt: Date; | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| const { withAuth } = createAuth({ | ||||
|   listKey: "User", | ||||
|   identityField: "email", | ||||
|  | ||||
|   sessionData: "id name createdAt isAdmin isEditor", | ||||
|   secretField: "password", | ||||
|  | ||||
|   initFirstItem: { | ||||
|     fields: ["name", "email", "password", "isAdmin"], | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| const sessionMaxAge = 60 * 60 * 24 * 30; | ||||
|  | ||||
| const session = statelessSessions({ | ||||
|   maxAge: sessionMaxAge, | ||||
|   secret: sessionSecret!, | ||||
| }); | ||||
|  | ||||
| export { withAuth, session }; | ||||
| @@ -1,6 +0,0 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| cd /app; | ||||
| npm install; | ||||
| npx prisma db push; | ||||
| npm run start; | ||||
| @@ -1,41 +0,0 @@ | ||||
| import { config } from "@keystone-6/core"; | ||||
|  | ||||
| import { lists } from "./schema"; | ||||
|  | ||||
| import { withAuth, session } from "./auth"; | ||||
| import { DatabaseProvider } from "@keystone-6/core/types"; | ||||
|  | ||||
| const baseUrl = process.env.BASE_URL ?? "http://localhost:3000"; | ||||
| const databaseUrl = process.env.DATABASE_URL ?? "postgresql://postgres:password@127.0.0.1:5432/capital"; | ||||
| const databaseProvider = process.env.DATABASE_PROVIDER ?? "postgresql"; | ||||
|  | ||||
| export default withAuth( | ||||
|   config({ | ||||
|     ui: { | ||||
|       basePath: "/cms", | ||||
|     }, | ||||
|     db: { | ||||
|       provider: databaseProvider as DatabaseProvider, | ||||
|       url: databaseUrl, | ||||
|     }, | ||||
|     server: { | ||||
|       cors: { | ||||
|         origin: "*", | ||||
|         methods: "GET,HEAD,PUT,PATCH,POST,DELETE", | ||||
|       }, | ||||
|     }, | ||||
|     storage: { | ||||
|       localImages: { | ||||
|         kind: "local", | ||||
|         type: "image", | ||||
|         generateUrl: (path) => `${baseUrl}/images${path}`, | ||||
|         serverRoute: { | ||||
|           path: "/images", | ||||
|         }, | ||||
|         storagePath: "public/images", | ||||
|       }, | ||||
|     }, | ||||
|     lists, | ||||
|     session, | ||||
|   }), | ||||
| ); | ||||
| @@ -1,28 +0,0 @@ | ||||
| const isUser = ({ session }: { session: any }) => session?.data.id != null; | ||||
| const allowUser: any = { | ||||
|   operation: { | ||||
|     create: isUser, | ||||
|     update: isUser, | ||||
|     delete: isUser, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| const isEditor = ({ session }: { session: any }) => session?.data.isEditor || session?.data.isAdmin; | ||||
| const allowEditor: any = { | ||||
|   operation: { | ||||
|     create: isEditor, | ||||
|     update: isEditor, | ||||
|     delete: isEditor, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| const isAdmin = ({ session }: { session: any }) => session?.data.isAdmin; | ||||
| const allowAdmin: any = { | ||||
|   operation: { | ||||
|     create: isAdmin, | ||||
|     update: isAdmin, | ||||
|     delete: isAdmin, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| export { isUser, isAdmin, isEditor, allowUser, allowAdmin, allowEditor }; | ||||
							
								
								
									
										11019
									
								
								content/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										11019
									
								
								content/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,17 +0,0 @@ | ||||
| { | ||||
|   "name": "keystone-app", | ||||
|   "version": "1.0.2", | ||||
|   "private": true, | ||||
|   "scripts": { | ||||
|     "dev": "keystone dev", | ||||
|     "start": "keystone start", | ||||
|     "build": "keystone build", | ||||
|     "postinstall": "keystone build --no-ui --frozen" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@keystone-6/auth": "^7.0.0", | ||||
|     "@keystone-6/core": "^5.0.0", | ||||
|     "@keystone-6/fields-document": "^7.0.0", | ||||
|     "typescript": "^4.9.5" | ||||
|   } | ||||
| } | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.3 MiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.3 MiB | 
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,155 +0,0 @@ | ||||
| // This file is automatically generated by Keystone, do not modify it manually. | ||||
| // Modify your Keystone config when you want to change this. | ||||
|  | ||||
| datasource postgresql { | ||||
|   url               = env("DATABASE_URL") | ||||
|   shadowDatabaseUrl = env("SHADOW_DATABASE_URL") | ||||
|   provider          = "postgresql" | ||||
| } | ||||
|  | ||||
| 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") | ||||
|   moments   Moment[]  @relation("Moment_author") | ||||
|   events    Event[]   @relation("Event_author") | ||||
|   isAdmin   Boolean   @default(false) | ||||
|   isEditor  Boolean   @default(false) | ||||
|   createdAt DateTime? @default(now()) | ||||
| } | ||||
|  | ||||
| model Image { | ||||
|   id                 String    @id @default(cuid()) | ||||
|   caption            String    @default("") | ||||
|   image_filesize     Int? | ||||
|   image_extension    String? | ||||
|   image_width        Int? | ||||
|   image_height       Int? | ||||
|   image_id           String? | ||||
|   createdAt          DateTime? @default(now()) | ||||
|   from_Post_cover    Post[]    @relation("Post_cover") | ||||
|   from_Post_images   Post[]    @relation("Post_images") | ||||
|   from_Moment_images Moment[]  @relation("Moment_images") | ||||
|   from_Project_icon  Project[] @relation("Project_icon") | ||||
| } | ||||
|  | ||||
| model Asset { | ||||
|   id               String        @id @default(cuid()) | ||||
|   caption          String        @default("") | ||||
|   url              String        @default("") | ||||
|   type             AssetTypeType @default(video) @map("media_type") | ||||
|   createdAt        DateTime?     @default(now()) | ||||
|   from_Post_assets Post[]        @relation("Post_assets") | ||||
| } | ||||
|  | ||||
| model Post { | ||||
|   id                String       @id @default(cuid()) | ||||
|   slug              String       @unique @default("") | ||||
|   title             String       @default("") | ||||
|   cover             Image?       @relation("Post_cover", fields: [coverId], references: [id]) | ||||
|   coverId           String?      @map("cover") | ||||
|   description       String       @default("") | ||||
|   assets            Asset[]      @relation("Post_assets") | ||||
|   images            Image[]      @relation("Post_images") | ||||
|   content           Json         @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]") | ||||
|   type              PostTypeType @default(article) @map("post_type") | ||||
|   isPublished       Boolean      @default(false) | ||||
|   author            User?        @relation("Post_author", fields: [authorId], references: [id]) | ||||
|   authorId          String?      @map("author") | ||||
|   categories        Category[]   @relation("Category_posts") | ||||
|   tags              Tag[]        @relation("Post_tags") | ||||
|   createdAt         DateTime?    @default(now()) | ||||
|   from_Project_post Project[]    @relation("Project_post") | ||||
|  | ||||
|   @@index([coverId]) | ||||
|   @@index([authorId]) | ||||
| } | ||||
|  | ||||
| model Moment { | ||||
|   id         String     @id @default(cuid()) | ||||
|   title      String     @default("") | ||||
|   images     Image[]    @relation("Moment_images") | ||||
|   content    Json       @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]") | ||||
|   author     User?      @relation("Moment_author", fields: [authorId], references: [id]) | ||||
|   authorId   String?    @map("author") | ||||
|   categories Category[] @relation("Category_moments") | ||||
|   tags       Tag[]      @relation("Moment_tags") | ||||
|   createdAt  DateTime?  @default(now()) | ||||
|  | ||||
|   @@index([authorId]) | ||||
| } | ||||
|  | ||||
| model Project { | ||||
|   id          String            @id @default(cuid()) | ||||
|   icon        Image?            @relation("Project_icon", fields: [iconId], references: [id]) | ||||
|   iconId      String?           @map("icon") | ||||
|   name        String            @default("") | ||||
|   description String            @default("") | ||||
|   link        String            @default("") | ||||
|   isPublished Boolean           @default(false) | ||||
|   status      ProjectStatusType @default(pending) @map("project_status") | ||||
|   post        Post?             @relation("Project_post", fields: [postId], references: [id]) | ||||
|   postId      String?           @map("post") | ||||
|   createdAt   DateTime?         @default(now()) | ||||
|  | ||||
|   @@index([iconId]) | ||||
|   @@index([postId]) | ||||
| } | ||||
|  | ||||
| model Event { | ||||
|   id          String     @id @default(cuid()) | ||||
|   slug        String     @unique @default("") | ||||
|   title       String     @default("") | ||||
|   description String     @default("") | ||||
|   content     Json       @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]") | ||||
|   isPublished Boolean    @default(false) | ||||
|   isHistory   Boolean    @default(false) | ||||
|   author      User?      @relation("Event_author", fields: [authorId], references: [id]) | ||||
|   authorId    String?    @map("author") | ||||
|   categories  Category[] @relation("Category_events") | ||||
|   tags        Tag[]      @relation("Event_tags") | ||||
|   createdAt   DateTime?  @default(now()) | ||||
|  | ||||
|   @@index([authorId]) | ||||
| } | ||||
|  | ||||
| model Category { | ||||
|   id      String   @id @default(cuid()) | ||||
|   slug    String   @unique @default("") | ||||
|   name    String   @default("") | ||||
|   posts   Post[]   @relation("Category_posts") | ||||
|   moments Moment[] @relation("Category_moments") | ||||
|   events  Event[]  @relation("Category_events") | ||||
| } | ||||
|  | ||||
| model Tag { | ||||
|   id      String   @id @default(cuid()) | ||||
|   slug    String   @unique @default("") | ||||
|   name    String   @default("") | ||||
|   posts   Post[]   @relation("Post_tags") | ||||
|   moments Moment[] @relation("Moment_tags") | ||||
|   events  Event[]  @relation("Event_tags") | ||||
| } | ||||
|  | ||||
| enum AssetTypeType { | ||||
|   video | ||||
|   audio | ||||
| } | ||||
|  | ||||
| enum PostTypeType { | ||||
|   article | ||||
|   podcast | ||||
| } | ||||
|  | ||||
| enum ProjectStatusType { | ||||
|   pending | ||||
|   constructing | ||||
|   published | ||||
|   abandoned | ||||
| } | ||||
| @@ -1,41 +0,0 @@ | ||||
| import { image, select, text, timestamp } from "@keystone-6/core/fields"; | ||||
| import { list } from "@keystone-6/core"; | ||||
|  | ||||
| import { allowEditor } from "../limit"; | ||||
|  | ||||
| export const Image = list({ | ||||
|   access: allowEditor, | ||||
|  | ||||
|   fields: { | ||||
|     caption: text(), | ||||
|     image: image({ storage: "localImages" }), | ||||
|  | ||||
|     createdAt: timestamp({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| export const Asset = list({ | ||||
|   access: allowEditor, | ||||
|  | ||||
|   fields: { | ||||
|     caption: text(), | ||||
|     url: text({ validation: { isRequired: true } }), | ||||
|     type: select({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Video", value: "video" }, | ||||
|         { label: "Audio", value: "audio" }, | ||||
|       ], | ||||
|       defaultValue: "video", | ||||
|       db: { map: "media_type" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" }, | ||||
|     }), | ||||
|  | ||||
|     createdAt: timestamp({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
| @@ -1,37 +0,0 @@ | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowEditor } from "../limit"; | ||||
| import { relationship, text } from "@keystone-6/core/fields"; | ||||
|  | ||||
| export const Category = list({ | ||||
|   access: allowEditor, | ||||
|  | ||||
|   fields: { | ||||
|     slug: text({ | ||||
|       validation: { | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     name: text(), | ||||
|     posts: relationship({ ref: "Post.categories", many: true }), | ||||
|     moments: relationship({ ref: "Moment.categories", many: true }), | ||||
|     events: relationship({ ref: "Event.categories", many: true }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| export const Tag = list({ | ||||
|   access: allowEditor, | ||||
|  | ||||
|   fields: { | ||||
|     slug: text({ | ||||
|       validation: { | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     name: text(), | ||||
|     posts: relationship({ ref: "Post.tags", many: true }), | ||||
|     moments: relationship({ ref: "Moment.tags", many: true }), | ||||
|     events: relationship({ ref: "Event.tags", many: true }), | ||||
|   }, | ||||
| }); | ||||
| @@ -1,89 +0,0 @@ | ||||
| import { checkbox, relationship, text, timestamp } from "@keystone-6/core/fields"; | ||||
| import { document } from "@keystone-6/fields-document"; | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowEditor } from "../limit"; | ||||
| import { Session } from "../auth"; | ||||
|  | ||||
| export const Event = list({ | ||||
|   access: { | ||||
|     ...allowEditor, | ||||
|  | ||||
|     filter: { | ||||
|       query: ({ session }: { session: Session }) => { | ||||
|         if (session?.data.isEditor || session?.data.isAdmin) return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   fields: { | ||||
|     slug: text({ | ||||
|       validation: { | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     title: text({ validation: { isRequired: true } }), | ||||
|     description: text(), | ||||
|  | ||||
|     content: document({ | ||||
|       formatting: true, | ||||
|       layouts: [ | ||||
|         [1, 1], | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1], | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true, | ||||
|     }), | ||||
|  | ||||
|     isPublished: checkbox(), | ||||
|     isHistory: checkbox(), | ||||
|  | ||||
|     author: relationship({ | ||||
|       ref: "User.events", | ||||
|  | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|       }, | ||||
|  | ||||
|       many: false, | ||||
|     }), | ||||
|  | ||||
|     categories: relationship({ | ||||
|       ref: "Category.events", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     tags: relationship({ | ||||
|       ref: "Tag.events", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     createdAt: timestamp({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
| @@ -1,49 +0,0 @@ | ||||
| import { list } from "@keystone-6/core"; | ||||
|  | ||||
| import { text, relationship, password, timestamp, checkbox } from "@keystone-6/core/fields"; | ||||
|  | ||||
| import { allowAdmin } from "../limit"; | ||||
|  | ||||
| import { Image, Asset } from "./assets"; | ||||
| import { Moment } from "./moments"; | ||||
| import { Category, Tag } from "./categories"; | ||||
| import { Project } from "./projects"; | ||||
| import { Post } from "./posts"; | ||||
| import { Event } from "./events"; | ||||
|  | ||||
| export const lists = { | ||||
|   User: list({ | ||||
|     access: allowAdmin, | ||||
|  | ||||
|     fields: { | ||||
|       name: text({ validation: { isRequired: true } }), | ||||
|       email: text({ | ||||
|         validation: { isRequired: true }, | ||||
|         isIndexed: "unique", | ||||
|       }), | ||||
|  | ||||
|       password: password({ validation: { isRequired: true } }), | ||||
|       posts: relationship({ ref: "Post.author", many: true }), | ||||
|       moments: relationship({ ref: "Moment.author", many: true }), | ||||
|       events: relationship({ ref: "Event.author", many: true }), | ||||
|  | ||||
|       isAdmin: checkbox(), | ||||
|       isEditor: checkbox(), | ||||
|  | ||||
|       createdAt: timestamp({ | ||||
|         defaultValue: { kind: "now" }, | ||||
|       }), | ||||
|     }, | ||||
|   }), | ||||
|  | ||||
|   Image, | ||||
|   Asset, | ||||
|  | ||||
|   Post, | ||||
|   Moment, | ||||
|   Project, | ||||
|   Event, | ||||
|  | ||||
|   Category, | ||||
|   Tag, | ||||
| }; | ||||
| @@ -1,70 +0,0 @@ | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowUser } from "../limit"; | ||||
| import { document } from "@keystone-6/fields-document"; | ||||
| import { relationship, text, timestamp } from "@keystone-6/core/fields"; | ||||
|  | ||||
| export const Moment = list({ | ||||
|   access: allowUser, | ||||
|  | ||||
|   fields: { | ||||
|     title: text({ validation: { isRequired: true } }), | ||||
|     images: relationship({ ref: "Image", many: true }), | ||||
|  | ||||
|     content: document({ | ||||
|       formatting: true, | ||||
|       layouts: [ | ||||
|         [1, 1], | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1], | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true, | ||||
|     }), | ||||
|  | ||||
|     author: relationship({ | ||||
|       ref: "User.moments", | ||||
|  | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|       }, | ||||
|  | ||||
|       many: false, | ||||
|     }), | ||||
|  | ||||
|     categories: relationship({ | ||||
|       ref: "Category.moments", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     tags: relationship({ | ||||
|       ref: "Tag.moments", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     createdAt: timestamp({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
| @@ -1,104 +0,0 @@ | ||||
| import { checkbox, relationship, select, text, timestamp } from "@keystone-6/core/fields"; | ||||
| import { document } from "@keystone-6/fields-document"; | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowEditor } from "../limit"; | ||||
| import { Session } from "../auth"; | ||||
|  | ||||
| export const Post = list({ | ||||
|   access: { | ||||
|     ...allowEditor, | ||||
|  | ||||
|     filter: { | ||||
|       query: ({ session }: { session: Session }) => { | ||||
|         if (session?.data.isEditor || session?.data.isAdmin) return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   fields: { | ||||
|     slug: text({ | ||||
|       validation: { | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     title: text({ validation: { isRequired: true } }), | ||||
|     cover: relationship({ ref: "Image" }), | ||||
|  | ||||
|     description: text(), | ||||
|  | ||||
|     assets: relationship({ ref: "Asset", many: true }), | ||||
|     images: relationship({ ref: "Image", many: true }), | ||||
|     content: document({ | ||||
|       formatting: true, | ||||
|       layouts: [ | ||||
|         [1, 1], | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1], | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true, | ||||
|     }), | ||||
|  | ||||
|     type: select({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Article", value: "article" }, | ||||
|         { label: "Podcast", value: "podcast" }, | ||||
|       ], | ||||
|       defaultValue: "article", | ||||
|       db: { map: "post_type" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" }, | ||||
|     }), | ||||
|  | ||||
|     isPublished: checkbox(), | ||||
|  | ||||
|     author: relationship({ | ||||
|       ref: "User.posts", | ||||
|  | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|       }, | ||||
|  | ||||
|       many: false, | ||||
|     }), | ||||
|  | ||||
|     categories: relationship({ | ||||
|       ref: "Category.posts", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     tags: relationship({ | ||||
|       ref: "Tag.posts", | ||||
|       many: true, | ||||
|       ui: { | ||||
|         displayMode: "cards", | ||||
|         cardFields: ["name"], | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     createdAt: timestamp({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
| @@ -1,46 +0,0 @@ | ||||
| import { checkbox, relationship, select, text, timestamp } from "@keystone-6/core/fields"; | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowAdmin } from "../limit"; | ||||
| import { Session } from "../auth"; | ||||
|  | ||||
| export const Project = list({ | ||||
|   access: { | ||||
|     ...allowAdmin, | ||||
|  | ||||
|     filter: { | ||||
|       query: ({ session }: { session: Session }) => { | ||||
|         if (session?.data.isEditor || session?.data.isAdmin) return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   fields: { | ||||
|     icon: relationship({ ref: "Image" }), | ||||
|     name: text({ validation: { isRequired: true } }), | ||||
|     description: text(), | ||||
|     link: text(), | ||||
|  | ||||
|     isPublished: checkbox(), | ||||
|  | ||||
|     status: select({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Pending", value: "pending" }, | ||||
|         { label: "Constructing", value: "constructing" }, | ||||
|         { label: "Published", value: "published" }, | ||||
|         { label: "Abandoned", value: "abandoned" }, | ||||
|       ], | ||||
|       defaultValue: "pending", | ||||
|       db: { map: "project_status" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" }, | ||||
|     }), | ||||
|  | ||||
|     post: relationship({ ref: "Post" }), | ||||
|  | ||||
|     createdAt: timestamp({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
| @@ -1,10 +0,0 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "esnext", | ||||
|     "module": "commonjs", | ||||
|     "strict": true, | ||||
|     "noEmit": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true, | ||||
|   }, | ||||
| } | ||||
		Reference in New Issue
	
	Block a user