@remix-run/cli 0.3.4 → 0.5.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.
Files changed (119) hide show
  1. package/README.md +105 -1
  2. package/dist/index.js +1 -1
  3. package/dist/lib/app-root.d.ts +11 -0
  4. package/dist/lib/app-root.d.ts.map +1 -0
  5. package/dist/lib/app-root.js +38 -0
  6. package/dist/lib/bootstrap-project.js +2 -2
  7. package/dist/lib/cli-context.d.ts +6 -0
  8. package/dist/lib/cli-context.d.ts.map +1 -1
  9. package/dist/lib/cli-context.js +12 -1
  10. package/dist/lib/cli.d.ts +3 -2
  11. package/dist/lib/cli.d.ts.map +1 -1
  12. package/dist/lib/cli.js +42 -14
  13. package/dist/lib/commands/completion.js +4 -4
  14. package/dist/lib/commands/db.d.ts +4 -0
  15. package/dist/lib/commands/db.d.ts.map +1 -0
  16. package/dist/lib/commands/db.js +283 -0
  17. package/dist/lib/commands/doctor.d.ts +5 -0
  18. package/dist/lib/commands/doctor.d.ts.map +1 -1
  19. package/dist/lib/commands/doctor.js +26 -251
  20. package/dist/lib/commands/help.d.ts.map +1 -1
  21. package/dist/lib/commands/help.js +17 -9
  22. package/dist/lib/commands/new.js +6 -6
  23. package/dist/lib/commands/routes.js +6 -6
  24. package/dist/lib/commands/test.d.ts +20 -1
  25. package/dist/lib/commands/test.d.ts.map +1 -1
  26. package/dist/lib/commands/test.js +353 -10
  27. package/dist/lib/commands/version.js +3 -3
  28. package/dist/lib/completion.d.ts +1 -1
  29. package/dist/lib/completion.d.ts.map +1 -1
  30. package/dist/lib/completion.js +229 -6
  31. package/dist/lib/controller-files.d.ts +0 -8
  32. package/dist/lib/controller-files.d.ts.map +1 -1
  33. package/dist/lib/controller-files.js +0 -23
  34. package/dist/lib/controller-ownership.d.ts +4 -12
  35. package/dist/lib/controller-ownership.d.ts.map +1 -1
  36. package/dist/lib/controller-ownership.js +31 -127
  37. package/dist/lib/database-command.d.ts +20 -0
  38. package/dist/lib/database-command.d.ts.map +1 -0
  39. package/dist/lib/database-command.js +7 -0
  40. package/dist/lib/doctor/controller-findings.d.ts +2 -2
  41. package/dist/lib/doctor/controller-findings.d.ts.map +1 -1
  42. package/dist/lib/doctor/controller-findings.js +23 -39
  43. package/dist/lib/doctor/controllers.d.ts +1 -2
  44. package/dist/lib/doctor/controllers.d.ts.map +1 -1
  45. package/dist/lib/doctor/controllers.js +4 -7
  46. package/dist/lib/doctor/environment.js +2 -2
  47. package/dist/lib/doctor/fixes.js +1 -1
  48. package/dist/lib/doctor/project.d.ts.map +1 -1
  49. package/dist/lib/doctor/project.js +3 -212
  50. package/dist/lib/doctor/run.d.ts +9 -0
  51. package/dist/lib/doctor/run.d.ts.map +1 -0
  52. package/dist/lib/doctor/run.js +237 -0
  53. package/dist/lib/doctor/types.d.ts +2 -1
  54. package/dist/lib/doctor/types.d.ts.map +1 -1
  55. package/dist/lib/doctor/types.js +4 -1
  56. package/dist/lib/errors.d.ts +30 -0
  57. package/dist/lib/errors.d.ts.map +1 -1
  58. package/dist/lib/errors.js +55 -0
  59. package/dist/lib/help-text.js +1 -1
  60. package/dist/lib/parse-args.d.ts.map +1 -1
  61. package/dist/lib/parse-args.js +17 -4
  62. package/dist/lib/remix-config.d.ts +75 -0
  63. package/dist/lib/remix-config.d.ts.map +1 -0
  64. package/dist/lib/remix-config.js +411 -0
  65. package/dist/lib/reporter.js +1 -1
  66. package/dist/lib/route-map.js +13 -33
  67. package/package.json +13 -7
  68. package/schema/remix.json +242 -0
  69. package/src/lib/app-root.ts +46 -0
  70. package/src/lib/cli-context.ts +17 -0
  71. package/src/lib/cli.ts +41 -6
  72. package/src/lib/commands/db.ts +377 -0
  73. package/src/lib/commands/doctor.ts +27 -329
  74. package/src/lib/commands/help.ts +10 -1
  75. package/src/lib/commands/test.ts +453 -12
  76. package/src/lib/completion.ts +321 -6
  77. package/src/lib/controller-files.ts +0 -38
  78. package/src/lib/controller-ownership.ts +50 -203
  79. package/src/lib/database-command.ts +31 -0
  80. package/src/lib/doctor/controller-findings.ts +30 -47
  81. package/src/lib/doctor/controllers.ts +2 -6
  82. package/src/lib/doctor/project.ts +0 -236
  83. package/src/lib/doctor/run.ts +311 -0
  84. package/src/lib/doctor/types.ts +6 -5
  85. package/src/lib/errors.ts +65 -0
  86. package/src/lib/parse-args.ts +19 -3
  87. package/src/lib/remix-config.ts +639 -0
  88. package/src/lib/route-map.ts +11 -48
  89. package/template/.agents/skills/remix/SKILL.md +38 -27
  90. package/template/.agents/skills/remix/references/assets-and-browser-modules.md +54 -11
  91. package/template/.agents/skills/remix/references/auth-and-sessions.md +5 -5
  92. package/template/.agents/skills/remix/references/data-and-validation.md +15 -15
  93. package/template/.agents/skills/remix/references/hydration-frames-navigation.md +63 -9
  94. package/template/.agents/skills/remix/references/middleware-and-server.md +68 -6
  95. package/template/.agents/skills/remix/references/mixins-styling-events.md +2 -0
  96. package/template/.agents/skills/remix/references/routing-and-controllers.md +8 -8
  97. package/template/.agents/skills/remix/references/testing-patterns.md +19 -18
  98. package/template/AGENTS.md +6 -3
  99. package/template/README.md +6 -3
  100. package/template/app/actions/controller.tsx +1 -1
  101. package/template/app/{ui → actions}/document.tsx +7 -5
  102. package/template/app/{ui/scaffold-home-page.tsx → actions/home-page.tsx} +1 -2
  103. package/template/app/actions/public/entry.ts +48 -0
  104. package/template/app/{assets → actions/public}/prompt-button.tsx +29 -25
  105. package/template/app/assets.ts +15 -2
  106. package/template/app/middleware/render.tsx +8 -2
  107. package/template/hmr.ts +46 -0
  108. package/template/package.json +1 -0
  109. package/template/server.ts +8 -1
  110. package/template/tsconfig.json +1 -1
  111. package/dist/lib/doctor/controller-fix-plans.d.ts +0 -4
  112. package/dist/lib/doctor/controller-fix-plans.d.ts.map +0 -1
  113. package/dist/lib/doctor/controller-fix-plans.js +0 -119
  114. package/dist/lib/doctor/controller-placeholders.d.ts +0 -3
  115. package/dist/lib/doctor/controller-placeholders.d.ts.map +0 -1
  116. package/dist/lib/doctor/controller-placeholders.js +0 -52
  117. package/src/lib/doctor/controller-fix-plans.ts +0 -168
  118. package/src/lib/doctor/controller-placeholders.ts +0 -70
  119. package/template/app/assets/entry.ts +0 -17
@@ -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.some((finding) => finding.severity === 'warn') ? 'issues' : 'ok',
8
+ status: hasWarningFindings(findings) ? 'issues' : 'ok',
6
9
  };
7
10
  }
8
11
  export function createSkippedDoctorSuite(name, reason) {
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"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"}
@@ -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 },
@@ -1,5 +1,5 @@
1
1
  import * as process from 'node:process';
2
- import { boldLightBlue, lightYellow } from "./terminal.js";
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,CA8C/B"}
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"}
@@ -1,4 +1,4 @@
1
- import { missingOptionValue, unexpectedExtraArgument, unknownArgument } from "./errors.js";
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 resolved = specsByFlag.get(arg);
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(arg);
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":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAIxD,QAAA,MAAM,SAAS,YAAI,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAU,CAAA;AAE1D,QAAA,MAAM,SAAS,YAAI,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAU,CAAA;AAEvD,KAAK,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAC1C,KAAK,QAAQ,GAAG,aAAa,CAAA;AAC7B,KAAK,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAG1C,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,oBAAoB,CAAA;IACzB,MAAM,CAAC,EAAE,wBAAwB,CAAA;IACjC,IAAI,CAAC,EAAE,sBAAsB,CAAA;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,MAAM,MAAM,oBAAoB,GAC5B;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,aAAa,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GACD;IACE,IAAI,EAAE,UAAU,CAAA;IAChB,gBAAgB,EAAE,aAAa,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GACD;IACE,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,aAAa,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAEL,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,UAAU,CAAC,EAAE;QACX,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,UAAU,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KACpB,CAAA;IACD,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAQD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,WAAW,CAAC,CA0CtB"}