fs/lib/readers/Filter.js

  1. import AbstractReader from "../AbstractReader.js";
  2. /**
  3. * A reader that allows dynamic filtering of resources passed through it
  4. *
  5. * @public
  6. * @class
  7. * @alias @ui5/fs/readers/Filter
  8. * @extends @ui5/fs/AbstractReader
  9. */
  10. class Filter extends AbstractReader {
  11. /**
  12. * Filter callback
  13. *
  14. * @public
  15. * @callback @ui5/fs/readers/Filter~callback
  16. * @param {@ui5/fs/Resource} resource Resource to test
  17. * @returns {boolean} Whether to keep the resource
  18. */
  19. /**
  20. * Constructor
  21. *
  22. * @public
  23. * @param {object} parameters Parameters
  24. * @param {@ui5/fs/AbstractReader} parameters.reader The resource reader or collection to wrap
  25. * @param {@ui5/fs/readers/Filter~callback} parameters.callback
  26. * Filter function. Will be called for every resource read through this reader.
  27. */
  28. constructor({reader, callback}) {
  29. super();
  30. if (!reader) {
  31. throw new Error(`Missing parameter "reader"`);
  32. }
  33. if (!callback) {
  34. throw new Error(`Missing parameter "callback"`);
  35. }
  36. this._reader = reader;
  37. this._callback = callback;
  38. }
  39. /**
  40. * Locates resources by glob.
  41. *
  42. * @private
  43. * @param {string|string[]} pattern glob pattern as string or an array of
  44. * glob patterns for virtual directory structure
  45. * @param {object} options glob options
  46. * @param {@ui5/fs/tracing/Trace} trace Trace instance
  47. * @returns {Promise<@ui5/fs/Resource[]>} Promise resolving to list of resources
  48. */
  49. async _byGlob(pattern, options, trace) {
  50. const result = await this._reader._byGlob(pattern, options, trace);
  51. return result.filter(this._callback);
  52. }
  53. /**
  54. * Locates resources by path.
  55. *
  56. * @private
  57. * @param {string} virPath Virtual path
  58. * @param {object} options Options
  59. * @param {@ui5/fs/tracing/Trace} trace Trace instance
  60. * @returns {Promise<@ui5/fs/Resource>} Promise resolving to a single resource
  61. */
  62. async _byPath(virPath, options, trace) {
  63. const result = await this._reader._byPath(virPath, options, trace);
  64. if (result && !this._callback(result)) {
  65. return null;
  66. }
  67. return result;
  68. }
  69. }
  70. export default Filter;