@pasosdejesus/m 0.27.1 → 0.27.2
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/dist/CHANGELOG.md +15 -0
- package/dist/tasks/create.d.ts +6 -1
- package/dist/tasks/create.d.ts.map +1 -1
- package/dist/tasks/create.js +8 -4
- package/dist/tasks/create.js.map +1 -1
- package/dist/tasks/create.test.d.ts +2 -0
- package/dist/tasks/create.test.d.ts.map +1 -0
- package/dist/tasks/create.test.js +41 -0
- package/dist/tasks/create.test.js.map +1 -0
- package/dist/tasks/update.d.ts +16 -0
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +61 -10
- package/dist/tasks/update.js.map +1 -1
- package/dist/tasks/update.test.d.ts +2 -0
- package/dist/tasks/update.test.d.ts.map +1 -0
- package/dist/tasks/update.test.js +79 -0
- package/dist/tasks/update.test.js.map +1 -0
- package/dist/templates/apps/nextjs/package.json.hbs +1 -0
- package/package.json +1 -1
package/dist/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@pasosdejesus/m` are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.27.2] - 2026-10-10
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **`m:create`**: el proyecto generado ahora incluye `apps/.env.example` (antes el filtro de
|
|
10
|
+
`getAllFiles` descartaba todo `.env*`, aunque el README indica `cp apps/.env.example apps/.env`) y
|
|
11
|
+
el template declara `@types/pg` (faltaba, con `pg` presente). Reportados al escribir los tutoriales
|
|
12
|
+
del modelo base (`m/REQ/46` finding 6).
|
|
13
|
+
- **`m:update`**: ahora ve los archivos ocultos de la plantilla (`glob` con `dot: true`) y **renderiza
|
|
14
|
+
los `.hbs`** (con el `name`/`description` del proyecto y la versión actual de `m`) antes de
|
|
15
|
+
comparar/mergear. Así ofrece/instala `apps/.env.example` y `.config/*` en proyectos existentes, un
|
|
16
|
+
proyecto recién creado ya no reporta diferencias falsas, y no se copian placeholders
|
|
17
|
+
`{{name}}`/`{{m_version}}` sin resolver. Se excluyen los env reales (`.env`, `.env.test`) y el
|
|
18
|
+
lockfile (`isTemplateFile`). Con pruebas de regresión para `m:create` y `m:update`.
|
|
19
|
+
|
|
5
20
|
## [0.27.1] - 2026-10-09
|
|
6
21
|
|
|
7
22
|
### Fixed
|
package/dist/tasks/create.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fills the template placeholders. Shared with `m:update`, which renders the
|
|
3
|
+
* `.hbs` sources before comparing/merging them into an existing project.
|
|
4
|
+
*/
|
|
5
|
+
export declare function render(content: string, name: string, description: string): string;
|
|
1
6
|
/**
|
|
2
7
|
* Scaffold a Web3 engine package (REQ/35 §3) under packages/<name>/.
|
|
3
8
|
* Generates engine.json, package.json, tsconfig, a kysely config for DB
|
|
4
9
|
* migrations, and the src/ skeleton (server, components, lib).
|
|
5
10
|
*/
|
|
6
11
|
export declare function runCreateEngine(name: string): Promise<void>;
|
|
7
|
-
export declare function runCreateProject(name: string, description?: string): Promise<void>;
|
|
12
|
+
export declare function runCreateProject(name: string, description?: string, baseDir?: string): Promise<void>;
|
|
8
13
|
//# sourceMappingURL=create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/tasks/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/tasks/create.ts"],"names":[],"mappings":"AAqCA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAMjF;AAqBD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,iBA8HjD;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,iBAuC1F"}
|
package/dist/tasks/create.js
CHANGED
|
@@ -33,7 +33,11 @@ function getTemplateDir() {
|
|
|
33
33
|
return srcTemplates;
|
|
34
34
|
return path.join(__dirname, 'templates');
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Fills the template placeholders. Shared with `m:update`, which renders the
|
|
38
|
+
* `.hbs` sources before comparing/merging them into an existing project.
|
|
39
|
+
*/
|
|
40
|
+
export function render(content, name, description) {
|
|
37
41
|
const pkg = JSON.parse(fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf-8'));
|
|
38
42
|
return content
|
|
39
43
|
.replace(/\{\{name\}\}/g, name)
|
|
@@ -45,7 +49,7 @@ function getAllFiles(dir) {
|
|
|
45
49
|
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
46
50
|
for (const entry of entries) {
|
|
47
51
|
const fullPath = path.join(dir, entry.name);
|
|
48
|
-
if (entry.name === 'pnpm-lock.yaml' || entry.name.startsWith('.env'))
|
|
52
|
+
if (entry.name === 'pnpm-lock.yaml' || (entry.name.startsWith('.env') && !entry.name.startsWith('.env.example')))
|
|
49
53
|
continue;
|
|
50
54
|
if (entry.isDirectory()) {
|
|
51
55
|
files.push(...getAllFiles(fullPath));
|
|
@@ -187,10 +191,10 @@ export function createApp(deps: EngineDeps) {
|
|
|
187
191
|
}
|
|
188
192
|
success(t('create.done'));
|
|
189
193
|
}
|
|
190
|
-
export async function runCreateProject(name, description) {
|
|
194
|
+
export async function runCreateProject(name, description, baseDir) {
|
|
191
195
|
const desc = description || '';
|
|
192
196
|
const templateDir = getTemplateDir();
|
|
193
|
-
const cwd = process.cwd();
|
|
197
|
+
const cwd = baseDir ?? process.cwd();
|
|
194
198
|
const destDir = path.resolve(cwd, name);
|
|
195
199
|
if (fs.existsSync(destDir)) {
|
|
196
200
|
problem(t('create.error', `Directory ${name} already exists`));
|
package/dist/tasks/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/tasks/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,SAAS,MAAM,uBAAuB,CAAA;AAE7C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,CAAC,GAAG,gBAAgB,CAAC,YAAY,EAAE,EAAE;IACzC,EAAE,EAAE;QACF,mBAAmB,EAAE,gCAAgC;QACrD,mBAAmB,EAAE,aAAa;QAClC,cAAc,EAAE,+BAA+B;QAC/C,aAAa,EAAE,+BAA+B;KAC/C;IACD,EAAE,EAAE;QACF,mBAAmB,EAAE,gCAAgC;QACrD,mBAAmB,EAAE,gBAAgB;QACrC,cAAc,EAAE,mCAAmC;QACnD,aAAa,EAAE,+BAA+B;KAC/C;CACF,EAAE,SAAS,CAAC,CAAA;AAEb,SAAS,cAAc;IACrB,+FAA+F;IAC/F,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAA;IACtD,mDAAmD;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IAClE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,YAAY,CAAA;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;AAC1C,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/tasks/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../src/tasks/create.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { runCreateProject } from './create.js';
|
|
6
|
+
describe('m:create', () => {
|
|
7
|
+
let workdir;
|
|
8
|
+
let projectDir;
|
|
9
|
+
beforeAll(async () => {
|
|
10
|
+
workdir = fs.mkdtempSync(path.join(os.tmpdir(), 'm-create-'));
|
|
11
|
+
await runCreateProject('demo-app', 'Demo project', workdir);
|
|
12
|
+
projectDir = path.join(workdir, 'demo-app');
|
|
13
|
+
});
|
|
14
|
+
afterAll(() => {
|
|
15
|
+
fs.rmSync(workdir, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
it('generates apps/.env.example from the .hbs source with {{name}} rendered', () => {
|
|
18
|
+
const envExample = path.join(projectDir, 'apps', '.env.example');
|
|
19
|
+
expect(fs.existsSync(envExample)).toBe(true);
|
|
20
|
+
const content = fs.readFileSync(envExample, 'utf-8');
|
|
21
|
+
expect(content).toContain('PGUSER=demo-app');
|
|
22
|
+
expect(content).toContain('PGDATABASE=demo-app_dev');
|
|
23
|
+
expect(content).not.toContain('{{name}}');
|
|
24
|
+
});
|
|
25
|
+
it('does not copy real .env files', () => {
|
|
26
|
+
const appsDir = path.join(projectDir, 'apps');
|
|
27
|
+
const envFiles = fs
|
|
28
|
+
.readdirSync(appsDir)
|
|
29
|
+
.filter((name) => name.startsWith('.env'));
|
|
30
|
+
expect(envFiles).toEqual(['.env.example']);
|
|
31
|
+
});
|
|
32
|
+
it('renders package.json with the current m version and @types/pg', () => {
|
|
33
|
+
const pkgPath = path.join(projectDir, 'apps', 'nextjs', 'package.json');
|
|
34
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
35
|
+
const mPkg = JSON.parse(fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf-8'));
|
|
36
|
+
expect(pkg.name).toBe('demo-app');
|
|
37
|
+
expect(pkg.dependencies['@pasosdejesus/m']).toBe(`^${mPkg.version}`);
|
|
38
|
+
expect(pkg.devDependencies['@types/pg']).toBeDefined();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=create.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../src/tasks/create.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,OAAe,CAAA;IACnB,IAAI,UAAkB,CAAA;IAEtB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;QAC7D,MAAM,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;QAC3D,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAA;QAChE,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,EAAE;aAChB,WAAW,CAAC,OAAO,CAAC;aACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CACzE,CAAA;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/tasks/update.d.ts
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
export declare function getTemplateDir(): string;
|
|
2
|
+
export declare function getAllFiles(dirPath: string): string[];
|
|
3
|
+
/**
|
|
4
|
+
* A file that should be compared/copied. Skips the real env files and the
|
|
5
|
+
* lockfile, but keeps `.env.example` (and its `.hbs` source): the project
|
|
6
|
+
* README tells the operator to `cp apps/.env.example apps/.env`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isTemplateFile(relPath: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* The values `m:create` used as `{{name}}`/`{{description}}`, read back from the
|
|
11
|
+
* project so `m:update` can render the `.hbs` templates before comparing them.
|
|
12
|
+
*/
|
|
13
|
+
export declare function readProjectIdentity(projectRoot: string): {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
1
17
|
export declare function runUpdate(options?: {
|
|
2
18
|
check?: boolean;
|
|
3
19
|
yes?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/tasks/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/tasks/update.ts"],"names":[],"mappings":"AA0CA,wBAAgB,cAAc,IAAI,MAAM,CAYvC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAiB9F;AAmDD,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,iBAiH3E"}
|
package/dist/tasks/update.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
|
+
import * as os from 'os';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import * as readline from 'readline';
|
|
4
5
|
import { spawnSync } from 'child_process';
|
|
5
6
|
import { fileURLToPath } from 'url';
|
|
6
7
|
import { dirname } from 'path';
|
|
7
8
|
import { globSync } from 'glob';
|
|
9
|
+
import { render } from './create.js';
|
|
8
10
|
import { success, info, warn } from '../util/colors.js';
|
|
9
11
|
import { createTranslator } from '../i18n/createTranslator.js';
|
|
10
12
|
import { detectLocale } from '../util/locale.js';
|
|
@@ -33,7 +35,7 @@ const updateT = createTranslator(detectLocale(), {
|
|
|
33
35
|
}, commonCli);
|
|
34
36
|
const __filename = fileURLToPath(import.meta.url);
|
|
35
37
|
const __dirname = dirname(__filename);
|
|
36
|
-
function getTemplateDir() {
|
|
38
|
+
export function getTemplateDir() {
|
|
37
39
|
// __dirname is dist/tasks/ in the npm package
|
|
38
40
|
// dist/templates/ is where build copies templates
|
|
39
41
|
const distTemplates = path.join(__dirname, '..', 'templates');
|
|
@@ -46,8 +48,45 @@ function getTemplateDir() {
|
|
|
46
48
|
// Last resort: templates/ next to tasks/
|
|
47
49
|
return path.join(__dirname, 'templates');
|
|
48
50
|
}
|
|
49
|
-
function getAllFiles(dirPath) {
|
|
50
|
-
return globSync('**/*', { cwd: dirPath, nodir: true });
|
|
51
|
+
export function getAllFiles(dirPath) {
|
|
52
|
+
return globSync('**/*', { cwd: dirPath, nodir: true, dot: true });
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A file that should be compared/copied. Skips the real env files and the
|
|
56
|
+
* lockfile, but keeps `.env.example` (and its `.hbs` source): the project
|
|
57
|
+
* README tells the operator to `cp apps/.env.example apps/.env`.
|
|
58
|
+
*/
|
|
59
|
+
export function isTemplateFile(relPath) {
|
|
60
|
+
const name = path.basename(relPath);
|
|
61
|
+
if (name === 'pnpm-lock.yaml')
|
|
62
|
+
return false;
|
|
63
|
+
if (name.startsWith('.env') && !name.startsWith('.env.example'))
|
|
64
|
+
return false;
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The values `m:create` used as `{{name}}`/`{{description}}`, read back from the
|
|
69
|
+
* project so `m:update` can render the `.hbs` templates before comparing them.
|
|
70
|
+
*/
|
|
71
|
+
export function readProjectIdentity(projectRoot) {
|
|
72
|
+
const candidates = [
|
|
73
|
+
path.join(projectRoot, 'apps', 'nextjs', 'package.json'),
|
|
74
|
+
path.join(projectRoot, 'package.json'),
|
|
75
|
+
];
|
|
76
|
+
for (const candidate of candidates) {
|
|
77
|
+
if (!fs.existsSync(candidate))
|
|
78
|
+
continue;
|
|
79
|
+
try {
|
|
80
|
+
const pkg = JSON.parse(fs.readFileSync(candidate, 'utf-8'));
|
|
81
|
+
if (typeof pkg.name === 'string' && pkg.name) {
|
|
82
|
+
return { name: pkg.name, description: typeof pkg.description === 'string' ? pkg.description : '' };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Not a readable package.json; try the next candidate.
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { name: path.basename(projectRoot), description: '' };
|
|
51
90
|
}
|
|
52
91
|
async function showDiff(file1, file2) {
|
|
53
92
|
const hasDiff = spawnSync('which', ['diff'], { stdio: 'ignore' }).status === 0;
|
|
@@ -105,23 +144,33 @@ export async function runUpdate(options) {
|
|
|
105
144
|
output: process.stdout
|
|
106
145
|
});
|
|
107
146
|
const question = (query) => new Promise((resolve) => rl.question(query, resolve));
|
|
147
|
+
let renderDir;
|
|
108
148
|
try {
|
|
109
149
|
const startDir = process.cwd();
|
|
110
150
|
const projectRoot = findProjectRoot(startDir);
|
|
111
151
|
const templateDir = getTemplateDir();
|
|
152
|
+
const { name: projectName, description: projectDescription } = readProjectIdentity(projectRoot);
|
|
112
153
|
info(`Project root identified at: ${projectRoot}`);
|
|
113
154
|
info(t('update.comparing'));
|
|
114
|
-
//
|
|
115
|
-
const templateFiles = getAllFiles(templateDir).filter(
|
|
116
|
-
const name = path.basename(f);
|
|
117
|
-
return f !== 'pnpm-lock.yaml' &&
|
|
118
|
-
!name.startsWith('.env');
|
|
119
|
-
});
|
|
155
|
+
// Keep `.env.example` (a template) but not real env files or the lockfile.
|
|
156
|
+
const templateFiles = getAllFiles(templateDir).filter(isTemplateFile);
|
|
120
157
|
for (const relPath of templateFiles) {
|
|
121
158
|
// Determine project path (remove .hbs from relPath if present)
|
|
122
159
|
const projectRelPath = relPath.endsWith('.hbs') ? relPath.slice(0, -4) : relPath;
|
|
123
160
|
const projectPath = path.join(projectRoot, projectRelPath);
|
|
124
|
-
|
|
161
|
+
let templatePath = path.join(templateDir, relPath);
|
|
162
|
+
// Render `.hbs` sources before comparing/merging: comparing the raw
|
|
163
|
+
// template (with `{{name}}`, `{{m_version}}`, …) reports every file as a
|
|
164
|
+
// difference and would copy the placeholders into the project.
|
|
165
|
+
if (relPath.endsWith('.hbs')) {
|
|
166
|
+
if (!renderDir)
|
|
167
|
+
renderDir = fs.mkdtempSync(path.join(os.tmpdir(), 'm-update-'));
|
|
168
|
+
const rendered = render(fs.readFileSync(templatePath, 'utf-8'), projectName, projectDescription);
|
|
169
|
+
const renderedPath = path.join(renderDir, projectRelPath);
|
|
170
|
+
fs.mkdirSync(path.dirname(renderedPath), { recursive: true });
|
|
171
|
+
fs.writeFileSync(renderedPath, rendered, 'utf-8');
|
|
172
|
+
templatePath = renderedPath;
|
|
173
|
+
}
|
|
125
174
|
if (!fs.existsSync(projectPath)) {
|
|
126
175
|
if (checkMode) {
|
|
127
176
|
info(t('update.file_new', projectRelPath));
|
|
@@ -196,6 +245,8 @@ export async function runUpdate(options) {
|
|
|
196
245
|
}
|
|
197
246
|
finally {
|
|
198
247
|
rl.close();
|
|
248
|
+
if (renderDir)
|
|
249
|
+
fs.rmSync(renderDir, { recursive: true, force: true });
|
|
199
250
|
}
|
|
200
251
|
}
|
|
201
252
|
//# sourceMappingURL=update.js.map
|
package/dist/tasks/update.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/tasks/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAE/B,OAAO,EAAW,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAE9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE,EAAE;IAC/C,EAAE,EAAE;QACF,kBAAkB,EAAE,2CAA2C;QAC/D,iBAAiB,EAAE,2BAA2B;QAC9C,kBAAkB,EAAE,4BAA4B;QAChD,eAAe,EAAE,wDAAwD;QACzE,gBAAgB,EAAE,yBAAyB;QAC3C,gBAAgB,EAAE,eAAe;QACjC,cAAc,EAAE,6BAA6B;QAC7C,iBAAiB,EAAE,0BAA0B;KAC9C;IACD,EAAE,EAAE;QACF,kBAAkB,EAAE,4DAA4D;QAChF,iBAAiB,EAAE,iCAAiC;QACpD,kBAAkB,EAAE,kCAAkC;QACtD,eAAe,EAAE,0EAA0E;QAC3F,gBAAgB,EAAE,gCAAgC;QAClD,gBAAgB,EAAE,gBAAgB;QAClC,cAAc,EAAE,kCAAkC;QAClD,iBAAiB,EAAE,qCAAqC;KACzD;CACF,EAAE,SAAS,CAAC,CAAA;AAEb,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/tasks/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.test.d.ts","sourceRoot":"","sources":["../../src/tasks/update.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { getAllFiles, getTemplateDir, isTemplateFile, readProjectIdentity, runUpdate, } from './update.js';
|
|
6
|
+
import { runCreateProject } from './create.js';
|
|
7
|
+
function templateFiles() {
|
|
8
|
+
return getAllFiles(getTemplateDir())
|
|
9
|
+
.map((file) => file.replace(/\\/g, '/'))
|
|
10
|
+
.filter(isTemplateFile);
|
|
11
|
+
}
|
|
12
|
+
describe('m:update template discovery', () => {
|
|
13
|
+
it('sees dotfiles inside the template (with dot: true)', () => {
|
|
14
|
+
const all = getAllFiles(getTemplateDir()).map((file) => file.replace(/\\/g, '/'));
|
|
15
|
+
expect(all).toContain('apps/.env.example.hbs');
|
|
16
|
+
expect(all.some((file) => file.endsWith('apps/nextjs/.config/kysely.config.ts'))).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it('includes .env.example but skips real env files and the lockfile', () => {
|
|
19
|
+
const files = templateFiles();
|
|
20
|
+
expect(files).toContain('apps/.env.example.hbs');
|
|
21
|
+
expect(files.every((file) => !file.endsWith('pnpm-lock.yaml'))).toBe(true);
|
|
22
|
+
expect(files.every((file) => {
|
|
23
|
+
const name = file.split('/').pop();
|
|
24
|
+
return !name.startsWith('.env') || name.startsWith('.env.example');
|
|
25
|
+
})).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it('isTemplateFile keeps env examples and drops real env files', () => {
|
|
28
|
+
expect(isTemplateFile('apps/.env.example.hbs')).toBe(true);
|
|
29
|
+
expect(isTemplateFile('apps/.env.example')).toBe(true);
|
|
30
|
+
expect(isTemplateFile('apps/.env')).toBe(false);
|
|
31
|
+
expect(isTemplateFile('apps/.env.test')).toBe(false);
|
|
32
|
+
expect(isTemplateFile('apps/nextjs/pnpm-lock.yaml')).toBe(false);
|
|
33
|
+
expect(isTemplateFile('apps/nextjs/package.json.hbs')).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('readProjectIdentity', () => {
|
|
37
|
+
it('reads name/description from apps/nextjs/package.json', () => {
|
|
38
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'm-ident-'));
|
|
39
|
+
const dir = path.join(tmp, 'apps', 'nextjs');
|
|
40
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
41
|
+
fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify({ name: 'ident-app', description: 'Ident app' }));
|
|
42
|
+
expect(readProjectIdentity(tmp)).toEqual({ name: 'ident-app', description: 'Ident app' });
|
|
43
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
44
|
+
});
|
|
45
|
+
it('falls back to the directory name when there is no package.json', () => {
|
|
46
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'm-ident-'));
|
|
47
|
+
const project = path.join(tmp, 'sin-paquete');
|
|
48
|
+
fs.mkdirSync(project, { recursive: true });
|
|
49
|
+
expect(readProjectIdentity(project)).toEqual({ name: 'sin-paquete', description: '' });
|
|
50
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('m:update over a freshly created project', () => {
|
|
54
|
+
const originalCwd = process.cwd();
|
|
55
|
+
let tmp;
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
process.chdir(originalCwd);
|
|
58
|
+
if (tmp)
|
|
59
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
60
|
+
tmp = undefined;
|
|
61
|
+
});
|
|
62
|
+
it('renders .hbs before comparing, so a just-created project has no drift', async () => {
|
|
63
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'm-update-'));
|
|
64
|
+
await runCreateProject('demo-app', 'Demo project', tmp);
|
|
65
|
+
const projectDir = path.join(tmp, 'demo-app');
|
|
66
|
+
const readBefore = new Map();
|
|
67
|
+
for (const rel of ['README.md', 'AGENTS.md', 'apps/nextjs/package.json']) {
|
|
68
|
+
readBefore.set(rel, fs.readFileSync(path.join(projectDir, rel), 'utf-8'));
|
|
69
|
+
}
|
|
70
|
+
process.chdir(projectDir);
|
|
71
|
+
await runUpdate({ yes: true });
|
|
72
|
+
for (const [rel, before] of readBefore) {
|
|
73
|
+
expect(fs.readFileSync(path.join(projectDir, rel), 'utf-8')).toBe(before);
|
|
74
|
+
}
|
|
75
|
+
// The generated README already carries the placeholders resolved.
|
|
76
|
+
expect(readBefore.get('README.md')).not.toContain('{{name}}');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=update.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.test.js","sourceRoot":"","sources":["../../src/tasks/update.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,SAAS,GACV,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,SAAS,aAAa;IACpB,OAAO,WAAW,CAAC,cAAc,EAAE,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SACvC,MAAM,CAAC,cAAc,CAAC,CAAA;AAC3B,CAAC;AAED,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QACjF,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QAC9C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1E,MAAM,CACJ,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAY,CAAA;YAC5C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QACpE,CAAC,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1D,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpD,MAAM,CAAC,cAAc,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChE,MAAM,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAA;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC5C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACtC,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAChE,CAAA;QACD,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAA;QACzF,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC7C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACtF,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACjC,IAAI,GAAuB,CAAA;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAC1B,IAAI,GAAG;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,GAAG,GAAG,SAAS,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;QACzD,MAAM,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,CAAA;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QAE7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,0BAA0B,CAAC,EAAE,CAAC;YACzE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACzB,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9B,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3E,CAAC;QACD,kEAAkE;QAClE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|