index.mjs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { l as loadConfig, S as SUPPORTED_EXTENSIONS } from './shared/c12.CEGFwQZa.mjs';
  2. export { a as loadDotenv, s as setupDotenv } from './shared/c12.CEGFwQZa.mjs';
  3. import { debounce } from 'perfect-debounce';
  4. import { resolve } from 'pathe';
  5. import 'node:fs';
  6. import 'node:fs/promises';
  7. import 'node:url';
  8. import 'node:os';
  9. import 'exsolve';
  10. import 'jiti';
  11. import 'rc9';
  12. import 'defu';
  13. import 'pkg-types';
  14. import 'dotenv';
  15. function createDefineConfig() {
  16. return (input) => input;
  17. }
  18. const eventMap = {
  19. add: "created",
  20. change: "updated",
  21. unlink: "removed"
  22. };
  23. async function watchConfig(options) {
  24. let config = await loadConfig(options);
  25. const configName = options.name || "config";
  26. const configFileName = options.configFile ?? (options.name === "config" ? "config" : `${options.name}.config`);
  27. const watchingFiles = [
  28. ...new Set(
  29. (config.layers || []).filter((l) => l.cwd).flatMap((l) => [
  30. ...SUPPORTED_EXTENSIONS.flatMap((ext) => [
  31. resolve(l.cwd, configFileName + ext),
  32. resolve(l.cwd, ".config", configFileName + ext),
  33. resolve(
  34. l.cwd,
  35. ".config",
  36. configFileName.replace(/\.config$/, "") + ext
  37. )
  38. ]),
  39. l.source && resolve(l.cwd, l.source),
  40. // TODO: Support watching rc from home and workspace
  41. options.rcFile && resolve(
  42. l.cwd,
  43. typeof options.rcFile === "string" ? options.rcFile : `.${configName}rc`
  44. ),
  45. options.packageJson && resolve(l.cwd, "package.json")
  46. ]).filter(Boolean)
  47. )
  48. ];
  49. const watch = await import('chokidar').then((r) => r.watch || r.default || r);
  50. const { diff } = await import('ohash/utils');
  51. const _fswatcher = watch(watchingFiles, {
  52. ignoreInitial: true,
  53. ...options.chokidarOptions
  54. });
  55. const onChange = async (event, path) => {
  56. const type = eventMap[event];
  57. if (!type) {
  58. return;
  59. }
  60. if (options.onWatch) {
  61. await options.onWatch({
  62. type,
  63. path
  64. });
  65. }
  66. const oldConfig = config;
  67. try {
  68. config = await loadConfig(options);
  69. } catch (error) {
  70. console.warn(`Failed to load config ${path}
  71. ${error}`);
  72. return;
  73. }
  74. const changeCtx = {
  75. newConfig: config,
  76. oldConfig,
  77. getDiff: () => diff(oldConfig.config, config.config)
  78. };
  79. if (options.acceptHMR) {
  80. const changeHandled = await options.acceptHMR(changeCtx);
  81. if (changeHandled) {
  82. return;
  83. }
  84. }
  85. if (options.onUpdate) {
  86. await options.onUpdate(changeCtx);
  87. }
  88. };
  89. if (options.debounce === false) {
  90. _fswatcher.on("all", onChange);
  91. } else {
  92. _fswatcher.on("all", debounce(onChange, options.debounce ?? 100));
  93. }
  94. const utils = {
  95. watchingFiles,
  96. unwatch: async () => {
  97. await _fswatcher.close();
  98. }
  99. };
  100. return new Proxy(utils, {
  101. get(_, prop) {
  102. if (prop in utils) {
  103. return utils[prop];
  104. }
  105. return config[prop];
  106. }
  107. });
  108. }
  109. export { SUPPORTED_EXTENSIONS, createDefineConfig, loadConfig, watchConfig };