Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion docs/cli-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ Set up ZenStack for an existing Next.js + Typescript project.
npx zenstack init [dir]
```

_Options_:

```
-p, --package-manager <pm>: package manager to use: "npm", "yarn", or "pnpm" (default: auto detect)
```

## `generate`

Generates RESTful CRUD API and React hooks from your model.
Expand All @@ -19,7 +25,9 @@ npx zenstack generate [options]
_Options_:

```
--schema <file> schema file (with extension .zmodel) (default: "./zenstack/schema.zmodel")
--schema <file>: schema file (with extension .zmodel) (default: "./zenstack/schema.zmodel")

-p, --package-manager <pm>: package manager to use: "npm", "yarn", or "pnpm" (default: auto detect)
```

## `migrate`
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "zenstack-monorepo",
"version": "0.3.11",
"version": "0.3.12",
"description": "",
"scripts": {
"build": "pnpm -r build",
Expand Down
8 changes: 4 additions & 4 deletions packages/runtime/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/runtime",
"displayName": "ZenStack Runtime Library",
"version": "0.3.11",
"version": "0.3.12",
"description": "Runtime of ZenStack for both client-side and server-side environments.",
"repository": {
"type": "git",
Expand All @@ -26,13 +26,13 @@
"deepcopy": "^2.1.0",
"swr": "^1.3.0",
"tslib": "^2.4.1",
"@types/bcryptjs": "^2.4.2",
"bcryptjs": "^2.4.3",
"zod": "^3.19.1",
"zod-validation-error": "^0.2.1"
},
"peerDependencies": {
"@types/bcryptjs": "^2.4.2",
"bcryptjs": "^2.4.3",
"next": "^12.3.1",
"next": "^12.3.1 || ^13",
"react": "^17.0.2 || ^18",
"react-dom": "^17.0.2 || ^18"
},
Expand Down
2 changes: 1 addition & 1 deletion packages/schema/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"publisher": "zenstack",
"displayName": "ZenStack Language Tools",
"description": "A toolkit for modeling data and access policies in full-stack development with Next.js and Typescript",
"version": "0.3.11",
"version": "0.3.12",
"author": {
"name": "ZenStack Team"
},
Expand Down
24 changes: 17 additions & 7 deletions packages/schema/src/cli/cli-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import fs from 'fs';
import { LangiumServices } from 'langium';
import { NodeFileSystem } from 'langium/node';
import path from 'path';
import { installPackage } from 'src/utils/pkg-utils';
import { installPackage, PackageManagers } from '../utils/pkg-utils';
import { URI } from 'vscode-uri';
import { ZenStackGenerator } from '../generator';
import { GENERATED_CODE_PATH } from '../generator/constants';
Expand All @@ -16,7 +16,15 @@ import { CliError } from './cli-error';
/**
* Initializes an existing project for ZenStack
*/
export async function initProject(projectPath: string) {
export async function initProject(
projectPath: string,
packageManager: PackageManagers | undefined
) {
if (!fs.existsSync(projectPath)) {
console.error(`Path does not exist: ${projectPath}`);
throw new CliError('project path does not exist');
}

const schema = path.join(projectPath, 'zenstack', 'schema.zmodel');
let schemaGenerated = false;

Expand Down Expand Up @@ -96,16 +104,18 @@ model Post {
schemaGenerated = true;
}

installPackage('zenstack', true, undefined, projectPath);
installPackage('@zenstackhq/runtime', false, undefined, projectPath);
installPackage('zenstack', true, packageManager, projectPath);
installPackage('@zenstackhq/runtime', false, packageManager, projectPath);

if (schemaGenerated) {
console.log(`Sample model generated at: ${colors.green(schema)}
console.log(`Sample model generated at: ${colors.blue(schema)}

Please check the following guide on how to model your app:
https://zenstack.dev/#/modeling-your-app.
`);
`);
}

console.log(colors.green('\nProject initialized successfully!'));
}

/**
Expand Down Expand Up @@ -173,7 +183,7 @@ export async function loadDocument(
}

export async function runGenerator(
options: { schema: string; packageManager: string },
options: { schema: string; packageManager: PackageManagers | undefined },
includedGenerators?: string[],
clearOutput = true
) {
Expand Down
20 changes: 13 additions & 7 deletions packages/schema/src/cli/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,31 @@ import { paramCase } from 'change-case';
import colors from 'colors';
import { Command, Option } from 'commander';
import path from 'path';
import { PackageManagers } from '../utils/pkg-utils';
import { ZModelLanguageMetaData } from '../language-server/generated/module';
import telemetry from '../telemetry';
import { execSync } from '../utils/exec-utils';
import { CliError } from './cli-error';
import { initProject, runGenerator } from './cli-util';

export const initAction = async (projectPath: string): Promise<void> => {
export const initAction = async (
projectPath: string,
options: {
packageManager: PackageManagers | undefined;
}
): Promise<void> => {
await telemetry.trackSpan(
'cli:command:start',
'cli:command:complete',
'cli:command:error',
{ command: 'init' },
() => initProject(projectPath)
() => initProject(projectPath, options.packageManager)
);
};

export const generateAction = async (options: {
schema: string;
packageManager: string;
packageManager: PackageManagers | undefined;
}): Promise<void> => {
await telemetry.trackSpan(
'cli:command:start',
Expand Down Expand Up @@ -118,17 +124,17 @@ export default async function (): Promise<void> {
).default('./zenstack/schema.zmodel');

const pmOption = new Option(
'--package-manager, -p',
'package manager to use: "npm", "yarn" or "pnpm"'
).default('auto detect');
'-p, --package-manager <pm>',
'package manager to use'
).choices(['npm', 'yarn', 'pnpm']);

//#region wraps Prisma commands

program
.command('init')
.description('Set up a new ZenStack project.')
.addOption(pmOption)
.argument('<path>', 'project path')
.argument('[path]', 'project path', '.')
.action(initAction);

program
Expand Down
8 changes: 4 additions & 4 deletions packages/schema/src/utils/pkg-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import fs from 'fs';
import path from 'path';
import { execSync } from './exec-utils';

type PackageManagers = 'npm' | 'yarn' | 'pnpm';
export type PackageManagers = 'npm' | 'yarn' | 'pnpm';

function getPackageManager(projectPath = '.'): PackageManagers {
if (fs.existsSync(path.join(projectPath, 'yarn.lock'))) {
Expand All @@ -25,9 +25,9 @@ export function installPackage(
switch (manager) {
case 'yarn':
execSync(
`yarn add --cwd "${projectPath}" ${
dev ? ' --save-dev' : ''
} ${pkg}`
`yarn --cwd "${projectPath}" add ${pkg} ${
dev ? ' --dev' : ''
} --ignore-engines`
);
break;

Expand Down
5 changes: 2 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 23 additions & 21 deletions samples/todo/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions samples/todo/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "todo",
"version": "0.3.11",
"version": "0.3.12",
"private": true,
"scripts": {
"dev": "next dev",
Expand All @@ -21,7 +21,7 @@
"dependencies": {
"@heroicons/react": "^2.0.12",
"@prisma/client": "^4.4.0",
"@zenstackhq/runtime": "^0.3.11",
"@zenstackhq/runtime": "^0.3.12",
"bcryptjs": "^2.4.3",
"daisyui": "^2.31.0",
"moment": "^2.29.4",
Expand All @@ -46,6 +46,6 @@
"postcss": "^8.4.16",
"tailwindcss": "^3.1.8",
"typescript": "^4.6.2",
"zenstack": "^0.3.11"
"zenstack": "^0.3.12"
}
}