@remix-run/cli 0.3.3 → 0.4.0
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/README.md +105 -1
- package/dist/index.js +1 -1
- package/dist/lib/app-root.d.ts +11 -0
- package/dist/lib/app-root.d.ts.map +1 -0
- package/dist/lib/app-root.js +38 -0
- package/dist/lib/bootstrap-project.js +2 -2
- package/dist/lib/cli-context.d.ts +6 -0
- package/dist/lib/cli-context.d.ts.map +1 -1
- package/dist/lib/cli-context.js +12 -1
- package/dist/lib/cli.d.ts +3 -2
- package/dist/lib/cli.d.ts.map +1 -1
- package/dist/lib/cli.js +42 -14
- package/dist/lib/commands/completion.js +4 -4
- package/dist/lib/commands/db.d.ts +4 -0
- package/dist/lib/commands/db.d.ts.map +1 -0
- package/dist/lib/commands/db.js +283 -0
- package/dist/lib/commands/doctor.d.ts +5 -0
- package/dist/lib/commands/doctor.d.ts.map +1 -1
- package/dist/lib/commands/doctor.js +26 -251
- package/dist/lib/commands/help.d.ts.map +1 -1
- package/dist/lib/commands/help.js +17 -9
- package/dist/lib/commands/new.js +6 -6
- package/dist/lib/commands/routes.js +6 -6
- package/dist/lib/commands/test.d.ts +20 -1
- package/dist/lib/commands/test.d.ts.map +1 -1
- package/dist/lib/commands/test.js +353 -10
- package/dist/lib/commands/version.js +3 -3
- package/dist/lib/completion.d.ts +1 -1
- package/dist/lib/completion.d.ts.map +1 -1
- package/dist/lib/completion.js +229 -6
- package/dist/lib/controller-files.d.ts +0 -8
- package/dist/lib/controller-files.d.ts.map +1 -1
- package/dist/lib/controller-files.js +0 -23
- package/dist/lib/controller-ownership.d.ts +4 -12
- package/dist/lib/controller-ownership.d.ts.map +1 -1
- package/dist/lib/controller-ownership.js +31 -127
- package/dist/lib/database-command.d.ts +20 -0
- package/dist/lib/database-command.d.ts.map +1 -0
- package/dist/lib/database-command.js +7 -0
- package/dist/lib/doctor/controller-findings.d.ts +2 -2
- package/dist/lib/doctor/controller-findings.d.ts.map +1 -1
- package/dist/lib/doctor/controller-findings.js +23 -39
- package/dist/lib/doctor/controllers.d.ts +1 -2
- package/dist/lib/doctor/controllers.d.ts.map +1 -1
- package/dist/lib/doctor/controllers.js +4 -7
- package/dist/lib/doctor/environment.js +2 -2
- package/dist/lib/doctor/fixes.d.ts.map +1 -1
- package/dist/lib/doctor/fixes.js +46 -7
- package/dist/lib/doctor/project.d.ts.map +1 -1
- package/dist/lib/doctor/project.js +3 -212
- package/dist/lib/doctor/run.d.ts +9 -0
- package/dist/lib/doctor/run.d.ts.map +1 -0
- package/dist/lib/doctor/run.js +237 -0
- package/dist/lib/doctor/types.d.ts +2 -1
- package/dist/lib/doctor/types.d.ts.map +1 -1
- package/dist/lib/doctor/types.js +4 -1
- package/dist/lib/errors.d.ts +30 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +55 -0
- package/dist/lib/help-text.js +1 -1
- package/dist/lib/parse-args.d.ts.map +1 -1
- package/dist/lib/parse-args.js +17 -4
- package/dist/lib/remix-config.d.ts +75 -0
- package/dist/lib/remix-config.d.ts.map +1 -0
- package/dist/lib/remix-config.js +411 -0
- package/dist/lib/reporter.js +1 -1
- package/dist/lib/route-map.js +13 -33
- package/package.json +12 -6
- package/schema/remix.json +242 -0
- package/src/lib/app-root.ts +46 -0
- package/src/lib/cli-context.ts +17 -0
- package/src/lib/cli.ts +41 -6
- package/src/lib/commands/db.ts +377 -0
- package/src/lib/commands/doctor.ts +27 -329
- package/src/lib/commands/help.ts +10 -1
- package/src/lib/commands/test.ts +453 -12
- package/src/lib/completion.ts +321 -6
- package/src/lib/controller-files.ts +0 -38
- package/src/lib/controller-ownership.ts +50 -203
- package/src/lib/database-command.ts +31 -0
- package/src/lib/doctor/controller-findings.ts +30 -47
- package/src/lib/doctor/controllers.ts +2 -6
- package/src/lib/doctor/fixes.ts +55 -6
- package/src/lib/doctor/project.ts +0 -236
- package/src/lib/doctor/run.ts +311 -0
- package/src/lib/doctor/types.ts +6 -5
- package/src/lib/errors.ts +65 -0
- package/src/lib/parse-args.ts +19 -3
- package/src/lib/remix-config.ts +639 -0
- package/src/lib/route-map.ts +11 -48
- package/template/.agents/skills/remix/SKILL.md +39 -28
- package/template/.agents/skills/remix/references/assets-and-browser-modules.md +53 -10
- package/template/.agents/skills/remix/references/auth-and-sessions.md +5 -5
- package/template/.agents/skills/remix/references/data-and-validation.md +15 -15
- package/template/.agents/skills/remix/references/hydration-frames-navigation.md +54 -8
- package/template/.agents/skills/remix/references/middleware-and-server.md +68 -6
- package/template/.agents/skills/remix/references/mixins-styling-events.md +2 -0
- package/template/.agents/skills/remix/references/routing-and-controllers.md +8 -8
- package/template/.agents/skills/remix/references/testing-patterns.md +19 -18
- package/template/AGENTS.md +6 -3
- package/template/README.md +6 -3
- package/template/app/actions/controller.tsx +1 -1
- package/template/app/{ui → actions}/document.tsx +7 -5
- package/template/app/{ui/scaffold-home-page.tsx → actions/home-page.tsx} +2 -3
- package/template/app/actions/public/entry.ts +48 -0
- package/template/app/{assets → actions/public}/prompt-button.tsx +29 -25
- package/template/app/assets.ts +19 -8
- package/template/app/middleware/render.tsx +29 -1
- package/template/hmr.ts +46 -0
- package/template/package.json +4 -3
- package/template/server.ts +8 -1
- package/template/tsconfig.json +1 -1
- package/dist/lib/doctor/controller-fix-plans.d.ts +0 -4
- package/dist/lib/doctor/controller-fix-plans.d.ts.map +0 -1
- package/dist/lib/doctor/controller-fix-plans.js +0 -119
- package/dist/lib/doctor/controller-placeholders.d.ts +0 -3
- package/dist/lib/doctor/controller-placeholders.d.ts.map +0 -1
- package/dist/lib/doctor/controller-placeholders.js +0 -52
- package/src/lib/doctor/controller-fix-plans.ts +0 -168
- package/src/lib/doctor/controller-placeholders.ts +0 -70
- package/template/app/assets/entry.ts +0 -8
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as process from 'node:process';
|
|
3
|
+
import { checkControllerConventions } from './controllers.js';
|
|
4
|
+
import { checkEnvironment, getEnvironmentFixPlans } from './environment.js';
|
|
5
|
+
import { applyDoctorFixPlans } from './fixes.js';
|
|
6
|
+
import { checkProject, getProjectFixPlans } from './project.js';
|
|
7
|
+
import { createDoctorSuite, createSkippedDoctorSuite, hasWarningFindings, } from './types.js';
|
|
8
|
+
import { createCommandReporter, createStepProgressReporter, } from '../reporter.js';
|
|
9
|
+
const DOCTOR_SUITE_LABELS = {
|
|
10
|
+
actions: {
|
|
11
|
+
complete: 'actions',
|
|
12
|
+
running: 'Checking actions',
|
|
13
|
+
},
|
|
14
|
+
environment: {
|
|
15
|
+
complete: 'environment',
|
|
16
|
+
running: 'Checking environment',
|
|
17
|
+
},
|
|
18
|
+
project: {
|
|
19
|
+
complete: 'project',
|
|
20
|
+
running: 'Checking project',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export async function runRemixDoctor(options) {
|
|
24
|
+
let reporter = null;
|
|
25
|
+
let progress = null;
|
|
26
|
+
try {
|
|
27
|
+
reporter = options.json
|
|
28
|
+
? null
|
|
29
|
+
: createCommandReporter({
|
|
30
|
+
remixVersion: options.remixVersion,
|
|
31
|
+
stderr: process.stdout,
|
|
32
|
+
stdout: process.stdout,
|
|
33
|
+
});
|
|
34
|
+
progress = reporter == null ? null : createDoctorProgressReporter(reporter);
|
|
35
|
+
if (reporter != null) {
|
|
36
|
+
await reporter.status.commandHeader('doctor');
|
|
37
|
+
}
|
|
38
|
+
let report = await collectDoctorReport(progress, options, reporter);
|
|
39
|
+
if (options.json) {
|
|
40
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
41
|
+
}
|
|
42
|
+
else if (reporter != null) {
|
|
43
|
+
writeDoctorReport(reporter, report);
|
|
44
|
+
reporter.finish();
|
|
45
|
+
}
|
|
46
|
+
if ((options.fix || options.strict) && hasWarningFindings(report.findings)) {
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
progress?.writeSummaryGap();
|
|
53
|
+
reporter?.finish();
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function collectDoctorReport(progress, options, reporter) {
|
|
58
|
+
let cwd = options.cwd;
|
|
59
|
+
let appliedFixes = [];
|
|
60
|
+
let environment = await runDoctorSuite(progress, 'environment', async () => {
|
|
61
|
+
let result = await checkEnvironment(cwd);
|
|
62
|
+
let suiteAppliedFixes = [];
|
|
63
|
+
let finalResult = result;
|
|
64
|
+
if (options.fix && result.projectRoot != null) {
|
|
65
|
+
let fixPlans = getEnvironmentFixPlans(result, options.remixVersion);
|
|
66
|
+
if (fixPlans.length > 0) {
|
|
67
|
+
suiteAppliedFixes = await applyDoctorFixPlans(result.projectRoot, fixPlans);
|
|
68
|
+
finalResult = await checkEnvironment(result.projectRoot);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let suite = finalResult.suite;
|
|
72
|
+
if (suiteAppliedFixes.length > 0) {
|
|
73
|
+
suite = {
|
|
74
|
+
...suite,
|
|
75
|
+
appliedFixes: suiteAppliedFixes,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
appliedFixes: suiteAppliedFixes,
|
|
80
|
+
projectRoot: finalResult.projectRoot ?? result.projectRoot,
|
|
81
|
+
suite,
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
let findings = [...environment.suite.findings];
|
|
85
|
+
appliedFixes.push(...(environment.appliedFixes ?? []));
|
|
86
|
+
let suites = [environment.suite];
|
|
87
|
+
let routesFile = environment.projectRoot == null
|
|
88
|
+
? undefined
|
|
89
|
+
: path.join(environment.projectRoot, 'app', 'routes.ts');
|
|
90
|
+
writeDoctorSuiteDetails(reporter, environment.suite);
|
|
91
|
+
progress?.writeSummaryGap();
|
|
92
|
+
if (hasWarningFindings(environment.suite.findings)) {
|
|
93
|
+
let projectSuite = createSkippedDoctorSuite('project', 'Blocked by environment warnings.');
|
|
94
|
+
let actionsSuite = createSkippedDoctorSuite('actions', 'Blocked by environment warnings.');
|
|
95
|
+
suites.push(projectSuite, actionsSuite);
|
|
96
|
+
progress?.skip(projectSuite.name, projectSuite.reason);
|
|
97
|
+
writeDoctorSuiteDetails(reporter, projectSuite);
|
|
98
|
+
progress?.writeSummaryGap();
|
|
99
|
+
progress?.skip(actionsSuite.name, actionsSuite.reason);
|
|
100
|
+
writeDoctorSuiteDetails(reporter, actionsSuite);
|
|
101
|
+
progress?.writeSummaryGap();
|
|
102
|
+
return {
|
|
103
|
+
appRoot: environment.projectRoot,
|
|
104
|
+
appliedFixes,
|
|
105
|
+
findings,
|
|
106
|
+
remainingFindings: findings,
|
|
107
|
+
routesFile,
|
|
108
|
+
suites,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
let project = await runDoctorSuite(progress, 'project', async () => {
|
|
112
|
+
let result = await checkProject(environment.projectRoot);
|
|
113
|
+
let suiteAppliedFixes = [];
|
|
114
|
+
let finalResult = result;
|
|
115
|
+
if (options.fix) {
|
|
116
|
+
let fixPlans = await getProjectFixPlans(environment.projectRoot);
|
|
117
|
+
if (fixPlans.length > 0) {
|
|
118
|
+
suiteAppliedFixes = await applyDoctorFixPlans(environment.projectRoot, fixPlans);
|
|
119
|
+
finalResult = await checkProject(environment.projectRoot);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
let suite = finalResult.suite;
|
|
123
|
+
if (suiteAppliedFixes.length > 0) {
|
|
124
|
+
suite = {
|
|
125
|
+
...suite,
|
|
126
|
+
appliedFixes: suiteAppliedFixes,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
appliedFixes: suiteAppliedFixes,
|
|
131
|
+
routeManifest: finalResult.routeManifest,
|
|
132
|
+
routesFile: finalResult.routesFile,
|
|
133
|
+
suite,
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
findings.push(...project.suite.findings);
|
|
137
|
+
appliedFixes.push(...(project.appliedFixes ?? []));
|
|
138
|
+
routesFile = project.routesFile;
|
|
139
|
+
suites.push(project.suite);
|
|
140
|
+
writeDoctorSuiteDetails(reporter, project.suite);
|
|
141
|
+
progress?.writeSummaryGap();
|
|
142
|
+
if (hasWarningFindings(project.suite.findings)) {
|
|
143
|
+
let actionsSuite = createSkippedDoctorSuite('actions', 'Blocked by project warnings.');
|
|
144
|
+
suites.push(actionsSuite);
|
|
145
|
+
progress?.skip(actionsSuite.name, actionsSuite.reason);
|
|
146
|
+
writeDoctorSuiteDetails(reporter, actionsSuite);
|
|
147
|
+
progress?.writeSummaryGap();
|
|
148
|
+
return {
|
|
149
|
+
appRoot: environment.projectRoot,
|
|
150
|
+
appliedFixes,
|
|
151
|
+
findings,
|
|
152
|
+
remainingFindings: findings,
|
|
153
|
+
routesFile,
|
|
154
|
+
suites,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
let actions = await runDoctorSuite(progress, 'actions', async () => {
|
|
158
|
+
let controllerResult = await checkControllerConventions(project.routeManifest.appRoot, project.routeManifest.tree);
|
|
159
|
+
return { suite: controllerResult.suite };
|
|
160
|
+
});
|
|
161
|
+
findings.push(...actions.suite.findings);
|
|
162
|
+
suites.push(actions.suite);
|
|
163
|
+
writeDoctorSuiteDetails(reporter, actions.suite);
|
|
164
|
+
progress?.writeSummaryGap();
|
|
165
|
+
let report = {
|
|
166
|
+
appRoot: environment.projectRoot,
|
|
167
|
+
findings,
|
|
168
|
+
routesFile,
|
|
169
|
+
suites,
|
|
170
|
+
};
|
|
171
|
+
if (options.fix) {
|
|
172
|
+
report.appliedFixes = appliedFixes;
|
|
173
|
+
report.remainingFindings = findings;
|
|
174
|
+
}
|
|
175
|
+
return report;
|
|
176
|
+
}
|
|
177
|
+
function formatAppliedFix(appliedFix) {
|
|
178
|
+
if (appliedFix.kind === 'update-file') {
|
|
179
|
+
return `Updated ${appliedFix.path}`;
|
|
180
|
+
}
|
|
181
|
+
return `Created ${appliedFix.path}`;
|
|
182
|
+
}
|
|
183
|
+
async function runDoctorSuite(progress, label, callback) {
|
|
184
|
+
progress?.start(label);
|
|
185
|
+
try {
|
|
186
|
+
let result = await callback();
|
|
187
|
+
if (result.suite.status === 'ok') {
|
|
188
|
+
progress?.succeed(label);
|
|
189
|
+
}
|
|
190
|
+
else if (result.suite.status === 'issues') {
|
|
191
|
+
progress?.fail(label);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
progress?.skip(label, result.suite.reason);
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
progress?.fail(label);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function createDoctorProgressReporter(reporter) {
|
|
204
|
+
return createStepProgressReporter(reporter.status, DOCTOR_SUITE_LABELS);
|
|
205
|
+
}
|
|
206
|
+
function writeDoctorReport(reporter, report) {
|
|
207
|
+
let warningCount = report.findings.filter((finding) => finding.severity === 'warn').length;
|
|
208
|
+
let adviceCount = report.findings.length - warningCount;
|
|
209
|
+
if ((report.appliedFixes?.length ?? 0) > 0) {
|
|
210
|
+
let fixCount = report.appliedFixes.length;
|
|
211
|
+
reporter.out.line(`Applied ${fixCount} ${fixCount === 1 ? 'fix' : 'fixes'}.`);
|
|
212
|
+
}
|
|
213
|
+
if (report.findings.length === 0) {
|
|
214
|
+
reporter.out.line('Doctor found no issues.');
|
|
215
|
+
}
|
|
216
|
+
reporter.out.line(`Summary: ${warningCount} warnings, ${adviceCount} advice.`);
|
|
217
|
+
}
|
|
218
|
+
function writeDoctorSuiteDetails(reporter, suite) {
|
|
219
|
+
if (reporter == null) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (suite.findings.length === 0 && (suite.appliedFixes?.length ?? 0) === 0) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
reporter.out.withIndent(() => {
|
|
226
|
+
for (let finding of suite.findings) {
|
|
227
|
+
reporter.out.bullet(reporter.out.label(finding.severity.toUpperCase(), finding.message, {
|
|
228
|
+
tone: finding.severity === 'warn' ? 'warn' : undefined,
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
if ((suite.appliedFixes?.length ?? 0) > 0) {
|
|
232
|
+
reporter.out.section('Applied fixes:', () => {
|
|
233
|
+
reporter.out.bullets((suite.appliedFixes ?? []).map(formatAppliedFix));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type DoctorSuiteName = 'environment' | 'project' | 'actions';
|
|
2
2
|
export type DoctorFindingSeverity = 'warn' | 'advice';
|
|
3
3
|
export type DoctorSuiteStatus = 'ok' | 'issues' | 'skipped';
|
|
4
|
-
export type DoctorFindingCode = 'project-root-not-found' | 'package-json-read-failed' | 'package-json-invalid' | 'node-engine-missing' | 'node-engine-unparseable' | 'node-version-unsupported' | 'remix-dependency-missing' | 'remix-install-missing' | 'routes-file-missing' | 'routes-export-missing' | 'route-map-invalid' | 'route-module-import-failed' | 'route-map-invalid-json' | 'route-map-loader-signal' | 'missing-owner' | '
|
|
4
|
+
export type DoctorFindingCode = 'project-root-not-found' | 'package-json-read-failed' | 'package-json-invalid' | 'node-engine-missing' | 'node-engine-unparseable' | 'node-version-unsupported' | 'remix-dependency-missing' | 'remix-install-missing' | 'routes-file-missing' | 'routes-export-missing' | 'route-map-invalid' | 'route-module-import-failed' | 'route-map-invalid-json' | 'route-map-loader-signal' | 'missing-owner' | 'missing-route-directory';
|
|
5
5
|
export type DoctorFixKind = 'create-directory' | 'create-file' | 'update-file';
|
|
6
6
|
export interface DoctorFinding {
|
|
7
7
|
actualPath?: string;
|
|
@@ -43,6 +43,7 @@ export interface DoctorReport {
|
|
|
43
43
|
routesFile?: string;
|
|
44
44
|
suites: DoctorSuiteResult[];
|
|
45
45
|
}
|
|
46
|
+
export declare function hasWarningFindings(findings: DoctorFinding[]): boolean;
|
|
46
47
|
export declare function createDoctorSuite(name: DoctorSuiteName, findings: DoctorFinding[]): DoctorSuiteResult;
|
|
47
48
|
export declare function createSkippedDoctorSuite(name: DoctorSuiteName, reason: string): DoctorSuiteResult;
|
|
48
49
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/doctor/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AACnE,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE3D,MAAM,MAAM,iBAAiB,GACzB,wBAAwB,GACxB,0BAA0B,GAC1B,sBAAsB,GACtB,qBAAqB,GACrB,yBAAyB,GACzB,0BAA0B,GAC1B,0BAA0B,GAC1B,uBAAuB,GACvB,qBAAqB,GACrB,uBAAuB,GACvB,mBAAmB,GACnB,4BAA4B,GAC5B,wBAAwB,GACxB,yBAAyB,GACzB,eAAe,GACf,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/doctor/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AACnE,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE3D,MAAM,MAAM,iBAAiB,GACzB,wBAAwB,GACxB,0BAA0B,GAC1B,sBAAsB,GACtB,qBAAqB,GACrB,yBAAyB,GACzB,0BAA0B,GAC1B,0BAA0B,GAC1B,uBAAuB,GACvB,qBAAqB,GACrB,uBAAuB,GACvB,mBAAmB,GACnB,4BAA4B,GAC5B,wBAAwB,GACxB,yBAAyB,GACzB,eAAe,GACf,yBAAyB,CAAA;AAE7B,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,aAAa,GAAG,aAAa,CAAA;AAE9E,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,iBAAiB,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,qBAAqB,CAAA;IAC/B,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,iBAAiB,CAAA;IACvB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,iBAAiB,CAAC,EAAE,aAAa,EAAE,CAAA;IACnC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAErE;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,aAAa,EAAE,GACxB,iBAAiB,CAMnB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAOjG"}
|
package/dist/lib/doctor/types.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
export function hasWarningFindings(findings) {
|
|
2
|
+
return findings.some((finding) => finding.severity === 'warn');
|
|
3
|
+
}
|
|
1
4
|
export function createDoctorSuite(name, findings) {
|
|
2
5
|
return {
|
|
3
6
|
findings,
|
|
4
7
|
name,
|
|
5
|
-
status: findings
|
|
8
|
+
status: hasWarningFindings(findings) ? 'issues' : 'ok',
|
|
6
9
|
};
|
|
7
10
|
}
|
|
8
11
|
export function createSkippedDoctorSuite(name, reason) {
|
package/dist/lib/errors.d.ts
CHANGED
|
@@ -20,6 +20,16 @@ export declare const CLI_ERROR_DEFINITIONS: {
|
|
|
20
20
|
title: string;
|
|
21
21
|
fix: string;
|
|
22
22
|
};
|
|
23
|
+
dbConfigRequired: {
|
|
24
|
+
code: string;
|
|
25
|
+
title: string;
|
|
26
|
+
fix: string;
|
|
27
|
+
};
|
|
28
|
+
dbForceRequired: {
|
|
29
|
+
code: string;
|
|
30
|
+
title: string;
|
|
31
|
+
fix: string;
|
|
32
|
+
};
|
|
23
33
|
remixVersionUnavailable: {
|
|
24
34
|
code: string;
|
|
25
35
|
title: string;
|
|
@@ -47,6 +57,16 @@ export declare const CLI_ERROR_DEFINITIONS: {
|
|
|
47
57
|
title: string;
|
|
48
58
|
fix: string;
|
|
49
59
|
};
|
|
60
|
+
invalidOptionValue: {
|
|
61
|
+
code: string;
|
|
62
|
+
title: string;
|
|
63
|
+
fix: string;
|
|
64
|
+
};
|
|
65
|
+
invalidRemixConfig: {
|
|
66
|
+
code: string;
|
|
67
|
+
title: string;
|
|
68
|
+
fix: string;
|
|
69
|
+
};
|
|
50
70
|
missingOptionValue: {
|
|
51
71
|
code: string;
|
|
52
72
|
title: string;
|
|
@@ -62,6 +82,11 @@ export declare const CLI_ERROR_DEFINITIONS: {
|
|
|
62
82
|
title: string;
|
|
63
83
|
fix: string;
|
|
64
84
|
};
|
|
85
|
+
remixConfigNotFound: {
|
|
86
|
+
code: string;
|
|
87
|
+
title: string;
|
|
88
|
+
fix: string;
|
|
89
|
+
};
|
|
65
90
|
remoteSkillDataMissing: {
|
|
66
91
|
code: string;
|
|
67
92
|
title: string;
|
|
@@ -139,14 +164,19 @@ export declare class UsageError extends CliError {
|
|
|
139
164
|
constructor(options: CliErrorOptions);
|
|
140
165
|
}
|
|
141
166
|
export declare function appNameUnavailable(targetDir?: string): UsageError;
|
|
167
|
+
export declare function dbConfigRequired(filePath: string): CliError;
|
|
168
|
+
export declare function dbForceRequired(command: string): UsageError;
|
|
142
169
|
export declare function remixVersionUnavailable(): CliError;
|
|
143
170
|
export declare function invalidCompletionRequest(): CliError;
|
|
144
171
|
export declare function fetchUnavailable(): CliError;
|
|
145
172
|
export declare function invalidFlagCombination(details: string): UsageError;
|
|
146
173
|
export declare function invalidPackageName(input: string): UsageError;
|
|
174
|
+
export declare function invalidOptionValue(details: string): UsageError;
|
|
175
|
+
export declare function invalidRemixConfig(filePath: string, details: string, line: number, column: number): CliError;
|
|
147
176
|
export declare function missingOptionValue(option: string): UsageError;
|
|
148
177
|
export declare function missingTargetDirectory(): UsageError;
|
|
149
178
|
export declare function projectRootNotFound(startDir?: string): CliError;
|
|
179
|
+
export declare function remixConfigNotFound(filePath: string): CliError;
|
|
150
180
|
export declare function remoteSkillDataMissing(name: string): CliError;
|
|
151
181
|
export declare function routeMapLoaderFailed(details: string): CliError;
|
|
152
182
|
export declare function routeMapLoaderInvalidJson(): CliError;
|
package/dist/lib/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;AAE1F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAOD,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/errors.js
CHANGED
|
@@ -4,6 +4,16 @@ export const CLI_ERROR_DEFINITIONS = {
|
|
|
4
4
|
title: 'Could not determine an app name',
|
|
5
5
|
fix: 'Pass --app-name or choose a target directory name that can become an app name.',
|
|
6
6
|
},
|
|
7
|
+
dbConfigRequired: {
|
|
8
|
+
code: 'RMX_DB_CONFIG_REQUIRED',
|
|
9
|
+
title: 'Database configuration is required',
|
|
10
|
+
fix: 'Add a db configuration to remix.json.',
|
|
11
|
+
},
|
|
12
|
+
dbForceRequired: {
|
|
13
|
+
code: 'RMX_DB_FORCE_REQUIRED',
|
|
14
|
+
title: 'Destructive database command requires --force',
|
|
15
|
+
fix: 'Re-run with --force to confirm.',
|
|
16
|
+
},
|
|
7
17
|
remixVersionUnavailable: {
|
|
8
18
|
code: 'RMX_REMIX_VERSION_UNAVAILABLE',
|
|
9
19
|
title: 'Could not determine the Remix version',
|
|
@@ -31,6 +41,16 @@ export const CLI_ERROR_DEFINITIONS = {
|
|
|
31
41
|
title: 'Could not derive a valid package name',
|
|
32
42
|
fix: 'Choose an app name that can be normalized into a valid npm package name.',
|
|
33
43
|
},
|
|
44
|
+
invalidOptionValue: {
|
|
45
|
+
code: 'RMX_INVALID_OPTION_VALUE',
|
|
46
|
+
title: 'Invalid option value',
|
|
47
|
+
fix: 'Check the command help for the supported option syntax.',
|
|
48
|
+
},
|
|
49
|
+
invalidRemixConfig: {
|
|
50
|
+
code: 'RMX_INVALID_CONFIG',
|
|
51
|
+
title: 'Invalid Remix configuration',
|
|
52
|
+
fix: 'Correct the configuration file and try again.',
|
|
53
|
+
},
|
|
34
54
|
missingOptionValue: {
|
|
35
55
|
code: 'RMX_MISSING_OPTION_VALUE',
|
|
36
56
|
title: 'Missing option value',
|
|
@@ -46,6 +66,11 @@ export const CLI_ERROR_DEFINITIONS = {
|
|
|
46
66
|
title: 'Could not find a project root',
|
|
47
67
|
fix: 'Run this command inside a Remix project.',
|
|
48
68
|
},
|
|
69
|
+
remixConfigNotFound: {
|
|
70
|
+
code: 'RMX_CONFIG_NOT_FOUND',
|
|
71
|
+
title: 'Remix configuration not found',
|
|
72
|
+
fix: 'Check the --config path and try again.',
|
|
73
|
+
},
|
|
49
74
|
remoteSkillDataMissing: {
|
|
50
75
|
code: 'RMX_REMOTE_SKILL_DATA_MISSING',
|
|
51
76
|
title: 'Could not find remote Remix skill data',
|
|
@@ -140,6 +165,18 @@ export function appNameUnavailable(targetDir) {
|
|
|
140
165
|
message: 'Could not determine an app name from the target directory.',
|
|
141
166
|
});
|
|
142
167
|
}
|
|
168
|
+
export function dbConfigRequired(filePath) {
|
|
169
|
+
return createCliError(CLI_ERROR_DEFINITIONS.dbConfigRequired, {
|
|
170
|
+
context: { filePath },
|
|
171
|
+
message: `Database configuration is missing from ${filePath}.`,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
export function dbForceRequired(command) {
|
|
175
|
+
return createUsageError(CLI_ERROR_DEFINITIONS.dbForceRequired, {
|
|
176
|
+
context: { command },
|
|
177
|
+
message: `\`remix db ${command}\` destroys data in the current app database.`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
143
180
|
export function remixVersionUnavailable() {
|
|
144
181
|
return createCliError(CLI_ERROR_DEFINITIONS.remixVersionUnavailable, {
|
|
145
182
|
message: 'Could not determine the current Remix version.',
|
|
@@ -167,6 +204,18 @@ export function invalidPackageName(input) {
|
|
|
167
204
|
message: `Could not derive a valid package name from "${input}".`,
|
|
168
205
|
});
|
|
169
206
|
}
|
|
207
|
+
export function invalidOptionValue(details) {
|
|
208
|
+
return createUsageError(CLI_ERROR_DEFINITIONS.invalidOptionValue, {
|
|
209
|
+
context: { details },
|
|
210
|
+
message: details,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
export function invalidRemixConfig(filePath, details, line, column) {
|
|
214
|
+
return createCliError(CLI_ERROR_DEFINITIONS.invalidRemixConfig, {
|
|
215
|
+
context: { column, filePath, line },
|
|
216
|
+
message: `${filePath}:${line}:${column}: ${details}`,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
170
219
|
export function missingOptionValue(option) {
|
|
171
220
|
return createUsageError(CLI_ERROR_DEFINITIONS.missingOptionValue, {
|
|
172
221
|
context: { option },
|
|
@@ -184,6 +233,12 @@ export function projectRootNotFound(startDir) {
|
|
|
184
233
|
message: 'Could not find a project root. Run this command inside a Remix project.',
|
|
185
234
|
});
|
|
186
235
|
}
|
|
236
|
+
export function remixConfigNotFound(filePath) {
|
|
237
|
+
return createCliError(CLI_ERROR_DEFINITIONS.remixConfigNotFound, {
|
|
238
|
+
context: { filePath },
|
|
239
|
+
message: `Could not find Remix configuration file: ${filePath}`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
187
242
|
export function remoteSkillDataMissing(name) {
|
|
188
243
|
return createCliError(CLI_ERROR_DEFINITIONS.remoteSkillDataMissing, {
|
|
189
244
|
context: { name },
|
package/dist/lib/help-text.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as process from 'node:process';
|
|
2
|
-
import { boldLightBlue, lightYellow } from
|
|
2
|
+
import { boldLightBlue, lightYellow } from './terminal.js';
|
|
3
3
|
const SECTION_INDENT = ' ';
|
|
4
4
|
const ROW_GAP = 2;
|
|
5
5
|
export function formatHelpText(options, target = process.stdout) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/lib/parse-args.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,0BAA0B,GAAG,yBAAyB,CAAA;AAExF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,gBAAgB,CAAC,WAAW,SAAS,0BAA0B,IAAI;KAC5E,GAAG,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAClE,OAAO,GACP,MAAM,GAAG,SAAS;CACvB,CAAA;AAED,MAAM,WAAW,gBAAgB,CAAC,WAAW,SAAS,0BAA0B;IAC9E,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;IACtC,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,wBAAgB,SAAS,CAAC,KAAK,CAAC,WAAW,SAAS,0BAA0B,EAC5E,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,gBAAqB,GAC7B,gBAAgB,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/lib/parse-args.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,0BAA0B,GAAG,yBAAyB,CAAA;AAExF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,gBAAgB,CAAC,WAAW,SAAS,0BAA0B,IAAI;KAC5E,GAAG,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAClE,OAAO,GACP,MAAM,GAAG,SAAS;CACvB,CAAA;AAED,MAAM,WAAW,gBAAgB,CAAC,WAAW,SAAS,0BAA0B;IAC9E,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;IACtC,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,wBAAgB,SAAS,CAAC,KAAK,CAAC,WAAW,SAAS,0BAA0B,EAC5E,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,gBAAqB,GAC7B,gBAAgB,CAAC,WAAW,CAAC,CA8D/B"}
|
package/dist/lib/parse-args.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { missingOptionValue, unexpectedExtraArgument, unknownArgument } from
|
|
1
|
+
import { missingOptionValue, unexpectedExtraArgument, unknownArgument } from './errors.js';
|
|
2
2
|
export function parseArgs(argv, definitions, options = {}) {
|
|
3
3
|
let values = {};
|
|
4
4
|
let specsByFlag = new Map();
|
|
@@ -9,15 +9,28 @@ export function parseArgs(argv, definitions, options = {}) {
|
|
|
9
9
|
}
|
|
10
10
|
for (let index = 0; index < argv.length; index++) {
|
|
11
11
|
let arg = argv[index];
|
|
12
|
-
let
|
|
12
|
+
let equalsIndex = arg.indexOf('=');
|
|
13
|
+
let flag = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex);
|
|
14
|
+
let inlineValue = equalsIndex === -1 ? undefined : arg.slice(equalsIndex + 1);
|
|
15
|
+
let resolved = specsByFlag.get(flag);
|
|
13
16
|
if (resolved != null) {
|
|
14
17
|
if (resolved.spec.type === 'boolean') {
|
|
18
|
+
if (inlineValue !== undefined) {
|
|
19
|
+
throw unknownArgument(arg);
|
|
20
|
+
}
|
|
15
21
|
values[resolved.key] = true;
|
|
16
22
|
continue;
|
|
17
23
|
}
|
|
24
|
+
if (inlineValue !== undefined) {
|
|
25
|
+
if (inlineValue.length === 0) {
|
|
26
|
+
throw missingOptionValue(flag);
|
|
27
|
+
}
|
|
28
|
+
values[resolved.key] = inlineValue;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
18
31
|
let next = argv[index + 1];
|
|
19
|
-
if (next == null || next.startsWith('-')) {
|
|
20
|
-
throw missingOptionValue(
|
|
32
|
+
if (next == null || next.length === 0 || next.startsWith('-')) {
|
|
33
|
+
throw missingOptionValue(flag);
|
|
21
34
|
}
|
|
22
35
|
values[resolved.key] = next;
|
|
23
36
|
index += 1;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { RemixTestPool } from '@remix-run/test/cli';
|
|
2
|
+
declare const reporters: readonly ['spec', 'files', 'tap', 'dot'];
|
|
3
|
+
declare const testTypes: readonly ['server', 'browser', 'e2e'];
|
|
4
|
+
type Reporter = (typeof reporters)[number];
|
|
5
|
+
type TestPool = RemixTestPool;
|
|
6
|
+
type TestType = (typeof testTypes)[number];
|
|
7
|
+
export interface RemixConfig {
|
|
8
|
+
db?: RemixDbCommandConfig;
|
|
9
|
+
doctor?: RemixDoctorCommandConfig;
|
|
10
|
+
test?: RemixTestCommandConfig;
|
|
11
|
+
}
|
|
12
|
+
export type RemixDbString = string | {
|
|
13
|
+
env: string;
|
|
14
|
+
default?: string;
|
|
15
|
+
};
|
|
16
|
+
export type RemixDbAdapterConfig = {
|
|
17
|
+
type: 'sqlite';
|
|
18
|
+
filename: RemixDbString;
|
|
19
|
+
foreignKeys?: boolean;
|
|
20
|
+
busyTimeout?: number;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'postgres';
|
|
23
|
+
connectionString: RemixDbString;
|
|
24
|
+
maintenanceDatabase?: string;
|
|
25
|
+
template?: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'mysql';
|
|
28
|
+
uri: RemixDbString;
|
|
29
|
+
characterSet?: string;
|
|
30
|
+
collation?: string;
|
|
31
|
+
};
|
|
32
|
+
export interface RemixDbCommandConfig {
|
|
33
|
+
adapter: RemixDbAdapterConfig;
|
|
34
|
+
migrations?: {
|
|
35
|
+
directory: string;
|
|
36
|
+
journalTable?: string;
|
|
37
|
+
};
|
|
38
|
+
seed?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface RemixDoctorCommandConfig {
|
|
41
|
+
strict?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface RemixTestCommandConfig {
|
|
44
|
+
browserFiles?: string[];
|
|
45
|
+
concurrency?: number;
|
|
46
|
+
coverage?: {
|
|
47
|
+
branches?: number;
|
|
48
|
+
dir?: string;
|
|
49
|
+
enabled?: boolean;
|
|
50
|
+
exclude?: string[];
|
|
51
|
+
functions?: number;
|
|
52
|
+
include?: string[];
|
|
53
|
+
lines?: number;
|
|
54
|
+
statements?: number;
|
|
55
|
+
};
|
|
56
|
+
e2eFiles?: string[];
|
|
57
|
+
exclude?: string[];
|
|
58
|
+
files?: string[];
|
|
59
|
+
only?: string[];
|
|
60
|
+
playwright?: {
|
|
61
|
+
configFile?: string;
|
|
62
|
+
echo?: boolean;
|
|
63
|
+
open?: boolean;
|
|
64
|
+
projects?: string[];
|
|
65
|
+
};
|
|
66
|
+
pool?: TestPool;
|
|
67
|
+
quiet?: boolean;
|
|
68
|
+
reporter?: Reporter;
|
|
69
|
+
setup?: string;
|
|
70
|
+
type?: TestType[];
|
|
71
|
+
watch?: boolean;
|
|
72
|
+
}
|
|
73
|
+
export declare function loadRemixConfig(cwd: string, configPath: string | undefined): Promise<RemixConfig>;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=remix-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remix-config.d.ts","sourceRoot":"","sources":["../../src/lib/remix-config.ts"],"names":[],"mappings":"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"}
|