Visitar URL original
fix(node): align option validator to types · rolldown/rolldown@ffb30f1 · GitHub
Skip to content

Commit ffb30f1

Browse files
committed
fix(node): align option validator to types
1 parent 2f27ecf commit ffb30f1

1 file changed

Lines changed: 58 additions & 37 deletions

File tree

‎packages/rolldown/src/utils/validator.ts‎

Lines changed: 58 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,22 @@ const JsxOptionsSchema = v.strictObject({
101101
v.optional(v.boolean()),
102102
v.description('Toggles whether to throw an error when a tag name uses an XML namespace'),
103103
),
104+
pure: v.pipe(
105+
v.optional(v.boolean()),
106+
v.description('Mark JSX elements and top-level React method calls as pure for tree shaking.'),
107+
),
104108
importSource: v.pipe(
105109
v.optional(v.string()),
106110
v.description('Import the factory of element and fragment if mode is classic'),
107111
),
108112
pragma: v.pipe(v.optional(v.string()), v.description('Jsx element transformation')),
109113
pragmaFrag: v.pipe(v.optional(v.string()), v.description('Jsx fragment transformation')),
110-
refresh: v.pipe(v.optional(v.boolean()), v.description('Enable react fast refresh')),
114+
refresh: v.pipe(
115+
v.optional(v.union([v.boolean(), v.any()])),
116+
v.description('Enable react fast refresh'),
117+
),
118+
useBuiltIns: v.pipe(v.optional(v.any()), v.description('Deprecated')),
119+
useSpread: v.pipe(v.optional(v.any()), v.description('Deprecated')),
111120
});
112121

113122
const HelperModeSchema = v.union([v.literal('Runtime'), v.literal('External')]);
@@ -132,6 +141,7 @@ const TypescriptSchema = v.object({
132141
onlyRemoveTypeImports: v.optional(v.boolean()),
133142
allowNamespaces: v.optional(v.boolean()),
134143
allowDeclareFields: v.optional(v.boolean()),
144+
removeClassFieldsWithoutInitializer: v.optional(v.boolean()),
135145
declaration: v.optional(
136146
v.object({
137147
stripInternal: v.optional(v.boolean()),
@@ -147,11 +157,17 @@ const AssumptionsSchema = v.object({
147157
pureGetters: v.optional(v.boolean()),
148158
setPublicClassFields: v.optional(v.boolean()),
149159
});
160+
161+
const TransformPluginsSchema = v.object({
162+
styledComponents: v.optional(v.any()),
163+
taggedTemplateEscape: v.optional(v.boolean()),
164+
});
165+
150166
const TransformOptionsSchema = v.object({
151167
assumptions: v.optional(AssumptionsSchema),
152168
typescript: v.optional(TypescriptSchema),
153169
helpers: v.optional(HelpersSchema),
154-
decorators: v.optional(DecoratorOptionSchema),
170+
decorator: v.optional(DecoratorOptionSchema),
155171
jsx: v.optional(
156172
v.union([
157173
v.literal(false),
@@ -177,6 +193,7 @@ const TransformOptionsSchema = v.object({
177193
v.optional(v.array(v.string())),
178194
v.description('Remove labeled statements with these label names'),
179195
),
196+
plugins: v.pipe(v.optional(TransformPluginsSchema), v.description('Third-party plugins to use')),
180197
});
181198

182199
const WatchOptionsSchema = v.strictObject({
@@ -296,26 +313,25 @@ const CompressOptionsKeepNamesSchema = v.strictObject({
296313
class: v.boolean(),
297314
});
298315

316+
const CompressTreeshakeOptionsSchema = v.strictObject({
317+
annotations: v.optional(v.boolean()),
318+
manualPureFunctions: v.optional(v.array(v.string())),
319+
propertyReadSideEffects: v.optional(v.union([v.boolean(), v.literal('always')])),
320+
unknownGlobalSideEffects: v.optional(v.boolean()),
321+
invalidImportSideEffects: v.optional(v.boolean()),
322+
});
323+
299324
const CompressOptionsSchema = v.strictObject({
300-
target: v.optional(
301-
v.union([
302-
v.literal('esnext'),
303-
v.literal('es2015'),
304-
v.literal('es2016'),
305-
v.literal('es2017'),
306-
v.literal('es2018'),
307-
v.literal('es2019'),
308-
v.literal('es2020'),
309-
v.literal('es2021'),
310-
v.literal('es2022'),
311-
v.literal('es2023'),
312-
v.literal('es2024'),
313-
]),
314-
),
325+
target: v.optional(v.union([v.string(), v.array(v.string())])),
315326
dropConsole: v.optional(v.boolean()),
316327
dropDebugger: v.optional(v.boolean()),
317328
keepNames: v.optional(CompressOptionsKeepNamesSchema),
318329
unused: v.optional(v.union([v.boolean(), v.literal('keep_assign')])),
330+
joinVars: v.optional(v.boolean()),
331+
sequences: v.optional(v.boolean()),
332+
dropLabels: v.optional(v.array(v.string())),
333+
maxIterations: v.optional(v.number()),
334+
treeshake: v.optional(CompressTreeshakeOptionsSchema),
319335
}) satisfies v.GenericSchema<CompressOptions>;
320336

321337
const MangleOptionsKeepNamesSchema = v.strictObject({
@@ -352,22 +368,23 @@ const ResolveOptionsSchema = v.strictObject({
352368
mainFiles: v.optional(v.array(v.string())),
353369
modules: v.optional(v.array(v.string())),
354370
symlinks: v.optional(v.boolean()),
355-
yarnPnp: v.optional(v.boolean()),
371+
tsconfigFilename: v.optional(v.string()),
356372
});
357373

358-
// TODO: moduleSideEffects
359-
const TreeshakingOptionsSchema = v.union([
360-
v.boolean(),
361-
v.looseObject({
362-
annotations: v.optional(v.boolean()),
363-
manualPureFunctions: v.optional(v.array(v.string())),
364-
unknownGlobalSideEffects: v.optional(v.boolean()),
365-
invalidImportSideEffects: v.optional(v.boolean()),
366-
commonjs: v.optional(v.boolean()),
367-
propertyReadSideEffects: v.optional(v.union([v.literal(false), v.literal('always')])),
368-
propertyWriteSideEffects: v.optional(v.union([v.literal(false), v.literal('always')])),
369-
}),
370-
]);
374+
const TreeshakingOptionsSchema = v.strictObject({
375+
// TODO: stricter typing
376+
moduleSideEffects: v.optional(v.any()),
377+
annotations: v.optional(v.boolean()),
378+
// valibot does not infer readonly arrays
379+
manualPureFunctions: v.optional(
380+
v.custom<readonly string[]>((input) => v.is(v.array(v.string()), input), 'string array'),
381+
),
382+
unknownGlobalSideEffects: v.optional(v.boolean()),
383+
invalidImportSideEffects: v.optional(v.boolean()),
384+
commonjs: v.optional(v.boolean()),
385+
propertyReadSideEffects: v.optional(v.union([v.literal(false), v.literal('always')])),
386+
propertyWriteSideEffects: v.optional(v.union([v.literal(false), v.literal('always')])),
387+
});
371388

372389
const OptimizationOptionsSchema = v.strictObject({
373390
inlineConst: v.pipe(
@@ -448,7 +465,7 @@ const InputOptionsSchema = v.strictObject({
448465
v.optional(v.boolean()),
449466
v.description('Create shim variables for missing exports'),
450467
),
451-
treeshake: v.optional(TreeshakingOptionsSchema),
468+
treeshake: v.optional(v.union([v.boolean(), TreeshakingOptionsSchema])),
452469
optimization: v.optional(OptimizationOptionsSchema),
453470
logLevel: v.pipe(
454471
v.optional(LogLevelOptionSchema),
@@ -467,16 +484,13 @@ const InputOptionsSchema = v.strictObject({
467484
),
468485
experimental: v.optional(
469486
v.strictObject({
470-
enableComposingJsPlugins: v.optional(v.boolean()),
471487
viteMode: v.optional(v.boolean()),
472488
resolveNewUrlToAsset: v.optional(v.boolean()),
473-
onDemandWrapping: v.optional(v.boolean()),
474-
incrementalBuild: v.optional(v.boolean()),
475489
devMode: v.optional(DevModeSchema),
490+
chunkModulesOrder: v.optional(v.union([v.literal('module-id'), v.literal('exec-order')])),
476491
attachDebugInfo: v.optional(
477492
v.union([v.literal('none'), v.literal('simple'), v.literal('full')]),
478493
),
479-
chunkModulesOrder: v.optional(v.union([v.literal('module-id'), v.literal('exec-order')])),
480494
chunkImportMap: v.optional(
481495
v.union([
482496
v.boolean(),
@@ -486,6 +500,9 @@ const InputOptionsSchema = v.strictObject({
486500
}),
487501
]),
488502
),
503+
onDemandWrapping: v.optional(v.boolean()),
504+
incrementalBuild: v.optional(v.boolean()),
505+
transformHiresSourcemap: v.optional(v.union([v.boolean(), v.literal('boundary')])),
489506
nativeMagicString: v.optional(v.boolean()),
490507
chunkOptimization: v.optional(v.boolean()),
491508
// lazyBarrel: v.optional(v.boolean()),
@@ -514,6 +531,10 @@ const InputOptionsSchema = v.strictObject({
514531
]),
515532
),
516533
),
534+
context: v.pipe(
535+
v.optional(v.string()),
536+
v.description('The value of `this` at the top level of each module.'),
537+
),
517538
tsconfig: v.pipe(
518539
v.optional(v.union([v.boolean(), v.string()])),
519540
v.description('Path to the tsconfig.json file.'),
@@ -650,7 +671,7 @@ const GeneratedCodeOptionsSchema = v.strictObject({
650671
v.optional(v.boolean()),
651672
v.description('Whether to use Symbol.toStringTag for namespace objects'),
652673
),
653-
preset: GeneratedCodePresetSchema,
674+
preset: v.optional(GeneratedCodePresetSchema),
654675
profilerNames: v.pipe(
655676
v.optional(v.boolean()),
656677
v.description('Whether to add readable names to internal variables for profiling purposes'),

0 commit comments

Comments
 (0)