appflare 0.2.29 → 0.2.31

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 (140) hide show
  1. package/Documentation.md +758 -758
  2. package/cli/commands/index.ts +238 -238
  3. package/cli/generate.ts +178 -178
  4. package/cli/index.ts +120 -120
  5. package/cli/load-config.ts +184 -184
  6. package/cli/schema-compiler.ts +1183 -1183
  7. package/cli/templates/auth/README.md +156 -156
  8. package/cli/templates/auth/config.ts +61 -61
  9. package/cli/templates/auth/route-config.ts +1 -1
  10. package/cli/templates/auth/route-handler.ts +1 -1
  11. package/cli/templates/auth/route-request-utils.ts +5 -5
  12. package/cli/templates/auth/route.config.ts +18 -18
  13. package/cli/templates/auth/route.handler.ts +18 -18
  14. package/cli/templates/auth/route.request-utils.ts +55 -55
  15. package/cli/templates/auth/route.ts +14 -14
  16. package/cli/templates/core/README.md +266 -266
  17. package/cli/templates/core/app-creation.ts +19 -19
  18. package/cli/templates/core/client/appflare.ts +112 -112
  19. package/cli/templates/core/client/handlers/index.ts +748 -748
  20. package/cli/templates/core/client/handlers.ts +1 -1
  21. package/cli/templates/core/client/index.ts +7 -7
  22. package/cli/templates/core/client/storage.ts +195 -195
  23. package/cli/templates/core/client/types.ts +186 -186
  24. package/cli/templates/core/client-modules/appflare.ts +1 -1
  25. package/cli/templates/core/client-modules/handlers.ts +1 -1
  26. package/cli/templates/core/client-modules/index.ts +1 -1
  27. package/cli/templates/core/client-modules/storage.ts +1 -1
  28. package/cli/templates/core/client-modules/types.ts +1 -1
  29. package/cli/templates/core/client.artifacts.ts +39 -39
  30. package/cli/templates/core/client.ts +4 -4
  31. package/cli/templates/core/drizzle.ts +15 -15
  32. package/cli/templates/core/export.ts +14 -14
  33. package/cli/templates/core/handlers.route.ts +24 -24
  34. package/cli/templates/core/handlers.ts +1 -1
  35. package/cli/templates/core/imports.ts +9 -9
  36. package/cli/templates/core/server.ts +38 -38
  37. package/cli/templates/core/types.ts +6 -6
  38. package/cli/templates/core/wrangler.ts +109 -109
  39. package/cli/templates/dashboard/builders/functions/index.ts +17 -17
  40. package/cli/templates/dashboard/builders/functions/render-page/header.ts +20 -20
  41. package/cli/templates/dashboard/builders/functions/render-page/index.ts +33 -33
  42. package/cli/templates/dashboard/builders/functions/render-page/request-panel.ts +171 -171
  43. package/cli/templates/dashboard/builders/functions/render-page/result-panel.ts +85 -85
  44. package/cli/templates/dashboard/builders/functions/render-page/scripts.ts +554 -554
  45. package/cli/templates/dashboard/builders/navigation.ts +122 -122
  46. package/cli/templates/dashboard/builders/storage/index.ts +13 -13
  47. package/cli/templates/dashboard/builders/storage/routes/create-directory-route.ts +29 -29
  48. package/cli/templates/dashboard/builders/storage/routes/delete-route.ts +18 -18
  49. package/cli/templates/dashboard/builders/storage/routes/download-route.ts +23 -23
  50. package/cli/templates/dashboard/builders/storage/routes/index.ts +22 -22
  51. package/cli/templates/dashboard/builders/storage/routes/list-route.ts +25 -25
  52. package/cli/templates/dashboard/builders/storage/routes/preview-route.ts +21 -21
  53. package/cli/templates/dashboard/builders/storage/routes/upload-route.ts +21 -21
  54. package/cli/templates/dashboard/builders/storage/runtime/helpers.ts +72 -72
  55. package/cli/templates/dashboard/builders/storage/runtime/storage-page.ts +130 -130
  56. package/cli/templates/dashboard/builders/table-routes/common/drawer-panel.ts +27 -27
  57. package/cli/templates/dashboard/builders/table-routes/common/pagination.ts +30 -30
  58. package/cli/templates/dashboard/builders/table-routes/common/search-bar.ts +23 -23
  59. package/cli/templates/dashboard/builders/table-routes/fragments.ts +217 -217
  60. package/cli/templates/dashboard/builders/table-routes/helpers.ts +45 -45
  61. package/cli/templates/dashboard/builders/table-routes/index.ts +8 -8
  62. package/cli/templates/dashboard/builders/table-routes/table/actions-cell.ts +71 -71
  63. package/cli/templates/dashboard/builders/table-routes/table/get-route.ts +291 -291
  64. package/cli/templates/dashboard/builders/table-routes/table/index.ts +80 -80
  65. package/cli/templates/dashboard/builders/table-routes/table/post-routes.ts +163 -163
  66. package/cli/templates/dashboard/builders/table-routes/table-route.ts +7 -7
  67. package/cli/templates/dashboard/builders/table-routes/users/get-route.ts +69 -69
  68. package/cli/templates/dashboard/builders/table-routes/users/html/modals.ts +57 -57
  69. package/cli/templates/dashboard/builders/table-routes/users/html/page.ts +27 -27
  70. package/cli/templates/dashboard/builders/table-routes/users/html/table.ts +128 -128
  71. package/cli/templates/dashboard/builders/table-routes/users/index.ts +32 -32
  72. package/cli/templates/dashboard/builders/table-routes/users/post-routes.ts +150 -150
  73. package/cli/templates/dashboard/builders/table-routes/users/redirect.ts +14 -14
  74. package/cli/templates/dashboard/builders/table-routes/users-route.ts +10 -10
  75. package/cli/templates/dashboard/components/dashboard-home.ts +23 -23
  76. package/cli/templates/dashboard/components/layout.ts +388 -388
  77. package/cli/templates/dashboard/components/login-page.ts +65 -65
  78. package/cli/templates/dashboard/index.ts +61 -61
  79. package/cli/templates/dashboard/types.ts +9 -9
  80. package/cli/templates/handlers/README.md +353 -353
  81. package/cli/templates/handlers/auth.ts +37 -37
  82. package/cli/templates/handlers/execution.ts +42 -42
  83. package/cli/templates/handlers/generators/context/context-creation.ts +101 -101
  84. package/cli/templates/handlers/generators/context/error-helpers.ts +11 -11
  85. package/cli/templates/handlers/generators/context/scheduler.ts +24 -24
  86. package/cli/templates/handlers/generators/context/storage-api.ts +82 -82
  87. package/cli/templates/handlers/generators/context/storage-helpers.ts +59 -59
  88. package/cli/templates/handlers/generators/context/types.ts +40 -40
  89. package/cli/templates/handlers/generators/context.ts +43 -43
  90. package/cli/templates/handlers/generators/execution.ts +15 -15
  91. package/cli/templates/handlers/generators/handlers.ts +13 -13
  92. package/cli/templates/handlers/generators/registration/modules/cron.ts +26 -26
  93. package/cli/templates/handlers/generators/registration/modules/realtime/auth.ts +75 -75
  94. package/cli/templates/handlers/generators/registration/modules/realtime/durable-object.ts +144 -144
  95. package/cli/templates/handlers/generators/registration/modules/realtime/index.ts +14 -14
  96. package/cli/templates/handlers/generators/registration/modules/realtime/publisher.ts +102 -102
  97. package/cli/templates/handlers/generators/registration/modules/realtime/routes.ts +164 -164
  98. package/cli/templates/handlers/generators/registration/modules/realtime/types.ts +30 -30
  99. package/cli/templates/handlers/generators/registration/modules/realtime/utils.ts +516 -516
  100. package/cli/templates/handlers/generators/registration/modules/scheduler.ts +56 -56
  101. package/cli/templates/handlers/generators/registration/modules/storage.ts +199 -199
  102. package/cli/templates/handlers/generators/registration/sections.ts +210 -210
  103. package/cli/templates/handlers/generators/types/context.ts +92 -92
  104. package/cli/templates/handlers/generators/types/core.ts +106 -106
  105. package/cli/templates/handlers/generators/types/operations.ts +135 -135
  106. package/cli/templates/handlers/generators/types/query-definitions/filter-and-where-types.ts +281 -259
  107. package/cli/templates/handlers/generators/types/query-definitions/query-api-types.ts +135 -135
  108. package/cli/templates/handlers/generators/types/query-definitions/query-helper-functions.ts +1103 -1031
  109. package/cli/templates/handlers/generators/types/query-definitions/schema-and-table-types.ts +278 -246
  110. package/cli/templates/handlers/generators/types/query-definitions.ts +13 -13
  111. package/cli/templates/handlers/generators/types/query-runtime/handled-error.ts +13 -13
  112. package/cli/templates/handlers/generators/types/query-runtime/runtime-aggregate-and-footer.ts +174 -174
  113. package/cli/templates/handlers/generators/types/query-runtime/runtime-read.ts +157 -121
  114. package/cli/templates/handlers/generators/types/query-runtime/runtime-setup.ts +45 -45
  115. package/cli/templates/handlers/generators/types/query-runtime/runtime-write.ts +697 -676
  116. package/cli/templates/handlers/generators/types/query-runtime.ts +15 -15
  117. package/cli/templates/handlers/index.ts +43 -43
  118. package/cli/templates/handlers/operations.ts +116 -116
  119. package/cli/templates/handlers/registration.ts +91 -91
  120. package/cli/templates/handlers/types.ts +15 -15
  121. package/cli/templates/handlers/utils.ts +48 -48
  122. package/cli/types.ts +110 -110
  123. package/cli/utils/handler-discovery.ts +466 -466
  124. package/cli/utils/json-utils.ts +24 -24
  125. package/cli/utils/path-utils.ts +19 -19
  126. package/cli/utils/schema-discovery.ts +399 -399
  127. package/dist/cli/index.d.mts +2 -0
  128. package/dist/cli/index.d.ts +2 -0
  129. package/dist/cli/index.js +301 -118
  130. package/dist/cli/index.mjs +301 -118
  131. package/index.ts +18 -18
  132. package/package.json +58 -58
  133. package/react/index.ts +5 -5
  134. package/react/use-infinite-query.ts +252 -252
  135. package/react/use-mutation.ts +89 -89
  136. package/react/use-query.ts +207 -207
  137. package/schema.ts +415 -415
  138. package/test-better-auth-hash.ts +2 -2
  139. package/tsconfig.json +6 -6
  140. package/tsup.config.ts +82 -82
@@ -1,184 +1,184 @@
1
- import { dirname, isAbsolute, resolve } from "node:path";
2
- import { pathToFileURL } from "node:url";
3
- import { z } from "zod";
4
- import type {
5
- AppflareConfig,
6
- LoadedAppflareConfig,
7
- NormalizedAppflareConfig,
8
- } from "./types";
9
-
10
- const databaseSchema = z
11
- .object({
12
- binding: z.string().min(1),
13
- databaseName: z.string().min(1),
14
- databaseId: z.string().min(1),
15
- previewDatabaseId: z.string().min(1).optional(),
16
- migrationsDir: z.string().min(1).optional(),
17
- })
18
- .strict();
19
-
20
- const kvSchema = z
21
- .object({
22
- binding: z.string().min(1),
23
- id: z.string().min(1),
24
- previewId: z.string().min(1).optional(),
25
- })
26
- .strict();
27
-
28
- const r2Schema = z
29
- .object({
30
- binding: z.string().min(1),
31
- bucketName: z.string().min(1),
32
- previewBucketName: z.string().min(1).optional(),
33
- jurisdiction: z.string().min(1).optional(),
34
- })
35
- .strict();
36
-
37
- const schedulerConfigSchema = z
38
- .object({
39
- enabled: z.boolean().optional(),
40
- binding: z.string().min(1).optional(),
41
- queue: z.string().min(1).optional(),
42
- })
43
- .strict();
44
-
45
- const realtimeConfigSchema = z
46
- .object({
47
- enabled: z.boolean().optional(),
48
- binding: z.string().min(1).optional(),
49
- className: z.string().min(1).optional(),
50
- objectName: z.string().min(1).optional(),
51
- subscribePath: z.string().min(1).optional(),
52
- websocketPath: z.string().min(1).optional(),
53
- protocol: z.string().min(1).optional(),
54
- })
55
- .strict();
56
-
57
- const appflareConfigSchema = z
58
- .object({
59
- scanDir: z.string().min(1),
60
- outDir: z.string().min(1),
61
- wranglerOutDir: z.string().min(1).optional(),
62
- wranglerOutPath: z.string().min(1).optional(),
63
- schema: z.array(z.string()).min(1),
64
- schemaDsl: z
65
- .object({
66
- entry: z.string().min(1),
67
- exportName: z.string().min(1).optional(),
68
- outFile: z.string().min(1).optional(),
69
- typesOutFile: z.string().min(1).optional(),
70
- zodOutFile: z.string().min(1).optional(),
71
- namingStrategy: z.literal("camelToSnake").optional(),
72
- })
73
- .strict()
74
- .optional(),
75
- database: z.union([databaseSchema, z.array(databaseSchema).min(1)]),
76
- kv: z.union([kvSchema, z.array(kvSchema)]).optional(),
77
- r2: z.union([r2Schema, z.array(r2Schema)]).optional(),
78
- auth: z
79
- .object({
80
- enabled: z.boolean(),
81
- basePath: z.string().min(1),
82
- options: z.custom<AppflareConfig["auth"]["options"]>((value) => {
83
- return typeof value === "object" && value !== null;
84
- }),
85
- clientOptions: z.custom<AppflareConfig["auth"]["clientOptions"]>(
86
- (value) => {
87
- return typeof value === "object" && value !== null;
88
- },
89
- ),
90
- })
91
- .strict(),
92
- scheduler: schedulerConfigSchema.optional(),
93
- realtime: realtimeConfigSchema.optional(),
94
- wranglerOverrides: z.record(z.string(), z.unknown()).optional(),
95
- build: z.boolean().optional(),
96
- })
97
- .strict();
98
-
99
- function isRecord(value: unknown): value is Record<string, unknown> {
100
- return typeof value === "object" && value !== null;
101
- }
102
-
103
- function readLegacySchedulerConfig(
104
- input: AppflareConfig,
105
- ): Partial<NonNullable<AppflareConfig["scheduler"]>> {
106
- const raw = isRecord(input.wranglerOverrides)
107
- ? input.wranglerOverrides.scheduler
108
- : undefined;
109
- const parsed = schedulerConfigSchema.safeParse(raw);
110
- if (!parsed.success) {
111
- return {};
112
- }
113
-
114
- return parsed.data;
115
- }
116
-
117
- function removeLegacySchedulerOverride(
118
- overrides: AppflareConfig["wranglerOverrides"],
119
- ): AppflareConfig["wranglerOverrides"] {
120
- if (!isRecord(overrides) || !("scheduler" in overrides)) {
121
- return overrides;
122
- }
123
-
124
- const { scheduler: _scheduler, ...rest } = overrides;
125
- return rest;
126
- }
127
-
128
- function normalizeConfig(input: AppflareConfig): NormalizedAppflareConfig {
129
- const legacyScheduler = readLegacySchedulerConfig(input);
130
- const scheduler = {
131
- ...(legacyScheduler ?? {}),
132
- ...(input.scheduler ?? {}),
133
- };
134
- const realtime = input.realtime ?? {};
135
-
136
- return {
137
- ...input,
138
- database: Array.isArray(input.database) ? input.database : [input.database],
139
- kv: input.kv ? (Array.isArray(input.kv) ? input.kv : [input.kv]) : [],
140
- r2: input.r2 ? (Array.isArray(input.r2) ? input.r2 : [input.r2]) : [],
141
- scheduler: {
142
- enabled: scheduler.enabled ?? true,
143
- binding: scheduler.binding ?? "APPFLARE_SCHEDULER_QUEUE",
144
- queue: scheduler.queue,
145
- },
146
- realtime: {
147
- enabled: realtime.enabled ?? true,
148
- binding: realtime.binding ?? "APPFLARE_REALTIME",
149
- className: realtime.className ?? "AppflareRealtimeDurableObject",
150
- objectName: realtime.objectName ?? "global",
151
- subscribePath: realtime.subscribePath ?? "/realtime/subscribe",
152
- websocketPath: realtime.websocketPath ?? "/realtime/ws",
153
- protocol: realtime.protocol ?? "appflare.realtime.v1",
154
- },
155
- wranglerOverrides: removeLegacySchedulerOverride(input.wranglerOverrides),
156
- wranglerOutDir:
157
- input.wranglerOutDir ?? input.wranglerOutPath ?? input.outDir,
158
- build: input.build ?? true,
159
- };
160
- }
161
-
162
- export async function loadConfig(
163
- configPathArg?: string,
164
- ): Promise<LoadedAppflareConfig> {
165
- const configPath = isAbsolute(configPathArg ?? "")
166
- ? (configPathArg as string)
167
- : resolve(process.cwd(), configPathArg ?? "appflare.config.ts");
168
-
169
- const configDir = dirname(configPath);
170
- const moduleUrl = pathToFileURL(configPath).href;
171
- const configModule = await import(moduleUrl);
172
- const raw = configModule.default;
173
- const parsed = appflareConfigSchema.parse(raw) as AppflareConfig;
174
- const config = normalizeConfig(parsed);
175
-
176
- return {
177
- configPath,
178
- configDir,
179
- scanDirAbs: resolve(configDir, config.scanDir),
180
- outDirAbs: resolve(configDir, config.outDir),
181
- wranglerOutDirAbs: resolve(configDir, config.wranglerOutDir),
182
- config,
183
- };
184
- }
1
+ import { dirname, isAbsolute, resolve } from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ import { z } from "zod";
4
+ import type {
5
+ AppflareConfig,
6
+ LoadedAppflareConfig,
7
+ NormalizedAppflareConfig,
8
+ } from "./types";
9
+
10
+ const databaseSchema = z
11
+ .object({
12
+ binding: z.string().min(1),
13
+ databaseName: z.string().min(1),
14
+ databaseId: z.string().min(1),
15
+ previewDatabaseId: z.string().min(1).optional(),
16
+ migrationsDir: z.string().min(1).optional(),
17
+ })
18
+ .strict();
19
+
20
+ const kvSchema = z
21
+ .object({
22
+ binding: z.string().min(1),
23
+ id: z.string().min(1),
24
+ previewId: z.string().min(1).optional(),
25
+ })
26
+ .strict();
27
+
28
+ const r2Schema = z
29
+ .object({
30
+ binding: z.string().min(1),
31
+ bucketName: z.string().min(1),
32
+ previewBucketName: z.string().min(1).optional(),
33
+ jurisdiction: z.string().min(1).optional(),
34
+ })
35
+ .strict();
36
+
37
+ const schedulerConfigSchema = z
38
+ .object({
39
+ enabled: z.boolean().optional(),
40
+ binding: z.string().min(1).optional(),
41
+ queue: z.string().min(1).optional(),
42
+ })
43
+ .strict();
44
+
45
+ const realtimeConfigSchema = z
46
+ .object({
47
+ enabled: z.boolean().optional(),
48
+ binding: z.string().min(1).optional(),
49
+ className: z.string().min(1).optional(),
50
+ objectName: z.string().min(1).optional(),
51
+ subscribePath: z.string().min(1).optional(),
52
+ websocketPath: z.string().min(1).optional(),
53
+ protocol: z.string().min(1).optional(),
54
+ })
55
+ .strict();
56
+
57
+ const appflareConfigSchema = z
58
+ .object({
59
+ scanDir: z.string().min(1),
60
+ outDir: z.string().min(1),
61
+ wranglerOutDir: z.string().min(1).optional(),
62
+ wranglerOutPath: z.string().min(1).optional(),
63
+ schema: z.array(z.string()).min(1),
64
+ schemaDsl: z
65
+ .object({
66
+ entry: z.string().min(1),
67
+ exportName: z.string().min(1).optional(),
68
+ outFile: z.string().min(1).optional(),
69
+ typesOutFile: z.string().min(1).optional(),
70
+ zodOutFile: z.string().min(1).optional(),
71
+ namingStrategy: z.literal("camelToSnake").optional(),
72
+ })
73
+ .strict()
74
+ .optional(),
75
+ database: z.union([databaseSchema, z.array(databaseSchema).min(1)]),
76
+ kv: z.union([kvSchema, z.array(kvSchema)]).optional(),
77
+ r2: z.union([r2Schema, z.array(r2Schema)]).optional(),
78
+ auth: z
79
+ .object({
80
+ enabled: z.boolean(),
81
+ basePath: z.string().min(1),
82
+ options: z.custom<AppflareConfig["auth"]["options"]>((value) => {
83
+ return typeof value === "object" && value !== null;
84
+ }),
85
+ clientOptions: z.custom<AppflareConfig["auth"]["clientOptions"]>(
86
+ (value) => {
87
+ return typeof value === "object" && value !== null;
88
+ },
89
+ ),
90
+ })
91
+ .strict(),
92
+ scheduler: schedulerConfigSchema.optional(),
93
+ realtime: realtimeConfigSchema.optional(),
94
+ wranglerOverrides: z.record(z.string(), z.unknown()).optional(),
95
+ build: z.boolean().optional(),
96
+ })
97
+ .strict();
98
+
99
+ function isRecord(value: unknown): value is Record<string, unknown> {
100
+ return typeof value === "object" && value !== null;
101
+ }
102
+
103
+ function readLegacySchedulerConfig(
104
+ input: AppflareConfig,
105
+ ): Partial<NonNullable<AppflareConfig["scheduler"]>> {
106
+ const raw = isRecord(input.wranglerOverrides)
107
+ ? input.wranglerOverrides.scheduler
108
+ : undefined;
109
+ const parsed = schedulerConfigSchema.safeParse(raw);
110
+ if (!parsed.success) {
111
+ return {};
112
+ }
113
+
114
+ return parsed.data;
115
+ }
116
+
117
+ function removeLegacySchedulerOverride(
118
+ overrides: AppflareConfig["wranglerOverrides"],
119
+ ): AppflareConfig["wranglerOverrides"] {
120
+ if (!isRecord(overrides) || !("scheduler" in overrides)) {
121
+ return overrides;
122
+ }
123
+
124
+ const { scheduler: _scheduler, ...rest } = overrides;
125
+ return rest;
126
+ }
127
+
128
+ function normalizeConfig(input: AppflareConfig): NormalizedAppflareConfig {
129
+ const legacyScheduler = readLegacySchedulerConfig(input);
130
+ const scheduler = {
131
+ ...(legacyScheduler ?? {}),
132
+ ...(input.scheduler ?? {}),
133
+ };
134
+ const realtime = input.realtime ?? {};
135
+
136
+ return {
137
+ ...input,
138
+ database: Array.isArray(input.database) ? input.database : [input.database],
139
+ kv: input.kv ? (Array.isArray(input.kv) ? input.kv : [input.kv]) : [],
140
+ r2: input.r2 ? (Array.isArray(input.r2) ? input.r2 : [input.r2]) : [],
141
+ scheduler: {
142
+ enabled: scheduler.enabled ?? true,
143
+ binding: scheduler.binding ?? "APPFLARE_SCHEDULER_QUEUE",
144
+ queue: scheduler.queue,
145
+ },
146
+ realtime: {
147
+ enabled: realtime.enabled ?? true,
148
+ binding: realtime.binding ?? "APPFLARE_REALTIME",
149
+ className: realtime.className ?? "AppflareRealtimeDurableObject",
150
+ objectName: realtime.objectName ?? "global",
151
+ subscribePath: realtime.subscribePath ?? "/realtime/subscribe",
152
+ websocketPath: realtime.websocketPath ?? "/realtime/ws",
153
+ protocol: realtime.protocol ?? "appflare.realtime.v1",
154
+ },
155
+ wranglerOverrides: removeLegacySchedulerOverride(input.wranglerOverrides),
156
+ wranglerOutDir:
157
+ input.wranglerOutDir ?? input.wranglerOutPath ?? input.outDir,
158
+ build: input.build ?? true,
159
+ };
160
+ }
161
+
162
+ export async function loadConfig(
163
+ configPathArg?: string,
164
+ ): Promise<LoadedAppflareConfig> {
165
+ const configPath = isAbsolute(configPathArg ?? "")
166
+ ? (configPathArg as string)
167
+ : resolve(process.cwd(), configPathArg ?? "appflare.config.ts");
168
+
169
+ const configDir = dirname(configPath);
170
+ const moduleUrl = pathToFileURL(configPath).href;
171
+ const configModule = await import(moduleUrl);
172
+ const raw = configModule.default;
173
+ const parsed = appflareConfigSchema.parse(raw) as AppflareConfig;
174
+ const config = normalizeConfig(parsed);
175
+
176
+ return {
177
+ configPath,
178
+ configDir,
179
+ scanDirAbs: resolve(configDir, config.scanDir),
180
+ outDirAbs: resolve(configDir, config.outDir),
181
+ wranglerOutDirAbs: resolve(configDir, config.wranglerOutDir),
182
+ config,
183
+ };
184
+ }