* [RAW_OPTION_PATTERNS] * (Note: "series: []" represents all other props in `ECUnitOption`) * * (1) No prop "baseOption" declared: * Root option is used as "baseOption" (except prop "options" and "media"). * ```js * option = { * series: [], * timeline: {}, * options: [], * };
(
// `rawOption` May be modified
rawOption: ECBasicOption,
optionPreprocessorFuncs: OptionPreprocessor[],
isNew: boolean
)
| 292 | * ``` |
| 293 | */ |
| 294 | function parseRawOption( |
| 295 | // `rawOption` May be modified |
| 296 | rawOption: ECBasicOption, |
| 297 | optionPreprocessorFuncs: OptionPreprocessor[], |
| 298 | isNew: boolean |
| 299 | ): ParsedRawOption { |
| 300 | const mediaList: MediaUnit[] = []; |
| 301 | let mediaDefault: MediaUnit; |
| 302 | let baseOption: ECUnitOption; |
| 303 | |
| 304 | const declaredBaseOption = rawOption.baseOption; |
| 305 | // Compatible with ec2, [RAW_OPTION_PATTERNS] above. |
| 306 | const timelineOnRoot = rawOption.timeline; |
| 307 | const timelineOptionsOnRoot = rawOption.options; |
| 308 | const mediaOnRoot = rawOption.media; |
| 309 | const hasMedia = !!rawOption.media; |
| 310 | const hasTimeline = !!( |
| 311 | timelineOptionsOnRoot || timelineOnRoot || (declaredBaseOption && declaredBaseOption.timeline) |
| 312 | ); |
| 313 | |
| 314 | if (declaredBaseOption) { |
| 315 | baseOption = declaredBaseOption; |
| 316 | // For merge option. |
| 317 | if (!baseOption.timeline) { |
| 318 | baseOption.timeline = timelineOnRoot; |
| 319 | } |
| 320 | } |
| 321 | // For convenience, enable to use the root option as the `baseOption`: |
| 322 | // `{ ...normalOptionProps, media: [{ ... }, { ... }] }` |
| 323 | else { |
| 324 | if (hasTimeline || hasMedia) { |
| 325 | rawOption.options = rawOption.media = null; |
| 326 | } |
| 327 | baseOption = rawOption; |
| 328 | } |
| 329 | |
| 330 | if (hasMedia) { |
| 331 | if (isArray(mediaOnRoot)) { |
| 332 | each(mediaOnRoot, function (singleMedia) { |
| 333 | if (__DEV__) { |
| 334 | // Real case of wrong config. |
| 335 | if (singleMedia |
| 336 | && !singleMedia.option |
| 337 | && isObject(singleMedia.query) |
| 338 | && isObject((singleMedia.query as any).option) |
| 339 | ) { |
| 340 | error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }'); |
| 341 | } |
| 342 | } |
| 343 | if (singleMedia && singleMedia.option) { |
| 344 | if (singleMedia.query) { |
| 345 | mediaList.push(singleMedia); |
| 346 | } |
| 347 | else if (!mediaDefault) { |
| 348 | // Use the first media default. |
| 349 | mediaDefault = singleMedia; |
| 350 | } |
| 351 | } |