main.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. const globalwith = (vars, fn) => {
  2. const original_values = {};
  3. const keys = Object.keys(vars);
  4. for ( const key of keys ) {
  5. if ( key in globalThis ) {
  6. original_values[key] = globalThis[key];
  7. }
  8. globalThis[key] = vars[key];
  9. }
  10. try {
  11. return fn();
  12. } finally {
  13. for ( const key of keys ) {
  14. if ( key in original_values ) {
  15. globalThis[key] = original_values[key];
  16. } else {
  17. delete globalThis[key];
  18. }
  19. }
  20. }
  21. };
  22. const aglobalwith = async (vars, fn) => {
  23. const original_values = {};
  24. const keys = Object.keys(vars);
  25. for ( const key of keys ) {
  26. if ( key in globalThis ) {
  27. original_values[key] = globalThis[key];
  28. }
  29. globalThis[key] = vars[key];
  30. }
  31. try {
  32. return await fn();
  33. } finally {
  34. for ( const key of keys ) {
  35. if ( key in original_values ) {
  36. globalThis[key] = original_values[key];
  37. } else {
  38. delete globalThis[key];
  39. }
  40. }
  41. }
  42. };
  43. let default_fn = () => {
  44. const use = name => {
  45. const parts = name.split('.');
  46. let obj = use;
  47. for ( const part of parts ) {
  48. if ( ! obj[part] ) {
  49. obj[part] = {};
  50. }
  51. obj = obj[part];
  52. }
  53. return obj;
  54. };
  55. const library = {
  56. use,
  57. def: (name, value) => {
  58. const parts = name.split('.');
  59. let obj = use;
  60. for ( const part of parts.slice(0, -1) ) {
  61. if ( ! obj[part] ) {
  62. obj[part] = {};
  63. }
  64. obj = obj[part];
  65. }
  66. obj[parts[parts.length - 1]] = value;
  67. },
  68. withuse: fn => {
  69. return globalwith({
  70. use,
  71. def: library.def,
  72. }, fn);
  73. },
  74. awithuse: async fn => {
  75. return await aglobalwith({
  76. use,
  77. def: library.def,
  78. }, fn);
  79. }
  80. };
  81. return library;
  82. };
  83. const useapi = function useapi () {
  84. return default_fn();
  85. };
  86. // We export some things on the function itself
  87. useapi.globalwith = globalwith;
  88. module.exports = useapi;