UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

180 lines (178 loc) 5.07 kB
"use strict"; var import_vitest = require("vitest"); var import_createMemoryHistory = require("./createMemoryHistory.native.js"); var dom; function setupDomMock() { var initialPath = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "/"; var entries = [{ state: null, path: initialPath }]; var cursor = 0; var listeners = []; var mockHistory = { get state() { return entries[cursor].state; }, pushState(state, _title, url) { entries.length = cursor + 1; entries.push({ state, path: url }); cursor = entries.length - 1; }, replaceState(state, _title, url) { entries[cursor] = { state, path: url }; }, go() {}, // not exercised in these tests; the real code path triggers popstate via // a fake event instead get length() { return entries.length; } }; var mockLocation = { get pathname() { var p = entries[cursor].path; return p.split("?")[0].split("#")[0]; }, get search() { var p1 = entries[cursor].path; var q = p1.indexOf("?"); if (q === -1) return ""; return p1.slice(q).split("#")[0]; }, get hash() { var p2 = entries[cursor].path; var h = p2.indexOf("#"); return h === -1 ? "" : p2.slice(h); } }; var mockDocument = { title: "" }; var mockWindow = { history: mockHistory, location: mockLocation, document: mockDocument, addEventListener(type, handler) { if (type === "popstate") listeners.push(handler); }, removeEventListener(type, handler) { if (type === "popstate") { var i = listeners.indexOf(handler); if (i > -1) listeners.splice(i, 1); } } }; globalThis.window = mockWindow; globalThis.location = mockLocation; globalThis.document = mockDocument; return { entries, getCursor: function () { return cursor; }, firePopState: function (delta) { var next = cursor + delta; if (next < 0 || next >= entries.length) return; cursor = next; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = listeners.slice()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var l = _step.value; l({ state: entries[cursor].state }); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } }; } function teardownDomMock() { delete globalThis.window; delete globalThis.location; delete globalThis.document; } var stackState = function (routeNames, index) { return { key: "stack-root", index, routeNames, routes: routeNames.map(function (name) { return { key: `${name}-k`, name }; }), stale: false, type: "stack" }; }; (0, import_vitest.beforeEach)(function () { dom = setupDomMock(); }); (0, import_vitest.afterEach)(function () { teardownDomMock(); }); (0, import_vitest.test)("browser back then forward restores the pushed stack (regression for external-popstate index drift)", function () { var _history_get; var history = (0, import_createMemoryHistory.createMemoryHistory)(); var s0 = stackState(["index"], 0); history.replace({ path: "/", state: s0 }); (0, import_vitest.expect)(history.index).toBe(0); var s1 = stackState(["index", "todo"], 1); history.push({ path: "/todo/abc", state: s1 }); (0, import_vitest.expect)(history.index).toBe(1); (0, import_vitest.expect)((_history_get = history.get(1)) === null || _history_get === void 0 ? void 0 : _history_get.state).toBe(s1); var popStateLog = []; var unlisten = history.listen(function () { var idx = history.index; var rec = history.get(idx); popStateLog.push({ path: globalThis.window.location.pathname, recordPath: rec === null || rec === void 0 ? void 0 : rec.path, recordState: rec === null || rec === void 0 ? void 0 : rec.state }); history.replace({ path: "/", state: s0 }); }); dom.firePopState(-1); (0, import_vitest.expect)(popStateLog).toHaveLength(1); (0, import_vitest.expect)(popStateLog[0].recordPath).toBe("/"); (0, import_vitest.expect)(popStateLog[0].recordState).toBe(s0); dom.firePopState(1); (0, import_vitest.expect)(popStateLog).toHaveLength(2); (0, import_vitest.expect)(popStateLog[1].recordPath).toBe("/todo/abc"); (0, import_vitest.expect)(popStateLog[1].recordState).toBe(s1); (0, import_vitest.expect)(history.index).toBe(1); unlisten(); }); //# sourceMappingURL=createMemoryHistory.test.native.js.map