@tldraw/editor
Version:
tldraw infinite canvas SDK (editor).
132 lines (131 loc) • 4.35 kB
JavaScript
import { atom, react } from "@tldraw/state";
import { deleteFromSessionStorage, getFromSessionStorage, setInSessionStorage } from "@tldraw/utils";
const featureFlags = {};
const pointerCaptureTrackingObject = createDebugValue(
"pointerCaptureTrackingObject",
// ideally we wouldn't store this mutable value in an atom but it's not
// a big deal for debug values
{
defaults: { all: /* @__PURE__ */ new Map() },
shouldStoreForSession: false
}
);
const debugFlags = {
// --- DEBUG VALUES ---
logPreventDefaults: createDebugValue("logPreventDefaults", {
defaults: { all: false }
}),
logPointerCaptures: createDebugValue("logPointerCaptures", {
defaults: { all: false }
}),
logElementRemoves: createDebugValue("logElementRemoves", {
defaults: { all: false }
}),
debugSvg: createDebugValue("debugSvg", {
defaults: { all: false }
}),
showFps: createDebugValue("showFps", {
defaults: { all: false }
}),
measurePerformance: createDebugValue("measurePerformance", { defaults: { all: false } }),
throwToBlob: createDebugValue("throwToBlob", {
defaults: { all: false }
}),
reconnectOnPing: createDebugValue("reconnectOnPing", {
defaults: { all: false }
}),
debugCursors: createDebugValue("debugCursors", {
defaults: { all: false }
}),
forceSrgb: createDebugValue("forceSrgbColors", { defaults: { all: false } }),
debugGeometry: createDebugValue("debugGeometry", { defaults: { all: false } }),
hideShapes: createDebugValue("hideShapes", { defaults: { all: false } }),
editOnType: createDebugValue("editOnType", { defaults: { all: false } }),
a11y: createDebugValue("a11y", { defaults: { all: false } }),
debugElbowArrows: createDebugValue("debugElbowArrows", { defaults: { all: false } })
};
if (typeof Element !== "undefined") {
const nativeElementRemoveChild = Element.prototype.removeChild;
react("element removal logging", () => {
if (debugFlags.logElementRemoves.get()) {
Element.prototype.removeChild = function(child) {
console.warn("[tldraw] removing child:", child);
return nativeElementRemoveChild.call(this, child);
};
} else {
Element.prototype.removeChild = nativeElementRemoveChild;
}
});
}
function createDebugValue(name, {
defaults,
shouldStoreForSession = true
}) {
return createDebugValueBase({
name,
defaults,
shouldStoreForSession
});
}
function createDebugValueBase(def) {
const defaultValue = getDefaultValue(def);
const storedValue = def.shouldStoreForSession ? getStoredInitialValue(def.name) : null;
const valueAtom = atom(`debug:${def.name}`, storedValue ?? defaultValue);
if (typeof window !== "undefined") {
if (def.shouldStoreForSession) {
react(`debug:${def.name}`, () => {
const currentValue = valueAtom.get();
if (currentValue === defaultValue) {
deleteFromSessionStorage(`tldraw_debug:${def.name}`);
} else {
setInSessionStorage(`tldraw_debug:${def.name}`, JSON.stringify(currentValue));
}
});
}
Object.defineProperty(window, `tldraw${def.name.replace(/^[a-z]/, (l) => l.toUpperCase())}`, {
get() {
return valueAtom.get();
},
set(newValue) {
valueAtom.set(newValue);
},
configurable: true
});
}
return Object.assign(valueAtom, def, {
reset: () => valueAtom.set(defaultValue)
});
}
function getStoredInitialValue(name) {
try {
return JSON.parse(getFromSessionStorage(`tldraw_debug:${name}`) ?? "null");
} catch {
return null;
}
}
function readEnv(fn) {
try {
return fn();
} catch {
return null;
}
}
function getDefaultValue(def) {
const env = readEnv(() => process.env.TLDRAW_ENV) ?? readEnv(() => process.env.VERCEL_PUBLIC_TLDRAW_ENV) ?? readEnv(() => process.env.NEXT_PUBLIC_TLDRAW_ENV) ?? // default to production because if we don't have one of these, this is probably a library use
"production";
switch (env) {
case "production":
return def.defaults.production ?? def.defaults.all;
case "preview":
case "staging":
return def.defaults.staging ?? def.defaults.all;
default:
return def.defaults.development ?? def.defaults.all;
}
}
export {
debugFlags,
featureFlags,
pointerCaptureTrackingObject
};
//# sourceMappingURL=debug-flags.mjs.map