ugly-app 0.1.776 → 0.1.777
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/cli/index.js +1 -1
- package/dist/cli/lint.d.ts.map +1 -1
- package/dist/cli/lint.js +29 -5
- package/dist/cli/lint.js.map +1 -1
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/package.json +1 -1
- package/src/cli/index.ts +1 -1
- package/src/cli/lint.ts +31 -5
- package/src/cli/version.ts +1 -1
- package/templates/CLAUDE.md +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -106,7 +106,7 @@ program
|
|
|
106
106
|
});
|
|
107
107
|
program
|
|
108
108
|
.command('lint')
|
|
109
|
-
.description('Lint
|
|
109
|
+
.description('Lint the project with eslint (scope decided by eslint.config.js)')
|
|
110
110
|
.option('--fix', 'Automatically fix problems where possible')
|
|
111
111
|
.option('--quiet', 'Report errors only (suppress warnings)')
|
|
112
112
|
.option('--max-warnings <n>', 'Number of warnings to trigger a nonzero exit code')
|
package/dist/cli/lint.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"AAqGA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,GAAG,EAAE,OAAO,CAAC;IACb,uEAAuE;IACvE,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,GAAE,cAAmB,GAAG,aAAa,CAqBhE;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAsCnF"}
|
package/dist/cli/lint.js
CHANGED
|
@@ -16,8 +16,32 @@ import { spawn, spawnSync } from 'node:child_process';
|
|
|
16
16
|
import { createRequire } from 'node:module';
|
|
17
17
|
import fs from 'node:fs';
|
|
18
18
|
import path from 'node:path';
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
// Lint the project root and let the app's own eslint.config.js `files` /
|
|
20
|
+
// `ignores` decide scope. Passing specific dirs (e.g. `client`) is brittle:
|
|
21
|
+
// ESLint 9 *fatally errors* if a passed directory's files are all ignored
|
|
22
|
+
// (e.g. ugly-studio's config lints server/shared/electron but not client).
|
|
23
|
+
// `.` always has matching files, mirrors the standard `eslint .` invocation,
|
|
24
|
+
// and stays correct for any app layout.
|
|
25
|
+
const DEFAULT_LINT_PATHS = ['.'];
|
|
26
|
+
/**
|
|
27
|
+
* Env for the spawned eslint:
|
|
28
|
+
* - ESLINT_USE_FLAT_CONFIG makes the pinned eslint v8 honor eslint.config.js.
|
|
29
|
+
* - Bump the V8 heap: type-aware linting (`strictTypeChecked`) over a whole
|
|
30
|
+
* project OOMs at the default ~4GB on large repos (ugly-studio crashes),
|
|
31
|
+
* which a lint gate must not mistake for a lint failure. Matches how apps
|
|
32
|
+
* already run eslint (`NODE_OPTIONS=--max-old-space-size=8192 eslint .`).
|
|
33
|
+
*/
|
|
34
|
+
function lintEnv() {
|
|
35
|
+
const existing = process.env['NODE_OPTIONS'] ?? '';
|
|
36
|
+
const nodeOptions = existing.includes('--max-old-space-size')
|
|
37
|
+
? existing
|
|
38
|
+
: `${existing} --max-old-space-size=8192`.trim();
|
|
39
|
+
return {
|
|
40
|
+
...process.env,
|
|
41
|
+
ESLINT_USE_FLAT_CONFIG: 'true',
|
|
42
|
+
NODE_OPTIONS: nodeOptions,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
21
45
|
/** Resolve the eslint CLI entry through the project's module graph (which
|
|
22
46
|
* includes ugly-app's bundled eslint). Returns null if eslint isn't installed. */
|
|
23
47
|
function resolveEslintBin(cwd) {
|
|
@@ -48,7 +72,7 @@ function hasEslintConfig(cwd) {
|
|
|
48
72
|
].some((f) => fs.existsSync(path.join(cwd, f)));
|
|
49
73
|
}
|
|
50
74
|
function targetDirs(cwd, dirs) {
|
|
51
|
-
return (dirs ??
|
|
75
|
+
return (dirs ?? DEFAULT_LINT_PATHS).filter((d) => fs.existsSync(path.join(cwd, d)));
|
|
52
76
|
}
|
|
53
77
|
/**
|
|
54
78
|
* Returns null when linting can't or shouldn't run (eslint absent, no config,
|
|
@@ -89,7 +113,7 @@ export function runLint(opts = {}) {
|
|
|
89
113
|
const res = spawnSync(process.execPath, args, {
|
|
90
114
|
cwd,
|
|
91
115
|
stdio: 'inherit',
|
|
92
|
-
env:
|
|
116
|
+
env: lintEnv(),
|
|
93
117
|
});
|
|
94
118
|
return { ran: true, ok: res.status === 0 };
|
|
95
119
|
}
|
|
@@ -106,7 +130,7 @@ export function lintSummaryAsync(cwd, dirs) {
|
|
|
106
130
|
resolve(empty);
|
|
107
131
|
return;
|
|
108
132
|
}
|
|
109
|
-
const child = spawn(process.execPath, [target.bin, ...target.dirs, '--format', 'json'], { cwd, env:
|
|
133
|
+
const child = spawn(process.execPath, [target.bin, ...target.dirs, '--format', 'json'], { cwd, env: lintEnv() });
|
|
110
134
|
let out = '';
|
|
111
135
|
child.stdout.on('data', (d) => {
|
|
112
136
|
out += d.toString();
|
package/dist/cli/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.777";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.777",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/index.ts
CHANGED
|
@@ -112,7 +112,7 @@ program
|
|
|
112
112
|
|
|
113
113
|
program
|
|
114
114
|
.command('lint')
|
|
115
|
-
.description('Lint
|
|
115
|
+
.description('Lint the project with eslint (scope decided by eslint.config.js)')
|
|
116
116
|
.option('--fix', 'Automatically fix problems where possible')
|
|
117
117
|
.option('--quiet', 'Report errors only (suppress warnings)')
|
|
118
118
|
.option('--max-warnings <n>', 'Number of warnings to trigger a nonzero exit code')
|
package/src/cli/lint.ts
CHANGED
|
@@ -17,9 +17,33 @@ import { createRequire } from 'node:module';
|
|
|
17
17
|
import fs from 'node:fs';
|
|
18
18
|
import path from 'node:path';
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
// Lint the project root and let the app's own eslint.config.js `files` /
|
|
21
|
+
// `ignores` decide scope. Passing specific dirs (e.g. `client`) is brittle:
|
|
22
|
+
// ESLint 9 *fatally errors* if a passed directory's files are all ignored
|
|
23
|
+
// (e.g. ugly-studio's config lints server/shared/electron but not client).
|
|
24
|
+
// `.` always has matching files, mirrors the standard `eslint .` invocation,
|
|
25
|
+
// and stays correct for any app layout.
|
|
26
|
+
const DEFAULT_LINT_PATHS = ['.'];
|
|
21
27
|
|
|
22
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Env for the spawned eslint:
|
|
30
|
+
* - ESLINT_USE_FLAT_CONFIG makes the pinned eslint v8 honor eslint.config.js.
|
|
31
|
+
* - Bump the V8 heap: type-aware linting (`strictTypeChecked`) over a whole
|
|
32
|
+
* project OOMs at the default ~4GB on large repos (ugly-studio crashes),
|
|
33
|
+
* which a lint gate must not mistake for a lint failure. Matches how apps
|
|
34
|
+
* already run eslint (`NODE_OPTIONS=--max-old-space-size=8192 eslint .`).
|
|
35
|
+
*/
|
|
36
|
+
function lintEnv(): NodeJS.ProcessEnv {
|
|
37
|
+
const existing = process.env['NODE_OPTIONS'] ?? '';
|
|
38
|
+
const nodeOptions = existing.includes('--max-old-space-size')
|
|
39
|
+
? existing
|
|
40
|
+
: `${existing} --max-old-space-size=8192`.trim();
|
|
41
|
+
return {
|
|
42
|
+
...process.env,
|
|
43
|
+
ESLINT_USE_FLAT_CONFIG: 'true',
|
|
44
|
+
NODE_OPTIONS: nodeOptions,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
23
47
|
|
|
24
48
|
/** Resolve the eslint CLI entry through the project's module graph (which
|
|
25
49
|
* includes ugly-app's bundled eslint). Returns null if eslint isn't installed. */
|
|
@@ -53,7 +77,9 @@ function hasEslintConfig(cwd: string): boolean {
|
|
|
53
77
|
}
|
|
54
78
|
|
|
55
79
|
function targetDirs(cwd: string, dirs?: string[]): string[] {
|
|
56
|
-
return (dirs ??
|
|
80
|
+
return (dirs ?? DEFAULT_LINT_PATHS).filter((d) =>
|
|
81
|
+
fs.existsSync(path.join(cwd, d)),
|
|
82
|
+
);
|
|
57
83
|
}
|
|
58
84
|
|
|
59
85
|
/**
|
|
@@ -111,7 +137,7 @@ export function runLint(opts: RunLintOptions = {}): RunLintResult {
|
|
|
111
137
|
const res = spawnSync(process.execPath, args, {
|
|
112
138
|
cwd,
|
|
113
139
|
stdio: 'inherit',
|
|
114
|
-
env:
|
|
140
|
+
env: lintEnv(),
|
|
115
141
|
});
|
|
116
142
|
return { ran: true, ok: res.status === 0 };
|
|
117
143
|
}
|
|
@@ -138,7 +164,7 @@ export function lintSummaryAsync(cwd: string, dirs?: string[]): Promise<LintSumm
|
|
|
138
164
|
const child = spawn(
|
|
139
165
|
process.execPath,
|
|
140
166
|
[target.bin, ...target.dirs, '--format', 'json'],
|
|
141
|
-
{ cwd, env:
|
|
167
|
+
{ cwd, env: lintEnv() },
|
|
142
168
|
);
|
|
143
169
|
let out = '';
|
|
144
170
|
child.stdout.on('data', (d: Buffer) => {
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.777";
|
package/templates/CLAUDE.md
CHANGED
|
@@ -11,7 +11,7 @@ Full API reference: https://www.npmjs.com/package/ugly-app
|
|
|
11
11
|
|
|
12
12
|
## Commands
|
|
13
13
|
- `npm run dev` — Start everything (local Postgres/MinIO, server, Vite, tsc watch, + a one-shot eslint summary)
|
|
14
|
-
- `npm run lint` — Lint
|
|
14
|
+
- `npm run lint` — Lint the project (`npm run lint:fix` to auto-fix)
|
|
15
15
|
- `npm run build` — Production build
|
|
16
16
|
- `npm run publish` — Deploy to Cloudflare Workers (runs an eslint gate first)
|
|
17
17
|
- `npm run db:migrate` — Run pending migrations
|