sandpack-file-explorer
Version:
A file explorer for Codesandbox's 'sandpack' code editor
1,403 lines (1,372 loc) • 473 kB
JavaScript
'use strict';
var sandpackReact = require('@codesandbox/sandpack-react');
var React4 = require('react');
var jsxRuntime = require('react/jsx-runtime');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var React4__namespace = /*#__PURE__*/_interopNamespaceDefault(React4);
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __commonJS = (cb2, mod) => function __require() {
return mod || (0, cb2[__getOwnPropNames(cb2)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/tslib/tslib.js
var require_tslib = __commonJS({
"node_modules/tslib/tslib.js"(exports, module) {
var __extends2;
var __assign3;
var __rest2;
var __decorate2;
var __param2;
var __metadata2;
var __awaiter2;
var __generator2;
var __exportStar2;
var __values2;
var __read2;
var __spread2;
var __spreadArrays2;
var __spreadArray3;
var __await2;
var __asyncGenerator2;
var __asyncDelegator2;
var __asyncValues2;
var __makeTemplateObject2;
var __importStar2;
var __importDefault2;
var __classPrivateFieldGet2;
var __classPrivateFieldSet2;
var __classPrivateFieldIn2;
var __createBinding2;
(function(factory) {
var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
if (typeof define === "function" && define.amd) {
define("tslib", ["exports"], function(exports2) {
factory(createExporter(root, createExporter(exports2)));
});
} else if (typeof module === "object" && typeof module.exports === "object") {
factory(createExporter(root, createExporter(module.exports)));
} else {
factory(createExporter(root));
}
function createExporter(exports2, previous) {
if (exports2 !== root) {
if (typeof Object.create === "function") {
Object.defineProperty(exports2, "__esModule", { value: true });
} else {
exports2.__esModule = true;
}
}
return function(id2, v) {
return exports2[id2] = previous ? previous(id2, v) : v;
};
}
})(function(exporter) {
var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d, b2) {
d.__proto__ = b2;
} || function(d, b2) {
for (var p in b2)
if (Object.prototype.hasOwnProperty.call(b2, p))
d[p] = b2[p];
};
__extends2 = function(d, b2) {
if (typeof b2 !== "function" && b2 !== null)
throw new TypeError("Class extends value " + String(b2) + " is not a constructor or null");
extendStatics(d, b2);
function __() {
this.constructor = d;
}
d.prototype = b2 === null ? Object.create(b2) : (__.prototype = b2.prototype, new __());
};
__assign3 = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
__rest2 = function(s, e) {
var t = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
__decorate2 = function(decorators, target, key, desc) {
var c2 = arguments.length, r = c2 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c2 < 3 ? d(r) : c2 > 3 ? d(target, key, r) : d(target, key)) || r;
return c2 > 3 && r && Object.defineProperty(target, key, r), r;
};
__param2 = function(paramIndex, decorator) {
return function(target, key) {
decorator(target, key, paramIndex);
};
};
__metadata2 = function(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(metadataKey, metadataValue);
};
__awaiter2 = function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
__generator2 = function(thisArg, body) {
var _ = { label: 0, sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
}, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([n, v]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return { value: op[1], done: false };
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [6, e];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return { value: op[0] ? op[1] : void 0, done: true };
}
};
__exportStar2 = function(m, o) {
for (var p in m)
if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
__createBinding2(o, m, p);
};
__createBinding2 = Object.create ? function(o, m, k, k2) {
if (k2 === void 0)
k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() {
return m[k];
} };
}
Object.defineProperty(o, k2, desc);
} : function(o, m, k, k2) {
if (k2 === void 0)
k2 = k;
o[k2] = m[k];
};
__values2 = function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m)
return m.call(o);
if (o && typeof o.length === "number")
return {
next: function() {
if (o && i >= o.length)
o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
__read2 = function(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
} catch (error) {
e = { error };
} finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
} finally {
if (e)
throw e.error;
}
}
return ar;
};
__spread2 = function() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read2(arguments[i]));
return ar;
};
__spreadArrays2 = function() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a2 = arguments[i], j = 0, jl = a2.length; j < jl; j++, k++)
r[k] = a2[j];
return r;
};
__spreadArray3 = function(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar)
ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
__await2 = function(v) {
return this instanceof __await2 ? (this.v = v, this) : new __await2(v);
};
__asyncGenerator2 = function(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
return this;
}, i;
function verb(n) {
if (g[n])
i[n] = function(v) {
return new Promise(function(a2, b2) {
q.push([n, v, a2, b2]) > 1 || resume(n, v);
});
};
}
function resume(n, v) {
try {
step(g[n](v));
} catch (e) {
settle(q[0][3], e);
}
}
function step(r) {
r.value instanceof __await2 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
}
function fulfill(value) {
resume("next", value);
}
function reject(value) {
resume("throw", value);
}
function settle(f, v) {
if (f(v), q.shift(), q.length)
resume(q[0][0], q[0][1]);
}
};
__asyncDelegator2 = function(o) {
var i, p;
return i = {}, verb("next"), verb("throw", function(e) {
throw e;
}), verb("return"), i[Symbol.iterator] = function() {
return this;
}, i;
function verb(n, f) {
i[n] = o[n] ? function(v) {
return (p = !p) ? { value: __await2(o[n](v)), done: n === "return" } : f ? f(v) : v;
} : f;
}
};
__asyncValues2 = function(o) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values2 === "function" ? __values2(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
return this;
}, i);
function verb(n) {
i[n] = o[n] && function(v) {
return new Promise(function(resolve, reject) {
v = o[n](v), settle(resolve, reject, v.done, v.value);
});
};
}
function settle(resolve, reject, d, v) {
Promise.resolve(v).then(function(v2) {
resolve({ value: v2, done: d });
}, reject);
}
};
__makeTemplateObject2 = function(cooked, raw) {
if (Object.defineProperty) {
Object.defineProperty(cooked, "raw", { value: raw });
} else {
cooked.raw = raw;
}
return cooked;
};
var __setModuleDefault = Object.create ? function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
} : function(o, v) {
o["default"] = v;
};
__importStar2 = function(mod) {
if (mod && mod.__esModule)
return mod;
var result = {};
if (mod != null) {
for (var k in mod)
if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
__createBinding2(result, mod, k);
}
__setModuleDefault(result, mod);
return result;
};
__importDefault2 = function(mod) {
return mod && mod.__esModule ? mod : { "default": mod };
};
__classPrivateFieldGet2 = function(receiver, state, kind, f) {
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
__classPrivateFieldSet2 = function(receiver, state, value, kind, f) {
if (kind === "m")
throw new TypeError("Private method is not writable");
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot write private member to an object whose class did not declare it");
return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
};
__classPrivateFieldIn2 = function(state, receiver) {
if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function")
throw new TypeError("Cannot use 'in' operator on non-object");
return typeof state === "function" ? receiver === state : state.has(receiver);
};
exporter("__extends", __extends2);
exporter("__assign", __assign3);
exporter("__rest", __rest2);
exporter("__decorate", __decorate2);
exporter("__param", __param2);
exporter("__metadata", __metadata2);
exporter("__awaiter", __awaiter2);
exporter("__generator", __generator2);
exporter("__exportStar", __exportStar2);
exporter("__createBinding", __createBinding2);
exporter("__values", __values2);
exporter("__read", __read2);
exporter("__spread", __spread2);
exporter("__spreadArrays", __spreadArrays2);
exporter("__spreadArray", __spreadArray3);
exporter("__await", __await2);
exporter("__asyncGenerator", __asyncGenerator2);
exporter("__asyncDelegator", __asyncDelegator2);
exporter("__asyncValues", __asyncValues2);
exporter("__makeTemplateObject", __makeTemplateObject2);
exporter("__importStar", __importStar2);
exporter("__importDefault", __importDefault2);
exporter("__classPrivateFieldGet", __classPrivateFieldGet2);
exporter("__classPrivateFieldSet", __classPrivateFieldSet2);
exporter("__classPrivateFieldIn", __classPrivateFieldIn2);
});
}
});
// node_modules/@emotion/memoize/dist/memoize.esm.js
function memoize2(fn) {
var cache2 = {};
return function(arg) {
if (cache2[arg] === void 0)
cache2[arg] = fn(arg);
return cache2[arg];
};
}
var memoize_esm_default;
var init_memoize_esm = __esm({
"node_modules/@emotion/memoize/dist/memoize.esm.js"() {
memoize_esm_default = memoize2;
}
});
// node_modules/@emotion/is-prop-valid/dist/is-prop-valid.esm.js
var is_prop_valid_esm_exports = {};
__export(is_prop_valid_esm_exports, {
default: () => is_prop_valid_esm_default
});
var reactPropsRegex, index, is_prop_valid_esm_default;
var init_is_prop_valid_esm = __esm({
"node_modules/@emotion/is-prop-valid/dist/is-prop-valid.esm.js"() {
init_memoize_esm();
reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/;
index = memoize_esm_default(
function(prop) {
return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 && prop.charCodeAt(1) === 110 && prop.charCodeAt(2) < 91;
}
);
is_prop_valid_esm_default = index;
}
});
// node_modules/debounce/index.js
var require_debounce = __commonJS({
"node_modules/debounce/index.js"(exports, module) {
function debounce(func, wait, immediate) {
var timeout, args, context, timestamp, result;
if (null == wait)
wait = 100;
function later() {
var last = Date.now() - timestamp;
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
context = args = null;
}
}
}
var debounced = function() {
context = this;
args = arguments;
timestamp = Date.now();
var callNow = immediate && !timeout;
if (!timeout)
timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
debounced.clear = function() {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
};
debounced.flush = function() {
if (timeout) {
result = func.apply(context, args);
context = args = null;
clearTimeout(timeout);
timeout = null;
}
};
return debounced;
}
debounce.debounce = debounce;
module.exports = debounce;
}
});
// node_modules/fast-deep-equal/index.js
var require_fast_deep_equal = __commonJS({
"node_modules/fast-deep-equal/index.js"(exports, module) {
module.exports = function equal2(a2, b2) {
if (a2 === b2)
return true;
if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") {
if (a2.constructor !== b2.constructor)
return false;
var length, i, keys2;
if (Array.isArray(a2)) {
length = a2.length;
if (length != b2.length)
return false;
for (i = length; i-- !== 0; )
if (!equal2(a2[i], b2[i]))
return false;
return true;
}
if (a2.constructor === RegExp)
return a2.source === b2.source && a2.flags === b2.flags;
if (a2.valueOf !== Object.prototype.valueOf)
return a2.valueOf() === b2.valueOf();
if (a2.toString !== Object.prototype.toString)
return a2.toString() === b2.toString();
keys2 = Object.keys(a2);
length = keys2.length;
if (length !== Object.keys(b2).length)
return false;
for (i = length; i-- !== 0; )
if (!Object.prototype.hasOwnProperty.call(b2, keys2[i]))
return false;
for (i = length; i-- !== 0; ) {
var key = keys2[i];
if (!equal2(a2[key], b2[key]))
return false;
}
return true;
}
return a2 !== a2 && b2 !== b2;
};
}
});
// src/utils/arrayToObject.tsx
function arrayToObject(arr) {
return arr.reduceRight(
(prev, current) => ({ [current]: prev }),
null
);
}
// src/utils/deepMerge.tsx
function deepMerge(files, obj1, obj2, path) {
var _a, _b, _c, _d, _e, _f;
const result = Object.assign({}, obj1);
for (const prop in obj2) {
if (!result[prop]) {
result[prop] = {};
}
if (typeof obj2[prop] === "object") {
if (((_a = Object.keys((obj1 == null ? void 0 : obj1[prop]) || {})) == null ? void 0 : _a.length) === 0 && ((_b = Object.keys((obj2 == null ? void 0 : obj2[prop]) || {})) == null ? void 0 : _b.length) === 0) {
result[prop] = (_c = files[`${prop}`]) == null ? void 0 : _c.code;
} else {
if (((_d = Object.keys((obj1 == null ? void 0 : obj1[prop]) || {})) == null ? void 0 : _d.length) === 0) {
result[prop] = Object.entries(obj2[prop]).reduce(
(acc, [key, value]) => {
var _a2;
if (value !== null) {
acc[key] = deepMerge(files, result[prop], value, path);
} else {
acc[key] = (_a2 = files[`${prop}/${key}`]) == null ? void 0 : _a2.code;
}
return acc;
},
{}
);
} else if (((_e = Object.keys((obj2 == null ? void 0 : obj2[prop]) || {})) == null ? void 0 : _e.length) === 0) {
result[prop] = obj1[prop];
} else {
result[prop] = deepMerge(files, result[prop], obj2[prop], path);
}
}
} else {
result[prop] = (_f = files[`${path}`]) == null ? void 0 : _f.code;
}
}
return result;
}
// src/utils/deleteKeys.tsx
var deleteKeys = (obj, keysToDelete) => {
return Object.fromEntries(
Object.entries(obj).filter(([key]) => !keysToDelete.includes(key))
);
};
// src/utils/directoryFileMap.tsx
var directoryFileMap = (files, overrides = {}) => {
const _overrides = typeof overrides === "string" ? { [overrides]: "" } : overrides ?? {};
const _files = Object.keys({ ...files, ..._overrides }).reduce(
(acc, current) => {
const split = current.split("/").splice(1);
const dirTree = arrayToObject(split);
acc = deepMerge(files, acc, dirTree, current);
return acc;
},
{}
);
return _files;
};
// src/utils/buildPath.tsx
var buildPath = (item, arr) => {
let path = "";
let parent = arr.find(({ id: id2 }) => id2 === item.parent);
if (parent) {
path = `${buildPath(parent, arr)}/${path}`;
}
path += `${item.text}`;
return path;
};
// src/utils/toHierarchicalArray.tsx
var toHierarchicalArray = (obj, parentId = "/", arr = []) => {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
const text = key;
let builtPath = buildPath(
{
id: "",
parent: parentId,
text,
droppable: false,
data: {
path: ""
}
},
arr
);
const item = {
id: builtPath,
parent: parentId,
text,
data: {
path: `/${builtPath}`
},
droppable: false
};
if (typeof obj[key] === "object" && obj[key] !== null) {
item.droppable = true;
arr.push(item);
toHierarchicalArray(obj[key], builtPath, arr);
} else {
arr.push(item);
}
}
}
return arr;
};
// src/utils/getEntryFile.tsx
var getEntryFile = (files) => {
var _a, _b, _c;
let entryFile = "";
try {
entryFile = (_b = JSON.parse((_a = files["/package.json"]) == null ? void 0 : _a.code)) == null ? void 0 : _b.main;
} catch {
const entryRegex = /\"main\"\s*:\s*\"([^"]+)\"/;
const match = entryRegex.exec((_c = files["/package.json"]) == null ? void 0 : _c.code);
const mainValue = (match == null ? void 0 : match[1]) ?? "";
entryFile = mainValue;
}
return entryFile;
};
// src/utils/getRemovedKeys.tsx
function getRemovedKeys(original, updated) {
const removedKeys = [];
for (let key in original) {
if (original.hasOwnProperty(key) && !updated.hasOwnProperty(key)) {
removedKeys.push(key);
}
}
return removedKeys;
}
// src/utils/mergeHierarchicalArray.tsx
function mergeHierarchicalArray(sandpackFiles, arr) {
let obj = {};
for (let i = 0; i < (arr == null ? void 0 : arr.length); i++) {
let item = arr[i];
let builtPath = buildPath(item, arr);
obj[`/${builtPath}`] = sandpackFiles[`${item.data.path}`];
if (item.droppable && !obj[`/${builtPath}`]) {
obj[`/${builtPath}`] = { code: ".emptyDir", hidden: true };
obj[`/${builtPath}/`] = { code: ".emptyDir", hidden: true };
}
item.data.path = `/${builtPath}`;
}
return obj;
}
var CustomSandpackContext = React4.createContext(null);
var useSandpackFiles = () => {
const context = React4.useContext(CustomSandpackContext);
if (!context) {
throw Error(
"<SandpackFileTree/> must be used inside a <SandpackFilesProvider>, you may be looking for <SandpackFileExplorer/>?"
);
}
return context;
};
var SandpackFilesProvider = ({ children, onMoveFile }) => {
const { sandpack } = sandpackReact.useSandpack();
const [treeData, setTreeData] = React4.useState(
() => toHierarchicalArray(directoryFileMap({ ...sandpack.files }))
);
const [openDirs, setOpenDirs] = React4.useState([]);
const deleteFile = async (file) => {
var _a, _b;
const entryFile = (_b = JSON.parse((_a = sandpack.files["/package.json"]) == null ? void 0 : _a.code)) == null ? void 0 : _b.main;
const files = typeof file === "string" ? [file] : file;
if (files.includes(entryFile)) {
return;
}
const sandpackFilesCopy = { ...sandpack.files };
const getAllChildrenOfDir = (dir, arr) => {
const children2 = [];
const childrenOfDir = arr == null ? void 0 : arr.filter(({ parent }) => parent === dir);
childrenOfDir.forEach((child) => {
children2.push(buildPath(child, arr));
if (child.id !== "/" && child.id !== dir) {
children2.push(...getAllChildrenOfDir(child.id, arr));
}
});
return children2;
};
const deleteFilePromises = files.map(async (key) => {
const isDir = key.endsWith("/");
if (isDir) {
const dirId = key.substring(0, key.length - 1);
const parentId = dirId.substring(1);
sandpack.deleteFile(`${dirId}`);
delete sandpackFilesCopy[dirId];
const childrenOfDir = getAllChildrenOfDir(parentId, treeData);
childrenOfDir.forEach((child) => {
sandpack.deleteFile(`/${child}`);
delete sandpackFilesCopy[`/${child}`];
});
}
sandpack.deleteFile(key);
delete sandpackFilesCopy[key];
});
await Promise.all(deleteFilePromises);
const newFiles = deleteKeys(sandpackFilesCopy, files);
setTreeData(toHierarchicalArray(directoryFileMap(newFiles)));
};
const addFile = async (files) => {
for (let id2 in files) {
if (sandpack.files[id2] || sandpack.files[id2.endsWith("/") ? id2.substring(0, id2.length - 1) : `${id2}/`]) {
delete files[id2];
}
}
sandpack.addFile(files);
const tempAddNodes = Object.keys(sandpack.files).filter(
(key) => key.includes("addDir") || key.includes("addFile")
);
const fileKeys = Object.keys(files);
const isAnInputNode = fileKeys.filter(
(id2) => id2.includes("addDir") || id2.includes("addFile")
).length;
if (!isAnInputNode) {
await deleteFile(tempAddNodes);
const newFiles = deleteKeys({ ...sandpack.files }, tempAddNodes);
setTreeData(toHierarchicalArray(directoryFileMap(newFiles, files)));
fileKeys.forEach((id2) => {
if (!id2.endsWith("/"))
sandpack.openFile(id2);
});
} else {
const newTree = toHierarchicalArray(
directoryFileMap({ ...sandpack.files }, files)
);
setTreeData(newTree);
const key = Object.keys(files)[0].substring(1);
const directoryIds = getAllParentDirs({ childId: key, tree: newTree });
setOpenDirs((prev) => Array.from(/* @__PURE__ */ new Set([...prev, ...directoryIds])));
}
};
const getAllParentDirs = ({
childId,
tree
}) => {
var _a;
const ids = [];
const itemParent = (_a = tree.find(({ id: id2 }) => id2 === childId)) == null ? void 0 : _a.parent;
if (!itemParent || itemParent === "/") {
return ids;
}
ids.push(`${itemParent}`);
ids.push(...getAllParentDirs({ childId: itemParent, tree }));
return ids;
};
const onFileMoved = async ({
node,
newTree
}) => {
const filesCopy = { ...sandpack.files };
const prev = mergeHierarchicalArray(filesCopy, treeData);
const neww = mergeHierarchicalArray(filesCopy, newTree);
const removedKeys = getRemovedKeys(prev, neww);
const deleteFilePromises = removedKeys.map((key) => {
deleteFile(key);
});
await Promise.all(deleteFilePromises);
sandpack.addFile(neww);
const movedFileMap = removedKeys.reduce((acc, id2) => {
var _a, _b, _c, _d, _e;
const newPath = `/${buildPath(
{
parent: ((_a = node.dropTarget) == null ? void 0 : _a.id) ?? "/",
text: (_b = node == null ? void 0 : node.dragSource) == null ? void 0 : _b.text
},
newTree
)}`;
acc[id2] = `${newPath}${id2.substring(
id2.indexOf((_c = node == null ? void 0 : node.dragSource) == null ? void 0 : _c.id) + ((_e = (_d = node == null ? void 0 : node.dragSource) == null ? void 0 : _d.id) == null ? void 0 : _e.length)
)}`;
return acc;
}, {});
onMoveFile == null ? void 0 : onMoveFile(movedFileMap);
const currentActiveFile = sandpack.activeFile;
let newActiveFile = sandpack.activeFile;
sandpack.visibleFiles.forEach((file) => {
if (movedFileMap[file]) {
sandpack.openFile(movedFileMap[file]);
if (currentActiveFile === file) {
newActiveFile = movedFileMap[file];
}
}
});
sandpack.setActiveFile(newActiveFile);
};
const moveFiles = async (fileMap) => {
const filesCopy = { ...sandpack.files };
for (let file in fileMap) {
if (filesCopy[file]) {
filesCopy[fileMap[file]] = filesCopy[file];
}
}
const deleteFilePromises = Object.keys(fileMap).map((key) => {
if (filesCopy[key]) {
delete filesCopy[key];
deleteFile(key);
}
});
await Promise.all(deleteFilePromises);
sandpack.addFile(filesCopy);
const currentActiveFile = sandpack.activeFile;
let newActiveFile = sandpack.activeFile;
sandpack.visibleFiles.forEach((file) => {
if (fileMap[file]) {
sandpack.openFile(fileMap[file]);
if (currentActiveFile === file) {
newActiveFile = file;
}
}
});
sandpack.setActiveFile(newActiveFile);
const array = toHierarchicalArray(directoryFileMap({ ...filesCopy }));
setTreeData(array);
};
const value = {
addFile,
treeData,
setTreeData,
buildPath,
deleteFile,
onFileMoved,
moveFiles,
openDirs,
setOpenDirs
};
return /* @__PURE__ */ jsxRuntime.jsx(CustomSandpackContext.Provider, {
value,
children
});
};
// node_modules/react-dnd-html5-backend/dist/utils/js_utils.js
function memoize(fn) {
let result = null;
const memoized = () => {
if (result == null) {
result = fn();
}
return result;
};
return memoized;
}
function without(items, item) {
return items.filter(
(i) => i !== item
);
}
function union(itemsA, itemsB) {
const set = /* @__PURE__ */ new Set();
const insertItem = (item) => set.add(item);
itemsA.forEach(insertItem);
itemsB.forEach(insertItem);
const result = [];
set.forEach(
(key) => result.push(key)
);
return result;
}
// node_modules/react-dnd-html5-backend/dist/EnterLeaveCounter.js
var EnterLeaveCounter = class {
enter(enteringNode) {
const previousLength = this.entered.length;
const isNodeEntered = (node) => this.isNodeInDocument(node) && (!node.contains || node.contains(enteringNode));
this.entered = union(this.entered.filter(isNodeEntered), [
enteringNode
]);
return previousLength === 0 && this.entered.length > 0;
}
leave(leavingNode) {
const previousLength = this.entered.length;
this.entered = without(this.entered.filter(this.isNodeInDocument), leavingNode);
return previousLength > 0 && this.entered.length === 0;
}
reset() {
this.entered = [];
}
constructor(isNodeInDocument) {
this.entered = [];
this.isNodeInDocument = isNodeInDocument;
}
};
// node_modules/react-dnd-html5-backend/dist/NativeDragSources/NativeDragSource.js
var NativeDragSource = class {
initializeExposedProperties() {
Object.keys(this.config.exposeProperties).forEach((property) => {
Object.defineProperty(this.item, property, {
configurable: true,
enumerable: true,
get() {
console.warn(`Browser doesn't allow reading "${property}" until the drop event.`);
return null;
}
});
});
}
loadDataTransfer(dataTransfer) {
if (dataTransfer) {
const newProperties = {};
Object.keys(this.config.exposeProperties).forEach((property) => {
const propertyFn = this.config.exposeProperties[property];
if (propertyFn != null) {
newProperties[property] = {
value: propertyFn(dataTransfer, this.config.matchesTypes),
configurable: true,
enumerable: true
};
}
});
Object.defineProperties(this.item, newProperties);
}
}
canDrag() {
return true;
}
beginDrag() {
return this.item;
}
isDragging(monitor, handle) {
return handle === monitor.getSourceId();
}
endDrag() {
}
constructor(config) {
this.config = config;
this.item = {};
this.initializeExposedProperties();
}
};
// node_modules/react-dnd-html5-backend/dist/NativeTypes.js
var NativeTypes_exports = {};
__export(NativeTypes_exports, {
FILE: () => FILE,
HTML: () => HTML,
TEXT: () => TEXT,
URL: () => URL
});
var FILE = "__NATIVE_FILE__";
var URL = "__NATIVE_URL__";
var TEXT = "__NATIVE_TEXT__";
var HTML = "__NATIVE_HTML__";
// node_modules/react-dnd-html5-backend/dist/NativeDragSources/getDataFromDataTransfer.js
function getDataFromDataTransfer(dataTransfer, typesToTry, defaultValue) {
const result = typesToTry.reduce(
(resultSoFar, typeToTry) => resultSoFar || dataTransfer.getData(typeToTry),
""
);
return result != null ? result : defaultValue;
}
// node_modules/react-dnd-html5-backend/dist/NativeDragSources/nativeTypesConfig.js
var nativeTypesConfig = {
[FILE]: {
exposeProperties: {
files: (dataTransfer) => Array.prototype.slice.call(dataTransfer.files),
items: (dataTransfer) => dataTransfer.items,
dataTransfer: (dataTransfer) => dataTransfer
},
matchesTypes: [
"Files"
]
},
[HTML]: {
exposeProperties: {
html: (dataTransfer, matchesTypes) => getDataFromDataTransfer(dataTransfer, matchesTypes, ""),
dataTransfer: (dataTransfer) => dataTransfer
},
matchesTypes: [
"Html",
"text/html"
]
},
[URL]: {
exposeProperties: {
urls: (dataTransfer, matchesTypes) => getDataFromDataTransfer(dataTransfer, matchesTypes, "").split("\n"),
dataTransfer: (dataTransfer) => dataTransfer
},
matchesTypes: [
"Url",
"text/uri-list"
]
},
[TEXT]: {
exposeProperties: {
text: (dataTransfer, matchesTypes) => getDataFromDataTransfer(dataTransfer, matchesTypes, ""),
dataTransfer: (dataTransfer) => dataTransfer
},
matchesTypes: [
"Text",
"text/plain"
]
}
};
// node_modules/react-dnd-html5-backend/dist/NativeDragSources/index.js
function createNativeDragSource(type, dataTransfer) {
const config = nativeTypesConfig[type];
if (!config) {
throw new Error(`native type ${type} has no configuration`);
}
const result = new NativeDragSource(config);
result.loadDataTransfer(dataTransfer);
return result;
}
function matchNativeItemType(dataTransfer) {
if (!dataTransfer) {
return null;
}
const dataTransferTypes = Array.prototype.slice.call(dataTransfer.types || []);
return Object.keys(nativeTypesConfig).filter((nativeItemType) => {
const typeConfig = nativeTypesConfig[nativeItemType];
if (!(typeConfig === null || typeConfig === void 0 ? void 0 : typeConfig.matchesTypes)) {
return false;
}
return typeConfig.matchesTypes.some(
(t) => dataTransferTypes.indexOf(t) > -1
);
})[0] || null;
}
// node_modules/react-dnd-html5-backend/dist/BrowserDetector.js
var isFirefox = memoize(
() => /firefox/i.test(navigator.userAgent)
);
var isSafari = memoize(
() => Boolean(window.safari)
);
// node_modules/react-dnd-html5-backend/dist/MonotonicInterpolant.js
var MonotonicInterpolant = class {
interpolate(x) {
const { xs, ys, c1s, c2s, c3s } = this;
let i = xs.length - 1;
if (x === xs[i]) {
return ys[i];
}
let low = 0;
let high = c3s.length - 1;
let mid;
while (low <= high) {
mid = Math.floor(0.5 * (low + high));
const xHere = xs[mid];
if (xHere < x) {
low = mid + 1;
} else if (xHere > x) {
high = mid - 1;
} else {
return ys[mid];
}
}
i = Math.max(0, high);
const diff = x - xs[i];
const diffSq = diff * diff;
return ys[i] + c1s[i] * diff + c2s[i] * diffSq + c3s[i] * diff * diffSq;
}
constructor(xs, ys) {
const { length } = xs;
const indexes = [];
for (let i = 0; i < length; i++) {
indexes.push(i);
}
indexes.sort(
(a2, b2) => xs[a2] < xs[b2] ? -1 : 1
);
const dxs = [];
const ms = [];
let dx;
let dy;
for (let i1 = 0; i1 < length - 1; i1++) {
dx = xs[i1 + 1] - xs[i1];
dy = ys[i1 + 1] - ys[i1];
dxs.push(dx);
ms.push(dy / dx);
}
const c1s = [
ms[0]
];
for (let i2 = 0; i2 < dxs.length - 1; i2++) {
const m2 = ms[i2];
const mNext = ms[i2 + 1];
if (m2 * mNext <= 0) {
c1s.push(0);
} else {
dx = dxs[i2];
const dxNext = dxs[i2 + 1];
const common = dx + dxNext;
c1s.push(3 * common / ((common + dxNext) / m2 + (common + dx) / mNext));
}
}
c1s.push(ms[ms.length - 1]);
const c2s = [];
const c3s = [];
let m;
for (let i3 = 0; i3 < c1s.length - 1; i3++) {
m = ms[i3];
const c1 = c1s[i3];
const invDx = 1 / dxs[i3];
const common = c1 + c1s[i3 + 1] - m - m;
c2s.push((m - c1 - common) * invDx);
c3s.push(common * invDx * invDx);
}
this.xs = xs;
this.ys = ys;
this.c1s = c1s;
this.c2s = c2s;
this.c3s = c3s;
}
};
// node_modules/react-dnd-html5-backend/dist/OffsetUtils.js
var ELEMENT_NODE = 1;
function getNodeClientOffset(node) {
const el = node.nodeType === ELEMENT_NODE ? node : node.parentElement;
if (!el) {
return null;
}
const { top, left } = el.getBoundingClientRect();
return {
x: left,
y: top
};
}
function getEventClientOffset(e) {
return {
x: e.clientX,
y: e.clientY
};
}
function isImageNode(node) {
var ref;
return node.nodeName === "IMG" && (isFirefox() || !((ref = document.documentElement) === null || ref === void 0 ? void 0 : ref.contains(node)));
}
function getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight) {
let dragPreviewWidth = isImage ? dragPreview.width : sourceWidth;
let dragPreviewHeight = isImage ? dragPreview.height : sourceHeight;
if (isSafari() && isImage) {
dragPreviewHeight /= window.devicePixelRatio;
dragPreviewWidth /= window.devicePixelRatio;
}
return {
dragPreviewWidth,
dragPreviewHeight
};
}
function getDragPreviewOffset(sourceNode, dragPreview, clientOffset, anchorPoint, offsetPoint) {
const isImage = isImageNode(dragPreview);
const dragPreviewNode = isImage ? sourceNode : dragPreview;
const dragPreviewNodeOffsetFromClient = getNodeClientOffset(dragPreviewNode);
const offsetFromDragPreview = {
x: clientOffset.x - dragPreviewNodeOffsetFromClient.x,
y: clientOffset.y - dragPreviewNodeOffsetFromClient.y
};
const { offsetWidth: sourceWidth, offsetHeight: sourceHeight } = sourceNode;
const { anchorX, anchorY } = anchorPoint;
const { dragPreviewWidth, dragPreviewHeight } = getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight);
const calculateYOffset = () => {
const interpolantY = new MonotonicInterpolant([
0,
0.5,
1
], [
offsetFromDragPreview.y,
offsetFromDragPreview.y / sourceHeight * dragPreviewHeight,
offsetFromDragPreview.y + dragPreviewHeight - sourceHeight
]);
let y = interpolantY.interpolate(anchorY);
if (isSafari() && isImage) {
y += (window.devicePixelRatio - 1) * dragPreviewHeight;
}
return y;
};
const calculateXOffset = () => {
const interpolantX = new MonotonicInterpolant([
0,
0.5,
1
], [
offsetFromDragPreview.x,
offsetFromDragPreview.x / sourceWidth * dragPreviewWidth,
offsetFromDragPreview.x + dragPreviewWidth - sourceWidth
]);
return interpolantX.interpolate(anchorX);
};
const { offsetX, offsetY } = offsetPoint;
const isManualOffsetX = offsetX === 0 || offsetX;
const isManualOffsetY = offsetY === 0 || offsetY;
return {
x: isManualOffsetX ? offsetX : calculateXOffset(),
y: isManualOffsetY ? offsetY : calculateYOffset()
};
}
// node_modules/react-dnd-html5-backend/dist/OptionsReader.js
var OptionsReader = class {
get window() {
if (this.globalContext) {
return this.globalContext;
} else if (typeof window !== "undefined") {
return window;
}
return void 0;
}
get document() {
var ref;
if ((ref = this.globalContext) === null || ref === void 0 ? void 0 : ref.document) {
return this.globalContext.document;
} else if (this.window) {
return this.window.document;
} else {
return void 0;
}
}
get rootElement() {
var ref;
return ((ref = this.optionsArgs) === null || ref === void 0 ? void 0 : ref.rootElement) || this.window;
}
constructor(globalContext, options) {
this.ownerDocument = null;
this.globalContext = globalContext;
this.optionsArgs = options;
}
};
// node_modules/react-dnd-html5-backend/dist/HTML5BackendImpl.js
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === "function") {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function(key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
var HTML5BackendImpl = class {
profile() {
var ref, ref1;
return {
sourcePreviewNodes: this.sourcePreviewNodes.size,
sourcePreviewNodeOptions: this.sourcePreviewNodeOptions.size,