UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

108 lines (87 loc) 2.94 kB
import { assert } from "../../core/assert.js"; const rx_url_schema = /[a-zA-Z0-9_\-]+\:\/\//; /** * * @param {string} path * @return {boolean} */ function isGlobalPath(path) { //search for URL schema at the start of the path return path.search(rx_url_schema) === 0; } // *** Environment setup code *** const ENVIRONMENT_IS_WEB = typeof window === 'object'; const ENVIRONMENT_IS_NODE = typeof process === 'object' && !ENVIRONMENT_IS_WEB; const ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; const ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; /** * * @param {string} path * @return {string} */ function localPathToGlobal(path) { /** * @type {Window|DedicatedWorkerGlobalScope} */ let scope; if (ENVIRONMENT_IS_WEB) { scope = window; } else if (ENVIRONMENT_IS_WORKER) { scope = self; } else if (ENVIRONMENT_IS_NODE) { let normalized_path = `${process.cwd()}/`.replace(/\\/g, '/'); // remove multiple sequential slashes normalized_path = normalized_path.replace(/\/+/g, '/'); if (normalized_path[0] !== '/') { // Windows drive letter must be prefixed with a slash. normalized_path = `/${normalized_path}`; } scope = { location: { pathname: normalized_path, host: '', protocol: 'file:' } }; } else { throw new Error('Unknown environment'); } const location = scope.location; const pathname = location.pathname; let directoryPath; /* path name contains file name also, there are two options here, "a/b" or "a/b/" second is a directory we need to extract directory to load relative path */ if (pathname.endsWith('/')) { //path is to a directory, strip last slash directoryPath = pathname.substring(0, pathname.length - 1); } else { //path is to a file const i = pathname.lastIndexOf('/'); if (i === -1) { //root level file directoryPath = "" } else { directoryPath = pathname.substring(0, i); } } const urlBase = location.protocol + "//" + location.host + directoryPath + "/"; return urlBase + path; } /** * Given a path, which may be a local path, produce a fully qualified URL * @example '/path' -> 'http://example.com/path' * @example 'some/local/path' -> 'http://example.com/current_path/some/local/path' * @param {string} path * @return {string} */ export function convertPathToURL(path) { assert.isString(path, 'path'); const is_global = isGlobalPath(path); let result = path; if (!is_global) { result = localPathToGlobal(path); } return result; }