@pasosdejesus/m 0.31.0 → 0.31.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.
@@ -0,0 +1,138 @@
1
+ // Lector/editor del subconjunto de `pnpm-workspace.yaml` que usa `m:check`
2
+ // (https://gitlab.com/pasosdeJesus/m/-/work_items/56). Sin dependencia YAML:
3
+ // el proyecto ya escribe ese archivo a mano en `m:create`/`m:update`.
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ const MAP_SECTIONS = [
6
+ 'catalog',
7
+ 'allowBuilds',
8
+ 'overrides',
9
+ 'patchedDependencies',
10
+ ];
11
+ function unquote(value) {
12
+ const trimmed = value.trim();
13
+ if (trimmed.length >= 2) {
14
+ const first = trimmed[0];
15
+ const last = trimmed[trimmed.length - 1];
16
+ if ((first === "'" && last === "'") || (first === '"' && last === '"')) {
17
+ return trimmed.slice(1, -1);
18
+ }
19
+ }
20
+ return trimmed;
21
+ }
22
+ function stripComment(line) {
23
+ let quote = null;
24
+ for (let index = 0; index < line.length; index += 1) {
25
+ const char = line[index];
26
+ if (quote) {
27
+ if (char === quote)
28
+ quote = null;
29
+ continue;
30
+ }
31
+ if (char === "'" || char === '"') {
32
+ quote = char;
33
+ continue;
34
+ }
35
+ if (char === '#' && (index === 0 || /\s/.test(line[index - 1]))) {
36
+ return line.slice(0, index);
37
+ }
38
+ }
39
+ return line;
40
+ }
41
+ export function parseWorkspaceYaml(text) {
42
+ const config = {
43
+ packages: [],
44
+ catalog: {},
45
+ allowBuilds: {},
46
+ overrides: {},
47
+ patchedDependencies: {},
48
+ raw: text,
49
+ };
50
+ let section = null;
51
+ for (const rawLine of text.split(/\r?\n/)) {
52
+ const line = stripComment(rawLine);
53
+ if (!line.trim())
54
+ continue;
55
+ if (!/^\s/.test(line)) {
56
+ const top = line.match(/^([A-Za-z][\w-]*):\s*(.*)$/);
57
+ if (top) {
58
+ section = top[1];
59
+ continue;
60
+ }
61
+ }
62
+ if (!section)
63
+ continue;
64
+ if (section === 'packages') {
65
+ const item = line.match(/^\s*-\s*(.+)$/);
66
+ if (item)
67
+ config.packages.push(unquote(item[1]));
68
+ continue;
69
+ }
70
+ if (!MAP_SECTIONS.includes(section))
71
+ continue;
72
+ const entry = line.match(/^\s+(.+?):\s*(.*)$/);
73
+ if (!entry)
74
+ continue;
75
+ const key = unquote(entry[1]);
76
+ const value = unquote(entry[2]);
77
+ if (!key || !value)
78
+ continue;
79
+ if (section === 'allowBuilds') {
80
+ config.allowBuilds[key] = value === 'true';
81
+ }
82
+ else {
83
+ config[section][key] = value;
84
+ }
85
+ }
86
+ return config;
87
+ }
88
+ export function readWorkspaceYaml(file) {
89
+ if (!existsSync(file))
90
+ return null;
91
+ try {
92
+ return parseWorkspaceYaml(readFileSync(file, 'utf-8'));
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ function formatKey(key) {
99
+ return /^[A-Za-z0-9_.-]+$/.test(key) ? key : `'${key}'`;
100
+ }
101
+ /**
102
+ * Adds the entries of `key` that are not already present to the top-level
103
+ * section `key:`, creating it at the end when absent. Existing lines are left
104
+ * untouched, so the diff stays small.
105
+ */
106
+ export function setSectionEntries(text, key, entries) {
107
+ const wanted = Object.entries(entries);
108
+ if (wanted.length === 0)
109
+ return text;
110
+ const lines = text.split(/\r?\n/);
111
+ const start = lines.findIndex((line) => new RegExp(`^${key}:\\s*$`).test(line));
112
+ const formatValue = (value) => typeof value === 'boolean' ? String(value) : /^[A-Za-z0-9_.^~/*<>=|-]+$/.test(value) ? value : unquote(`'${value}'`);
113
+ if (start < 0) {
114
+ const block = ['', `${key}:`, ...wanted.map(([k, v]) => ` ${formatKey(k)}: ${formatValue(v)}`)];
115
+ return `${text.replace(/\s*$/, '')}\n${block.join('\n')}\n`;
116
+ }
117
+ let end = lines.length;
118
+ for (let index = start + 1; index < lines.length; index += 1) {
119
+ if (/^[A-Za-z][\w-]*:/.test(lines[index])) {
120
+ end = index;
121
+ break;
122
+ }
123
+ }
124
+ const body = lines.slice(start + 1, end);
125
+ const present = new Set();
126
+ for (const line of body) {
127
+ const entry = line.match(/^\s+(.+?):\s*(.*)$/);
128
+ if (entry)
129
+ present.add(unquote(entry[1]));
130
+ }
131
+ const missing = wanted.filter(([k]) => !present.has(k));
132
+ if (missing.length === 0)
133
+ return text;
134
+ const insert = missing.map(([k, v]) => ` ${formatKey(k)}: ${formatValue(v)}`);
135
+ const next = [...lines.slice(0, end), ...insert, ...lines.slice(end)];
136
+ return next.join('\n');
137
+ }
138
+ //# sourceMappingURL=pnpm-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-workspace.js","sourceRoot":"","sources":["../../src/util/pnpm-workspace.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pasosdejesus/m",
3
- "version": "0.31.0",
3
+ "version": "0.31.2",
4
4
  "description": "Motor para crear y gestionar proyectos al estilo Pasos de Jesus.",
5
5
  "author": "",
6
6
  "license": "ISC",
@@ -20,6 +20,7 @@ Each file in this directory exports a `runXxx()` function registered in `../m.ts
20
20
  | `context-git.ts` | *(internal)* | Git queries (tracked, untracked, ignored, branch, log, status) and file collection |
21
21
  | `context-reqs.ts` | *(internal)* | Parses `REQ/*.md` and keeps only open requirements |
22
22
  | `context-render.ts` | *(internal)* | Structure and document rendering with a hard size budget |
23
+ | `check.ts` | `m:check` | Verifies the recommended project layout (root workspace, `apps/web`, `apps/contracts`, `catalog:`) and reports findings; `--fix` applies only reversible fixes |
23
24
  | `create.ts` | `m:create` | Scaffolds new projects from `templates/` via direct recursive copy (replaced Plop.js) |
24
25
  | `db.ts` | `db:create`, `db:drop`, `db:super:createuser`, `db:structure:dump`, `db:structure:load`, `db:migrate`, `db:rollback`, `db:mig:make`, `db:seed`, `db:console`, `db:test`, `db:dump`, `db:restore` | PostgreSQL database lifecycle, migration management, schema verification, and backup/restore |
25
26
  | `e2e.ts` | `test:e2e` | E2E tests (Puppeteer specs, axios smoke) |