From 551dd61d5034c393c2c4e9bb34bed5a33b83eafc Mon Sep 17 00:00:00 2001 From: Ian Walter Date: Sun, 24 Feb 2019 14:37:55 -0500 Subject: [PATCH] Cleaning up inline test --- package.json | 1 - test/dist.test.js | 6 +- test/fixtures/exportObjectWithImports.js | 6 +- test/snapshots/dist.test.js.md | 653 ++--------------------- test/snapshots/dist.test.js.snap | Bin 5791 -> 1627 bytes yarn.lock | 5 - 6 files changed, 39 insertions(+), 632 deletions(-) diff --git a/package.json b/package.json index dfdeb93..e469e35 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,6 @@ "eslint-plugin-node": "^8.0.1", "eslint-plugin-promise": "^4.0.1", "eslint-plugin-standard": "^4.0.0", - "ky": "^0.8.0", "np": "^3.1.0", "postcss": "^7.0.14", "rollup-plugin-vue": "^4.7.2", diff --git a/test/dist.test.js b/test/dist.test.js index f71f67a..9232fa5 100644 --- a/test/dist.test.js +++ b/test/dist.test.js @@ -51,12 +51,12 @@ test('dist bundles imports with module into dist files', async t => { t.snapshot(await dist({ name, input, output, cjs, esm: true, inline: '' })) }) -test('dist bundles specified imports with module into dist files', async t => { +test('specified import gets bundled with module into dist files', async t => { const name = 'exportObjectWithImports' const input = join(__dirname, `fixtures/${name}.js`) const cjs = join(output, `${name}.js`) - const babel = true - t.snapshot(await dist({ name, input, output, cjs, inline: 'ky', babel })) + const inline = '@ianwalter/npm-short-name' + t.snapshot(await dist({ name, input, output, cjs, inline, babel: true })) }) test('hashbang is preserved', async t => { diff --git a/test/fixtures/exportObjectWithImports.js b/test/fixtures/exportObjectWithImports.js index 8768bcf..65a8031 100644 --- a/test/fixtures/exportObjectWithImports.js +++ b/test/fixtures/exportObjectWithImports.js @@ -1,9 +1,9 @@ import npmShortName from '@ianwalter/npm-short-name' -import ky from 'ky' +import promiseComplete from '@ianwalter/promise-complete' import greeting from './exportDefaultFunction' export { npmShortName, - greeting, - ky + promiseComplete, + greeting } diff --git a/test/snapshots/dist.test.js.md b/test/snapshots/dist.test.js.md index 472b9df..3eb0974 100644 --- a/test/snapshots/dist.test.js.md +++ b/test/snapshots/dist.test.js.md @@ -211,626 +211,6 @@ Generated by [AVA](https://ava.li). ], } -## dist bundles specified imports with module into dist files - -> Snapshot 1 - - { - cjs: [ - '/fakePath/exportObjectWithImports.js', - `'use strict';␊ - ␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ - ␊ - function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }␊ - ␊ - var npmShortName = _interopDefault(require('@ianwalter/npm-short-name'));␊ - var _objectWithoutProperties = _interopDefault(require('@babel/runtime/helpers/objectWithoutProperties'));␊ - var _createClass = _interopDefault(require('@babel/runtime/helpers/createClass'));␊ - var _regeneratorRuntime = _interopDefault(require('@babel/runtime/regenerator'));␊ - var _asyncToGenerator = _interopDefault(require('@babel/runtime/helpers/asyncToGenerator'));␊ - var _classCallCheck = _interopDefault(require('@babel/runtime/helpers/classCallCheck'));␊ - var _possibleConstructorReturn = _interopDefault(require('@babel/runtime/helpers/possibleConstructorReturn'));␊ - var _getPrototypeOf = _interopDefault(require('@babel/runtime/helpers/getPrototypeOf'));␊ - var _inherits = _interopDefault(require('@babel/runtime/helpers/inherits'));␊ - var _wrapNativeSuper = _interopDefault(require('@babel/runtime/helpers/wrapNativeSuper'));␊ - var _defineProperty = _interopDefault(require('@babel/runtime/helpers/defineProperty'));␊ - var _objectSpread = _interopDefault(require('@babel/runtime/helpers/objectSpread'));␊ - var _slicedToArray = _interopDefault(require('@babel/runtime/helpers/slicedToArray'));␊ - var _toConsumableArray = _interopDefault(require('@babel/runtime/helpers/toConsumableArray'));␊ - var _typeof = _interopDefault(require('@babel/runtime/helpers/typeof'));␊ - ␊ - /*! MIT License © Sindre Sorhus */␊ - var getGlobal = function getGlobal(property) {␊ - /* istanbul ignore next */␊ - if (typeof self !== 'undefined' && self && property in self) {␊ - return self[property];␊ - }␊ - /* istanbul ignore next */␊ - ␊ - ␊ - if (typeof window !== 'undefined' && window && property in window) {␊ - return window[property];␊ - }␊ - ␊ - if (typeof global !== 'undefined' && global && property in global) {␊ - return global[property];␊ - }␊ - /* istanbul ignore next */␊ - ␊ - ␊ - if (typeof globalThis !== 'undefined' && globalThis) {␊ - return globalThis[property];␊ - }␊ - };␊ - ␊ - var document = getGlobal('document');␊ - var Headers = getGlobal('Headers');␊ - var Response = getGlobal('Response');␊ - var fetch = getGlobal('fetch');␊ - var AbortController = getGlobal('AbortController');␊ - ␊ - var isObject = function isObject(value) {␊ - return value !== null && _typeof(value) === 'object';␊ - };␊ - ␊ - var supportsAbortController = typeof getGlobal('AbortController') === 'function';␊ - ␊ - var deepMerge = function deepMerge() {␊ - var returnValue = {};␊ - ␊ - for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {␊ - sources[_key] = arguments[_key];␊ - }␊ - ␊ - for (var _i = 0; _i < sources.length; _i++) {␊ - var source = sources[_i];␊ - ␊ - if (Array.isArray(source)) {␊ - if (!Array.isArray(returnValue)) {␊ - returnValue = [];␊ - }␊ - ␊ - returnValue = [].concat(_toConsumableArray(returnValue), _toConsumableArray(source));␊ - } else if (isObject(source)) {␊ - var _arr = Object.entries(source);␊ - ␊ - for (var _i2 = 0; _i2 < _arr.length; _i2++) {␊ - var _arr$_i = _slicedToArray(_arr[_i2], 2),␊ - key = _arr$_i[0],␊ - value = _arr$_i[1];␊ - ␊ - if (isObject(value) && Reflect.has(returnValue, key)) {␊ - value = deepMerge(returnValue[key], value);␊ - }␊ - ␊ - returnValue = _objectSpread({}, returnValue, _defineProperty({}, key, value));␊ - }␊ - }␊ - }␊ - ␊ - return returnValue;␊ - };␊ - ␊ - var requestMethods = ['get', 'post', 'put', 'patch', 'head', 'delete'];␊ - var responseTypes = ['json', 'text', 'formData', 'arrayBuffer', 'blob'];␊ - var retryMethods = new Set(['get', 'put', 'head', 'delete', 'options', 'trace']);␊ - var retryStatusCodes = new Set([408, 413, 429, 500, 502, 503, 504]);␊ - var retryAfterStatusCodes = new Set([413, 429, 503]);␊ - ␊ - var HTTPError =␊ - /*#__PURE__*/␊ - function (_Error) {␊ - _inherits(HTTPError, _Error);␊ - ␊ - function HTTPError(response) {␊ - var _this;␊ - ␊ - _classCallCheck(this, HTTPError);␊ - ␊ - _this = _possibleConstructorReturn(this, _getPrototypeOf(HTTPError).call(this, response.statusText));␊ - _this.name = 'HTTPError';␊ - _this.response = response;␊ - return _this;␊ - }␊ - ␊ - return HTTPError;␊ - }(_wrapNativeSuper(Error));␊ - ␊ - var TimeoutError =␊ - /*#__PURE__*/␊ - function (_Error2) {␊ - _inherits(TimeoutError, _Error2);␊ - ␊ - function TimeoutError() {␊ - var _this2;␊ - ␊ - _classCallCheck(this, TimeoutError);␊ - ␊ - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(TimeoutError).call(this, 'Request timed out'));␊ - _this2.name = 'TimeoutError';␊ - return _this2;␊ - }␊ - ␊ - return TimeoutError;␊ - }(_wrapNativeSuper(Error));␊ - ␊ - var delay = function delay(ms) {␊ - return new Promise(function (resolve) {␊ - return setTimeout(resolve, ms);␊ - });␊ - };␊ - ␊ - var timeout = function timeout(promise, ms, abortController) {␊ - return Promise.race([promise, _asyncToGenerator(␊ - /*#__PURE__*/␊ - _regeneratorRuntime.mark(function _callee() {␊ - return _regeneratorRuntime.wrap(function _callee$(_context) {␊ - while (1) {␊ - switch (_context.prev = _context.next) {␊ - case 0:␊ - _context.next = 2;␊ - return delay(ms);␊ - ␊ - case 2:␊ - if (abortController) {␊ - // Throw TimeoutError first␊ - setTimeout(function () {␊ - return abortController.abort();␊ - }, 1);␊ - }␊ - ␊ - throw new TimeoutError();␊ - ␊ - case 4:␊ - case "end":␊ - return _context.stop();␊ - }␊ - }␊ - }, _callee, this);␊ - }))()]);␊ - };␊ - ␊ - var normalizeRequestMethod = function normalizeRequestMethod(input) {␊ - return requestMethods.includes(input) ? input.toUpperCase() : input;␊ - };␊ - ␊ - var Ky =␊ - /*#__PURE__*/␊ - function () {␊ - function Ky(input, _ref2) {␊ - var _this3 = this;␊ - ␊ - var _ref2$timeout = _ref2.timeout,␊ - timeout = _ref2$timeout === void 0 ? 10000 : _ref2$timeout,␊ - hooks = _ref2.hooks,␊ - _ref2$throwHttpErrors = _ref2.throwHttpErrors,␊ - throwHttpErrors = _ref2$throwHttpErrors === void 0 ? true : _ref2$throwHttpErrors,␊ - searchParams = _ref2.searchParams,␊ - json = _ref2.json,␊ - otherOptions = _objectWithoutProperties(_ref2, ["timeout", "hooks", "throwHttpErrors", "searchParams", "json"]);␊ - ␊ - _classCallCheck(this, Ky);␊ - ␊ - this._retryCount = 0;␊ - this._options = _objectSpread({␊ - method: 'get',␊ - credentials: 'same-origin',␊ - // TODO: This can be removed when the spec change is implemented in all browsers. Context: https://www.chromestatus.com/feature/4539473312350208␊ - retry: 2␊ - }, otherOptions);␊ - ␊ - if (supportsAbortController) {␊ - this.abortController = new AbortController();␊ - ␊ - if (this._options.signal) {␊ - this._options.signal.addEventListener('abort', function () {␊ - _this3.abortController.abort();␊ - });␊ - }␊ - ␊ - this._options.signal = this.abortController.signal;␊ - }␊ - ␊ - this._options.method = normalizeRequestMethod(this._options.method);␊ - this._options.prefixUrl = String(this._options.prefixUrl || '');␊ - this._input = String(input || '');␊ - ␊ - if (this._options.prefixUrl && this._input.startsWith('/')) {␊ - throw new Error('`input` must not begin with a slash when using `prefixUrl`');␊ - }␊ - ␊ - if (this._options.prefixUrl && !this._options.prefixUrl.endsWith('/')) {␊ - this._options.prefixUrl += '/';␊ - }␊ - ␊ - this._input = this._options.prefixUrl + this._input;␊ - ␊ - if (searchParams) {␊ - var url = new URL(this._input, document && document.baseURI);␊ - ␊ - if (typeof searchParams === 'string' || URLSearchParams && searchParams instanceof URLSearchParams) {␊ - url.search = searchParams;␊ - } else if (Object.values(searchParams).every(function (param) {␊ - return typeof param === 'number' || typeof param === 'string';␊ - })) {␊ - url.search = new URLSearchParams(searchParams).toString();␊ - } else {␊ - throw new Error('The `searchParams` option must be either a string, `URLSearchParams` instance or an object with string and number values');␊ - }␊ - ␊ - this._input = url.toString();␊ - }␊ - ␊ - this._timeout = timeout;␊ - this._hooks = deepMerge({␊ - beforeRequest: [],␊ - afterResponse: []␊ - }, hooks);␊ - this._throwHttpErrors = throwHttpErrors;␊ - var headers = new Headers(this._options.headers || {});␊ - ␊ - if (json) {␊ - headers.set('content-type', 'application/json');␊ - this._options.body = JSON.stringify(json);␊ - }␊ - ␊ - this._options.headers = headers;␊ - this._response = this._fetch();␊ - ␊ - var _loop = function _loop() {␊ - var type = responseTypes[_i3];␊ - var isRetriableMethod = retryMethods.has(_this3._options.method.toLowerCase());␊ - ␊ - var fn =␊ - /*#__PURE__*/␊ - function () {␊ - var _ref3 = _asyncToGenerator(␊ - /*#__PURE__*/␊ - _regeneratorRuntime.mark(function _callee2() {␊ - var response, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, hook, modifiedResponse;␊ - ␊ - return _regeneratorRuntime.wrap(function _callee2$(_context2) {␊ - while (1) {␊ - switch (_context2.prev = _context2.next) {␊ - case 0:␊ - if (_this3._retryCount > 0) {␊ - _this3._response = _this3._fetch();␊ - }␊ - ␊ - _context2.next = 3;␊ - return _this3._response;␊ - ␊ - case 3:␊ - response = _context2.sent;␊ - _iteratorNormalCompletion = true;␊ - _didIteratorError = false;␊ - _iteratorError = undefined;␊ - _context2.prev = 7;␊ - _iterator = _this3._hooks.afterResponse[Symbol.iterator]();␊ - ␊ - case 9:␊ - if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {␊ - _context2.next = 18;␊ - break;␊ - }␊ - ␊ - hook = _step.value;␊ - _context2.next = 13;␊ - return hook(response.clone());␊ - ␊ - case 13:␊ - modifiedResponse = _context2.sent;␊ - ␊ - if (modifiedResponse instanceof Response) {␊ - response = modifiedResponse;␊ - }␊ - ␊ - case 15:␊ - _iteratorNormalCompletion = true;␊ - _context2.next = 9;␊ - break;␊ - ␊ - case 18:␊ - _context2.next = 24;␊ - break;␊ - ␊ - case 20:␊ - _context2.prev = 20;␊ - _context2.t0 = _context2["catch"](7);␊ - _didIteratorError = true;␊ - _iteratorError = _context2.t0;␊ - ␊ - case 24:␊ - _context2.prev = 24;␊ - _context2.prev = 25;␊ - ␊ - if (!_iteratorNormalCompletion && _iterator.return != null) {␊ - _iterator.return();␊ - }␊ - ␊ - case 27:␊ - _context2.prev = 27;␊ - ␊ - if (!_didIteratorError) {␊ - _context2.next = 30;␊ - break;␊ - }␊ - ␊ - throw _iteratorError;␊ - ␊ - case 30:␊ - return _context2.finish(27);␊ - ␊ - case 31:␊ - return _context2.finish(24);␊ - ␊ - case 32:␊ - if (!(!response.ok && (isRetriableMethod || _this3._throwHttpErrors))) {␊ - _context2.next = 34;␊ - break;␊ - }␊ - ␊ - throw new HTTPError(response);␊ - ␊ - case 34:␊ - return _context2.abrupt("return", response.clone()[type]());␊ - ␊ - case 35:␊ - case "end":␊ - return _context2.stop();␊ - }␊ - }␊ - }, _callee2, this, [[7, 20, 24, 32], [25,, 27, 31]]);␊ - }));␊ - ␊ - return function fn() {␊ - return _ref3.apply(this, arguments);␊ - };␊ - }();␊ - ␊ - _this3._response[type] = isRetriableMethod ? _this3._retry(fn) : fn;␊ - };␊ - ␊ - for (var _i3 = 0; _i3 < responseTypes.length; _i3++) {␊ - _loop();␊ - }␊ - ␊ - return this._response;␊ - }␊ - ␊ - _createClass(Ky, [{␊ - key: "_calculateRetryDelay",␊ - value: function _calculateRetryDelay(error) {␊ - this._retryCount++;␊ - ␊ - if (this._retryCount < this._options.retry && !(error instanceof TimeoutError)) {␊ - if (error instanceof HTTPError) {␊ - if (!retryStatusCodes.has(error.response.status)) {␊ - return 0;␊ - }␊ - ␊ - var retryAfter = error.response.headers.get('Retry-After');␊ - ␊ - if (retryAfter && retryAfterStatusCodes.has(error.response.status)) {␊ - var after = Number(retryAfter);␊ - ␊ - if (Number.isNaN(after)) {␊ - after = Date.parse(retryAfter) - Date.now();␊ - } else {␊ - after *= 1000;␊ - }␊ - ␊ - return after;␊ - }␊ - ␊ - if (error.response.status === 413) {␊ - return 0;␊ - }␊ - }␊ - ␊ - var BACKOFF_FACTOR = 0.3;␊ - return BACKOFF_FACTOR * Math.pow(2, this._retryCount - 1) * 1000;␊ - }␊ - ␊ - return 0;␊ - }␊ - }, {␊ - key: "_retry",␊ - value: function _retry(fn) {␊ - var _this4 = this;␊ - ␊ - var retry =␊ - /*#__PURE__*/␊ - function () {␊ - var _ref4 = _asyncToGenerator(␊ - /*#__PURE__*/␊ - _regeneratorRuntime.mark(function _callee3() {␊ - var ms;␊ - return _regeneratorRuntime.wrap(function _callee3$(_context3) {␊ - while (1) {␊ - switch (_context3.prev = _context3.next) {␊ - case 0:␊ - _context3.prev = 0;␊ - _context3.next = 3;␊ - return fn();␊ - ␊ - case 3:␊ - return _context3.abrupt("return", _context3.sent);␊ - ␊ - case 6:␊ - _context3.prev = 6;␊ - _context3.t0 = _context3["catch"](0);␊ - ms = _this4._calculateRetryDelay(_context3.t0);␊ - ␊ - if (!(ms !== 0)) {␊ - _context3.next = 13;␊ - break;␊ - }␊ - ␊ - _context3.next = 12;␊ - return delay(ms);␊ - ␊ - case 12:␊ - return _context3.abrupt("return", retry());␊ - ␊ - case 13:␊ - if (!_this4._throwHttpErrors) {␊ - _context3.next = 15;␊ - break;␊ - }␊ - ␊ - throw _context3.t0;␊ - ␊ - case 15:␊ - case "end":␊ - return _context3.stop();␊ - }␊ - }␊ - }, _callee3, this, [[0, 6]]);␊ - }));␊ - ␊ - return function retry() {␊ - return _ref4.apply(this, arguments);␊ - };␊ - }();␊ - ␊ - return retry;␊ - }␊ - }, {␊ - key: "_fetch",␊ - value: function () {␊ - var _fetch2 = _asyncToGenerator(␊ - /*#__PURE__*/␊ - _regeneratorRuntime.mark(function _callee4() {␊ - var _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, hook;␊ - ␊ - return _regeneratorRuntime.wrap(function _callee4$(_context4) {␊ - while (1) {␊ - switch (_context4.prev = _context4.next) {␊ - case 0:␊ - _iteratorNormalCompletion2 = true;␊ - _didIteratorError2 = false;␊ - _iteratorError2 = undefined;␊ - _context4.prev = 3;␊ - _iterator2 = this._hooks.beforeRequest[Symbol.iterator]();␊ - ␊ - case 5:␊ - if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {␊ - _context4.next = 12;␊ - break;␊ - }␊ - ␊ - hook = _step2.value;␊ - _context4.next = 9;␊ - return hook(this._options);␊ - ␊ - case 9:␊ - _iteratorNormalCompletion2 = true;␊ - _context4.next = 5;␊ - break;␊ - ␊ - case 12:␊ - _context4.next = 18;␊ - break;␊ - ␊ - case 14:␊ - _context4.prev = 14;␊ - _context4.t0 = _context4["catch"](3);␊ - _didIteratorError2 = true;␊ - _iteratorError2 = _context4.t0;␊ - ␊ - case 18:␊ - _context4.prev = 18;␊ - _context4.prev = 19;␊ - ␊ - if (!_iteratorNormalCompletion2 && _iterator2.return != null) {␊ - _iterator2.return();␊ - }␊ - ␊ - case 21:␊ - _context4.prev = 21;␊ - ␊ - if (!_didIteratorError2) {␊ - _context4.next = 24;␊ - break;␊ - }␊ - ␊ - throw _iteratorError2;␊ - ␊ - case 24:␊ - return _context4.finish(21);␊ - ␊ - case 25:␊ - return _context4.finish(18);␊ - ␊ - case 26:␊ - return _context4.abrupt("return", timeout(fetch(this._input, this._options), this._timeout, this.abortController));␊ - ␊ - case 27:␊ - case "end":␊ - return _context4.stop();␊ - }␊ - }␊ - }, _callee4, this, [[3, 14, 18, 26], [19,, 21, 25]]);␊ - }));␊ - ␊ - function _fetch() {␊ - return _fetch2.apply(this, arguments);␊ - }␊ - ␊ - return _fetch;␊ - }()␊ - }]);␊ - ␊ - return Ky;␊ - }();␊ - ␊ - var createInstance = function createInstance() {␊ - var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};␊ - ␊ - if (!isObject(defaults) || Array.isArray(defaults)) {␊ - throw new TypeError('The `defaultOptions` argument must be an object');␊ - }␊ - ␊ - var ky = function ky(input, options) {␊ - return new Ky(input, deepMerge({}, defaults, options));␊ - };␊ - ␊ - var _loop2 = function _loop2() {␊ - var method = requestMethods[_i4];␊ - ␊ - ky[method] = function (input, options) {␊ - return new Ky(input, deepMerge({}, defaults, options, {␊ - method: method␊ - }));␊ - };␊ - };␊ - ␊ - for (var _i4 = 0; _i4 < requestMethods.length; _i4++) {␊ - _loop2();␊ - }␊ - ␊ - ky.extend = function (defaults) {␊ - return createInstance(defaults);␊ - };␊ - ␊ - return ky;␊ - };␊ - ␊ - var index = createInstance();␊ - ␊ - function greeting() {␊ - return 'Hello World';␊ - }␊ - ␊ - exports.npmShortName = npmShortName;␊ - exports.greeting = greeting;␊ - exports.ky = index;␊ - `, - ], - } - ## dist converts an export default function declaration to a module.exports assignment > Snapshot 1 @@ -881,3 +261,36 @@ Generated by [AVA](https://ava.li). `, ], } + +## specified import gets bundled with module into dist files + +> Snapshot 1 + + { + cjs: [ + '/fakePath/exportObjectWithImports.js', + `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }␊ + ␊ + var camelCase = _interopDefault(require('camelcase'));␊ + var promiseComplete = _interopDefault(require('@ianwalter/promise-complete'));␊ + ␊ + function npmShortName() {␊ + var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';␊ + var parts = name.split('/');␊ + return parts.length ? camelCase(parts[parts.length - 1]) : '';␊ + }␊ + ␊ + function greeting() {␊ + return 'Hello World';␊ + }␊ + ␊ + exports.promiseComplete = promiseComplete;␊ + exports.npmShortName = npmShortName;␊ + exports.greeting = greeting;␊ + `, + ], + } diff --git a/test/snapshots/dist.test.js.snap b/test/snapshots/dist.test.js.snap index cc843388c4a2477e21aab7c710a5c12fd3df3ca6..4d2127d2fc639151477e329570f22db79390ee8e 100644 GIT binary patch literal 1627 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