diff --git a/readme.md b/readme.md index ba37c51..44863ad 100644 --- a/readme.md +++ b/readme.md @@ -42,16 +42,29 @@ You should `.gitignore` the above auto-generated `routes.json` file. ### Publish resources -Publish JavaScript router to `resources/js/router.js` +Publish JavaScript router to `resources/js` ```bash php artisan vendor:publish --provider="Bmatovu\JsRoutes\JsRoutesServiceProvider" ``` -Load JavaScript router; usually from `resources/js/bootstrap.js` +**Using Webpack | Laravel Mix** + +Load JavaScript router; usually in `resources/js/app.js` ```js window.route = require('./router.js').route; + +console.log(route('login')); +``` + +**Using ViteJS** + +```js +import { route } from './router.mjs'; +window.route = route; + +console.log(route('login')); ``` ### Compile JS routes diff --git a/resources/js/router.mjs b/resources/js/router.mjs new file mode 100644 index 0000000..2524ac3 --- /dev/null +++ b/resources/js/router.mjs @@ -0,0 +1,57 @@ +import routes from './routes.json' assert {type: 'json'}; + +var appUrl = document.head.querySelector('meta[name="app-url"]').content; + +if (!String.prototype.endsWith) { + String.prototype.endsWith = function (search, this_len) { + if (this_len === undefined || this_len > this.length) { + this_len = this.length; + } + return this.substring(this_len - search.length, this_len) === search; + }; +} + +export function route(name, params) { + if (routes[name] === undefined) { + console.error('Unknown route ', name); + return false; + } + + if (params === null || typeof params !== 'object') { + return appUrl + '/' + routes[name]; + } + + var path = routes[name] + .split('/') + .map(function (part) { + if (part === null) { + return ''; + } + + if (part[0] != '{') { + return part; + } + + var param = part.match(/[^{\}]+/g)[0]; + + if (param.endsWith('?')) { + param = param.slice(0, -1); + } + + var value = params['' + param]; + + delete params['' + param]; + + return value; + }) + .join('/') + .replace(/\/+$/g, ''); + + var query = Object.keys(params) + .map(function (key) { + return key + '=' + params[key]; + }) + .join('&'); + + return query ? appUrl + '/' + path + '?' + encodeURI(query) : appUrl + '/' + path; +}