config-loading.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import loadConfig from "../lib/config";
  2. import path from "path";
  3. describe("@babel/core config loading", () => {
  4. const FILEPATH = path.join(
  5. __dirname,
  6. "fixtures",
  7. "config-loading",
  8. "folder",
  9. "example.js",
  10. );
  11. afterEach(() => {
  12. delete process.env.INVALIDATE_BABELRC;
  13. delete process.env.INVALIDATE_PRESET1;
  14. delete process.env.INVALIDATE_PRESET2;
  15. delete process.env.INVALIDATE_PRESET3;
  16. delete process.env.INVALIDATE_PLUGIN1;
  17. delete process.env.INVALIDATE_PLUGIN2;
  18. delete process.env.INVALIDATE_PLUGIN3;
  19. delete process.env.INVALIDATE_PLUGIN4;
  20. delete process.env.INVALIDATE_PLUGIN5;
  21. delete process.env.INVALIDATE_PLUGIN6;
  22. });
  23. function makeOpts(skipProgrammatic = false) {
  24. return {
  25. cwd: path.dirname(FILEPATH),
  26. filename: FILEPATH,
  27. presets: skipProgrammatic
  28. ? null
  29. : [require("./fixtures/config-loading/preset3")],
  30. plugins: skipProgrammatic
  31. ? null
  32. : [require("./fixtures/config-loading/plugin6")],
  33. };
  34. }
  35. describe("config file", () => {
  36. it("should load and cache the config with plugins and presets", () => {
  37. const opts = makeOpts();
  38. const options1 = loadConfig(opts).options;
  39. expect(options1.plugins.map(p => p.key)).toEqual([
  40. "plugin1",
  41. "plugin2",
  42. "plugin6",
  43. "plugin5",
  44. "plugin4",
  45. "plugin3",
  46. ]);
  47. const options2 = loadConfig(opts).options;
  48. expect(options2.plugins.length).toBe(options1.plugins.length);
  49. for (let i = 0; i < options2.plugins.length; i++) {
  50. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  51. }
  52. });
  53. it("should load and cache the config for unique opts objects", () => {
  54. const options1 = loadConfig(makeOpts(true)).options;
  55. expect(options1.plugins.map(p => p.key)).toEqual([
  56. "plugin1",
  57. "plugin2",
  58. "plugin4",
  59. "plugin3",
  60. ]);
  61. const options2 = loadConfig(makeOpts(true)).options;
  62. expect(options2.plugins.length).toBe(options1.plugins.length);
  63. for (let i = 0; i < options2.plugins.length; i++) {
  64. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  65. }
  66. });
  67. it("should invalidate config file plugins", () => {
  68. const opts = makeOpts();
  69. const options1 = loadConfig(opts).options;
  70. process.env.INVALIDATE_PLUGIN1 = true;
  71. const options2 = loadConfig(opts).options;
  72. expect(options2.plugins.length).toBe(options1.plugins.length);
  73. for (let i = 0; i < options1.plugins.length; i++) {
  74. if (i === 0) {
  75. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  76. } else {
  77. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  78. }
  79. }
  80. process.env.INVALIDATE_PLUGIN3 = true;
  81. const options3 = loadConfig(opts).options;
  82. expect(options3.plugins.length).toBe(options1.plugins.length);
  83. for (let i = 0; i < options1.plugins.length; i++) {
  84. if (i === 0 || i === 5) {
  85. expect(options3.plugins[i]).not.toBe(options1.plugins[i]);
  86. } else {
  87. expect(options3.plugins[i]).toBe(options1.plugins[i]);
  88. }
  89. }
  90. });
  91. it("should invalidate config file presets and their children", () => {
  92. const opts = makeOpts();
  93. const options1 = loadConfig(opts).options;
  94. process.env.INVALIDATE_PRESET1 = true;
  95. const options2 = loadConfig(opts).options;
  96. expect(options2.plugins.length).toBe(options1.plugins.length);
  97. for (let i = 0; i < options1.plugins.length; i++) {
  98. if (i === 5) {
  99. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  100. } else {
  101. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  102. }
  103. }
  104. process.env.INVALIDATE_PRESET2 = true;
  105. const options3 = loadConfig(opts).options;
  106. expect(options3.plugins.length).toBe(options1.plugins.length);
  107. for (let i = 0; i < options1.plugins.length; i++) {
  108. if (i === 4 || i === 5) {
  109. expect(options3.plugins[i]).not.toBe(options1.plugins[i]);
  110. } else {
  111. expect(options3.plugins[i]).toBe(options1.plugins[i]);
  112. }
  113. }
  114. });
  115. it("should invalidate the config file and its plugins/presets", () => {
  116. const opts = makeOpts();
  117. const options1 = loadConfig(opts).options;
  118. process.env.INVALIDATE_BABELRC = true;
  119. const options2 = loadConfig(opts).options;
  120. expect(options2.plugins.length).toBe(options1.plugins.length);
  121. for (let i = 0; i < options1.plugins.length; i++) {
  122. if (i === 0 || i === 1 || i === 4 || i === 5 || i === 6) {
  123. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  124. } else {
  125. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  126. }
  127. }
  128. });
  129. });
  130. describe("programmatic plugins/presets", () => {
  131. it("should not invalidate the plugins when given a fresh object", () => {
  132. const opts = makeOpts();
  133. const options1 = loadConfig(opts).options;
  134. const options2 = loadConfig(Object.assign({}, opts)).options;
  135. expect(options2.plugins.length).toBe(options1.plugins.length);
  136. for (let i = 0; i < options2.plugins.length; i++) {
  137. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  138. }
  139. });
  140. it("should invalidate the plugins when given a fresh arrays", () => {
  141. const opts = makeOpts();
  142. const options1 = loadConfig(opts).options;
  143. const options2 = loadConfig({
  144. ...opts,
  145. plugins: opts.plugins.slice(),
  146. }).options;
  147. expect(options2.plugins.length).toBe(options1.plugins.length);
  148. for (let i = 0; i < options2.plugins.length; i++) {
  149. if (i === 2) {
  150. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  151. } else {
  152. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  153. }
  154. }
  155. });
  156. it("should invalidate the presets when given a fresh arrays", () => {
  157. const opts = makeOpts();
  158. const options1 = loadConfig(opts).options;
  159. const options2 = loadConfig({
  160. ...opts,
  161. presets: opts.presets.slice(),
  162. }).options;
  163. expect(options2.plugins.length).toBe(options1.plugins.length);
  164. for (let i = 0; i < options2.plugins.length; i++) {
  165. if (i === 3) {
  166. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  167. } else {
  168. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  169. }
  170. }
  171. });
  172. it("should invalidate the programmatic plugins", () => {
  173. const opts = makeOpts();
  174. const options1 = loadConfig(opts).options;
  175. process.env.INVALIDATE_PLUGIN6 = true;
  176. const options2 = loadConfig(opts).options;
  177. expect(options2.plugins.length).toBe(options1.plugins.length);
  178. for (let i = 0; i < options1.plugins.length; i++) {
  179. if (i === 2) {
  180. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  181. } else {
  182. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  183. }
  184. }
  185. });
  186. it("should invalidate the programmatic presets and their children", () => {
  187. const opts = makeOpts();
  188. const options1 = loadConfig(opts).options;
  189. process.env.INVALIDATE_PRESET3 = true;
  190. const options2 = loadConfig(opts).options;
  191. expect(options2.plugins.length).toBe(options1.plugins.length);
  192. for (let i = 0; i < options1.plugins.length; i++) {
  193. if (i === 3) {
  194. expect(options2.plugins[i]).not.toBe(options1.plugins[i]);
  195. } else {
  196. expect(options2.plugins[i]).toBe(options1.plugins[i]);
  197. }
  198. }
  199. });
  200. });
  201. });