From 6551cff698795b9446a044b52e55e659bb8a0e6d Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sat, 16 Sep 2023 12:40:23 -0700 Subject: [PATCH 1/2] feat: CLI improvements - warn when multiple versions of zenstack packages are detected - check for new version --- packages/schema/src/cli/actions/generate.ts | 72 +++++++++ packages/schema/src/cli/actions/index.ts | 3 + packages/schema/src/cli/actions/info.ts | 44 ++++++ packages/schema/src/cli/actions/init.ts | 77 ++++++++++ packages/schema/src/cli/cli-util.ts | 159 +++++--------------- packages/schema/src/cli/index.ts | 58 ++----- pnpm-lock.yaml | 67 +-------- 7 files changed, 252 insertions(+), 228 deletions(-) create mode 100644 packages/schema/src/cli/actions/generate.ts create mode 100644 packages/schema/src/cli/actions/index.ts create mode 100644 packages/schema/src/cli/actions/info.ts create mode 100644 packages/schema/src/cli/actions/init.ts diff --git a/packages/schema/src/cli/actions/generate.ts b/packages/schema/src/cli/actions/generate.ts new file mode 100644 index 000000000..25553c094 --- /dev/null +++ b/packages/schema/src/cli/actions/generate.ts @@ -0,0 +1,72 @@ +import { PluginError } from '@zenstackhq/sdk'; +import colors from 'colors'; +import path from 'path'; +import { Context } from '../../types'; +import { PackageManagers } from '../../utils/pkg-utils'; +import { CliError } from '../cli-error'; +import { + checkNewVersion, + checkRequiredPackage, + getZenStackPackages, + loadDocument, + requiredPrismaVersion, +} from '../cli-util'; +import { PluginRunner } from '../plugin-runner'; + +type Options = { + schema: string; + packageManager: PackageManagers | undefined; + dependencyCheck: boolean; + versionCheck: boolean; +}; + +/** + * CLI action for generating code from schema + */ +export async function generate(projectPath: string, options: Options) { + if (options.dependencyCheck) { + checkRequiredPackage('prisma', requiredPrismaVersion); + checkRequiredPackage('@prisma/client', requiredPrismaVersion); + } + + // check for multiple versions of Zenstack packages + const packages = getZenStackPackages(projectPath); + if (packages) { + const versions = new Set(packages.map((p) => p.version)); + if (versions.size > 1) { + console.warn( + colors.yellow( + 'WARNING: Multiple versions of Zenstack packages detected. Run "zenstack info" to see details.' + ) + ); + } + } + + const tasks = [runPlugins(options)]; + + if (options.versionCheck) { + tasks.push(checkNewVersion()); + } + + await Promise.all(tasks); +} + +async function runPlugins(options: Options) { + const model = await loadDocument(options.schema); + const context: Context = { + schema: model, + schemaPath: path.resolve(options.schema), + outDir: path.dirname(options.schema), + }; + + try { + await new PluginRunner().run(context); + } catch (err) { + if (err instanceof PluginError) { + console.error(colors.red(`${err.plugin}: ${err.message}`)); + throw new CliError(err.message); + } else { + throw err; + } + } +} diff --git a/packages/schema/src/cli/actions/index.ts b/packages/schema/src/cli/actions/index.ts new file mode 100644 index 000000000..19f6fcec2 --- /dev/null +++ b/packages/schema/src/cli/actions/index.ts @@ -0,0 +1,3 @@ +export * from './generate'; +export * from './info'; +export * from './init'; diff --git a/packages/schema/src/cli/actions/info.ts b/packages/schema/src/cli/actions/info.ts new file mode 100644 index 000000000..bb839eee5 --- /dev/null +++ b/packages/schema/src/cli/actions/info.ts @@ -0,0 +1,44 @@ +import colors from 'colors'; +import getLatestVersion from 'get-latest-version'; +import ora from 'ora'; +import semver from 'semver'; +import { getZenStackPackages } from '../cli-util'; + +/** + * CLI action for getting information about installed ZenStack packages + */ +export async function info(projectPath: string) { + const packages = getZenStackPackages(projectPath); + if (!packages) { + console.error('Unable to locate package.json. Are you in a valid project directory?'); + return; + } + + console.log('Installed ZenStack Packages:'); + const versions = new Set(); + for (const { pkg, version } of packages) { + versions.add(version); + console.log(` ${colors.green(pkg.padEnd(20))}\t${version}`); + } + + if (versions.size > 1) { + console.warn(colors.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.')); + } else if (versions.size > 0) { + const spinner = ora('Checking npm registry').start(); + const latest = await getLatestVersion('zenstack'); + + if (!latest) { + spinner.fail('unable to check for latest version'); + } else { + spinner.succeed(); + const version = [...versions][0]; + if (semver.gt(latest, version)) { + console.log(`A newer version of Zenstack is available: ${latest}.`); + } else if (semver.gt(version, latest)) { + console.log('You are using a pre-release version of Zenstack.'); + } else { + console.log('You are using the latest version of Zenstack.'); + } + } + } +} diff --git a/packages/schema/src/cli/actions/init.ts b/packages/schema/src/cli/actions/init.ts new file mode 100644 index 000000000..3f04f4f48 --- /dev/null +++ b/packages/schema/src/cli/actions/init.ts @@ -0,0 +1,77 @@ +import colors from 'colors'; +import fs from 'fs'; +import path from 'path'; +import { PackageManagers, ensurePackage, installPackage } from '../../utils/pkg-utils'; +import { getVersion } from '../../utils/version-utils'; +import { CliError } from '../cli-error'; +import { checkNewVersion } from '../cli-util'; + +type Options = { + prisma: string | undefined; + packageManager: PackageManagers | undefined; + versionCheck: boolean; + tag?: string; +}; + +/** + * CLI action for initializing an existing project + */ +export async function init(projectPath: string, options: Options) { + if (!fs.existsSync(projectPath)) { + console.error(`Path does not exist: ${projectPath}`); + throw new CliError('project path does not exist'); + } + + const defaultPrismaSchemaLocation = './prisma/schema.prisma'; + let prismaSchema = options.prisma; + if (prismaSchema) { + if (!fs.existsSync(prismaSchema)) { + console.error(`Prisma schema file does not exist: ${prismaSchema}`); + throw new CliError('prisma schema does not exist'); + } + } else if (fs.existsSync(defaultPrismaSchemaLocation)) { + prismaSchema = defaultPrismaSchemaLocation; + } + + const zmodelFile = path.join(projectPath, './schema.zmodel'); + let sampleModelGenerated = false; + + if (fs.existsSync(zmodelFile)) { + console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`); + } else { + if (prismaSchema) { + // copy over schema.prisma + fs.copyFileSync(prismaSchema, zmodelFile); + } else { + // create a new model + const starterContent = fs.readFileSync(path.join(__dirname, '../res/starter.zmodel'), 'utf-8'); + fs.writeFileSync(zmodelFile, starterContent); + sampleModelGenerated = true; + } + } + + ensurePackage('prisma', true, options.packageManager, 'latest', projectPath); + ensurePackage('@prisma/client', false, options.packageManager, 'latest', projectPath); + + const tag = options.tag ?? getVersion(); + installPackage('zenstack', true, options.packageManager, tag, projectPath); + installPackage('@zenstackhq/runtime', false, options.packageManager, tag, projectPath); + + if (sampleModelGenerated) { + console.log(`Sample model generated at: ${colors.blue(zmodelFile)} + +Please check the following guide on how to model your app: + https://zenstack.dev/#/modeling-your-app.`); + } else if (prismaSchema) { + console.log( + `Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}". +Moving forward please edit this file and run "zenstack generate" to regenerate Prisma schema.` + ); + } + + console.log(colors.green('\nProject initialized successfully!')); + + if (options.versionCheck) { + await checkNewVersion(); + } +} diff --git a/packages/schema/src/cli/cli-util.ts b/packages/schema/src/cli/cli-util.ts index 21e36481d..1f57da695 100644 --- a/packages/schema/src/cli/cli-util.ts +++ b/packages/schema/src/cli/cli-util.ts @@ -1,85 +1,21 @@ import { isDataSource, isPlugin, Model } from '@zenstackhq/language/ast'; -import { getLiteral, PluginError } from '@zenstackhq/sdk'; +import { getLiteral } from '@zenstackhq/sdk'; import colors from 'colors'; import fs from 'fs'; import getLatestVersion from 'get-latest-version'; import { AstNode, getDocument, LangiumDocument, LangiumDocuments, Mutable } from 'langium'; import { NodeFileSystem } from 'langium/node'; -import ora from 'ora'; import path from 'path'; import semver from 'semver'; import { URI } from 'vscode-uri'; import { PLUGIN_MODULE_NAME, STD_LIB_MODULE_NAME } from '../language-server/constants'; import { createZModelServices, ZModelServices } from '../language-server/zmodel-module'; -import { Context } from '../types'; import { mergeBaseModel, resolveImport, resolveTransitiveImports } from '../utils/ast-utils'; -import { ensurePackage, installPackage, PackageManagers } from '../utils/pkg-utils'; import { getVersion } from '../utils/version-utils'; import { CliError } from './cli-error'; -import { PluginRunner } from './plugin-runner'; -/** - * Initializes an existing project for ZenStack - */ -export async function initProject( - projectPath: string, - prismaSchema: string | undefined, - packageManager: PackageManagers | undefined, - tag?: string -) { - if (!fs.existsSync(projectPath)) { - console.error(`Path does not exist: ${projectPath}`); - throw new CliError('project path does not exist'); - } - - const defaultPrismaSchemaLocation = './prisma/schema.prisma'; - if (prismaSchema) { - if (!fs.existsSync(prismaSchema)) { - console.error(`Prisma schema file does not exist: ${prismaSchema}`); - throw new CliError('prisma schema does not exist'); - } - } else if (fs.existsSync(defaultPrismaSchemaLocation)) { - prismaSchema = defaultPrismaSchemaLocation; - } - - const zmodelFile = path.join(projectPath, './schema.zmodel'); - let sampleModelGenerated = false; - - if (fs.existsSync(zmodelFile)) { - console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`); - } else { - if (prismaSchema) { - // copy over schema.prisma - fs.copyFileSync(prismaSchema, zmodelFile); - } else { - // create a new model - const starterContent = fs.readFileSync(path.join(__dirname, '../res/starter.zmodel'), 'utf-8'); - fs.writeFileSync(zmodelFile, starterContent); - sampleModelGenerated = true; - } - } - - ensurePackage('prisma', true, packageManager, 'latest', projectPath); - ensurePackage('@prisma/client', false, packageManager, 'latest', projectPath); - - tag = tag ?? getVersion(); - installPackage('zenstack', true, packageManager, tag, projectPath); - installPackage('@zenstackhq/runtime', false, packageManager, tag, projectPath); - - if (sampleModelGenerated) { - console.log(`Sample model generated at: ${colors.blue(zmodelFile)} - -Please check the following guide on how to model your app: - https://zenstack.dev/#/modeling-your-app.`); - } else if (prismaSchema) { - console.log( - `Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}". -Moving forward please edit this file and run "zenstack generate" to regenerate Prisma schema.` - ); - } - - console.log(colors.green('\nProject initialized successfully!')); -} +// required minimal version of Prisma +export const requiredPrismaVersion = '4.8.0'; /** * Loads a zmodel document from a file. @@ -239,74 +175,59 @@ export async function getPluginDocuments(services: ZModelServices, fileName: str return result; } -export async function runPlugins(options: { schema: string; packageManager: PackageManagers | undefined }) { - const model = await loadDocument(options.schema); - - const context: Context = { - schema: model, - schemaPath: path.resolve(options.schema), - outDir: path.dirname(options.schema), - }; - - try { - await new PluginRunner().run(context); - } catch (err) { - if (err instanceof PluginError) { - console.error(colors.red(`${err.plugin}: ${err.message}`)); - throw new CliError(err.message); - } else { - throw err; - } - } -} - -export async function dumpInfo(projectPath: string) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let pkgJson: any; +export function getZenStackPackages(projectPath: string) { + let pkgJson: { dependencies: Record; devDependencies: Record }; const resolvedPath = path.resolve(projectPath); try { pkgJson = require(path.join(resolvedPath, 'package.json')); } catch { - console.error('Unable to locate package.json. Are you in a valid project directory?'); - return; + return undefined; } + const packages = [ - 'zenstack', ...Object.keys(pkgJson.dependencies ?? {}).filter((p) => p.startsWith('@zenstackhq/')), ...Object.keys(pkgJson.devDependencies ?? {}).filter((p) => p.startsWith('@zenstackhq/')), ]; - const versions = new Set(); - for (const pkg of packages) { + const result = packages.map((pkg) => { try { const resolved = require.resolve(`${pkg}/package.json`, { paths: [resolvedPath] }); // eslint-disable-next-line @typescript-eslint/no-var-requires - const version = require(resolved).version; - versions.add(version); - console.log(` ${colors.green(pkg.padEnd(20))}\t${version}`); + return { pkg, version: require(resolved).version }; } catch { - // noop + return { pkg, version: undefined }; } + }); + + result.splice(0, 0, { pkg: 'zenstack', version: getVersion() }); + + return result; +} + +export function checkRequiredPackage(packageName: string, minVersion?: string) { + let packageVersion: string; + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + packageVersion = require(`${packageName}/package.json`).version; + } catch (error) { + console.error(colors.red(`${packageName} not found, please install it`)); + throw new CliError(`${packageName} not found`); } - if (versions.size > 1) { - console.warn(colors.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.')); - } else if (versions.size > 0) { - const spinner = ora('Checking npm registry').start(); - const latest = await getLatestVersion('zenstack'); - - if (!latest) { - spinner.fail('unable to check for latest version'); - } else { - spinner.succeed(); - const version = [...versions][0]; - if (semver.gt(latest, version)) { - console.log(`A newer version of Zenstack is available: ${latest}.`); - } else if (semver.gt(version, latest)) { - console.log('You are using a pre-release version of Zenstack.'); - } else { - console.log('You are using the latest version of Zenstack.'); - } - } + if (minVersion && semver.lt(packageVersion, minVersion)) { + console.error( + colors.red( + `${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it` + ) + ); + throw new CliError(`${packageName} version is too low`); + } +} + +export async function checkNewVersion() { + const currVersion = getVersion(); + const latestVersion = await getLatestVersion('zenstack'); + if (latestVersion && semver.gt(latestVersion, currVersion)) { + console.log(`A newer version ${colors.cyan(latestVersion)} is available.`); } } diff --git a/packages/schema/src/cli/index.ts b/packages/schema/src/cli/index.ts index a3b511340..8ea6fa28c 100644 --- a/packages/schema/src/cli/index.ts +++ b/packages/schema/src/cli/index.ts @@ -3,33 +3,20 @@ import { ZModelLanguageMetaData } from '@zenstackhq/language/module'; import colors from 'colors'; import { Command, Option } from 'commander'; import fs from 'fs'; -import * as semver from 'semver'; import telemetry from '../telemetry'; -import { PackageManagers } from '../utils/pkg-utils'; import { getVersion } from '../utils/version-utils'; -import { CliError } from './cli-error'; -import { dumpInfo, initProject, runPlugins } from './cli-util'; +import * as actions from './actions'; import { loadConfig } from './config'; -// required minimal version of Prisma -export const requiredPrismaVersion = '4.0.0'; - const DEFAULT_CONFIG_FILE = 'zenstack.config.json'; -export const initAction = async ( - projectPath: string, - options: { - prisma: string | undefined; - packageManager: PackageManagers | undefined; - tag?: string; - } -): Promise => { +export const initAction = async (projectPath: string, options: Parameters[1]): Promise => { await telemetry.trackSpan( 'cli:command:start', 'cli:command:complete', 'cli:command:error', { command: 'init' }, - () => initProject(projectPath, options.prisma, options.packageManager, options.tag) + () => actions.init(projectPath, options) ); }; @@ -39,48 +26,20 @@ export const infoAction = async (projectPath: string): Promise => { 'cli:command:complete', 'cli:command:error', { command: 'info' }, - () => dumpInfo(projectPath) + () => actions.info(projectPath) ); }; -export const generateAction = async (options: { - schema: string; - packageManager: PackageManagers | undefined; - dependencyCheck: boolean; -}): Promise => { - if (options.dependencyCheck) { - checkRequiredPackage('prisma', requiredPrismaVersion); - checkRequiredPackage('@prisma/client', requiredPrismaVersion); - } +export const generateAction = async (options: Parameters[1]): Promise => { await telemetry.trackSpan( 'cli:command:start', 'cli:command:complete', 'cli:command:error', { command: 'generate' }, - () => runPlugins(options) + () => actions.generate(process.cwd(), options) ); }; -const checkRequiredPackage = (packageName: string, minVersion?: string) => { - let packageVersion: string; - try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - packageVersion = require(`${packageName}/package.json`).version; - } catch (error) { - console.error(colors.red(`${packageName} not found, please install it`)); - throw new CliError(`${packageName} not found`); - } - - if (minVersion && semver.lt(packageVersion, minVersion)) { - console.error( - colors.red( - `${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it` - ) - ); - throw new CliError(`${packageName} version is too low`); - } -}; - export function createProgram() { const program = new Command('zenstack'); @@ -102,13 +61,12 @@ export function createProgram() { ); const configOption = new Option('-c, --config [file]', 'config file'); - const pmOption = new Option('-p, --package-manager ', 'package manager to use').choices([ 'npm', 'yarn', 'pnpm', ]); - + const noVersionCheckOption = new Option('--no-version-check', 'do not check for new version'); const noDependencyCheck = new Option('--no-dependency-check', 'do not check if dependencies are installed'); program @@ -124,6 +82,7 @@ export function createProgram() { .addOption(pmOption) .addOption(new Option('--prisma ', 'location of Prisma schema file to bootstrap from')) .addOption(new Option('--tag [tag]', 'the NPM package tag to use when installing dependencies')) + .addOption(noVersionCheckOption) .argument('[path]', 'project path', '.') .action(initAction); @@ -133,6 +92,7 @@ export function createProgram() { .addOption(schemaOption) .addOption(configOption) .addOption(pmOption) + .addOption(noVersionCheckOption) .addOption(noDependencyCheck) .action(generateAction); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb083aa46..9d8560b7d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: version: 0.2.1 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.9)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.22.5)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -738,7 +738,7 @@ importers: version: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) next: specifier: ^13.4.5 - version: 13.4.5(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.5(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -747,7 +747,7 @@ importers: version: 6.3.3 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.5)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.4) + version: 29.0.5(@babel/core@7.22.9)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.4) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -8467,7 +8467,7 @@ packages: - babel-plugin-macros dev: true - /next@13.4.5(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0): + /next@13.4.5(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-pfNsRLVM9e5Y1/z02VakJRfD6hMQkr24FaN2xc9GbcZDBxoOgiNAViSg5cXwlWCoMhtm4U315D7XYhgOr96Q3Q==} engines: {node: '>=16.8.0'} hasBin: true @@ -8492,7 +8492,7 @@ packages: postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.22.5)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.22.9)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -10182,24 +10182,6 @@ packages: react: 18.2.0 dev: true - /styled-jsx@5.1.1(@babel/core@7.22.5)(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - '@babel/core': 7.22.5 - client-only: 0.0.1 - react: 18.2.0 - dev: true - /styled-jsx@5.1.1(@babel/core@7.22.9)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -10614,7 +10596,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.22.5)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.4): + /ts-jest@29.0.5(@babel/core@7.22.5)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.5): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10645,7 +10627,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.3 - typescript: 4.9.4 + typescript: 4.9.5 yargs-parser: 21.1.1 dev: true @@ -10684,41 +10666,6 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.22.9)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.5): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.22.9 - bs-logger: 0.2.6 - esbuild: 0.18.13 - fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.3 - typescript: 4.9.5 - yargs-parser: 21.1.1 - dev: true - /ts-morph@16.0.0: resolution: {integrity: sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==} dependencies: From 957c0b633c2e863b6930d6a3842080f9b19dddce Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sat, 16 Sep 2023 12:57:44 -0700 Subject: [PATCH 2/2] fix resource path --- packages/schema/src/cli/actions/init.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/src/cli/actions/init.ts b/packages/schema/src/cli/actions/init.ts index 3f04f4f48..9d798b865 100644 --- a/packages/schema/src/cli/actions/init.ts +++ b/packages/schema/src/cli/actions/init.ts @@ -44,7 +44,7 @@ export async function init(projectPath: string, options: Options) { fs.copyFileSync(prismaSchema, zmodelFile); } else { // create a new model - const starterContent = fs.readFileSync(path.join(__dirname, '../res/starter.zmodel'), 'utf-8'); + const starterContent = fs.readFileSync(path.join(__dirname, '../../res/starter.zmodel'), 'utf-8'); fs.writeFileSync(zmodelFile, starterContent); sampleModelGenerated = true; }