@kywi-software/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +44 -0
- package/bin/kywi.js +22 -0
- package/dist/__tests__/command-wiring.test.d.ts +2 -0
- package/dist/__tests__/command-wiring.test.d.ts.map +1 -0
- package/dist/__tests__/command-wiring.test.js +55 -0
- package/dist/__tests__/command-wiring.test.js.map +1 -0
- package/dist/__tests__/migrate-generate.test.d.ts +2 -0
- package/dist/__tests__/migrate-generate.test.d.ts.map +1 -0
- package/dist/__tests__/migrate-generate.test.js +53 -0
- package/dist/__tests__/migrate-generate.test.js.map +1 -0
- package/dist/commands/migrate-generate.d.ts +2 -0
- package/dist/commands/migrate-generate.d.ts.map +1 -0
- package/dist/commands/migrate-generate.js +64 -0
- package/dist/commands/migrate-generate.js.map +1 -0
- package/dist/commands/migrate-status.d.ts +2 -0
- package/dist/commands/migrate-status.d.ts.map +1 -0
- package/dist/commands/migrate-status.js +22 -0
- package/dist/commands/migrate-status.js.map +1 -0
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +72 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/seed-demo.d.ts +2 -0
- package/dist/commands/seed-demo.d.ts.map +1 -0
- package/dist/commands/seed-demo.js +451 -0
- package/dist/commands/seed-demo.js.map +1 -0
- package/dist/commands/seed.d.ts +2 -0
- package/dist/commands/seed.d.ts.map +1 -0
- package/dist/commands/seed.js +163 -0
- package/dist/commands/seed.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { program } from 'commander';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
program
|
|
4
|
+
.command('seed')
|
|
5
|
+
.description('Seed the database with a default site, superadmin user, and root content node.')
|
|
6
|
+
.option('-c, --config <path>', 'Path to kywi.config.ts', 'kywi.config.ts')
|
|
7
|
+
.action(async (options) => {
|
|
8
|
+
// Dynamic import so we only load DB deps when the command runs
|
|
9
|
+
const configPath = resolve(process.cwd(), options.config);
|
|
10
|
+
const configModule = await import(configPath);
|
|
11
|
+
const config = configModule.default;
|
|
12
|
+
const { createDb, kywiSites, kywiContent, kywiUsers, kywiGroups, kywiUserGroups, kywiSiteMemberships, hashPassword, resolveDatabaseUrl, explainDbError, } = await import('@kywi-software/core');
|
|
13
|
+
const { eq } = await import('drizzle-orm');
|
|
14
|
+
let dbUrl;
|
|
15
|
+
try {
|
|
16
|
+
dbUrl = resolveDatabaseUrl(config.db.url, 'postgres://localhost:5432/kywi_dev').url;
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.error(`\n✖ ${err.message}\n`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const db = createDb(dbUrl, config.db.provider);
|
|
23
|
+
try {
|
|
24
|
+
await seedAll();
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const friendly = explainDbError(err, dbUrl);
|
|
28
|
+
if (friendly) {
|
|
29
|
+
console.error(`\n✖ ${friendly}\n`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
async function seedAll() {
|
|
35
|
+
// ── 1. Seed default site ────────────────────────────────────────────────
|
|
36
|
+
const siteDef = config.sites?.[0];
|
|
37
|
+
const siteSlug = siteDef?.id ?? 'default';
|
|
38
|
+
const siteName = siteDef?.name ?? 'Kywi Dev Site';
|
|
39
|
+
const siteDomain = siteDef?.domain ?? 'localhost';
|
|
40
|
+
const siteLocale = siteDef?.defaultLocale ?? 'en';
|
|
41
|
+
const siteTheme = siteDef?.theme ?? 'default';
|
|
42
|
+
const [existingSite] = await db
|
|
43
|
+
.select()
|
|
44
|
+
.from(kywiSites)
|
|
45
|
+
.where(eq(kywiSites.slug, siteSlug))
|
|
46
|
+
.limit(1);
|
|
47
|
+
let siteDbId;
|
|
48
|
+
if (existingSite) {
|
|
49
|
+
console.log(`Site "${siteName}" (slug: ${siteSlug}) already exists — skipping.`);
|
|
50
|
+
siteDbId = existingSite.id;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const [site] = await db
|
|
54
|
+
.insert(kywiSites)
|
|
55
|
+
.values({
|
|
56
|
+
slug: siteSlug,
|
|
57
|
+
name: siteName,
|
|
58
|
+
domain: siteDomain,
|
|
59
|
+
defaultLocale: siteLocale,
|
|
60
|
+
theme: siteTheme,
|
|
61
|
+
})
|
|
62
|
+
.returning();
|
|
63
|
+
siteDbId = site.id;
|
|
64
|
+
console.log(`Created site "${siteName}" (slug: ${siteSlug}, id: ${siteDbId})`);
|
|
65
|
+
}
|
|
66
|
+
// ── 2. Seed superadmin user ─────────────────────────────────────────────
|
|
67
|
+
const adminEmail = process.env['KYWI_ADMIN_EMAIL'] ?? 'admin@kywi.dev';
|
|
68
|
+
const adminPassword = process.env['KYWI_ADMIN_PASSWORD'] ?? 'admin123';
|
|
69
|
+
const [existingUser] = await db
|
|
70
|
+
.select()
|
|
71
|
+
.from(kywiUsers)
|
|
72
|
+
.where(eq(kywiUsers.email, adminEmail))
|
|
73
|
+
.limit(1);
|
|
74
|
+
let adminId;
|
|
75
|
+
if (existingUser) {
|
|
76
|
+
console.log(`User "${adminEmail}" already exists — skipping.`);
|
|
77
|
+
adminId = existingUser.id;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const passwordHash = await hashPassword(adminPassword);
|
|
81
|
+
const [user] = await db
|
|
82
|
+
.insert(kywiUsers)
|
|
83
|
+
.values({
|
|
84
|
+
email: adminEmail,
|
|
85
|
+
passwordHash,
|
|
86
|
+
firstName: 'Super',
|
|
87
|
+
lastName: 'Admin',
|
|
88
|
+
role: 'superAdmin',
|
|
89
|
+
})
|
|
90
|
+
.returning();
|
|
91
|
+
adminId = user.id;
|
|
92
|
+
console.log(`Created superadmin user:`);
|
|
93
|
+
console.log(` Email: ${adminEmail}`);
|
|
94
|
+
console.log(` Password: ${adminPassword}`);
|
|
95
|
+
console.log(` ID: ${adminId}`);
|
|
96
|
+
}
|
|
97
|
+
// ── 3. Seed Administrators group + membership ───────────────────────────
|
|
98
|
+
const [existingGroup] = await db
|
|
99
|
+
.select()
|
|
100
|
+
.from(kywiGroups)
|
|
101
|
+
.where(eq(kywiGroups.name, 'Administrators'))
|
|
102
|
+
.limit(1);
|
|
103
|
+
let groupId;
|
|
104
|
+
if (existingGroup) {
|
|
105
|
+
groupId = existingGroup.id;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const [group] = await db
|
|
109
|
+
.insert(kywiGroups)
|
|
110
|
+
.values({ siteId: siteDbId, name: 'Administrators' })
|
|
111
|
+
.returning();
|
|
112
|
+
groupId = group.id;
|
|
113
|
+
console.log(`Created "Administrators" group (${groupId})`);
|
|
114
|
+
}
|
|
115
|
+
// Add admin to group (ignore if already member)
|
|
116
|
+
try {
|
|
117
|
+
await db.insert(kywiUserGroups).values({ userId: adminId, groupId });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Already a member — ignore
|
|
121
|
+
}
|
|
122
|
+
// Site membership
|
|
123
|
+
try {
|
|
124
|
+
await db.insert(kywiSiteMemberships).values({ userId: adminId, siteId: siteDbId });
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Already a member — ignore
|
|
128
|
+
}
|
|
129
|
+
// ── 4. Seed root content node (Home page) ──────────────────────────────
|
|
130
|
+
const [existingHome] = await db
|
|
131
|
+
.select()
|
|
132
|
+
.from(kywiContent)
|
|
133
|
+
.where(eq(kywiContent.slug, 'home'))
|
|
134
|
+
.limit(1);
|
|
135
|
+
if (existingHome) {
|
|
136
|
+
console.log(`Root content "home" already exists — skipping.`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const [home] = await db
|
|
140
|
+
.insert(kywiContent)
|
|
141
|
+
.values({
|
|
142
|
+
siteId: siteDbId,
|
|
143
|
+
title: 'Home',
|
|
144
|
+
slug: 'home',
|
|
145
|
+
path: '/',
|
|
146
|
+
depth: 0,
|
|
147
|
+
sortOrder: 0,
|
|
148
|
+
status: 'published',
|
|
149
|
+
baseType: 'content',
|
|
150
|
+
contentTypeName: 'page',
|
|
151
|
+
publishedAt: new Date(),
|
|
152
|
+
createdBy: adminId,
|
|
153
|
+
body: '<h1>Welcome to Kywi CMS</h1><p>Your site is ready.</p>',
|
|
154
|
+
isNav: true,
|
|
155
|
+
})
|
|
156
|
+
.returning();
|
|
157
|
+
console.log(`Created root page "Home" (${home.id})`);
|
|
158
|
+
}
|
|
159
|
+
console.log('\nSeed complete.');
|
|
160
|
+
process.exit(0);
|
|
161
|
+
} // end seedAll
|
|
162
|
+
});
|
|
163
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,gCAAgC,CAAA;AACvC,OAAO,uBAAuB,CAAA;AAC9B,OAAO,8BAA8B,CAAA;AACrC,OAAO,oBAAoB,CAAA;AAC3B,OAAO,yBAAyB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { program } from 'commander';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import './commands/migrate-generate.js';
|
|
4
|
+
import './commands/migrate.js';
|
|
5
|
+
import './commands/migrate-status.js';
|
|
6
|
+
import './commands/seed.js';
|
|
7
|
+
import './commands/seed-demo.js';
|
|
8
|
+
// Load a project-root .env before commands run, so `kywi migrate` / `kywi seed`
|
|
9
|
+
// work with nothing but a .env present (no `export DATABASE_URL=…` needed). Uses
|
|
10
|
+
// Node 20.6+'s built-in loader (this package requires node >=20.6.0). Runs before
|
|
11
|
+
// program.parse(), so every command's action sees the values; a real process env
|
|
12
|
+
// var still wins (loadEnvFile does not overwrite existing keys).
|
|
13
|
+
if (typeof process.loadEnvFile === 'function' && existsSync('.env')) {
|
|
14
|
+
try {
|
|
15
|
+
process.loadEnvFile('.env');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// A malformed .env shouldn't crash the CLI — commands surface their own
|
|
19
|
+
// "DATABASE_URL missing" guidance if the value never got set.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
program
|
|
23
|
+
.name('kywi')
|
|
24
|
+
.description('Kywi CMS CLI')
|
|
25
|
+
.version('0.1.0');
|
|
26
|
+
program.parse(process.argv);
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,gCAAgC,CAAA;AACvC,OAAO,uBAAuB,CAAA;AAC9B,OAAO,8BAA8B,CAAA;AACrC,OAAO,oBAAoB,CAAA;AAC3B,OAAO,yBAAyB,CAAA;AAEhC,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,iFAAiF;AACjF,iEAAiE;AACjE,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IACpE,IAAI,CAAC;QACH,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,8DAA8D;IAChE,CAAC;AACH,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,cAAc,CAAC;KAC3B,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kywi-software/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Kywi CMS command-line tool — migrate, seed, and generate schema from a kywi.config.ts project.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "AGPL-3.0-only",
|
|
7
|
+
"homepage": "https://github.com/Kywi-Software/kywi-cms#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Kywi-Software/kywi-cms.git",
|
|
11
|
+
"directory": "packages/cli"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"kywi",
|
|
15
|
+
"cms",
|
|
16
|
+
"cli",
|
|
17
|
+
"migrate",
|
|
18
|
+
"seed"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"bin",
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20.6.0"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"kywi": "./bin/kywi.js"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"commander": "^12.0.0",
|
|
37
|
+
"drizzle-orm": "^0.38.0",
|
|
38
|
+
"tsx": "^4.7.0",
|
|
39
|
+
"@kywi-software/core": "0.1.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^20.0.0",
|
|
43
|
+
"drizzle-kit": "^0.28.0",
|
|
44
|
+
"typescript": "^5.5.0",
|
|
45
|
+
"vitest": "^1.6.1"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsc",
|
|
49
|
+
"dev": "tsx src/index.ts",
|
|
50
|
+
"test": "vitest run"
|
|
51
|
+
}
|
|
52
|
+
}
|