create-payload-app 0.3.19 → 0.3.21

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -15,7 +15,7 @@ CLI for easily starting new Payload project
15
15
  --name my-payload-app Set project name
16
16
  --template template_name Choose specific template
17
17
 
18
- Available templates: js-blank, js-blog, js-todo, ts-blank, ts-blog, ts-todo
18
+ Available templates: blank, blog, todo
19
19
 
20
20
  --use-npm Use npm to install dependencies
21
21
  --no-deps Do not install any dependencies
@@ -0,0 +1,4 @@
1
+ {
2
+ "ext": "ts",
3
+ "exec": "ts-node src/server.ts"
4
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "description": "Payload project created from {{templateName}} template",
4
+ "version": "1.0.0",
5
+ "main": "dist/server.js",
6
+ "license": "MIT",
7
+ "scripts": {
8
+ "dev": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts nodemon",
9
+ "build:payload": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload build",
10
+ "build:server": "tsc",
11
+ "build": "{{runCommand}} copyfiles && {{runCommand}} build:payload && {{runCommand}} build:server",
12
+ "serve": "cross-env PAYLOAD_CONFIG_PATH=dist/payload.config.js NODE_ENV=production node dist/server.js",
13
+ "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png}\" dist/",
14
+ "generate:types": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload generate:types",
15
+ "generate:graphQLSchema": "PAYLOAD_CONFIG_PATH=src/payload.config.ts payload generate:graphQLSchema"
16
+ },
17
+ "dependencies": {
18
+ "payload": "1.1.17",
19
+ "dotenv": "^8.2.0",
20
+ "express": "^4.17.1"
21
+ },
22
+ "devDependencies": {
23
+ "@types/express": "^4.17.9",
24
+ "cross-env": "^7.0.3",
25
+ "nodemon": "^2.0.6",
26
+ "ts-node": "^9.1.1",
27
+ "copyfiles": "^2.4.1",
28
+ "typescript": "^4.8.4"
29
+ }
30
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "lib": [
5
+ "dom",
6
+ "dom.iterable",
7
+ "esnext"
8
+ ],
9
+ "allowJs": true,
10
+ "strict": false,
11
+ "esModuleInterop": true,
12
+ "skipLibCheck": true,
13
+ "outDir": "./dist",
14
+ "rootDir": "./src",
15
+ "jsx": "react"
16
+ },
17
+ "include": [
18
+ "src"
19
+ ],
20
+ "exclude": [
21
+ "node_modules",
22
+ "dist",
23
+ "build",
24
+ ],
25
+ "ts-node": {
26
+ "transpileOnly": true
27
+ }
28
+ }
@@ -8,7 +8,7 @@
8
8
  "dev": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts nodemon",
9
9
  "build:payload": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload build",
10
10
  "build:server": "tsc",
11
- "build": "yarn copyfiles && yarn build:payload && yarn build:server",
11
+ "build": "{{runCommand}} copyfiles && {{runCommand}} build:payload && {{runCommand}} build:server",
12
12
  "serve": "cross-env PAYLOAD_CONFIG_PATH=dist/payload.config.js NODE_ENV=production node dist/server.js",
13
13
  "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png}\" dist/",
14
14
  "generate:types": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload generate:types",
@@ -62,16 +62,16 @@ describe('createProject', function () {
62
62
  var args = { _: ['project-name'], '--no-deps': true };
63
63
  var packageManager = 'yarn';
64
64
  it('creates static project', function () { return __awaiter(void 0, void 0, void 0, function () {
65
- var expectedPayloadVersion, template, packageJsonPath, packageJson;
65
+ var expectedPayloadVersion, templateName, template, packageJsonPath, packageJson;
66
66
  return __generator(this, function (_a) {
67
67
  switch (_a.label) {
68
68
  case 0: return [4 /*yield*/, (0, create_project_1.getLatestPayloadVersion)()];
69
69
  case 1:
70
70
  expectedPayloadVersion = _a.sent();
71
+ templateName = 'todo';
71
72
  template = {
72
- name: 'ts-todo',
73
+ name: templateName,
73
74
  type: 'static',
74
- language: 'typescript',
75
75
  };
76
76
  return [4 /*yield*/, (0, create_project_1.createProject)(args, projectDir, template, packageManager)];
77
77
  case 2:
@@ -81,7 +81,7 @@ describe('createProject', function () {
81
81
  expect(packageJson.dependencies.payload).toBe(expectedPayloadVersion);
82
82
  // Check package name and description
83
83
  expect(packageJson.name).toEqual(path_1.default.basename(projectDir));
84
- expect(packageJson.description).toContain('ts-todo');
84
+ expect(packageJson.description).toContain(templateName);
85
85
  // Check all common files are create
86
86
  assertProjectFileExists('.npmrc');
87
87
  assertProjectFileExists('.gitignore');
@@ -41,7 +41,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.parseTemplate = void 0;
43
43
  var prompts_1 = __importDefault(require("prompts"));
44
- function parseTemplate(args, validTemplates, language) {
44
+ function parseTemplate(args, validTemplates) {
45
45
  return __awaiter(this, void 0, void 0, function () {
46
46
  var templateName_1, template_1, filteredTemplates, response, template;
47
47
  return __generator(this, function (_a) {
@@ -54,24 +54,20 @@ function parseTemplate(args, validTemplates, language) {
54
54
  throw new Error('Invalid template given');
55
55
  return [2 /*return*/, template_1];
56
56
  }
57
- filteredTemplates = validTemplates
58
- .filter(function (d) { return d.name.startsWith(language); })
59
- .map(function (t) { return t.name.replace("".concat(language, "-"), ''); });
57
+ filteredTemplates = validTemplates.map(function (t) { return t.name; });
60
58
  return [4 /*yield*/, (0, prompts_1.default)({
61
59
  type: 'select',
62
60
  name: 'value',
63
61
  message: 'Choose project template',
64
62
  choices: filteredTemplates.map(function (p) {
65
- return { title: p, value: "".concat(language, "-").concat(p) };
63
+ return { title: p, value: p };
66
64
  }),
67
65
  validate: function (value) { return !!value.length; },
68
66
  }, {
69
67
  onCancel: function () {
70
68
  process.exit(0);
71
69
  },
72
- })
73
- // const template = `${language}-${response.value}`
74
- ];
70
+ })];
75
71
  case 1:
76
72
  response = _a.sent();
77
73
  template = validTemplates.find(function (t) { return t.name === response.value; });
@@ -72,7 +72,6 @@ function getValidTemplates() {
72
72
  return {
73
73
  name: name,
74
74
  type: 'static',
75
- language: name.startsWith('js-') ? 'javascript' : 'typescript',
76
75
  };
77
76
  });
78
77
  return [2 /*return*/, templates];
@@ -64,19 +64,20 @@ function writeCommonFiles(projectDir, template, packageManager) {
64
64
  ];
65
65
  case 2:
66
66
  _a.sent();
67
- return [4 /*yield*/, fs_extra_1.default.readFile(path_1.default.resolve(commonFilesDir, template.language, 'package.template.json'), 'utf8')];
67
+ return [4 /*yield*/, fs_extra_1.default.readFile(path_1.default.resolve(commonFilesDir, 'package.template.json'), 'utf8')];
68
68
  case 3:
69
69
  packageJsonTemplate = _a.sent();
70
70
  packageJson = handlebars_1.default.compile(packageJsonTemplate)({
71
71
  projectName: path_1.default.basename(projectDir),
72
72
  templateName: template.name,
73
+ runCommand: packageManager === 'yarn' ? 'yarn' : 'npm run',
73
74
  });
74
75
  return [4 /*yield*/, fs_extra_1.default.writeFile(path_1.default.resolve(projectDir, 'package.json'), packageJson)
75
76
  // nodemon.json
76
77
  ];
77
78
  case 4:
78
79
  _a.sent();
79
- nodemon = path_1.default.resolve(commonFilesDir, template.language, 'nodemon.json');
80
+ nodemon = path_1.default.resolve(commonFilesDir, 'nodemon.json');
80
81
  nodemonDest = path_1.default.resolve(projectDir, 'nodemon.json');
81
82
  return [4 /*yield*/, fs_extra_1.default.copy(nodemon, nodemonDest)
82
83
  // README.md
@@ -95,15 +96,15 @@ function writeCommonFiles(projectDir, template, packageManager) {
95
96
  ];
96
97
  case 7:
97
98
  _a.sent();
98
- if (!(template.language === 'typescript')) return [3 /*break*/, 9];
99
- tsconfig = path_1.default.resolve(commonFilesDir, template.language, 'tsconfig.json');
99
+ tsconfig = path_1.default.resolve(commonFilesDir, 'tsconfig.json');
100
100
  tsconfigDest = path_1.default.resolve(projectDir, 'tsconfig.json');
101
- return [4 /*yield*/, fs_extra_1.default.copy(tsconfig, tsconfigDest)];
101
+ return [4 /*yield*/, fs_extra_1.default.copy(tsconfig, tsconfigDest)
102
+ // docker-compose.yml
103
+ ];
102
104
  case 8:
103
105
  _a.sent();
104
- _a.label = 9;
105
- case 9: return [4 /*yield*/, fs_extra_1.default.readFile(path_1.default.resolve(commonFilesDir, 'docker-compose.template.yml'), 'utf8')];
106
- case 10:
106
+ return [4 /*yield*/, fs_extra_1.default.readFile(path_1.default.resolve(commonFilesDir, 'docker-compose.template.yml'), 'utf8')];
107
+ case 9:
107
108
  dockerComposeTemplate = _a.sent();
108
109
  dockerCompose = handlebars_1.default.compile(dockerComposeTemplate)(packageManager === 'yarn'
109
110
  ? { installCmd: 'yarn install', devCmd: 'yarn dev' }
@@ -111,16 +112,16 @@ function writeCommonFiles(projectDir, template, packageManager) {
111
112
  return [4 /*yield*/, fs_extra_1.default.writeFile(path_1.default.resolve(projectDir, 'docker-compose.yml'), dockerCompose)
112
113
  // Dockerfile
113
114
  ];
114
- case 11:
115
+ case 10:
115
116
  _a.sent();
116
117
  return [4 /*yield*/, fs_extra_1.default.readFile(path_1.default.resolve(commonFilesDir, 'Dockerfile.template'), 'utf8')];
117
- case 12:
118
+ case 11:
118
119
  dockerfileTemplate = _a.sent();
119
120
  dockerfile = handlebars_1.default.compile(dockerfileTemplate)(packageManager === 'yarn'
120
121
  ? { installCmd: 'yarn install', buildCmd: 'yarn build' }
121
122
  : { installCmd: 'npm install', buildCmd: 'npm run build' });
122
123
  return [4 /*yield*/, fs_extra_1.default.writeFile(path_1.default.resolve(projectDir, 'Dockerfile'), dockerfile)];
123
- case 13:
124
+ case 12:
124
125
  _a.sent();
125
126
  return [2 /*return*/];
126
127
  }
package/dist/main.js CHANGED
@@ -46,7 +46,6 @@ var command_exists_1 = __importDefault(require("command-exists"));
46
46
  var create_project_1 = require("./lib/create-project");
47
47
  var get_db_connection_1 = require("./lib/get-db-connection");
48
48
  var generate_secret_1 = require("./lib/generate-secret");
49
- var parse_language_1 = require("./lib/parse-language");
50
49
  var parse_project_name_1 = require("./lib/parse-project-name");
51
50
  var parse_template_1 = require("./lib/parse-template");
52
51
  var templates_1 = require("./lib/templates");
@@ -73,11 +72,11 @@ var Main = /** @class */ (function () {
73
72
  }
74
73
  Main.prototype.init = function () {
75
74
  return __awaiter(this, void 0, void 0, function () {
76
- var _a, _b, templateArg, valid, _c, _d, projectName, language, validTemplates, template, databaseUri, payloadSecret, projectDir, packageManager, error_1;
75
+ var _a, _b, templateArg, valid, _c, _d, projectName, validTemplates, template, databaseUri, payloadSecret, projectDir, packageManager, error_1;
77
76
  return __generator(this, function (_e) {
78
77
  switch (_e.label) {
79
78
  case 0:
80
- _e.trys.push([0, 16, , 17]);
79
+ _e.trys.push([0, 15, , 16]);
81
80
  if (!this.args['--help']) return [3 /*break*/, 2];
82
81
  _b = (_a = console).log;
83
82
  return [4 /*yield*/, (0, messages_1.helpMessage)()];
@@ -103,42 +102,39 @@ var Main = /** @class */ (function () {
103
102
  return [4 /*yield*/, (0, parse_project_name_1.parseProjectName)(this.args)];
104
103
  case 6:
105
104
  projectName = _e.sent();
106
- return [4 /*yield*/, (0, parse_language_1.parseLanguage)(this.args)];
107
- case 7:
108
- language = _e.sent();
109
105
  return [4 /*yield*/, (0, templates_1.getValidTemplates)()];
110
- case 8:
106
+ case 7:
111
107
  validTemplates = _e.sent();
112
- return [4 /*yield*/, (0, parse_template_1.parseTemplate)(this.args, validTemplates, language)];
113
- case 9:
108
+ return [4 /*yield*/, (0, parse_template_1.parseTemplate)(this.args, validTemplates)];
109
+ case 8:
114
110
  template = _e.sent();
115
111
  return [4 /*yield*/, (0, get_db_connection_1.getDatabaseConnection)(this.args, projectName)];
116
- case 10:
112
+ case 9:
117
113
  databaseUri = _e.sent();
118
114
  return [4 /*yield*/, (0, generate_secret_1.generateSecret)()];
119
- case 11:
115
+ case 10:
120
116
  payloadSecret = _e.sent();
121
117
  projectDir = projectName === '.' ? process.cwd() : "./".concat((0, slugify_1.default)(projectName));
122
118
  return [4 /*yield*/, getPackageManager(this.args)];
123
- case 12:
119
+ case 11:
124
120
  packageManager = _e.sent();
125
- if (!!this.args['--dry-run']) return [3 /*break*/, 15];
121
+ if (!!this.args['--dry-run']) return [3 /*break*/, 14];
126
122
  return [4 /*yield*/, (0, create_project_1.createProject)(this.args, projectDir, template, packageManager)];
127
- case 13:
123
+ case 12:
128
124
  _e.sent();
129
125
  return [4 /*yield*/, (0, write_env_file_1.writeEnvFile)(projectName, databaseUri, payloadSecret)];
130
- case 14:
126
+ case 13:
131
127
  _e.sent();
132
- _e.label = 15;
133
- case 15:
128
+ _e.label = 14;
129
+ case 14:
134
130
  (0, log_1.success)('Payload project successfully created');
135
131
  console.log((0, messages_1.successMessage)(projectDir, packageManager));
136
- return [3 /*break*/, 17];
137
- case 16:
132
+ return [3 /*break*/, 16];
133
+ case 15:
138
134
  error_1 = _e.sent();
139
135
  console.log(error_1);
140
- return [3 /*break*/, 17];
141
- case 17: return [2 /*return*/];
136
+ return [3 /*break*/, 16];
137
+ case 16: return [2 /*return*/];
142
138
  }
143
139
  });
144
140
  });
@@ -0,0 +1,17 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ // Example Collection - For reference only, this must be added to payload.config.ts to be used.
4
+ const Examples: CollectionConfig = {
5
+ slug: 'examples',
6
+ admin: {
7
+ useAsTitle: 'someField',
8
+ },
9
+ fields: [
10
+ {
11
+ name: 'someField',
12
+ type: 'text',
13
+ },
14
+ ],
15
+ }
16
+
17
+ export default Examples;
@@ -0,0 +1,18 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Users: CollectionConfig = {
4
+ slug: 'users',
5
+ auth: true,
6
+ admin: {
7
+ useAsTitle: 'email',
8
+ },
9
+ access: {
10
+ read: () => true,
11
+ },
12
+ fields: [
13
+ // Email added by default
14
+ // Add more fields as needed
15
+ ],
16
+ };
17
+
18
+ export default Users;
@@ -0,0 +1,22 @@
1
+ import { buildConfig } from 'payload/config';
2
+ import path from 'path';
3
+ // import Examples from './collections/Examples';
4
+ import Users from './collections/Users';
5
+
6
+ export default buildConfig({
7
+ serverURL: 'http://localhost:3000',
8
+ admin: {
9
+ user: Users.slug,
10
+ },
11
+ collections: [
12
+ Users,
13
+ // Add Collections here
14
+ // Examples,
15
+ ],
16
+ typescript: {
17
+ outputFile: path.resolve(__dirname, 'payload-types.ts'),
18
+ },
19
+ graphQL: {
20
+ schemaOutputFile: path.resolve(__dirname, 'generated-schema.graphql'),
21
+ },
22
+ });
@@ -0,0 +1,24 @@
1
+ import express from 'express';
2
+ import payload from 'payload';
3
+
4
+ require('dotenv').config();
5
+ const app = express();
6
+
7
+ // Redirect root to Admin panel
8
+ app.get('/', (_, res) => {
9
+ res.redirect('/admin');
10
+ });
11
+
12
+ // Initialize Payload
13
+ payload.init({
14
+ secret: process.env.PAYLOAD_SECRET,
15
+ mongoURL: process.env.MONGODB_URI,
16
+ express: app,
17
+ onInit: () => {
18
+ payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`)
19
+ },
20
+ })
21
+
22
+ // Add your own express routes here
23
+
24
+ app.listen(3000);
@@ -0,0 +1,20 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Categories: CollectionConfig = {
4
+ slug: 'categories',
5
+ admin: {
6
+ useAsTitle: 'name',
7
+ },
8
+ access: {
9
+ read: () => true,
10
+ },
11
+ fields: [
12
+ {
13
+ name: 'name',
14
+ type: 'text',
15
+ },
16
+ ],
17
+ timestamps: false,
18
+ }
19
+
20
+ export default Categories;
@@ -0,0 +1,62 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Posts: CollectionConfig = {
4
+ slug: 'posts',
5
+ admin: {
6
+ defaultColumns: ['title', 'author', 'category', 'tags', 'status'],
7
+ useAsTitle: 'title',
8
+ },
9
+ access: {
10
+ read: () => true,
11
+ },
12
+ fields: [
13
+ {
14
+ name: 'title',
15
+ type: 'text',
16
+ },
17
+ {
18
+ name: 'author',
19
+ type: 'relationship',
20
+ relationTo: 'users',
21
+ },
22
+ {
23
+ name: 'publishedDate',
24
+ type: 'date',
25
+ },
26
+ {
27
+ name: 'category',
28
+ type: 'relationship',
29
+ relationTo: 'categories'
30
+ },
31
+ {
32
+ name: 'tags',
33
+ type: 'relationship',
34
+ relationTo: 'tags',
35
+ hasMany: true,
36
+ },
37
+ {
38
+ name: 'content',
39
+ type: 'richText'
40
+ },
41
+ {
42
+ name: 'status',
43
+ type: 'select',
44
+ options: [
45
+ {
46
+ value: 'draft',
47
+ label: 'Draft',
48
+ },
49
+ {
50
+ value: 'published',
51
+ label: 'Published',
52
+ },
53
+ ],
54
+ defaultValue: 'draft',
55
+ admin: {
56
+ position: 'sidebar',
57
+ }
58
+ }
59
+ ],
60
+ }
61
+
62
+ export default Posts;
@@ -0,0 +1,20 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Tags: CollectionConfig = {
4
+ slug: 'tags',
5
+ admin: {
6
+ useAsTitle: 'name',
7
+ },
8
+ access: {
9
+ read: () => true,
10
+ },
11
+ fields: [
12
+ {
13
+ name: 'name',
14
+ type: 'text',
15
+ },
16
+ ],
17
+ timestamps: false,
18
+ }
19
+
20
+ export default Tags;
@@ -0,0 +1,21 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Users: CollectionConfig = {
4
+ slug: 'users',
5
+ auth: true,
6
+ admin: {
7
+ useAsTitle: 'email',
8
+ },
9
+ access: {
10
+ read: () => true,
11
+ },
12
+ fields: [
13
+ // Email added by default
14
+ {
15
+ name: 'name',
16
+ type: 'text',
17
+ }
18
+ ],
19
+ };
20
+
21
+ export default Users;
@@ -0,0 +1,25 @@
1
+ import { buildConfig } from 'payload/config';
2
+ import path from 'path';
3
+ import Categories from './collections/Categories';
4
+ import Posts from './collections/Posts';
5
+ import Tags from './collections/Tags';
6
+ import Users from './collections/Users';
7
+
8
+ export default buildConfig({
9
+ serverURL: 'http://localhost:3000',
10
+ admin: {
11
+ user: Users.slug,
12
+ },
13
+ collections: [
14
+ Categories,
15
+ Posts,
16
+ Tags,
17
+ Users,
18
+ ],
19
+ typescript: {
20
+ outputFile: path.resolve(__dirname, 'payload-types.ts')
21
+ },
22
+ graphQL: {
23
+ schemaOutputFile: path.resolve(__dirname, 'generated-schema.graphql'),
24
+ },
25
+ });
@@ -0,0 +1,24 @@
1
+ import express from 'express';
2
+ import payload from 'payload';
3
+
4
+ require('dotenv').config();
5
+ const app = express();
6
+
7
+ // Redirect root to Admin panel
8
+ app.get('/', (_, res) => {
9
+ res.redirect('/admin');
10
+ });
11
+
12
+ // Initialize Payload
13
+ payload.init({
14
+ secret: process.env.PAYLOAD_SECRET,
15
+ mongoURL: process.env.MONGODB_URI,
16
+ express: app,
17
+ onInit: () => {
18
+ payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`)
19
+ },
20
+ })
21
+
22
+ // Add your own express routes here
23
+
24
+ app.listen(3000);
@@ -0,0 +1,38 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Todo: CollectionConfig = {
4
+ slug: 'todos',
5
+ admin: {
6
+ defaultColumns: ['listName', 'tasks', 'updatedAt'],
7
+ useAsTitle: 'listName',
8
+ },
9
+ access: {
10
+ create: () => true,
11
+ read: () => true,
12
+ update: () => true,
13
+ delete: () => true,
14
+ },
15
+ fields: [
16
+ {
17
+ name: 'listName',
18
+ type: 'text',
19
+ },
20
+ {
21
+ name: 'tasks',
22
+ type: 'array',
23
+ fields: [
24
+ {
25
+ name: 'name',
26
+ type: 'text',
27
+ },
28
+ {
29
+ name: 'complete',
30
+ type: 'checkbox',
31
+ defaultValue: false,
32
+ }
33
+ ]
34
+ },
35
+ ],
36
+ }
37
+
38
+ export default Todo;
@@ -0,0 +1,18 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+
3
+ const Users: CollectionConfig = {
4
+ slug: 'users',
5
+ auth: true,
6
+ admin: {
7
+ useAsTitle: 'email',
8
+ },
9
+ access: {
10
+ read: () => true,
11
+ },
12
+ fields: [
13
+ // Email added by default
14
+ // Add more fields as needed
15
+ ],
16
+ };
17
+
18
+ export default Users;
@@ -0,0 +1,21 @@
1
+ import { buildConfig } from 'payload/config';
2
+ import path from 'path';
3
+ import TodoLists from './collections/TodoLists';
4
+ import Users from './collections/Users';
5
+
6
+ export default buildConfig({
7
+ serverURL: 'http://localhost:3000',
8
+ admin: {
9
+ user: Users.slug,
10
+ },
11
+ collections: [
12
+ TodoLists,
13
+ Users,
14
+ ],
15
+ typescript: {
16
+ outputFile: path.resolve(__dirname, 'payload-types.ts')
17
+ },
18
+ graphQL: {
19
+ schemaOutputFile: path.resolve(__dirname, 'generated-schema.graphql'),
20
+ },
21
+ });
@@ -0,0 +1,24 @@
1
+ import express from 'express';
2
+ import payload from 'payload';
3
+
4
+ require('dotenv').config();
5
+ const app = express();
6
+
7
+ // Redirect root to Admin panel
8
+ app.get('/', (_, res) => {
9
+ res.redirect('/admin');
10
+ });
11
+
12
+ // Initialize Payload
13
+ payload.init({
14
+ secret: process.env.PAYLOAD_SECRET,
15
+ mongoURL: process.env.MONGODB_URI,
16
+ express: app,
17
+ onInit: () => {
18
+ payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`)
19
+ },
20
+ })
21
+
22
+ // Add your own express routes here
23
+
24
+ app.listen(3000);
package/package.json CHANGED
@@ -36,7 +36,7 @@
36
36
  "prompts": "^2.4.0",
37
37
  "terminal-link": "^2.1.1"
38
38
  },
39
- "version": "0.3.19",
39
+ "version": "0.3.21",
40
40
  "devDependencies": {
41
41
  "@types/command-exists": "^1.2.0",
42
42
  "@types/degit": "^2.8.3",