diff --git a/README.md b/README.md index 990fc94..ce95f3a 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ Three shapes: app-builder layout (frontend and/or backend selected), plain TS en ``` . +|-- .env-template # only with backend; enables readable development logs |-- .gitignore |-- .prettierrc.js |-- .stylelintrc.json # only with styles @@ -108,6 +109,9 @@ Three shapes: app-builder layout (frontend and/or backend selected), plain TS en **Neither frontend nor backend, JavaScript** — plain `index.js` at project root. +Backend projects include `.env-template`. Copy it to `.env` before development; +`APP_DEV_MODE=true` enables human-readable, colorized NodeKit logs. + ## Requirements Node.js `^22.13.0 || >=23.5.0`. diff --git a/scripts/readme/readme.hbs b/scripts/readme/readme.hbs index e0df393..86f11d1 100644 --- a/scripts/readme/readme.hbs +++ b/scripts/readme/readme.hbs @@ -35,6 +35,7 @@ Three shapes: app-builder layout (frontend and/or backend selected), plain TS en ``` . +|-- .env-template # only with backend; enables readable development logs |-- .gitignore |-- .prettierrc.js |-- .stylelintrc.json # only with styles @@ -61,6 +62,9 @@ Three shapes: app-builder layout (frontend and/or backend selected), plain TS en **Neither frontend nor backend, JavaScript** — plain `index.js` at project root. +Backend projects include `.env-template`. Copy it to `.env` before development; +`APP_DEV_MODE=true` enables human-readable, colorized NodeKit logs. + ## Requirements Node.js `{{{engines}}}`. diff --git a/src/generators/base.test.ts b/src/generators/base.test.ts index 7642a60..6e1cb58 100644 --- a/src/generators/base.test.ts +++ b/src/generators/base.test.ts @@ -4,6 +4,30 @@ import {setupGeneratorTest} from './__fixtures__/setupGeneratorTest.js'; import {generateBase} from './base.js'; test.describe('base generator', () => { + test('backend README documents the environment template', async (t: TestContext) => { + const {file} = await setupGeneratorTest(generateBase, { + destination: '/project', + projectName: 'my-app', + hasBackend: true, + }); + + const readme = file('README.md'); + t.assert.ok(readme); + t.assert.match(String(readme.content), /cp \.env-template \.env/); + t.assert.match(String(readme.content), /APP_DEV_MODE=true/); + }); + + test('project without backend omits environment setup from README', async (t: TestContext) => { + const {file} = await setupGeneratorTest(generateBase, { + destination: '/project', + projectName: 'my-app', + }); + + const readme = file('README.md'); + t.assert.ok(readme); + t.assert.doesNotMatch(String(readme.content), /\.env-template/); + }); + test('no registry set: does not write .npmrc', async (t: TestContext) => { const {file} = await setupGeneratorTest(generateBase, { destination: '/project', diff --git a/src/generators/base.ts b/src/generators/base.ts index 31771f8..53b912a 100644 --- a/src/generators/base.ts +++ b/src/generators/base.ts @@ -33,7 +33,7 @@ export async function generateBase(model: ProjectModel, fs: FileSystem): Promise await fs.writeFile( path.join(model.destination, 'README.md'), - renderReadme({projectName: model.projectName}), + renderReadme({hasBackend: model.hasBackend, projectName: model.projectName}), ); if (model.registry && !isDefaultRegistry(model.registry)) { diff --git a/src/generators/nodekit.test.ts b/src/generators/nodekit.test.ts index 11ae47e..f36c967 100644 --- a/src/generators/nodekit.test.ts +++ b/src/generators/nodekit.test.ts @@ -11,6 +11,7 @@ test.describe('nodekit generator', () => { language: 'ts', }); + t.assert.equal(file('.env-template'), null); t.assert.equal(file('src/server/index.ts'), null); }); @@ -22,6 +23,10 @@ test.describe('nodekit generator', () => { hasBackend: true, }); + const envTemplate = file('.env-template'); + t.assert.ok(envTemplate); + t.assert.equal(envTemplate.content, 'APP_DEV_MODE=true\n'); + const server = file('src/server/index.ts'); t.assert.ok(server); t.assert.match(server.content, /Hello, world!/); diff --git a/src/generators/nodekit.ts b/src/generators/nodekit.ts index f019809..f725f4b 100644 --- a/src/generators/nodekit.ts +++ b/src/generators/nodekit.ts @@ -6,6 +6,7 @@ import {getDefaultEntryFileName} from '../utils/getDefaultEntryFileName.js'; import {addDep} from '../utils/pm.js'; import type {FileSystem} from '../utils/types.js'; +import renderEnvTemplate from './templates/.env-template.hbs.js'; import renderServerIndexJs from './templates/src/server/index.js.hbs.js'; import renderServerIndexTs from './templates/src/server/index.ts.hbs.js'; @@ -27,6 +28,7 @@ export async function generateNodekit(model: ProjectModel, fs: FileSystem): Prom const serverFile = path.join(model.destination, 'src', 'server', `index.${isTs ? 'ts' : 'js'}`); const render = isTs ? renderServerIndexTs : renderServerIndexJs; + await fs.writeFile(path.join(model.destination, '.env-template'), renderEnvTemplate({})); await fs.writeFile( serverFile, render({ diff --git a/src/generators/templates/.env-template.hbs b/src/generators/templates/.env-template.hbs new file mode 100644 index 0000000..1852276 --- /dev/null +++ b/src/generators/templates/.env-template.hbs @@ -0,0 +1 @@ +APP_DEV_MODE=true diff --git a/src/generators/templates/README.md.hbs b/src/generators/templates/README.md.hbs index 9241f65..4121f24 100644 --- a/src/generators/templates/README.md.hbs +++ b/src/generators/templates/README.md.hbs @@ -1,3 +1,15 @@ # {{projectName}} Bootstrapped with @gravity-ui/create. +{{#if hasBackend}} + +## Environment + +Create the local environment file: + +```bash +cp .env-template .env +``` + +`APP_DEV_MODE=true` enables human-readable, colorized NodeKit logs. +{{/if}}