path.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Renderer shim for `node:path` (dev-app-proven): pure string path math so the
  2. // `@nengine/core` barrel resolves in the renderer build.
  3. export function isAbsolute(p: string): boolean {
  4. return p.startsWith("/");
  5. }
  6. export function resolve(...segments: string[]): string {
  7. const parts: string[] = [];
  8. for (const segment of segments) {
  9. if (segment.length === 0) continue;
  10. if (segment.startsWith("/")) {
  11. parts.length = 0;
  12. }
  13. parts.push(...segment.split("/"));
  14. }
  15. const out: string[] = [];
  16. for (const part of parts) {
  17. if (part === "" || part === ".") continue;
  18. if (part === "..") {
  19. out.pop();
  20. } else {
  21. out.push(part);
  22. }
  23. }
  24. return "/" + out.join("/");
  25. }
  26. export function join(...segments: string[]): string {
  27. return resolve(...segments);
  28. }
  29. export function basename(p: string, suffix?: string): string {
  30. const name = p.split("/").filter((s) => s.length > 0).pop() ?? "";
  31. if (suffix && name.endsWith(suffix)) {
  32. return name.slice(0, -suffix.length);
  33. }
  34. return name;
  35. }
  36. export function extname(p: string): string {
  37. const name = basename(p);
  38. const idx = name.lastIndexOf(".");
  39. return idx > 0 ? name.slice(idx) : "";
  40. }
  41. export function dirname(p: string): string {
  42. const idx = p.lastIndexOf("/");
  43. return idx > 0 ? p.slice(0, idx) : "/";
  44. }