screen.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.screen = void 0;
  7. var _lzString = _interopRequireDefault(require("lz-string"));
  8. var _getQueriesForElement = require("./get-queries-for-element");
  9. var _helpers = require("./helpers");
  10. var _prettyDom = require("./pretty-dom");
  11. var queries = _interopRequireWildcard(require("./queries"));
  12. function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
  13. // WARNING: `lz-string` only has a default export but statically we assume named exports are allowed
  14. // TODO: Statically verify we don't rely on NodeJS implicit named imports.
  15. function unindent(string) {
  16. // remove white spaces first, to save a few bytes.
  17. // testing-playground will reformat on load any ways.
  18. return string.replace(/[ \t]*[\n][ \t]*/g, '\n');
  19. }
  20. function encode(value) {
  21. return _lzString.default.compressToEncodedURIComponent(unindent(value));
  22. }
  23. function getPlaygroundUrl(markup) {
  24. return `https://testing-playground.com/#markup=${encode(markup)}`;
  25. }
  26. const debug = (element, maxLength, options) => Array.isArray(element) ? element.forEach(el => (0, _prettyDom.logDOM)(el, maxLength, options)) : (0, _prettyDom.logDOM)(element, maxLength, options);
  27. const logTestingPlaygroundURL = (element = (0, _helpers.getDocument)().body) => {
  28. // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
  29. if (!element || !('innerHTML' in element)) {
  30. console.log(`The element you're providing isn't a valid DOM element.`);
  31. return;
  32. }
  33. // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
  34. if (!element.innerHTML) {
  35. console.log(`The provided element doesn't have any children.`);
  36. return;
  37. }
  38. const playgroundUrl = getPlaygroundUrl(element.innerHTML);
  39. console.log(`Open this URL in your browser\n\n${playgroundUrl}`);
  40. return playgroundUrl;
  41. };
  42. const initialValue = {
  43. debug,
  44. logTestingPlaygroundURL
  45. };
  46. const screen = exports.screen = typeof document !== 'undefined' && document.body // eslint-disable-line @typescript-eslint/no-unnecessary-condition
  47. ? (0, _getQueriesForElement.getQueriesForElement)(document.body, queries, initialValue) : Object.keys(queries).reduce((helpers, key) => {
  48. // `key` is for all intents and purposes the type of keyof `helpers`, which itself is the type of `initialValue` plus incoming properties from `queries`
  49. // if `Object.keys(something)` returned Array<keyof typeof something> this explicit type assertion would not be necessary
  50. // see https://stackoverflow.com/questions/55012174/why-doesnt-object-keys-return-a-keyof-type-in-typescript
  51. helpers[key] = () => {
  52. throw new TypeError('For queries bound to document.body a global document has to be available... Learn more: https://testing-library.com/s/screen-global-error');
  53. };
  54. return helpers;
  55. }, initialValue);