one
Version:
One is a new React Framework that makes Vite serve both native and web.
180 lines (178 loc) • 5.07 kB
JavaScript
;
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