compactable.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. // Contains the interpretation of CSS properties, as used by the property optimizer
  2. var breakUp = require('./break-up');
  3. var canOverride = require('./can-override');
  4. var restore = require('./restore');
  5. var override = require('../../utils/override');
  6. // Properties to process
  7. // Extend this object in order to add support for more properties in the optimizer.
  8. //
  9. // Each key in this object represents a CSS property and should be an object.
  10. // Such an object contains properties that describe how the represented CSS property should be handled.
  11. // Possible options:
  12. //
  13. // * components: array (Only specify for shorthand properties.)
  14. // Contains the names of the granular properties this shorthand compacts.
  15. //
  16. // * canOverride: function
  17. // Returns whether two tokens of this property can be merged with each other.
  18. // This property has no meaning for shorthands.
  19. //
  20. // * defaultValue: string
  21. // Specifies the default value of the property according to the CSS standard.
  22. // For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components.
  23. //
  24. // * shortestValue: string
  25. // Specifies the shortest possible value the property can possibly have.
  26. // (Falls back to defaultValue if unspecified.)
  27. //
  28. // * breakUp: function (Only specify for shorthand properties.)
  29. // Breaks the shorthand up to its components.
  30. //
  31. // * restore: function (Only specify for shorthand properties.)
  32. // Puts the shorthand together from its components.
  33. //
  34. var compactable = {
  35. 'background': {
  36. canOverride: canOverride.generic.components([
  37. canOverride.generic.image,
  38. canOverride.property.backgroundPosition,
  39. canOverride.property.backgroundSize,
  40. canOverride.property.backgroundRepeat,
  41. canOverride.property.backgroundAttachment,
  42. canOverride.property.backgroundOrigin,
  43. canOverride.property.backgroundClip,
  44. canOverride.generic.color
  45. ]),
  46. components: [
  47. 'background-image',
  48. 'background-position',
  49. 'background-size',
  50. 'background-repeat',
  51. 'background-attachment',
  52. 'background-origin',
  53. 'background-clip',
  54. 'background-color'
  55. ],
  56. breakUp: breakUp.multiplex(breakUp.background),
  57. defaultValue: '0 0',
  58. restore: restore.multiplex(restore.background),
  59. shortestValue: '0',
  60. shorthand: true
  61. },
  62. 'background-attachment': {
  63. canOverride: canOverride.property.backgroundAttachment,
  64. componentOf: [
  65. 'background'
  66. ],
  67. defaultValue: 'scroll'
  68. },
  69. 'background-clip': {
  70. canOverride: canOverride.property.backgroundClip,
  71. componentOf: [
  72. 'background'
  73. ],
  74. defaultValue: 'border-box',
  75. shortestValue: 'border-box'
  76. },
  77. 'background-color': {
  78. canOverride: canOverride.generic.color,
  79. componentOf: [
  80. 'background'
  81. ],
  82. defaultValue: 'transparent',
  83. multiplexLastOnly: true,
  84. nonMergeableValue: 'none',
  85. shortestValue: 'red'
  86. },
  87. 'background-image': {
  88. canOverride: canOverride.generic.image,
  89. componentOf: [
  90. 'background'
  91. ],
  92. defaultValue: 'none'
  93. },
  94. 'background-origin': {
  95. canOverride: canOverride.property.backgroundOrigin,
  96. componentOf: [
  97. 'background'
  98. ],
  99. defaultValue: 'padding-box',
  100. shortestValue: 'border-box'
  101. },
  102. 'background-position': {
  103. canOverride: canOverride.property.backgroundPosition,
  104. componentOf: [
  105. 'background'
  106. ],
  107. defaultValue: ['0', '0'],
  108. doubleValues: true,
  109. shortestValue: '0'
  110. },
  111. 'background-repeat': {
  112. canOverride: canOverride.property.backgroundRepeat,
  113. componentOf: [
  114. 'background'
  115. ],
  116. defaultValue: ['repeat'],
  117. doubleValues: true
  118. },
  119. 'background-size': {
  120. canOverride: canOverride.property.backgroundSize,
  121. componentOf: [
  122. 'background'
  123. ],
  124. defaultValue: ['auto'],
  125. doubleValues: true,
  126. shortestValue: '0 0'
  127. },
  128. 'bottom': {
  129. canOverride: canOverride.property.bottom,
  130. defaultValue: 'auto'
  131. },
  132. 'border': {
  133. breakUp: breakUp.border,
  134. canOverride: canOverride.generic.components([
  135. canOverride.generic.unit,
  136. canOverride.property.borderStyle,
  137. canOverride.generic.color
  138. ]),
  139. components: [
  140. 'border-width',
  141. 'border-style',
  142. 'border-color'
  143. ],
  144. defaultValue: 'none',
  145. overridesShorthands: [
  146. 'border-bottom',
  147. 'border-left',
  148. 'border-right',
  149. 'border-top'
  150. ],
  151. restore: restore.withoutDefaults,
  152. shorthand: true,
  153. shorthandComponents: true
  154. },
  155. 'border-bottom': {
  156. breakUp: breakUp.border,
  157. canOverride: canOverride.generic.components([
  158. canOverride.generic.unit,
  159. canOverride.property.borderStyle,
  160. canOverride.generic.color
  161. ]),
  162. components: [
  163. 'border-bottom-width',
  164. 'border-bottom-style',
  165. 'border-bottom-color'
  166. ],
  167. defaultValue: 'none',
  168. restore: restore.withoutDefaults,
  169. shorthand: true
  170. },
  171. 'border-bottom-color': {
  172. canOverride: canOverride.generic.color,
  173. componentOf: [
  174. 'border-bottom',
  175. 'border-color'
  176. ],
  177. defaultValue: 'none'
  178. },
  179. 'border-bottom-left-radius': {
  180. canOverride: canOverride.generic.unit,
  181. componentOf: [
  182. 'border-radius'
  183. ],
  184. defaultValue: '0',
  185. vendorPrefixes: [
  186. '-moz-',
  187. '-o-'
  188. ]
  189. },
  190. 'border-bottom-right-radius': {
  191. canOverride: canOverride.generic.unit,
  192. componentOf: [
  193. 'border-radius'
  194. ],
  195. defaultValue: '0',
  196. vendorPrefixes: [
  197. '-moz-',
  198. '-o-'
  199. ]
  200. },
  201. 'border-bottom-style': {
  202. canOverride: canOverride.property.borderStyle,
  203. componentOf: [
  204. 'border-bottom',
  205. 'border-style'
  206. ],
  207. defaultValue: 'none'
  208. },
  209. 'border-bottom-width': {
  210. canOverride: canOverride.generic.unit,
  211. componentOf: [
  212. 'border-bottom',
  213. 'border-width'
  214. ],
  215. defaultValue: 'medium',
  216. shortestValue: '0'
  217. },
  218. 'border-collapse': {
  219. canOverride: canOverride.property.borderCollapse,
  220. defaultValue: 'separate'
  221. },
  222. 'border-color': {
  223. breakUp: breakUp.fourValues,
  224. canOverride: canOverride.generic.components([
  225. canOverride.generic.color,
  226. canOverride.generic.color,
  227. canOverride.generic.color,
  228. canOverride.generic.color
  229. ]),
  230. componentOf: ['border'],
  231. components: [
  232. 'border-top-color',
  233. 'border-right-color',
  234. 'border-bottom-color',
  235. 'border-left-color'
  236. ],
  237. defaultValue: 'none',
  238. restore: restore.fourValues,
  239. shortestValue: 'red',
  240. shorthand: true
  241. },
  242. 'border-left': {
  243. breakUp: breakUp.border,
  244. canOverride: canOverride.generic.components([
  245. canOverride.generic.unit,
  246. canOverride.property.borderStyle,
  247. canOverride.generic.color
  248. ]),
  249. components: [
  250. 'border-left-width',
  251. 'border-left-style',
  252. 'border-left-color'
  253. ],
  254. defaultValue: 'none',
  255. restore: restore.withoutDefaults,
  256. shorthand: true
  257. },
  258. 'border-left-color': {
  259. canOverride: canOverride.generic.color,
  260. componentOf: [
  261. 'border-color',
  262. 'border-left'
  263. ],
  264. defaultValue: 'none'
  265. },
  266. 'border-left-style': {
  267. canOverride: canOverride.property.borderStyle,
  268. componentOf: [
  269. 'border-left',
  270. 'border-style'
  271. ],
  272. defaultValue: 'none'
  273. },
  274. 'border-left-width': {
  275. canOverride: canOverride.generic.unit,
  276. componentOf: [
  277. 'border-left',
  278. 'border-width'
  279. ],
  280. defaultValue: 'medium',
  281. shortestValue: '0'
  282. },
  283. 'border-radius': {
  284. breakUp: breakUp.borderRadius,
  285. canOverride: canOverride.generic.components([
  286. canOverride.generic.unit,
  287. canOverride.generic.unit,
  288. canOverride.generic.unit,
  289. canOverride.generic.unit
  290. ]),
  291. components: [
  292. 'border-top-left-radius',
  293. 'border-top-right-radius',
  294. 'border-bottom-right-radius',
  295. 'border-bottom-left-radius'
  296. ],
  297. defaultValue: '0',
  298. restore: restore.borderRadius,
  299. shorthand: true,
  300. vendorPrefixes: [
  301. '-moz-',
  302. '-o-'
  303. ]
  304. },
  305. 'border-right': {
  306. breakUp: breakUp.border,
  307. canOverride: canOverride.generic.components([
  308. canOverride.generic.unit,
  309. canOverride.property.borderStyle,
  310. canOverride.generic.color
  311. ]),
  312. components: [
  313. 'border-right-width',
  314. 'border-right-style',
  315. 'border-right-color'
  316. ],
  317. defaultValue: 'none',
  318. restore: restore.withoutDefaults,
  319. shorthand: true
  320. },
  321. 'border-right-color': {
  322. canOverride: canOverride.generic.color,
  323. componentOf: [
  324. 'border-color',
  325. 'border-right'
  326. ],
  327. defaultValue: 'none'
  328. },
  329. 'border-right-style': {
  330. canOverride: canOverride.property.borderStyle,
  331. componentOf: [
  332. 'border-right',
  333. 'border-style'
  334. ],
  335. defaultValue: 'none'
  336. },
  337. 'border-right-width': {
  338. canOverride: canOverride.generic.unit,
  339. componentOf: [
  340. 'border-right',
  341. 'border-width'
  342. ],
  343. defaultValue: 'medium',
  344. shortestValue: '0'
  345. },
  346. 'border-style': {
  347. breakUp: breakUp.fourValues,
  348. canOverride: canOverride.generic.components([
  349. canOverride.property.borderStyle,
  350. canOverride.property.borderStyle,
  351. canOverride.property.borderStyle,
  352. canOverride.property.borderStyle
  353. ]),
  354. componentOf: [
  355. 'border'
  356. ],
  357. components: [
  358. 'border-top-style',
  359. 'border-right-style',
  360. 'border-bottom-style',
  361. 'border-left-style'
  362. ],
  363. defaultValue: 'none',
  364. restore: restore.fourValues,
  365. shorthand: true
  366. },
  367. 'border-top': {
  368. breakUp: breakUp.border,
  369. canOverride: canOverride.generic.components([
  370. canOverride.generic.unit,
  371. canOverride.property.borderStyle,
  372. canOverride.generic.color
  373. ]),
  374. components: [
  375. 'border-top-width',
  376. 'border-top-style',
  377. 'border-top-color'
  378. ],
  379. defaultValue: 'none',
  380. restore: restore.withoutDefaults,
  381. shorthand: true
  382. },
  383. 'border-top-color': {
  384. canOverride: canOverride.generic.color,
  385. componentOf: [
  386. 'border-color',
  387. 'border-top'
  388. ],
  389. defaultValue: 'none'
  390. },
  391. 'border-top-left-radius': {
  392. canOverride: canOverride.generic.unit,
  393. componentOf: [
  394. 'border-radius'
  395. ],
  396. defaultValue: '0',
  397. vendorPrefixes: [
  398. '-moz-',
  399. '-o-'
  400. ]
  401. },
  402. 'border-top-right-radius': {
  403. canOverride: canOverride.generic.unit,
  404. componentOf: [
  405. 'border-radius'
  406. ],
  407. defaultValue: '0',
  408. vendorPrefixes: [
  409. '-moz-',
  410. '-o-'
  411. ]
  412. },
  413. 'border-top-style': {
  414. canOverride: canOverride.property.borderStyle,
  415. componentOf: [
  416. 'border-style',
  417. 'border-top'
  418. ],
  419. defaultValue: 'none'
  420. },
  421. 'border-top-width': {
  422. canOverride: canOverride.generic.unit,
  423. componentOf: [
  424. 'border-top',
  425. 'border-width'
  426. ],
  427. defaultValue: 'medium',
  428. shortestValue: '0'
  429. },
  430. 'border-width': {
  431. breakUp: breakUp.fourValues,
  432. canOverride: canOverride.generic.components([
  433. canOverride.generic.unit,
  434. canOverride.generic.unit,
  435. canOverride.generic.unit,
  436. canOverride.generic.unit
  437. ]),
  438. components: [
  439. 'border-top-width',
  440. 'border-right-width',
  441. 'border-bottom-width',
  442. 'border-left-width'
  443. ],
  444. defaultValue: 'medium',
  445. restore: restore.fourValues,
  446. shortestValue: '0',
  447. shorthand: true
  448. },
  449. 'clear': {
  450. canOverride: canOverride.property.clear,
  451. defaultValue: 'none'
  452. },
  453. 'color': {
  454. canOverride: canOverride.generic.color,
  455. defaultValue: 'transparent',
  456. shortestValue: 'red'
  457. },
  458. 'cursor': {
  459. canOverride: canOverride.property.cursor,
  460. defaultValue: 'auto'
  461. },
  462. 'display': {
  463. canOverride: canOverride.property.display,
  464. },
  465. 'float': {
  466. canOverride: canOverride.property.float,
  467. defaultValue: 'none'
  468. },
  469. 'font-size': {
  470. canOverride: canOverride.generic.unit,
  471. defaultValue: 'medium',
  472. shortestValue: '0'
  473. },
  474. 'font-style': {
  475. canOverride: canOverride.property.fontStyle,
  476. defaultValue: 'normal'
  477. },
  478. 'font-weight': {
  479. canOverride: canOverride.property.fontWeight,
  480. defaultValue: '400',
  481. shortestValue: '400'
  482. },
  483. 'height': {
  484. canOverride: canOverride.generic.unit,
  485. defaultValue: 'auto',
  486. shortestValue: '0'
  487. },
  488. 'left': {
  489. canOverride: canOverride.property.left,
  490. defaultValue: 'auto'
  491. },
  492. 'line-height': {
  493. canOverride: canOverride.generic.unit,
  494. defaultValue: 'normal',
  495. shortestValue: '0'
  496. },
  497. 'list-style': {
  498. canOverride: canOverride.generic.components([
  499. canOverride.property.listStyleType,
  500. canOverride.property.listStylePosition,
  501. canOverride.property.listStyleImage
  502. ]),
  503. components: [
  504. 'list-style-type',
  505. 'list-style-position',
  506. 'list-style-image'
  507. ],
  508. breakUp: breakUp.listStyle,
  509. restore: restore.withoutDefaults,
  510. defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
  511. shortestValue: 'none',
  512. shorthand: true
  513. },
  514. 'list-style-image' : {
  515. canOverride: canOverride.generic.image,
  516. componentOf: [
  517. 'list-style'
  518. ],
  519. defaultValue: 'none'
  520. },
  521. 'list-style-position' : {
  522. canOverride: canOverride.property.listStylePosition,
  523. componentOf: [
  524. 'list-style'
  525. ],
  526. defaultValue: 'outside',
  527. shortestValue: 'inside'
  528. },
  529. 'list-style-type' : {
  530. canOverride: canOverride.property.listStyleType,
  531. componentOf: [
  532. 'list-style'
  533. ],
  534. // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
  535. // this is a hack, but it doesn't matter because this value will be either overridden or
  536. // it will disappear at the final step anyway
  537. defaultValue: 'decimal|disc',
  538. shortestValue: 'none'
  539. },
  540. 'margin': {
  541. breakUp: breakUp.fourValues,
  542. canOverride: canOverride.generic.components([
  543. canOverride.generic.unit,
  544. canOverride.generic.unit,
  545. canOverride.generic.unit,
  546. canOverride.generic.unit
  547. ]),
  548. components: [
  549. 'margin-top',
  550. 'margin-right',
  551. 'margin-bottom',
  552. 'margin-left'
  553. ],
  554. defaultValue: '0',
  555. restore: restore.fourValues,
  556. shorthand: true
  557. },
  558. 'margin-bottom': {
  559. canOverride: canOverride.generic.unit,
  560. componentOf: [
  561. 'margin'
  562. ],
  563. defaultValue: '0'
  564. },
  565. 'margin-left': {
  566. canOverride: canOverride.generic.unit,
  567. componentOf: [
  568. 'margin'
  569. ],
  570. defaultValue: '0'
  571. },
  572. 'margin-right': {
  573. canOverride: canOverride.generic.unit,
  574. componentOf: [
  575. 'margin'
  576. ],
  577. defaultValue: '0'
  578. },
  579. 'margin-top': {
  580. canOverride: canOverride.generic.unit,
  581. componentOf: [
  582. 'margin'
  583. ],
  584. defaultValue: '0'
  585. },
  586. 'outline': {
  587. canOverride: canOverride.generic.components([
  588. canOverride.generic.color,
  589. canOverride.property.outlineStyle,
  590. canOverride.generic.unit
  591. ]),
  592. components: [
  593. 'outline-color',
  594. 'outline-style',
  595. 'outline-width'
  596. ],
  597. breakUp: breakUp.outline,
  598. restore: restore.withoutDefaults,
  599. defaultValue: '0',
  600. shorthand: true
  601. },
  602. 'outline-color': {
  603. canOverride: canOverride.generic.color,
  604. componentOf: [
  605. 'outline'
  606. ],
  607. defaultValue: 'invert',
  608. shortestValue: 'red'
  609. },
  610. 'outline-style': {
  611. canOverride: canOverride.property.outlineStyle,
  612. componentOf: [
  613. 'outline'
  614. ],
  615. defaultValue: 'none'
  616. },
  617. 'outline-width': {
  618. canOverride: canOverride.generic.unit,
  619. componentOf: [
  620. 'outline'
  621. ],
  622. defaultValue: 'medium',
  623. shortestValue: '0'
  624. },
  625. 'overflow': {
  626. canOverride: canOverride.property.overflow,
  627. defaultValue: 'visible'
  628. },
  629. 'overflow-x': {
  630. canOverride: canOverride.property.overflow,
  631. defaultValue: 'visible'
  632. },
  633. 'overflow-y': {
  634. canOverride: canOverride.property.overflow,
  635. defaultValue: 'visible'
  636. },
  637. 'padding': {
  638. breakUp: breakUp.fourValues,
  639. canOverride: canOverride.generic.components([
  640. canOverride.generic.unit,
  641. canOverride.generic.unit,
  642. canOverride.generic.unit,
  643. canOverride.generic.unit
  644. ]),
  645. components: [
  646. 'padding-top',
  647. 'padding-right',
  648. 'padding-bottom',
  649. 'padding-left'
  650. ],
  651. defaultValue: '0',
  652. restore: restore.fourValues,
  653. shorthand: true
  654. },
  655. 'padding-bottom': {
  656. canOverride: canOverride.generic.unit,
  657. componentOf: [
  658. 'padding'
  659. ],
  660. defaultValue: '0'
  661. },
  662. 'padding-left': {
  663. canOverride: canOverride.generic.unit,
  664. componentOf: [
  665. 'padding'
  666. ],
  667. defaultValue: '0'
  668. },
  669. 'padding-right': {
  670. canOverride: canOverride.generic.unit,
  671. componentOf: [
  672. 'padding'
  673. ],
  674. defaultValue: '0'
  675. },
  676. 'padding-top': {
  677. canOverride: canOverride.generic.unit,
  678. componentOf: [
  679. 'padding'
  680. ],
  681. defaultValue: '0'
  682. },
  683. 'position': {
  684. canOverride: canOverride.property.position,
  685. defaultValue: 'static'
  686. },
  687. 'right': {
  688. canOverride: canOverride.property.right,
  689. defaultValue: 'auto'
  690. },
  691. 'text-align': {
  692. canOverride: canOverride.property.textAlign,
  693. // NOTE: we can't tell the real default value here, as it depends on default text direction
  694. // this is a hack, but it doesn't matter because this value will be either overridden or
  695. // it will disappear anyway
  696. defaultValue: 'left|right'
  697. },
  698. 'text-decoration': {
  699. canOverride: canOverride.property.textDecoration,
  700. defaultValue: 'none'
  701. },
  702. 'text-overflow': {
  703. canOverride: canOverride.property.textOverflow,
  704. defaultValue: 'none'
  705. },
  706. 'text-shadow': {
  707. canOverride: canOverride.property.textShadow,
  708. defaultValue: 'none'
  709. },
  710. 'top': {
  711. canOverride: canOverride.property.top,
  712. defaultValue: 'auto'
  713. },
  714. 'transform': {
  715. canOverride: canOverride.property.transform,
  716. vendorPrefixes: [
  717. '-moz-',
  718. '-ms-',
  719. '-webkit-'
  720. ]
  721. },
  722. 'vertical-align': {
  723. canOverride: canOverride.property.verticalAlign,
  724. defaultValue: 'baseline'
  725. },
  726. 'visibility': {
  727. canOverride: canOverride.property.visibility,
  728. defaultValue: 'visible'
  729. },
  730. 'white-space': {
  731. canOverride: canOverride.property.whiteSpace,
  732. defaultValue: 'normal'
  733. },
  734. 'width': {
  735. canOverride: canOverride.generic.unit,
  736. defaultValue: 'auto',
  737. shortestValue: '0'
  738. },
  739. 'z-index': {
  740. canOverride: canOverride.property.zIndex,
  741. defaultValue: 'auto'
  742. }
  743. };
  744. function cloneDescriptor(propertyName, prefix) {
  745. var clonedDescriptor = override(compactable[propertyName], {});
  746. if ('componentOf' in clonedDescriptor) {
  747. clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function (shorthandName) {
  748. return prefix + shorthandName;
  749. });
  750. }
  751. if ('components' in clonedDescriptor) {
  752. clonedDescriptor.components = clonedDescriptor.components.map(function (longhandName) {
  753. return prefix + longhandName;
  754. });
  755. }
  756. return clonedDescriptor;
  757. }
  758. // generate vendor-prefixed properties
  759. var vendorPrefixedCompactable = {};
  760. for (var propertyName in compactable) {
  761. var descriptor = compactable[propertyName];
  762. if (!('vendorPrefixes' in descriptor)) {
  763. continue;
  764. }
  765. for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
  766. var prefix = descriptor.vendorPrefixes[i];
  767. var clonedDescriptor = cloneDescriptor(propertyName, prefix);
  768. delete clonedDescriptor.vendorPrefixes;
  769. vendorPrefixedCompactable[prefix + propertyName] = clonedDescriptor;
  770. }
  771. delete descriptor.vendorPrefixes;
  772. }
  773. module.exports = override(compactable, vendorPrefixedCompactable);