create-zenstack 3.5.6 → 3.6.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/bin/cli +1 -1
- package/dist/index.cjs +122 -147
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +177 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +8 -6
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -204
- package/dist/index.js.map +0 -1
package/bin/cli
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,37 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
2
|
var __create = Object.create;
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
8
|
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
+
key = keys[i];
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
+
get: ((k) => from[k]).bind(null, key),
|
|
13
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
16
17
|
};
|
|
17
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// ../cli/src/actions/templates.ts
|
|
34
|
-
var STARTER_ZMODEL = `// This is a sample model to get you started.
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
+
value: mod,
|
|
20
|
+
enumerable: true
|
|
21
|
+
}) : target, mod));
|
|
22
|
+
//#endregion
|
|
23
|
+
let colors = require("colors");
|
|
24
|
+
colors = __toESM(colors, 1);
|
|
25
|
+
let commander = require("commander");
|
|
26
|
+
let node_child_process = require("node:child_process");
|
|
27
|
+
let node_fs = require("node:fs");
|
|
28
|
+
node_fs = __toESM(node_fs, 1);
|
|
29
|
+
let ora = require("ora");
|
|
30
|
+
ora = __toESM(ora, 1);
|
|
31
|
+
//#region ../cli/src/actions/templates.ts
|
|
32
|
+
const STARTER_ZMODEL = `// This is a sample model to get you started.
|
|
35
33
|
|
|
36
34
|
/// A sample data source using local sqlite db.
|
|
37
35
|
datasource db {
|
|
@@ -58,7 +56,7 @@ model Post {
|
|
|
58
56
|
authorId String
|
|
59
57
|
}
|
|
60
58
|
`;
|
|
61
|
-
|
|
59
|
+
const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';
|
|
62
60
|
import { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';
|
|
63
61
|
import SQLite from 'better-sqlite3';
|
|
64
62
|
import { schema } from './zenstack/schema';
|
|
@@ -88,139 +86,116 @@ async function main() {
|
|
|
88
86
|
|
|
89
87
|
main();
|
|
90
88
|
`;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/index.ts
|
|
91
|
+
const npmAgent = process.env["npm_config_user_agent"];
|
|
92
|
+
let agent = "npm";
|
|
93
|
+
let agentExec = "npx";
|
|
94
|
+
let saveDev = "--save-dev";
|
|
97
95
|
if (npmAgent?.includes("pnpm")) {
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
agent = "pnpm";
|
|
97
|
+
agentExec = "pnpm";
|
|
100
98
|
} else if (npmAgent?.includes("yarn")) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
agent = "yarn";
|
|
100
|
+
agentExec = "npx";
|
|
101
|
+
saveDev = "--dev";
|
|
104
102
|
} else if (npmAgent?.includes("bun")) {
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
agent = "bun";
|
|
104
|
+
agentExec = "bun";
|
|
107
105
|
}
|
|
108
|
-
|
|
106
|
+
const program = new commander.Command("create-zenstack");
|
|
109
107
|
program.arguments("<project-name>").action((projectName) => {
|
|
110
|
-
|
|
108
|
+
initProject(projectName);
|
|
111
109
|
});
|
|
112
110
|
program.parse(process.argv);
|
|
113
111
|
function initProject(name) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
import_node_fs.default.writeFileSync("zenstack/schema.zmodel", STARTER_ZMODEL);
|
|
183
|
-
import_node_fs.default.writeFileSync("main.ts", STARTER_MAIN_TS);
|
|
184
|
-
runCommand(`${agentExec} zen generate`, "Running `zen generate`");
|
|
185
|
-
runCommand(`${agentExec} zen db push`, "Running `zen db push`");
|
|
186
|
-
console.log(`Running \`${agent} run dev\``);
|
|
187
|
-
(0, import_node_child_process.execSync)(`${agent} run dev`, {
|
|
188
|
-
stdio: "inherit"
|
|
189
|
-
});
|
|
190
|
-
console.log(import_colors.default.green("Project setup completed!"));
|
|
112
|
+
if (node_fs.default.existsSync(name)) {
|
|
113
|
+
console.log(colors.default.red(`Directory ${name} already exists.`));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
node_fs.default.mkdirSync(name);
|
|
117
|
+
process.chdir(name);
|
|
118
|
+
console.log(colors.default.gray(`Using package manager: ${agent}`));
|
|
119
|
+
node_fs.default.writeFileSync("package.json", JSON.stringify({
|
|
120
|
+
name: "zenstack-app",
|
|
121
|
+
version: "1.0.0",
|
|
122
|
+
description: "Scaffolded with create-zenstack",
|
|
123
|
+
type: "module",
|
|
124
|
+
scripts: { dev: "tsx main.ts" },
|
|
125
|
+
license: "ISC"
|
|
126
|
+
}, null, 2));
|
|
127
|
+
createVsCodeConfig();
|
|
128
|
+
for (const pkg of [
|
|
129
|
+
{
|
|
130
|
+
name: "@zenstackhq/cli@latest",
|
|
131
|
+
dev: true
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "@zenstackhq/schema@latest",
|
|
135
|
+
dev: false
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "@zenstackhq/orm@latest",
|
|
139
|
+
dev: false
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "better-sqlite3",
|
|
143
|
+
dev: false
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "@types/better-sqlite3",
|
|
147
|
+
dev: true
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "typescript",
|
|
151
|
+
dev: true
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "tsx",
|
|
155
|
+
dev: true
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
name: "@types/node",
|
|
159
|
+
dev: true
|
|
160
|
+
}
|
|
161
|
+
]) installPackage(pkg);
|
|
162
|
+
node_fs.default.writeFileSync("tsconfig.json", JSON.stringify({ compilerOptions: {
|
|
163
|
+
module: "esnext",
|
|
164
|
+
target: "esnext",
|
|
165
|
+
moduleResolution: "bundler",
|
|
166
|
+
sourceMap: true,
|
|
167
|
+
outDir: "dist",
|
|
168
|
+
strict: true,
|
|
169
|
+
skipLibCheck: true,
|
|
170
|
+
esModuleInterop: true
|
|
171
|
+
} }, null, 2));
|
|
172
|
+
node_fs.default.mkdirSync("zenstack");
|
|
173
|
+
node_fs.default.writeFileSync("zenstack/schema.zmodel", STARTER_ZMODEL);
|
|
174
|
+
node_fs.default.writeFileSync("main.ts", STARTER_MAIN_TS);
|
|
175
|
+
runCommand(`${agentExec} zen generate`, "Running `zen generate`");
|
|
176
|
+
runCommand(`${agentExec} zen db push`, "Running `zen db push`");
|
|
177
|
+
console.log(`Running \`${agent} run dev\``);
|
|
178
|
+
(0, node_child_process.execSync)(`${agent} run dev`, { stdio: "inherit" });
|
|
179
|
+
console.log(colors.default.green("Project setup completed!"));
|
|
191
180
|
}
|
|
192
|
-
__name(initProject, "initProject");
|
|
193
181
|
function installPackage(pkg) {
|
|
194
|
-
|
|
182
|
+
runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ""}`, `Installing "${pkg.name}"`);
|
|
195
183
|
}
|
|
196
|
-
__name(installPackage, "installPackage");
|
|
197
184
|
function runCommand(cmd, status, stdio = "ignore") {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
throw e;
|
|
207
|
-
}
|
|
185
|
+
const spinner = (0, ora.default)(status).start();
|
|
186
|
+
try {
|
|
187
|
+
(0, node_child_process.execSync)(cmd, { stdio });
|
|
188
|
+
spinner.succeed();
|
|
189
|
+
} catch (e) {
|
|
190
|
+
spinner.fail();
|
|
191
|
+
throw e;
|
|
192
|
+
}
|
|
208
193
|
}
|
|
209
|
-
__name(runCommand, "runCommand");
|
|
210
194
|
function createVsCodeConfig() {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
import_node_fs.default.writeFileSync(".vscode/settings.json", JSON.stringify({
|
|
215
|
-
"files.associations": {
|
|
216
|
-
"*.zmodel": "zmodel-v3"
|
|
217
|
-
}
|
|
218
|
-
}, null, 4));
|
|
219
|
-
import_node_fs.default.writeFileSync(".vscode/extensions.json", JSON.stringify({
|
|
220
|
-
recommendations: [
|
|
221
|
-
"zenstack.zenstack-v3"
|
|
222
|
-
]
|
|
223
|
-
}, null, 4));
|
|
195
|
+
node_fs.default.mkdirSync(".vscode", { recursive: true });
|
|
196
|
+
node_fs.default.writeFileSync(".vscode/settings.json", JSON.stringify({ "files.associations": { "*.zmodel": "zmodel-v3" } }, null, 4));
|
|
197
|
+
node_fs.default.writeFileSync(".vscode/extensions.json", JSON.stringify({ recommendations: ["zenstack.zenstack-v3"] }, null, 4));
|
|
224
198
|
}
|
|
225
|
-
|
|
199
|
+
//#endregion
|
|
200
|
+
|
|
226
201
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Command","fs"],"sources":["../../cli/src/actions/templates.ts","../src/index.ts"],"sourcesContent":["export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id], onDelete: Cascade)\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport SQLite from 'better-sqlite3';\nimport { schema } from './zenstack/schema';\n\nasync function main() {\n const db = new ZenStackClient(schema, {\n dialect: new SqliteDialect({\n database: new SQLite('./zenstack/dev.db'),\n }),\n });\n const user = await db.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n","import colors from 'colors';\nimport { Command } from 'commander';\nimport { execSync, type StdioOptions } from 'node:child_process';\nimport fs from 'node:fs';\nimport ora from 'ora';\nimport { STARTER_MAIN_TS, STARTER_ZMODEL } from './templates';\n\n// detect package manager\nconst npmAgent = process.env['npm_config_user_agent'];\nlet agent = 'npm';\nlet agentExec = 'npx';\nlet saveDev = '--save-dev';\n\nif (npmAgent?.includes('pnpm')) {\n agent = 'pnpm';\n agentExec = 'pnpm';\n} else if (npmAgent?.includes('yarn')) {\n agent = 'yarn';\n agentExec = 'npx';\n saveDev = '--dev';\n} else if (npmAgent?.includes('bun')) {\n agent = 'bun';\n agentExec = 'bun';\n}\n\nconst program = new Command('create-zenstack');\n\nprogram.arguments('<project-name>').action((projectName) => {\n initProject(projectName);\n});\n\nprogram.parse(process.argv);\n\nfunction initProject(name: string) {\n // create folder\n if (fs.existsSync(name)) {\n console.log(colors.red(`Directory ${name} already exists.`));\n process.exit(1);\n }\n fs.mkdirSync(name);\n process.chdir(name);\n\n console.log(colors.gray(`Using package manager: ${agent}`));\n\n // create package.json\n fs.writeFileSync(\n 'package.json',\n JSON.stringify(\n {\n name: 'zenstack-app',\n version: '1.0.0',\n description: 'Scaffolded with create-zenstack',\n type: 'module',\n scripts: {\n dev: 'tsx main.ts',\n },\n license: 'ISC',\n },\n null,\n 2,\n ),\n );\n\n // create VSCode config files\n createVsCodeConfig();\n\n // install packages\n const packages = [\n { name: '@zenstackhq/cli@latest', dev: true },\n { name: '@zenstackhq/schema@latest', dev: false },\n { name: '@zenstackhq/orm@latest', dev: false },\n { name: 'better-sqlite3', dev: false },\n { name: '@types/better-sqlite3', dev: true },\n { name: 'typescript', dev: true },\n { name: 'tsx', dev: true },\n { name: '@types/node', dev: true },\n ];\n for (const pkg of packages) {\n installPackage(pkg);\n }\n\n // create tsconfig.json\n fs.writeFileSync(\n 'tsconfig.json',\n JSON.stringify(\n {\n compilerOptions: {\n module: 'esnext',\n target: 'esnext',\n moduleResolution: 'bundler',\n sourceMap: true,\n outDir: 'dist',\n strict: true,\n skipLibCheck: true,\n esModuleInterop: true,\n },\n },\n null,\n 2,\n ),\n );\n\n // create schema.zmodel\n fs.mkdirSync('zenstack');\n fs.writeFileSync('zenstack/schema.zmodel', STARTER_ZMODEL);\n\n // create main.ts\n fs.writeFileSync('main.ts', STARTER_MAIN_TS);\n\n // run `zen generate`\n runCommand(`${agentExec} zen generate`, 'Running `zen generate`');\n\n // run `zen db push`\n runCommand(`${agentExec} zen db push`, 'Running `zen db push`');\n\n // run `$agent run dev`\n console.log(`Running \\`${agent} run dev\\``);\n execSync(`${agent} run dev`, { stdio: 'inherit' });\n console.log(colors.green('Project setup completed!'));\n}\n\nfunction installPackage(pkg: { name: string; dev: boolean }) {\n runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ''}`, `Installing \"${pkg.name}\"`);\n}\n\nfunction runCommand(cmd: string, status: string, stdio: StdioOptions = 'ignore') {\n const spinner = ora(status).start();\n try {\n execSync(cmd, { stdio });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n}\n\nfunction createVsCodeConfig() {\n fs.mkdirSync('.vscode', { recursive: true });\n fs.writeFileSync(\n '.vscode/settings.json',\n JSON.stringify(\n {\n 'files.associations': {\n '*.zmodel': 'zmodel-v3',\n },\n },\n null,\n 4,\n ),\n );\n fs.writeFileSync('.vscode/extensions.json', JSON.stringify({ recommendations: ['zenstack.zenstack-v3'] }, null, 4));\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { }
|
|
1
|
+
export { };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import colors from "colors";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import ora from "ora";
|
|
6
|
+
//#region ../cli/src/actions/templates.ts
|
|
7
|
+
const STARTER_ZMODEL = `// This is a sample model to get you started.
|
|
8
|
+
|
|
9
|
+
/// A sample data source using local sqlite db.
|
|
10
|
+
datasource db {
|
|
11
|
+
provider = 'sqlite'
|
|
12
|
+
url = 'file:./dev.db'
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/// User model
|
|
16
|
+
model User {
|
|
17
|
+
id String @id @default(cuid())
|
|
18
|
+
email String @unique @email @length(6, 32)
|
|
19
|
+
posts Post[]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Post model
|
|
23
|
+
model Post {
|
|
24
|
+
id String @id @default(cuid())
|
|
25
|
+
createdAt DateTime @default(now())
|
|
26
|
+
updatedAt DateTime @updatedAt
|
|
27
|
+
title String @length(1, 256)
|
|
28
|
+
content String
|
|
29
|
+
published Boolean @default(false)
|
|
30
|
+
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
|
|
31
|
+
authorId String
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';
|
|
35
|
+
import { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';
|
|
36
|
+
import SQLite from 'better-sqlite3';
|
|
37
|
+
import { schema } from './zenstack/schema';
|
|
38
|
+
|
|
39
|
+
async function main() {
|
|
40
|
+
const db = new ZenStackClient(schema, {
|
|
41
|
+
dialect: new SqliteDialect({
|
|
42
|
+
database: new SQLite('./zenstack/dev.db'),
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
const user = await db.user.create({
|
|
46
|
+
data: {
|
|
47
|
+
email: 'test@zenstack.dev',
|
|
48
|
+
posts: {
|
|
49
|
+
create: [
|
|
50
|
+
{
|
|
51
|
+
title: 'Hello World',
|
|
52
|
+
content: 'This is a test post',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
include: { posts: true }
|
|
58
|
+
});
|
|
59
|
+
console.log('User created:', user);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
main();
|
|
63
|
+
`;
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/index.ts
|
|
66
|
+
const npmAgent = process.env["npm_config_user_agent"];
|
|
67
|
+
let agent = "npm";
|
|
68
|
+
let agentExec = "npx";
|
|
69
|
+
let saveDev = "--save-dev";
|
|
70
|
+
if (npmAgent?.includes("pnpm")) {
|
|
71
|
+
agent = "pnpm";
|
|
72
|
+
agentExec = "pnpm";
|
|
73
|
+
} else if (npmAgent?.includes("yarn")) {
|
|
74
|
+
agent = "yarn";
|
|
75
|
+
agentExec = "npx";
|
|
76
|
+
saveDev = "--dev";
|
|
77
|
+
} else if (npmAgent?.includes("bun")) {
|
|
78
|
+
agent = "bun";
|
|
79
|
+
agentExec = "bun";
|
|
80
|
+
}
|
|
81
|
+
const program = new Command("create-zenstack");
|
|
82
|
+
program.arguments("<project-name>").action((projectName) => {
|
|
83
|
+
initProject(projectName);
|
|
84
|
+
});
|
|
85
|
+
program.parse(process.argv);
|
|
86
|
+
function initProject(name) {
|
|
87
|
+
if (fs.existsSync(name)) {
|
|
88
|
+
console.log(colors.red(`Directory ${name} already exists.`));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
fs.mkdirSync(name);
|
|
92
|
+
process.chdir(name);
|
|
93
|
+
console.log(colors.gray(`Using package manager: ${agent}`));
|
|
94
|
+
fs.writeFileSync("package.json", JSON.stringify({
|
|
95
|
+
name: "zenstack-app",
|
|
96
|
+
version: "1.0.0",
|
|
97
|
+
description: "Scaffolded with create-zenstack",
|
|
98
|
+
type: "module",
|
|
99
|
+
scripts: { dev: "tsx main.ts" },
|
|
100
|
+
license: "ISC"
|
|
101
|
+
}, null, 2));
|
|
102
|
+
createVsCodeConfig();
|
|
103
|
+
for (const pkg of [
|
|
104
|
+
{
|
|
105
|
+
name: "@zenstackhq/cli@latest",
|
|
106
|
+
dev: true
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "@zenstackhq/schema@latest",
|
|
110
|
+
dev: false
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "@zenstackhq/orm@latest",
|
|
114
|
+
dev: false
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: "better-sqlite3",
|
|
118
|
+
dev: false
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "@types/better-sqlite3",
|
|
122
|
+
dev: true
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "typescript",
|
|
126
|
+
dev: true
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "tsx",
|
|
130
|
+
dev: true
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "@types/node",
|
|
134
|
+
dev: true
|
|
135
|
+
}
|
|
136
|
+
]) installPackage(pkg);
|
|
137
|
+
fs.writeFileSync("tsconfig.json", JSON.stringify({ compilerOptions: {
|
|
138
|
+
module: "esnext",
|
|
139
|
+
target: "esnext",
|
|
140
|
+
moduleResolution: "bundler",
|
|
141
|
+
sourceMap: true,
|
|
142
|
+
outDir: "dist",
|
|
143
|
+
strict: true,
|
|
144
|
+
skipLibCheck: true,
|
|
145
|
+
esModuleInterop: true
|
|
146
|
+
} }, null, 2));
|
|
147
|
+
fs.mkdirSync("zenstack");
|
|
148
|
+
fs.writeFileSync("zenstack/schema.zmodel", STARTER_ZMODEL);
|
|
149
|
+
fs.writeFileSync("main.ts", STARTER_MAIN_TS);
|
|
150
|
+
runCommand(`${agentExec} zen generate`, "Running `zen generate`");
|
|
151
|
+
runCommand(`${agentExec} zen db push`, "Running `zen db push`");
|
|
152
|
+
console.log(`Running \`${agent} run dev\``);
|
|
153
|
+
execSync(`${agent} run dev`, { stdio: "inherit" });
|
|
154
|
+
console.log(colors.green("Project setup completed!"));
|
|
155
|
+
}
|
|
156
|
+
function installPackage(pkg) {
|
|
157
|
+
runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ""}`, `Installing "${pkg.name}"`);
|
|
158
|
+
}
|
|
159
|
+
function runCommand(cmd, status, stdio = "ignore") {
|
|
160
|
+
const spinner = ora(status).start();
|
|
161
|
+
try {
|
|
162
|
+
execSync(cmd, { stdio });
|
|
163
|
+
spinner.succeed();
|
|
164
|
+
} catch (e) {
|
|
165
|
+
spinner.fail();
|
|
166
|
+
throw e;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function createVsCodeConfig() {
|
|
170
|
+
fs.mkdirSync(".vscode", { recursive: true });
|
|
171
|
+
fs.writeFileSync(".vscode/settings.json", JSON.stringify({ "files.associations": { "*.zmodel": "zmodel-v3" } }, null, 4));
|
|
172
|
+
fs.writeFileSync(".vscode/extensions.json", JSON.stringify({ recommendations: ["zenstack.zenstack-v3"] }, null, 4));
|
|
173
|
+
}
|
|
174
|
+
//#endregion
|
|
175
|
+
export {};
|
|
176
|
+
|
|
177
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../cli/src/actions/templates.ts","../src/index.ts"],"sourcesContent":["export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id], onDelete: Cascade)\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport SQLite from 'better-sqlite3';\nimport { schema } from './zenstack/schema';\n\nasync function main() {\n const db = new ZenStackClient(schema, {\n dialect: new SqliteDialect({\n database: new SQLite('./zenstack/dev.db'),\n }),\n });\n const user = await db.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n","import colors from 'colors';\nimport { Command } from 'commander';\nimport { execSync, type StdioOptions } from 'node:child_process';\nimport fs from 'node:fs';\nimport ora from 'ora';\nimport { STARTER_MAIN_TS, STARTER_ZMODEL } from './templates';\n\n// detect package manager\nconst npmAgent = process.env['npm_config_user_agent'];\nlet agent = 'npm';\nlet agentExec = 'npx';\nlet saveDev = '--save-dev';\n\nif (npmAgent?.includes('pnpm')) {\n agent = 'pnpm';\n agentExec = 'pnpm';\n} else if (npmAgent?.includes('yarn')) {\n agent = 'yarn';\n agentExec = 'npx';\n saveDev = '--dev';\n} else if (npmAgent?.includes('bun')) {\n agent = 'bun';\n agentExec = 'bun';\n}\n\nconst program = new Command('create-zenstack');\n\nprogram.arguments('<project-name>').action((projectName) => {\n initProject(projectName);\n});\n\nprogram.parse(process.argv);\n\nfunction initProject(name: string) {\n // create folder\n if (fs.existsSync(name)) {\n console.log(colors.red(`Directory ${name} already exists.`));\n process.exit(1);\n }\n fs.mkdirSync(name);\n process.chdir(name);\n\n console.log(colors.gray(`Using package manager: ${agent}`));\n\n // create package.json\n fs.writeFileSync(\n 'package.json',\n JSON.stringify(\n {\n name: 'zenstack-app',\n version: '1.0.0',\n description: 'Scaffolded with create-zenstack',\n type: 'module',\n scripts: {\n dev: 'tsx main.ts',\n },\n license: 'ISC',\n },\n null,\n 2,\n ),\n );\n\n // create VSCode config files\n createVsCodeConfig();\n\n // install packages\n const packages = [\n { name: '@zenstackhq/cli@latest', dev: true },\n { name: '@zenstackhq/schema@latest', dev: false },\n { name: '@zenstackhq/orm@latest', dev: false },\n { name: 'better-sqlite3', dev: false },\n { name: '@types/better-sqlite3', dev: true },\n { name: 'typescript', dev: true },\n { name: 'tsx', dev: true },\n { name: '@types/node', dev: true },\n ];\n for (const pkg of packages) {\n installPackage(pkg);\n }\n\n // create tsconfig.json\n fs.writeFileSync(\n 'tsconfig.json',\n JSON.stringify(\n {\n compilerOptions: {\n module: 'esnext',\n target: 'esnext',\n moduleResolution: 'bundler',\n sourceMap: true,\n outDir: 'dist',\n strict: true,\n skipLibCheck: true,\n esModuleInterop: true,\n },\n },\n null,\n 2,\n ),\n );\n\n // create schema.zmodel\n fs.mkdirSync('zenstack');\n fs.writeFileSync('zenstack/schema.zmodel', STARTER_ZMODEL);\n\n // create main.ts\n fs.writeFileSync('main.ts', STARTER_MAIN_TS);\n\n // run `zen generate`\n runCommand(`${agentExec} zen generate`, 'Running `zen generate`');\n\n // run `zen db push`\n runCommand(`${agentExec} zen db push`, 'Running `zen db push`');\n\n // run `$agent run dev`\n console.log(`Running \\`${agent} run dev\\``);\n execSync(`${agent} run dev`, { stdio: 'inherit' });\n console.log(colors.green('Project setup completed!'));\n}\n\nfunction installPackage(pkg: { name: string; dev: boolean }) {\n runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ''}`, `Installing \"${pkg.name}\"`);\n}\n\nfunction runCommand(cmd: string, status: string, stdio: StdioOptions = 'ignore') {\n const spinner = ora(status).start();\n try {\n execSync(cmd, { stdio });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n}\n\nfunction createVsCodeConfig() {\n fs.mkdirSync('.vscode', { recursive: true });\n fs.writeFileSync(\n '.vscode/settings.json',\n JSON.stringify(\n {\n 'files.associations': {\n '*.zmodel': 'zmodel-v3',\n },\n },\n null,\n 4,\n ),\n );\n fs.writeFileSync('.vscode/extensions.json', JSON.stringify({ recommendations: ['zenstack.zenstack-v3'] }, null, 4));\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "create-zenstack",
|
|
3
3
|
"displayName": "Create ZenStack",
|
|
4
4
|
"description": "Create a new ZenStack project",
|
|
5
|
-
"version": "3.
|
|
5
|
+
"version": "3.6.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ZenStack Team",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"exports": {
|
|
25
25
|
".": {
|
|
26
26
|
"import": {
|
|
27
|
-
"types": "./dist/index.d.
|
|
28
|
-
"default": "./dist/index.
|
|
27
|
+
"types": "./dist/index.d.mts",
|
|
28
|
+
"default": "./dist/index.mjs"
|
|
29
29
|
},
|
|
30
30
|
"require": {
|
|
31
31
|
"types": "./dist/index.d.cts",
|
|
@@ -39,12 +39,14 @@
|
|
|
39
39
|
"ora": "^5.4.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@
|
|
43
|
-
"@zenstackhq/
|
|
42
|
+
"@types/node": "^20.19.0",
|
|
43
|
+
"@zenstackhq/eslint-config": "3.6.0",
|
|
44
|
+
"@zenstackhq/tsdown-config": "3.6.0",
|
|
45
|
+
"@zenstackhq/typescript-config": "3.6.0"
|
|
44
46
|
},
|
|
45
47
|
"funding": "https://github.com/sponsors/zenstackhq",
|
|
46
48
|
"scripts": {
|
|
47
|
-
"build": "tsc --noEmit &&
|
|
49
|
+
"build": "tsc --noEmit && tsdown",
|
|
48
50
|
"lint": "eslint src --ext ts",
|
|
49
51
|
"pack": "pnpm pack"
|
|
50
52
|
}
|
package/dist/index.d.ts
DELETED
package/dist/index.js
DELETED
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
|
|
4
|
-
// src/index.ts
|
|
5
|
-
import colors from "colors";
|
|
6
|
-
import { Command } from "commander";
|
|
7
|
-
import { execSync } from "child_process";
|
|
8
|
-
import fs from "fs";
|
|
9
|
-
import ora from "ora";
|
|
10
|
-
|
|
11
|
-
// ../cli/src/actions/templates.ts
|
|
12
|
-
var STARTER_ZMODEL = `// This is a sample model to get you started.
|
|
13
|
-
|
|
14
|
-
/// A sample data source using local sqlite db.
|
|
15
|
-
datasource db {
|
|
16
|
-
provider = 'sqlite'
|
|
17
|
-
url = 'file:./dev.db'
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/// User model
|
|
21
|
-
model User {
|
|
22
|
-
id String @id @default(cuid())
|
|
23
|
-
email String @unique @email @length(6, 32)
|
|
24
|
-
posts Post[]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/// Post model
|
|
28
|
-
model Post {
|
|
29
|
-
id String @id @default(cuid())
|
|
30
|
-
createdAt DateTime @default(now())
|
|
31
|
-
updatedAt DateTime @updatedAt
|
|
32
|
-
title String @length(1, 256)
|
|
33
|
-
content String
|
|
34
|
-
published Boolean @default(false)
|
|
35
|
-
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
|
|
36
|
-
authorId String
|
|
37
|
-
}
|
|
38
|
-
`;
|
|
39
|
-
var STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';
|
|
40
|
-
import { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';
|
|
41
|
-
import SQLite from 'better-sqlite3';
|
|
42
|
-
import { schema } from './zenstack/schema';
|
|
43
|
-
|
|
44
|
-
async function main() {
|
|
45
|
-
const db = new ZenStackClient(schema, {
|
|
46
|
-
dialect: new SqliteDialect({
|
|
47
|
-
database: new SQLite('./zenstack/dev.db'),
|
|
48
|
-
}),
|
|
49
|
-
});
|
|
50
|
-
const user = await db.user.create({
|
|
51
|
-
data: {
|
|
52
|
-
email: 'test@zenstack.dev',
|
|
53
|
-
posts: {
|
|
54
|
-
create: [
|
|
55
|
-
{
|
|
56
|
-
title: 'Hello World',
|
|
57
|
-
content: 'This is a test post',
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
include: { posts: true }
|
|
63
|
-
});
|
|
64
|
-
console.log('User created:', user);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
main();
|
|
68
|
-
`;
|
|
69
|
-
|
|
70
|
-
// src/index.ts
|
|
71
|
-
var npmAgent = process.env["npm_config_user_agent"];
|
|
72
|
-
var agent = "npm";
|
|
73
|
-
var agentExec = "npx";
|
|
74
|
-
var saveDev = "--save-dev";
|
|
75
|
-
if (npmAgent?.includes("pnpm")) {
|
|
76
|
-
agent = "pnpm";
|
|
77
|
-
agentExec = "pnpm";
|
|
78
|
-
} else if (npmAgent?.includes("yarn")) {
|
|
79
|
-
agent = "yarn";
|
|
80
|
-
agentExec = "npx";
|
|
81
|
-
saveDev = "--dev";
|
|
82
|
-
} else if (npmAgent?.includes("bun")) {
|
|
83
|
-
agent = "bun";
|
|
84
|
-
agentExec = "bun";
|
|
85
|
-
}
|
|
86
|
-
var program = new Command("create-zenstack");
|
|
87
|
-
program.arguments("<project-name>").action((projectName) => {
|
|
88
|
-
initProject(projectName);
|
|
89
|
-
});
|
|
90
|
-
program.parse(process.argv);
|
|
91
|
-
function initProject(name) {
|
|
92
|
-
if (fs.existsSync(name)) {
|
|
93
|
-
console.log(colors.red(`Directory ${name} already exists.`));
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
fs.mkdirSync(name);
|
|
97
|
-
process.chdir(name);
|
|
98
|
-
console.log(colors.gray(`Using package manager: ${agent}`));
|
|
99
|
-
fs.writeFileSync("package.json", JSON.stringify({
|
|
100
|
-
name: "zenstack-app",
|
|
101
|
-
version: "1.0.0",
|
|
102
|
-
description: "Scaffolded with create-zenstack",
|
|
103
|
-
type: "module",
|
|
104
|
-
scripts: {
|
|
105
|
-
dev: "tsx main.ts"
|
|
106
|
-
},
|
|
107
|
-
license: "ISC"
|
|
108
|
-
}, null, 2));
|
|
109
|
-
createVsCodeConfig();
|
|
110
|
-
const packages = [
|
|
111
|
-
{
|
|
112
|
-
name: "@zenstackhq/cli@latest",
|
|
113
|
-
dev: true
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
name: "@zenstackhq/schema@latest",
|
|
117
|
-
dev: false
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
name: "@zenstackhq/orm@latest",
|
|
121
|
-
dev: false
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
name: "better-sqlite3",
|
|
125
|
-
dev: false
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
name: "@types/better-sqlite3",
|
|
129
|
-
dev: true
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
name: "typescript",
|
|
133
|
-
dev: true
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
name: "tsx",
|
|
137
|
-
dev: true
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
name: "@types/node",
|
|
141
|
-
dev: true
|
|
142
|
-
}
|
|
143
|
-
];
|
|
144
|
-
for (const pkg of packages) {
|
|
145
|
-
installPackage(pkg);
|
|
146
|
-
}
|
|
147
|
-
fs.writeFileSync("tsconfig.json", JSON.stringify({
|
|
148
|
-
compilerOptions: {
|
|
149
|
-
module: "esnext",
|
|
150
|
-
target: "esnext",
|
|
151
|
-
moduleResolution: "bundler",
|
|
152
|
-
sourceMap: true,
|
|
153
|
-
outDir: "dist",
|
|
154
|
-
strict: true,
|
|
155
|
-
skipLibCheck: true,
|
|
156
|
-
esModuleInterop: true
|
|
157
|
-
}
|
|
158
|
-
}, null, 2));
|
|
159
|
-
fs.mkdirSync("zenstack");
|
|
160
|
-
fs.writeFileSync("zenstack/schema.zmodel", STARTER_ZMODEL);
|
|
161
|
-
fs.writeFileSync("main.ts", STARTER_MAIN_TS);
|
|
162
|
-
runCommand(`${agentExec} zen generate`, "Running `zen generate`");
|
|
163
|
-
runCommand(`${agentExec} zen db push`, "Running `zen db push`");
|
|
164
|
-
console.log(`Running \`${agent} run dev\``);
|
|
165
|
-
execSync(`${agent} run dev`, {
|
|
166
|
-
stdio: "inherit"
|
|
167
|
-
});
|
|
168
|
-
console.log(colors.green("Project setup completed!"));
|
|
169
|
-
}
|
|
170
|
-
__name(initProject, "initProject");
|
|
171
|
-
function installPackage(pkg) {
|
|
172
|
-
runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ""}`, `Installing "${pkg.name}"`);
|
|
173
|
-
}
|
|
174
|
-
__name(installPackage, "installPackage");
|
|
175
|
-
function runCommand(cmd, status, stdio = "ignore") {
|
|
176
|
-
const spinner = ora(status).start();
|
|
177
|
-
try {
|
|
178
|
-
execSync(cmd, {
|
|
179
|
-
stdio
|
|
180
|
-
});
|
|
181
|
-
spinner.succeed();
|
|
182
|
-
} catch (e) {
|
|
183
|
-
spinner.fail();
|
|
184
|
-
throw e;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
__name(runCommand, "runCommand");
|
|
188
|
-
function createVsCodeConfig() {
|
|
189
|
-
fs.mkdirSync(".vscode", {
|
|
190
|
-
recursive: true
|
|
191
|
-
});
|
|
192
|
-
fs.writeFileSync(".vscode/settings.json", JSON.stringify({
|
|
193
|
-
"files.associations": {
|
|
194
|
-
"*.zmodel": "zmodel-v3"
|
|
195
|
-
}
|
|
196
|
-
}, null, 4));
|
|
197
|
-
fs.writeFileSync(".vscode/extensions.json", JSON.stringify({
|
|
198
|
-
recommendations: [
|
|
199
|
-
"zenstack.zenstack-v3"
|
|
200
|
-
]
|
|
201
|
-
}, null, 4));
|
|
202
|
-
}
|
|
203
|
-
__name(createVsCodeConfig, "createVsCodeConfig");
|
|
204
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../cli/src/actions/templates.ts"],"sourcesContent":["import colors from 'colors';\nimport { Command } from 'commander';\nimport { execSync, type StdioOptions } from 'node:child_process';\nimport fs from 'node:fs';\nimport ora from 'ora';\nimport { STARTER_MAIN_TS, STARTER_ZMODEL } from './templates';\n\n// detect package manager\nconst npmAgent = process.env['npm_config_user_agent'];\nlet agent = 'npm';\nlet agentExec = 'npx';\nlet saveDev = '--save-dev';\n\nif (npmAgent?.includes('pnpm')) {\n agent = 'pnpm';\n agentExec = 'pnpm';\n} else if (npmAgent?.includes('yarn')) {\n agent = 'yarn';\n agentExec = 'npx';\n saveDev = '--dev';\n} else if (npmAgent?.includes('bun')) {\n agent = 'bun';\n agentExec = 'bun';\n}\n\nconst program = new Command('create-zenstack');\n\nprogram.arguments('<project-name>').action((projectName) => {\n initProject(projectName);\n});\n\nprogram.parse(process.argv);\n\nfunction initProject(name: string) {\n // create folder\n if (fs.existsSync(name)) {\n console.log(colors.red(`Directory ${name} already exists.`));\n process.exit(1);\n }\n fs.mkdirSync(name);\n process.chdir(name);\n\n console.log(colors.gray(`Using package manager: ${agent}`));\n\n // create package.json\n fs.writeFileSync(\n 'package.json',\n JSON.stringify(\n {\n name: 'zenstack-app',\n version: '1.0.0',\n description: 'Scaffolded with create-zenstack',\n type: 'module',\n scripts: {\n dev: 'tsx main.ts',\n },\n license: 'ISC',\n },\n null,\n 2,\n ),\n );\n\n // create VSCode config files\n createVsCodeConfig();\n\n // install packages\n const packages = [\n { name: '@zenstackhq/cli@latest', dev: true },\n { name: '@zenstackhq/schema@latest', dev: false },\n { name: '@zenstackhq/orm@latest', dev: false },\n { name: 'better-sqlite3', dev: false },\n { name: '@types/better-sqlite3', dev: true },\n { name: 'typescript', dev: true },\n { name: 'tsx', dev: true },\n { name: '@types/node', dev: true },\n ];\n for (const pkg of packages) {\n installPackage(pkg);\n }\n\n // create tsconfig.json\n fs.writeFileSync(\n 'tsconfig.json',\n JSON.stringify(\n {\n compilerOptions: {\n module: 'esnext',\n target: 'esnext',\n moduleResolution: 'bundler',\n sourceMap: true,\n outDir: 'dist',\n strict: true,\n skipLibCheck: true,\n esModuleInterop: true,\n },\n },\n null,\n 2,\n ),\n );\n\n // create schema.zmodel\n fs.mkdirSync('zenstack');\n fs.writeFileSync('zenstack/schema.zmodel', STARTER_ZMODEL);\n\n // create main.ts\n fs.writeFileSync('main.ts', STARTER_MAIN_TS);\n\n // run `zen generate`\n runCommand(`${agentExec} zen generate`, 'Running `zen generate`');\n\n // run `zen db push`\n runCommand(`${agentExec} zen db push`, 'Running `zen db push`');\n\n // run `$agent run dev`\n console.log(`Running \\`${agent} run dev\\``);\n execSync(`${agent} run dev`, { stdio: 'inherit' });\n console.log(colors.green('Project setup completed!'));\n}\n\nfunction installPackage(pkg: { name: string; dev: boolean }) {\n runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ''}`, `Installing \"${pkg.name}\"`);\n}\n\nfunction runCommand(cmd: string, status: string, stdio: StdioOptions = 'ignore') {\n const spinner = ora(status).start();\n try {\n execSync(cmd, { stdio });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n}\n\nfunction createVsCodeConfig() {\n fs.mkdirSync('.vscode', { recursive: true });\n fs.writeFileSync(\n '.vscode/settings.json',\n JSON.stringify(\n {\n 'files.associations': {\n '*.zmodel': 'zmodel-v3',\n },\n },\n null,\n 4,\n ),\n );\n fs.writeFileSync('.vscode/extensions.json', JSON.stringify({ recommendations: ['zenstack.zenstack-v3'] }, null, 4));\n}\n","export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id], onDelete: Cascade)\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport SQLite from 'better-sqlite3';\nimport { schema } from './zenstack/schema';\n\nasync function main() {\n const db = new ZenStackClient(schema, {\n dialect: new SqliteDialect({\n database: new SQLite('./zenstack/dev.db'),\n }),\n });\n const user = await db.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n"],"mappings":"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","names":["colors","Command","execSync","fs","ora","STARTER_ZMODEL","STARTER_MAIN_TS","npmAgent","process","env","agent","agentExec","saveDev","includes","program","Command","arguments","action","projectName","initProject","parse","argv","name","fs","existsSync","console","log","colors","red","exit","mkdirSync","chdir","gray","writeFileSync","JSON","stringify","version","description","type","scripts","dev","license","createVsCodeConfig","packages","pkg","installPackage","compilerOptions","module","target","moduleResolution","sourceMap","outDir","strict","skipLibCheck","esModuleInterop","STARTER_ZMODEL","STARTER_MAIN_TS","runCommand","execSync","stdio","green","cmd","status","spinner","ora","start","succeed","e","fail","recursive","recommendations"]}
|