vue-i18n-routing
Advanced tools
Comparing version
@@ -1,5 +0,5 @@ | ||
"use strict";var H=Object.defineProperty,Y=Object.defineProperties;var J=Object.getOwnPropertyDescriptors;var A=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,X=Object.prototype.propertyIsEnumerable;var C=(e,t,o)=>t in e?H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,F=(e,t)=>{for(var o in t||(t={}))N.call(t,o)&&C(e,o,t[o]);if(A)for(var o of A(t))X.call(t,o)&&C(e,o,t[o]);return e},T=(e,t)=>Y(e,J(t));var M=(e,t)=>{var o={};for(var r in e)N.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(e!=null&&A)for(var r of A(e))t.indexOf(r)<0&&X.call(e,r)&&(o[r]=e[r]);return o};Object.defineProperty(exports,"__esModule",{value:!0});exports[Symbol.toStringTag]="Module";var E=require("vue-demi"),j=require("@intlify/vue-router-composable"),K=require("vue-i18n");/*! | ||
* shared v9.2.0-beta.25 | ||
* (c) 2021 kazuya kawaguchi | ||
"use strict";var ie=Object.defineProperty,fe=Object.defineProperties;var de=Object.getOwnPropertyDescriptors;var D=Object.getOwnPropertySymbols;var G=Object.prototype.hasOwnProperty,H=Object.prototype.propertyIsEnumerable;var B=(e,t,a)=>t in e?ie(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a,T=(e,t)=>{for(var a in t||(t={}))G.call(t,a)&&B(e,a,t[a]);if(D)for(var a of D(t))H.call(t,a)&&B(e,a,t[a]);return e},N=(e,t)=>fe(e,de(t));var W=(e,t)=>{var a={};for(var n in e)G.call(e,n)&&t.indexOf(n)<0&&(a[n]=e[n]);if(e!=null&&D)for(var n of D(e))t.indexOf(n)<0&&H.call(e,n)&&(a[n]=e[n]);return a};Object.defineProperty(exports,"__esModule",{value:!0});exports[Symbol.toStringTag]="Module";var _=require("vue-demi"),v=require("@intlify/vue-router-bridge"),J=require("@intlify/vue-i18n-bridge");function he(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var _e=he(v);/*! | ||
* shared v9.2.0-beta.30 | ||
* (c) 2022 kazuya kawaguchi | ||
* Released under the MIT License. | ||
*/const q=Object.assign,P=e=>typeof e=="string",Q=e=>typeof e=="symbol",Z=e=>typeof e=="symbol";new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(Z));function I(e){return Boolean(e&&e.__v_isRef===!0)}Promise.resolve();function ee(e){e=e||[];const t=[];for(const o of e)P(o)?t.push({code:o}):t.push(o);return t}function y(e,t){return I(e.locale)&&t==="composition"}function G(e){return"global"in e&&"mode"in e}function O(e){return G(e)?y(e.global,e.mode)?e.global.locale.value:e.global.locale:I(e.locale)?e.locale.value:e.locale}function B(e,t){G(e)?y(e.global,e.mode)?e.global.locale.value=t:e.global.locale=t:I(e.locale)&&(e.locale.value=t)}function oe(e,t,o){return e.replace(/\/+$/,"")+(t?"/":"")||(o?"":"/")}function te(e,{localeCodes:t=[]}={}){if(!y(e.global,e.mode))throw new Error("");const o=E.ref(t);e.global.locales=E.computed(()=>o.value),console.log("... extends i18n done")}const ne={PREFIX:"prefix",PREFIX_EXCEPT_DEFAULT:"prefix_except_default",PREFIX_AND_DEFAULT:"prefix_and_default",NO_PREFIX:"no_prefix"},w="",W=ne.PREFIX_EXCEPT_DEFAULT,D=!1,z="___",U="default";function V(e,{defaultLocale:t=w,strategy:o=W,trailingSlash:r=D,routesNameSeparator:f=z,defaultLocaleRouteNameSuffix:_=U,includeUprefixedFallback:i=!1,localeCodes:$=[]}={}){if(o==="no_prefix")return e;const d=$.map(n=>P(n)?n:n.code);function m(n,p,L=!1,h=!1){return n.redirect&&(!n.component||!n.file)?[n]:p.reduce((l,s)=>{const{name:c}=n;let{path:u}=n;const a=F({},n);c&&(a.name=`${c}${f}${s}`),n.children&&(a.children=n.children.reduce((b,S)=>[...b,...m(S,[s],!0,h)],[]));const x=s===t;if(x&&o==="prefix_and_default")if(L)L&&h&&c&&(a.name+=`${f}${_}`);else{const b=T(F({},a),{path:u});if(c&&(b.name=`${a.name}${f}${_}`),n.children){b.children=[];for(const S of n.children)b.children=b.children.concat(m(S,[s],!0,!0))}l.push(b)}const R=L&&!u.startsWith("/"),v=!R&&!(x&&o==="prefix_except_default");return v&&(u=`/${s}${u}`),u&&(u=oe(u,r,R)),v&&x&&o==="prefix"&&i&&l.push(F({},n)),a.path=u,l.push(a),l},[])}return e.reduce((n,p)=>[...n,...m(p,d||[])],[])}function ce(e){return new RegExp(`^/(${e.join("|")})(?:/|$)`,"i")}function le(e,t,o){const r=`(${e.join("|")})`,f=`(?:${t}${o})?`,_=new RegExp(`${t}${r}${f}$`,"i"),i=ce(e);return d=>{if(d.name){const n=(P(d.name)?d.name:d.name.toString()).match(_);if(n&&n.length>1)return n[1]}else if(d.path){const m=d.path.match(i);if(m&&m.length>1)return m[1]}return""}}function se({router:e,i18n:t,defaultLocale:o=w,strategy:r=W,trailingSlash:f=D,routesNameSeparator:_=z,defaultLocaleRouteNameSuffix:i=U,localeCodes:$=[]}={}){const d=ee($),m=le(d.map(n=>n.code),_,i);if(te(t,{localeCodes:d}),E.isVue2){const n=e,p=n.constructor,L=n.options.routes||[],h=V(L,{localeCodes:$,defaultLocale:o,strategy:r,trailingSlash:f,routesNameSeparator:_,defaultLocaleRouteNameSuffix:i});console.log("vue2 routes",L,h);const g=new p({mode:"history",base:n.options.base,routes:h});return g.__defaultLocale=o,g.__strategy=r,g.__trailingSlash=f,g.__routesNameSeparator=_,g.__defaultLocaleRouteNameSuffix=i,g.beforeEach((l,s,c)=>{console.log("beforeEach",l,s);const u=O(t),a=m(l)||u||o||"";console.log("currentLocale",u,"finalLocale",a),u!==a&&B(t,a),c()}),g}else{const n=e,p=n.options.routes||[],L=V(p,{localeCodes:$,defaultLocale:o,strategy:r,trailingSlash:f,routesNameSeparator:_,defaultLocaleRouteNameSuffix:i});return console.log("vue3 routes",p,L,n),p.forEach(h=>n.removeRoute(h.name)),L.forEach(h=>n.addRoute(h)),n.__defaultLocale=o,n.__strategy=r,n.__trailingSlash=f,n.__routesNameSeparator=_,n.__defaultLocaleRouteNameSuffix=i,n.beforeEach((h,g,l)=>{console.log("beforeEach",h,g);const s=O(t),c=m(h)||s||o||"";console.log("currentLocale",s,"finalLocale",c),s!==c&&B(t,c),l()}),n}}function re(){return K.useI18n()}function ae(e={}){const t=re(),o=j.useRouter(),r=j.useRoute(),f=e.defaultLocaleRouteNameSuffix||o.__defaultLocaleRouteNameSuffix,_=e.defaultLocale||o.__defaultLocale,i=e.routesNameSeparator||o.__routesNameSeparator,$=e.strategy||o.__strategy;function d(l){const s=l!=null?l:E.isRef(r)?r.value:r;return s.name?k(s.name).split(i)[0]:void 0}function m(l,s){let c=k(l)+($==="no_prefix"?"":i+s);return s===_&&$==="prefix_and_default"&&(c+=i+f),c}function n(l,s){const c=s||O(t);let u=l;P(l)&&(l[0]==="/"?u={path:l}:u={name:l});let a=q({},u);if(a.path&&!a.name){const R=o.resolve(a),v=E.isVue2?R.route:R,b=d(v);P(b)&&(a={name:m(b,c),params:v.params,query:v.query,hash:v.hash})}else{a.name=m(a.name,c);const{params:R}=a;R&&R["0"]===void 0&&R.pathMatch&&(R["0"]=R.pathMatch)}const x=o.resolve(a);return(E.isVue2?x.route.name:x.name)?x:o.resolve(l)}function p(l,s){const c=n(l,s);return c==null?"":E.isVue2?c.route.redirectedFrom||c.route.fullPath:c.redirectedFrom||c.fullPath}function L(l,s){const c=n(l,s);return c==null?void 0:E.isVue2?c.route:c}function h(l,s){const c=n(l,s);return c==null?void 0:E.isVue2?c.location:c.href}function g(l){const s=d();if(!s)return"";const v=E.isVue2&&E.isRef(r)?r.value:r,{params:c}=v,u=M(v,["params"]),a={},x=q({},u,{name:s,params:T(F(F({},c),a),{0:c.pathMatch})}),R=p(x,l);return console.log("switchLocalePath",t.locale.value,l,R),R}return{localePath:p,localeRoute:L,localeLocation:h,switchLocalePath:g}}function k(e){return P(e)?e:Q(e)?e.toString():""}function ue({router:e,i18n:t,defaultLocale:o=w,trailingSlash:r=D,routesNameSeparator:f=z,defaultLocaleRouteNameSuffix:_=U,localeCodes:i=[]}={}){if(e==null)throw new Error("TODO");return se({router:e,i18n:t,defaultLocale:o,trailingSlash:r,routesNameSeparator:f,defaultLocaleRouteNameSuffix:_,localeCodes:i})}const ie="";exports.VERSION=ie;exports.extendRouting=ue;exports.localizeRoutes=V;exports.useI18nRouting=ae; | ||
*/const K=Object.assign,me=Array.isArray,Re=e=>typeof e=="function",F=e=>typeof e=="string",ge=e=>typeof e=="boolean",Le=e=>typeof e=="symbol",Ee=e=>e!==null&&typeof e=="object",pe=/\/$|\/\?/;function C(e="",t=!1){return t?pe.test(e):e.endsWith("/")}function ve(e="",t=!1){if(!t)return(C(e)?e.slice(0,-1):e)||"/";if(!C(e,!0))return e||"/";const[a,...n]=e.split("?");return(a.slice(0,-1)||"/")+(n.length?`?${n.join("?")}`:"")}function Se(e="",t=!1){if(!t)return e.endsWith("/")?e:e+"/";if(C(e,!0))return e||"/";const[a,...n]=e.split("?");return a+"/"+(n.length?`?${n.join("?")}`:"")}const Ae=typeof window!="undefined";function Ie(e,t){typeof console!="undefined"&&(console.warn("[vue-i18n-routing] "+e),t&&console.warn(t.stack))}function Z(e){e=e||[];const t=[];for(const a of e)F(a)?t.push({code:a}):t.push(a);return t}function j(e,t){return _.isRef(e.locale)&&t==="composition"}function ee(e){return"global"in e&&"mode"in e}function x(e){return ee(e)?j(e.global,e.mode)?e.global.locale.value:e.global.locale:e.locale.value}function te(e,t){ee(e)?j(e.global,e.mode)?e.global.locale.value=t:e.global.locale=t:_.isRef(e.locale)&&(e.locale.value=t)}function Te(e,t,a){return e.replace(/\/+$/,"")+(t?"/":"")||(a?"":"/")}function Q(e){return v.isVueRouter4,_.isRef(e)?e.value:e}function ae(e){return F(e)?e:Le(e)?e.toString():"(null)"}function Y(e,t,{defaultLocale:a,strategy:n,routesNameSeparator:o,defaultLocaleRouteNameSuffix:l}){let r=ae(e)+(n==="no_prefix"?"":o+t);return t===a&&n==="prefix_and_default"&&(r+=o+l),r}function Fe(e,t){return Re(e)?e(t):e}const y={PREFIX:"prefix",PREFIX_EXCEPT_DEFAULT:"prefix_except_default",PREFIX_AND_DEFAULT:"prefix_and_default",NO_PREFIX:"no_prefix"},$="",O=y.PREFIX_EXCEPT_DEFAULT,ne=!1,U="___",M="default",Pe="ltr",le="",ye=new Set([y.PREFIX_AND_DEFAULT,y.PREFIX_EXCEPT_DEFAULT]);function b(e=v.useRoute(),{router:t=v.useRouter(),routesNameSeparator:a=U}={}){const n=a||t.__routesNameSeparator,o=_.unref(e);return o.name?ae(o.name).split(n)[0]:null}function oe(e,t,a){const n=q(e,t,a);return n==null?"":_.isVue3?n.redirectedFrom||n.fullPath:n.route.redirectedFrom||n.route.fullPath}function re(e,t,a){const n=q(e,t,a);return n==null?void 0:_.isVue3?n:n.route}function De(e,t,a){const n=q(e,t,a);return n==null?void 0:_.isVue3?n:n.location}function q(e,t,{router:a=v.useRouter(),i18n:n=J.useI18n(),defaultLocale:o=$,defaultLocaleRouteNameSuffix:l=M,routesNameSeparator:r=U,strategy:f=O,trailingSlash:u=!1}={}){const c=a.__defaultLocaleRouteNameSuffix||l,h=a.__defaultLocale||o,s=a.__routesNameSeparator||r,m=a.__strategy||f,R=t||x(n);let g=e;F(e)&&(g[0]==="/"?g={path:e}:g={name:e});let d=K({},g);if(d.path&&!d.name){const i=a.resolve(d),L=_.isVue3?i:i.route,A=b(L);F(A)?d={name:Y(A,R,{defaultLocale:h,strategy:m,routesNameSeparator:s,defaultLocaleRouteNameSuffix:c}),params:L.params,query:L.query,hash:L.hash}:(!(R===o&&ye.has(m))&&m!==y.NO_PREFIX&&(d.path=`/${R}${d.path}`),d.path=u?Se(d.path,!0):ve(d.path,!0))}else{d.name=Y(d.name,R,{defaultLocale:h,strategy:m,routesNameSeparator:s,defaultLocaleRouteNameSuffix:c});const{params:i}=d;i&&i["0"]===void 0&&i.pathMatch&&(i["0"]=i.pathMatch)}const S=a.resolve(d);return(_.isVue3?S.name:S.route.name)?S:a.resolve(e)}function V(e,t){const a=t&&t.route||v.useRoute(),n=b(a,t);if(!n)return"";const c=!_.isVue3&&_.isRef(a)?a.value:a,{params:o}=c,l=W(c,["params"]),r={},f=K({},l,{name:n,params:N(T(T({},o),r),{0:o.pathMatch})});return oe(f,e,t)}function Ne({addDirAttribute:e=!1,addSeoAttributes:t=!1,strategy:a=O,defaultLocale:n=$,route:o=v.useRoute(),router:l=v.useRouter(),i18n:r=J.useI18n()}={}){const f=n||l.__defaultLocale,u=a||l.__strategy,c=_.ref({htmlAttrs:{},link:[],meta:[]});function h(){c.value={htmlAttrs:{},link:[],meta:[]}}function s(m){if(r.locales==null||r.__baseUrl==null)return;const R=x(r),g=Z(r.locales.value).find(i=>i.code===R)||{code:R},d=g.iso,S=g.dir||l.__defaultDirection;if(e&&(c.value.htmlAttrs.dir=S),t&&R&&r.locales){d&&(c.value.htmlAttrs.lang=d);const i=r.locales.value;xe(i,r.__baseUrl,c.value.link,{defaultLocale:f,strategy:u,route:o,router:l,i18n:r}),$e(r.__baseUrl,c.value.link,t,{route:m,router:l,i18n:r}),Oe(g,d,c.value.meta),Ue(i,d,c.value.meta)}}return Ae?_.watchEffect(()=>{h(),s(Q(l.currentRoute))}):s(Q(l.currentRoute)),c}function xe(e,t,a,n){if(n.strategy===y.NO_PREFIX)return;const o=new Map;for(const l of e){const r=l.iso;if(!r){Ie("Locale ISO code is required to generate alternate link");continue}const[f,u]=r.split("-");f&&u&&(l.isCatchallLocale||!o.has(f))&&o.set(f,l),o.set(r,l)}for(const[l,r]of o.entries()){const f=V(r.code,n);f&&a.push({hid:`i18n-alt-${l}`,rel:"alternate",href:X(f,t),hreflang:l})}if(n.defaultLocale){const l=V(n.defaultLocale,n);l&&a.push({hid:"i18n-xd",rel:"alternate",href:X(l,t),hreflang:"x-default"})}}function $e(e,t,a,n){const{route:o}=n,l=re(N(T({},o),{name:b(o,n)}),void 0,n);if(l){let r=X(l.path,e);const f=!ge(a)&&a.canonicalQueries||[];if(f.length){const u=l.query,c=new URLSearchParams;for(const s of f)if(s in u){const m=u[s];me(m)?m.forEach(R=>c.append(s,R||"")):c.append(s,m||"")}const h=c.toString();h&&(r=`${r}?${h}`)}t.push({hid:"i18n-can",rel:"canonical",href:r})}}function Oe(e,t,a){!(e&&t)||a.push({hid:"i18n-og",property:"og:locale",content:ce(t)})}function Ue(e,t,a){const n=e.filter(o=>{const l=o.iso;return l&&l!==t});if(n.length){const o=n.map(l=>({hid:`i18n-og-alt-${l.iso}`,property:"og:locale:alternate",content:ce(l.iso)}));a.push(...o)}}function ce(e){return(e||"").replace(/-/g,"_")}function X(e,t){return e.match(/^https?:\/\//)?e:t+e}function se(e,{defaultLocale:t=$,strategy:a=O,trailingSlash:n=ne,routesNameSeparator:o=U,defaultLocaleRouteNameSuffix:l=M,includeUprefixedFallback:r=!1,optionsResolver:f=void 0,locales:u=[]}={}){if(a==="no_prefix")return e;const c=u.map(s=>F(s)?s:s.code);function h(s,m,R=!1,g=!1){if(s.redirect&&(!s.component||!s.file))return[s];let d=null;return f!=null&&(d=f(s,m),d==null)?[s]:m.reduce((i,L)=>{const{name:A}=s;let{path:E}=s;const p=T({},s);A&&(p.name=`${A}${o}${L}`),s.children&&(p.children=s.children.reduce((I,w)=>[...I,...h(w,[L],!0,g)],[]));const P=L===t;if(P&&a==="prefix_and_default")if(R)R&&g&&A&&(p.name+=`${o}${l}`);else{const I=N(T({},p),{path:E});if(A&&(I.name=`${p.name}${o}${l}`),s.children){I.children=[];for(const w of s.children)I.children=I.children.concat(h(w,[L],!0,!0))}i.push(I)}const z=R&&!E.startsWith("/"),k=!z&&!(P&&a==="prefix_except_default");return k&&(E=`/${L}${E}`),E&&(E=Te(E,n,z)),k&&P&&a==="prefix"&&r&&i.push(T({},s)),p.path=E,i.push(p),i},[])}return e.reduce((s,m)=>[...s,...h(m,c||[])],[])}function be(e,{locales:t=[],localeCodes:a=[],baseUrl:n=le}={}){if(!j(e.global,e.mode))throw new Error("TODO:");const o=_.ref(t),l=_.ref(a);e.global.locales=_.computed(()=>o.value),e.global.localeCodes=_.computed(()=>l.value),e.global.__baseUrl=Fe(n,{})}function we(e,t={}){const{version:a,defaultLocale:n,locales:o,strategy:l,trailingSlash:r,routesNameSeparator:f,defaultLocaleRouteNameSuffix:u,defaultDirection:c,baseUrl:h,routes:s,routeOptionsResolver:m}=Xe(t),R=Z(o),g=R.map(L=>L.code),d=ue(g,f,u);be(e,{locales:R,baseUrl:h,localeCodes:g});const S=se(s,{locales:o,defaultLocale:n,strategy:l,trailingSlash:r,routesNameSeparator:f,defaultLocaleRouteNameSuffix:u,optionsResolver:m});t.routes=S;const i=Ce(t,a);return i.__defaultLocale=n,i.__localeCodes=g,i.__strategy=l,i.__trailingSlash=r,i.__routesNameSeparator=f,i.__defaultLocaleRouteNameSuffix=u,i.__defaultDirection=c,i.beforeEach((L,A,E)=>{const p=x(e),P=d(L)||p||n||"";p!==P&&te(e,P),E()}),i}function Ce(e,t){if(_.isVue3&&t===4)return v.createRouter(e);if(_.isVue2&&t===3)return new _e.default(e);throw new Error("TODO:")}function Ve(e){return new RegExp(`^/(${e.join("|")})(?:/|$)`,"i")}function ue(e,t,a){const n=`(${e.join("|")})`,o=`(?:${t}${a})?`,l=new RegExp(`${t}${n}${o}$`,"i"),r=Ve(e);return u=>{if(Ee(u)){if(u.name){const h=(F(u.name)?u.name:u.name.toString()).match(l);if(h&&h.length>1)return h[1]}else if(u.path){const c=u.path.match(r);if(c&&c.length>1)return c[1]}}else if(F(u)){const c=u.match(r);if(c&&c.length>1)return c[1]}return""}}function Xe(e){var t,a,n,o,l,r,f,u,c,h;return e.version=(t=e.version)!=null?t:4,e.defaultLocale=(a=e.defaultLocale)!=null?a:$,e.strategy=(n=e.strategy)!=null?n:O,e.trailingSlash=(o=e.trailingSlash)!=null?o:ne,e.routesNameSeparator=(l=e.routesNameSeparator)!=null?l:U,e.defaultLocaleRouteNameSuffix=(r=e.defaultLocaleRouteNameSuffix)!=null?r:M,e.locales=(f=e.locales)!=null?f:[],e.defaultDirection=(u=e.defaultDirection)!=null?u:Pe,e.baseUrl=(c=e.baseUrl)!=null?c:le,e.routes=(h=e.routes)!=null?h:[],e}const je="0.0.0";exports.VERSION=je;exports.createLocaleFromRouteGetter=ue;exports.createRouter=we;exports.getLocale=x;exports.getRouteBaseName=b;exports.localeLocation=De;exports.localePath=oe;exports.localeRoute=re;exports.localizeRoutes=se;exports.setLocale=te;exports.switchLocalePath=V;exports.useI18nHead=Ne; |
@@ -1,11 +0,59 @@ | ||
import type { I18n } from 'vue-i18n'; | ||
import { Locale } from 'vue-i18n'; | ||
import type { Route as Route_2 } from 'vue-router3'; | ||
import type { RouteConfig } from 'vue-router3'; | ||
import type { RouteLocationNormalizedLoaded } from 'vue-router'; | ||
import type { Router } from 'vue-router'; | ||
import VueI18n from 'vue-i18n-legacy'; | ||
import VueRouter from 'vue-router3'; | ||
import { Composer } from '@intlify/vue-i18n-bridge'; | ||
import type { I18n } from '@intlify/vue-i18n-bridge'; | ||
import type { Locale } from '@intlify/vue-i18n-bridge'; | ||
import type { RawLocation } from '@intlify/vue-router-bridge'; | ||
import type { Ref } from 'vue-demi'; | ||
import type { Route as Route_2 } from '@intlify/vue-router-bridge'; | ||
import type { RouteConfig } from '@intlify/vue-router-bridge'; | ||
import type { RouteLocation } from '@intlify/vue-router-bridge'; | ||
import type { RouteLocationNormalized } from '@intlify/vue-router-bridge'; | ||
import type { RouteLocationNormalizedLoaded } from '@intlify/vue-router-bridge'; | ||
import type { RouteLocationRaw } from '@intlify/vue-router-bridge'; | ||
import type { Router } from '@intlify/vue-router-bridge'; | ||
import type { RouterOptions } from '@intlify/vue-router-bridge'; | ||
import { useRoute } from '@intlify/vue-router-bridge'; | ||
import { useRouter } from '@intlify/vue-router-bridge'; | ||
import type { VueRouter } from '@intlify/vue-router-bridge'; | ||
export declare type BaseUrlResolveHandler = (context: unknown) => string; | ||
export declare type ComposableOptions = { | ||
route?: ReturnType<typeof useRoute>; | ||
router?: ReturnType<typeof useRouter>; | ||
i18n?: Composer; | ||
}; | ||
/** | ||
* Options to compute route localizing | ||
* | ||
* @remarks | ||
* The route options that is compute the route to be localized on {@link localizeRoutes} | ||
*/ | ||
export declare type ComputedRouteOptions = { | ||
locales: readonly string[]; | ||
paths: Record<string, string>; | ||
}; | ||
export declare function createLocaleFromRouteGetter(localeCodes: string[], routesNameSeparator: string, defaultLocaleRouteNameSuffix: string): (route: Route_2 | RouteLocationNormalizedLoaded | RouteLocationNormalized | string) => string; | ||
/** | ||
* Create a Vue Router instance | ||
* | ||
* @param i18n - A Vue I18n instance, see [Vue I18n API docs](https://vue-i18n.intlify.dev/api/general.html#i18n) | ||
* @param options - An options, see {@link VueI18nRoutingOptions} | ||
* | ||
* @returns A Vue Router instance | ||
* | ||
* @remakrs | ||
* You can create a vue router instance to be used by the Vue app. | ||
* | ||
* The routes of the created router instance are handled with i18n routing. | ||
* | ||
* At the Vue 2 will return a [Vue Router v3 instance](https://router.vuejs.org/api/#router-construction-options), and at the Vue 3 will return a [Vue Router v4 instance](https://next.router.vuejs.org/api/#createrouter). | ||
* | ||
* @public | ||
*/ | ||
export declare function createRouter<Options extends VueI18nRoutingOptions = VueI18nRoutingOptions>(i18n: I18n, options?: Options): Options['version'] extends 4 ? Router : VueRouter; | ||
/** | ||
* Direction | ||
@@ -15,17 +63,59 @@ */ | ||
export declare function extendRouting<TRouter extends VueRouter | Router>({ router, i18n, defaultLocale, trailingSlash, routesNameSeparator, defaultLocaleRouteNameSuffix, localeCodes }?: VueI18nRoutingOptions): TRouter; | ||
export declare function getLocale(i18n: I18n | Composer): Locale; | ||
export declare type I18nRoutingOptions = Pick<VueI18nRoutingOptions, 'defaultLocale' | 'strategy' | 'defaultLocaleRouteNameSuffix' | 'trailingSlash' | 'localeCodes'> & { | ||
routesNameSeparator?: string; | ||
}; | ||
/** | ||
* Get route base name | ||
* | ||
* @param givenRoute - A route object, if not provided, the route is returned with `useRoute` will be used | ||
* @param options - An options, see about details {@link I18nRoutingOptions} | ||
* | ||
* @returns The route base name, if route name is not defined, return null | ||
*/ | ||
export declare function getRouteBaseName(givenRoute?: Route_2 | RouteLocationNormalizedLoaded, { router, routesNameSeparator }?: I18nRoutingOptions): string | null; | ||
export declare interface I18nRoutingReturn { | ||
getRouteBaseName(givenRoute?: Route_2 | RouteLocationNormalizedLoaded): string; | ||
localePath(route: any, locale?: Locale): string; | ||
localeRoute(route: any, locale?: Locale): any; | ||
localeLocation(route: any, locale?: Locale): any; | ||
switchLocalePath(locale: Locale): void; | ||
/** | ||
* I18n header meta info | ||
*/ | ||
export declare interface I18nHeadMetaInfo { | ||
htmlAttrs?: MetaAttrs; | ||
meta?: MetaAttrs[]; | ||
link?: MetaAttrs[]; | ||
} | ||
/** | ||
* Options for {@link useI18nHead} function | ||
*/ | ||
export declare interface I18nHeadOptions { | ||
/** | ||
* Adds a `dir` attribute to the HTML element. | ||
* | ||
* @defaultValue false | ||
*/ | ||
addDirAttribute?: boolean; | ||
/** | ||
* Adds various SEO attributes. | ||
* | ||
* @defaultValue false | ||
*/ | ||
addSeoAttributes?: boolean | SeoAttributesOptions; | ||
} | ||
/** | ||
* Options for vue-i18n-routing common | ||
*/ | ||
export declare type I18nRoutingOptions = Pick<VueI18nRoutingOptions, 'defaultLocale' | 'strategy' | 'defaultLocaleRouteNameSuffix' | 'trailingSlash' | 'locales' | 'routesNameSeparator'> & ComposableOptions; | ||
/** | ||
* Resolve locale location | ||
* | ||
* @param route - A route location. The path or name of the route or an object for more complex routes | ||
* @param locale - A locale code, if not specified, uses the current locale | ||
* @param options - An options, see about details {@link I18nRoutingOptions} | ||
* | ||
* @returns Returns the location object for a given route, the location object is resolved by vue-router rather than just a full route path. | ||
*/ | ||
export declare function localeLocation(route: RawLocation | RouteLocationRaw, locale?: Locale, // TODO: locale should be more type inference (completion) | ||
options?: I18nRoutingOptions): Location | RouteLocation | undefined; | ||
/** | ||
* Locale object | ||
@@ -43,6 +133,43 @@ */ | ||
export declare function localizeRoutes(routes: VueI18nRoute[], { defaultLocale, strategy, trailingSlash, routesNameSeparator, defaultLocaleRouteNameSuffix, includeUprefixedFallback, localeCodes }?: Pick<VueI18nRoutingOptions, 'defaultLocale' | 'strategy' | 'localeCodes' | 'routesNameSeparator' | 'trailingSlash' | 'defaultLocaleRouteNameSuffix'> & { | ||
/** | ||
* Resolve locale path | ||
* | ||
* @param route - A route location. The path or name of the route or an object for more complex routes | ||
* @param locale - A locale code, if not specified, uses the current locale | ||
* @param options - An options, see about details {@link I18nRoutingOptions} | ||
* | ||
* @returns Returns the localized URL for a given route | ||
*/ | ||
export declare function localePath(route: RawLocation | RouteLocationRaw, locale?: Locale, // TODO: locale should be more type inference (completion) | ||
options?: I18nRoutingOptions): string; | ||
/** | ||
* Resolve locale route | ||
* | ||
* @param route - A route location. The path or name of the route or an object for more complex routes | ||
* @param locale - A locale code, if not specified, uses the current locale | ||
* @param options - An options, see about details {@link I18nRoutingOptions} | ||
* | ||
* @returns Returns the route object for a given route, the route object is resolved by vue-router rather than just a full route path. | ||
*/ | ||
export declare function localeRoute(route: RawLocation | RouteLocationRaw, locale?: Locale, // TODO: locale should be more type inference (completion) | ||
options?: I18nRoutingOptions): Route_2 | ReturnType<Router['resolve']> | undefined; | ||
/** | ||
* Localize routes | ||
* | ||
* @param routes - Some routes | ||
* @param options - An options | ||
* | ||
* @returns Localized routes | ||
* | ||
* @public | ||
*/ | ||
export declare function localizeRoutes(routes: VueI18nRoute[], { defaultLocale, strategy, trailingSlash, routesNameSeparator, defaultLocaleRouteNameSuffix, includeUprefixedFallback, optionsResolver, locales }?: Pick<VueI18nRoutingOptions, 'defaultLocale' | 'strategy' | 'locales' | 'routesNameSeparator' | 'trailingSlash' | 'defaultLocaleRouteNameSuffix'> & { | ||
includeUprefixedFallback?: boolean; | ||
optionsResolver?: RouteOptionsResolver; | ||
}): VueI18nRoute[]; | ||
export declare type MetaAttrs = Record<string, any>; | ||
/** | ||
@@ -70,2 +197,21 @@ * Route config for vue-router v4 | ||
/** | ||
* Resolver for route localizing options | ||
*/ | ||
export declare type RouteOptionsResolver = (route: VueI18nRoute, allowedLocaleCodes: string[]) => ComputedRouteOptions | null; | ||
/** | ||
* SEO Attribute options | ||
*/ | ||
export declare interface SeoAttributesOptions { | ||
/** | ||
* An array of strings corresponding to query params you would like to include in your canonical URL. | ||
* | ||
* @defaultValue [] | ||
*/ | ||
canonicalQueries?: string[]; | ||
} | ||
export declare function setLocale(i18n: I18n | Composer, locale: Locale): void; | ||
declare const STRATEGIES: { | ||
@@ -83,5 +229,22 @@ readonly PREFIX: "prefix"; | ||
/** | ||
* Switch locale path | ||
* | ||
* @param locale - A locale code, if not specified, uses the current locale | ||
* @param options - An options, see about details {@link I18nRoutingOptions} | ||
* | ||
* @returns Returns a link to the current route in another language | ||
*/ | ||
export declare function switchLocalePath(locale: Locale, options?: I18nRoutingOptions): string; | ||
declare type UnionToIntersection<T> = (T extends any ? (k: T) => void : never) extends (k: infer U) => void ? U : never; | ||
export declare function useI18nRouting<Legacy extends boolean = false>(options?: I18nRoutingOptions): I18nRoutingReturn; | ||
/** | ||
* Generate SEO head meta information | ||
* | ||
* @param options - An options, see about details {@link I18nHeadOptions} | ||
* | ||
* @returns Genereated SEO head meta information | ||
*/ | ||
export declare function useI18nHead({ addDirAttribute, addSeoAttributes, strategy, defaultLocale, route, router, i18n }?: Pick<I18nRoutingOptions, 'strategy' | 'defaultLocale'> & ComposableOptions & I18nHeadOptions): Ref<I18nHeadMetaInfo>; | ||
@@ -94,3 +257,3 @@ /** | ||
*/ | ||
export declare const VERSION = ""; | ||
export declare const VERSION: string; | ||
@@ -105,28 +268,137 @@ /** | ||
/** | ||
* Vue I18n routing options | ||
* Options to initialize a VueRouter instance | ||
* | ||
* @remarks | ||
* This options is extended from Vue Router `RouterOptioins`, so you can specify those options. | ||
*/ | ||
export declare interface VueI18nRoutingOptions { | ||
export declare type VueI18nRoutingOptions<BaseUrl extends BaseUrlResolveHandler = BaseUrlResolveHandler> = { | ||
/** | ||
* Vue Router instance | ||
* Vue Router version | ||
* | ||
* @remarks | ||
* You can choice between vue-router v3 and v4. | ||
* | ||
* If you specify `3`, this function return Vue Router v3 instance, else specify `4`, this function return Vue Router v4 instance. | ||
* | ||
* @defaultValue 4 | ||
*/ | ||
router?: VueRouter | Router; | ||
version?: 3 | 4; | ||
/** | ||
* Vue I18n instance | ||
* The app's default locale | ||
* | ||
* @remarks | ||
* When using `prefix_except_default` strategy, URLs for locale specified here won't have a prefix. | ||
* | ||
* It's recommended to set this to some locale regardless of chosen strategy, as it will be used as a fallback locale when navigating to a non-existent route | ||
* | ||
* @defaultValue '' (emputy string) | ||
*/ | ||
i18n?: VueI18n | I18n; | ||
defaultLocale?: string; | ||
localeCodes?: string[] | LocaleObject[]; | ||
/** | ||
* List of locales supported by your app | ||
* | ||
* @remarks | ||
* Can either be an array of string codes (e.g. `['en', 'fr']`) or an array of {@link LocaleObject} for more complex configurations | ||
* | ||
* @defaultValue [] | ||
*/ | ||
locales?: string[] | LocaleObject[]; | ||
/** | ||
* Routes strategy | ||
* | ||
* @remarks | ||
* Can be set to one of the following: | ||
* | ||
* - `no_prefix`: routes won't have a locale prefix | ||
* - `prefix_except_default`: locale prefix added for every locale except default | ||
* - `prefix`: locale prefix added for every locale | ||
* - `prefix_and_default`: locale prefix added for every locale and default | ||
* | ||
* @defaultValue 'prefix_except_default' | ||
*/ | ||
strategy?: Strategies; | ||
/** | ||
* Whether to use trailing slash | ||
* | ||
* @defaultValue false | ||
*/ | ||
trailingSlash?: boolean; | ||
/** | ||
* Internal separator used for generated route names for each locale. You shouldn't need to change this | ||
* | ||
* @defaultValue '___' | ||
*/ | ||
routesNameSeparator?: string; | ||
/** | ||
* Internal suffix added to generated route names for default locale | ||
* | ||
* @remarks | ||
* if strategy is prefix_and_default. You shouldn't need to change this. | ||
* | ||
* @defaultValue 'default' | ||
*/ | ||
defaultLocaleRouteNameSuffix?: string; | ||
} | ||
/** | ||
* Default direction direction | ||
* | ||
* @defaultValue 'ltr' | ||
*/ | ||
defaultDirection?: Directions; | ||
/** | ||
* The fallback base URL to use as a prefix for alternate URLs in hreflang tags. | ||
* | ||
* @remarks | ||
* By default VueRouter's base URL will be used and only if that is not available, fallback URL will be used. | ||
* | ||
* Can also be a function (will be passed a Nuxt Context as a parameter) that returns a string. | ||
* | ||
* Useful to make base URL dynamic based on request headers. | ||
* | ||
* @defaultValue '' | ||
*/ | ||
baseUrl?: string | BaseUrl; | ||
/** | ||
* Route options resolver | ||
* | ||
* @defaultValue undefined | ||
*/ | ||
routeOptionsResolver?: RouteOptionsResolver; | ||
} & RouterOptions; | ||
export { } | ||
import type { ComputedRef } from 'vue' | ||
import type { ComputedRef } from 'vue-demi' | ||
declare module 'vue-i18n' { | ||
export interface ComposerCustom { | ||
locales: ComputedRef<string[] | LocaleObject[]> | ||
/** | ||
* List of locales | ||
* | ||
* @defaultValue `undefined` | ||
*/ | ||
locales?: ComputedRef<string[] | LocaleObject[]> | ||
/** | ||
* List of locale codes | ||
* | ||
* @defaultValue `undefined` | ||
*/ | ||
localeCodes?: ComputedRef<string[]> | ||
__baseUrl?: string | ||
} | ||
} | ||
declare module 'vue-i18n-bridge' { | ||
export interface ComposerCustom { | ||
/** | ||
* List of locales | ||
* | ||
* @defaultValue `undefined` | ||
*/ | ||
locales?: ComputedRef<string[] | LocaleObject[]> | ||
/** | ||
* List of locale codes | ||
* | ||
* @defaultValue `undefined` | ||
*/ | ||
localeCodes?: ComputedRef<string[]> | ||
__baseUrl?: string | ||
} | ||
} |
@@ -32,19 +32,53 @@ var __defProp = Object.defineProperty; | ||
}; | ||
import { ref, computed, isVue2, isRef as isRef$1 } from "vue-demi"; | ||
import { useRouter, useRoute } from "@intlify/vue-router-composable"; | ||
import { useI18n as useI18n$1 } from "vue-i18n"; | ||
import { isRef, unref, isVue3, ref, watchEffect, computed, isVue2 } from "vue-demi"; | ||
import VueRouter3, { isVueRouter4, useRoute, useRouter, createRouter as createRouter$1 } from "@intlify/vue-router-bridge"; | ||
import { useI18n } from "@intlify/vue-i18n-bridge"; | ||
/*! | ||
* shared v9.2.0-beta.25 | ||
* (c) 2021 kazuya kawaguchi | ||
* shared v9.2.0-beta.30 | ||
* (c) 2022 kazuya kawaguchi | ||
* Released under the MIT License. | ||
*/ | ||
const assign = Object.assign; | ||
const isArray = Array.isArray; | ||
const isFunction = (val) => typeof val === "function"; | ||
const isString = (val) => typeof val === "string"; | ||
const isSymbol$1 = (val) => typeof val === "symbol"; | ||
const isBoolean = (val) => typeof val === "boolean"; | ||
const isSymbol = (val) => typeof val === "symbol"; | ||
new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(isSymbol)); | ||
function isRef(r) { | ||
return Boolean(r && r.__v_isRef === true); | ||
const isObject = (val) => val !== null && typeof val === "object"; | ||
const TRAILING_SLASH_RE = /\/$|\/\?/; | ||
function hasTrailingSlash(input = "", queryParams = false) { | ||
if (!queryParams) { | ||
return input.endsWith("/"); | ||
} | ||
return TRAILING_SLASH_RE.test(input); | ||
} | ||
Promise.resolve(); | ||
function withoutTrailingSlash(input = "", queryParams = false) { | ||
if (!queryParams) { | ||
return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || "/"; | ||
} | ||
if (!hasTrailingSlash(input, true)) { | ||
return input || "/"; | ||
} | ||
const [s0, ...s] = input.split("?"); | ||
return (s0.slice(0, -1) || "/") + (s.length ? `?${s.join("?")}` : ""); | ||
} | ||
function withTrailingSlash(input = "", queryParams = false) { | ||
if (!queryParams) { | ||
return input.endsWith("/") ? input : input + "/"; | ||
} | ||
if (hasTrailingSlash(input, true)) { | ||
return input || "/"; | ||
} | ||
const [s0, ...s] = input.split("?"); | ||
return s0 + "/" + (s.length ? `?${s.join("?")}` : ""); | ||
} | ||
const inBrowser = typeof window !== "undefined"; | ||
function warn(msg, err) { | ||
if (typeof console !== "undefined") { | ||
console.warn(`[vue-i18n-routing] ` + msg); | ||
if (err) { | ||
console.warn(err.stack); | ||
} | ||
} | ||
} | ||
function getNormalizedLocales(locales) { | ||
@@ -69,3 +103,3 @@ locales = locales || []; | ||
function getLocale(i18n) { | ||
return isI18nInstance(i18n) ? isComposer(i18n.global, i18n.mode) ? i18n.global.locale.value : i18n.global.locale : isRef(i18n.locale) ? i18n.locale.value : i18n.locale; | ||
return isI18nInstance(i18n) ? isComposer(i18n.global, i18n.mode) ? i18n.global.locale.value : i18n.global.locale : i18n.locale.value; | ||
} | ||
@@ -86,10 +120,26 @@ function setLocale(i18n, locale) { | ||
} | ||
function extendI18n(i18n, { localeCodes = [] } = {}) { | ||
if (!isComposer(i18n.global, i18n.mode)) { | ||
throw new Error(""); | ||
function toRawRoute(maybeRoute) { | ||
return isVueRouter4 ? isRef(maybeRoute) ? maybeRoute.value : maybeRoute : isRef(maybeRoute) ? maybeRoute.value : maybeRoute; | ||
} | ||
function getRouteName(routeName) { | ||
return isString(routeName) ? routeName : isSymbol(routeName) ? routeName.toString() : "(null)"; | ||
} | ||
function getLocaleRouteName(routeName, locale, { | ||
defaultLocale, | ||
strategy, | ||
routesNameSeparator, | ||
defaultLocaleRouteNameSuffix | ||
}) { | ||
let name = getRouteName(routeName) + (strategy === "no_prefix" ? "" : routesNameSeparator + locale); | ||
if (locale === defaultLocale && strategy === "prefix_and_default") { | ||
name += routesNameSeparator + defaultLocaleRouteNameSuffix; | ||
} | ||
const _localeCodes = ref(localeCodes); | ||
i18n.global.locales = computed(() => _localeCodes.value); | ||
console.log("... extends i18n done"); | ||
return name; | ||
} | ||
function resolveBaseUrl(baseUrl, context) { | ||
if (isFunction(baseUrl)) { | ||
return baseUrl(context); | ||
} | ||
return baseUrl; | ||
} | ||
const STRATEGIES = { | ||
@@ -106,2 +156,278 @@ PREFIX: "prefix", | ||
const DEFAULT_LOCALE_ROUTE_NAME_SUFFIX = "default"; | ||
const DEFAULT_DETECTION_DIRECTION = "ltr"; | ||
const DEFAULT_BASE_URL = ""; | ||
const RESOLVED_PREFIXED = /* @__PURE__ */ new Set([STRATEGIES.PREFIX_AND_DEFAULT, STRATEGIES.PREFIX_EXCEPT_DEFAULT]); | ||
function getRouteBaseName(givenRoute = useRoute(), { router = useRouter(), routesNameSeparator = DEFAULT_ROUTES_NAME_SEPARATOR } = {}) { | ||
const _routesNameSeparator = routesNameSeparator || router.__routesNameSeparator; | ||
const _route = unref(givenRoute); | ||
if (!_route.name) { | ||
return null; | ||
} | ||
const name = getRouteName(_route.name); | ||
return name.split(_routesNameSeparator)[0]; | ||
} | ||
function localePath(route, locale, options) { | ||
const localizedRoute = resolveRoute(route, locale, options); | ||
return localizedRoute == null ? "" : isVue3 ? localizedRoute.redirectedFrom || localizedRoute.fullPath : localizedRoute.route.redirectedFrom || localizedRoute.route.fullPath; | ||
} | ||
function localeRoute(route, locale, options) { | ||
const resolved = resolveRoute(route, locale, options); | ||
return resolved == null ? void 0 : isVue3 ? resolved : resolved.route; | ||
} | ||
function localeLocation(route, locale, options) { | ||
const resolved = resolveRoute(route, locale, options); | ||
return resolved == null ? void 0 : isVue3 ? resolved : resolved.location; | ||
} | ||
function resolveRoute(route, locale, { | ||
router = useRouter(), | ||
i18n = useI18n(), | ||
defaultLocale = DEFAULT_LOCALE, | ||
defaultLocaleRouteNameSuffix = DEFAULT_LOCALE_ROUTE_NAME_SUFFIX, | ||
routesNameSeparator = DEFAULT_ROUTES_NAME_SEPARATOR, | ||
strategy = DEFAULT_STRATEGY, | ||
trailingSlash = false | ||
} = {}) { | ||
const _defaultLocaleRouteNameSuffix = router.__defaultLocaleRouteNameSuffix || defaultLocaleRouteNameSuffix; | ||
const _defaultLocale = router.__defaultLocale || defaultLocale; | ||
const _routesNameSeparator = router.__routesNameSeparator || routesNameSeparator; | ||
const _strategy = router.__strategy || strategy; | ||
const _locale = locale || getLocale(i18n); | ||
let _route = route; | ||
if (isString(route)) { | ||
if (_route[0] === "/") { | ||
_route = { path: route }; | ||
} else { | ||
_route = { name: route }; | ||
} | ||
} | ||
let localizedRoute = assign({}, _route); | ||
if (localizedRoute.path && !localizedRoute.name) { | ||
const _resolvedRoute = router.resolve(localizedRoute); | ||
const resolvedRoute2 = isVue3 ? _resolvedRoute : _resolvedRoute.route; | ||
const resolvedRouteName = getRouteBaseName(resolvedRoute2); | ||
if (isString(resolvedRouteName)) { | ||
localizedRoute = { | ||
name: getLocaleRouteName(resolvedRouteName, _locale, { | ||
defaultLocale: _defaultLocale, | ||
strategy: _strategy, | ||
routesNameSeparator: _routesNameSeparator, | ||
defaultLocaleRouteNameSuffix: _defaultLocaleRouteNameSuffix | ||
}), | ||
params: resolvedRoute2.params, | ||
query: resolvedRoute2.query, | ||
hash: resolvedRoute2.hash | ||
}; | ||
} else { | ||
const isDefaultLocale = _locale === defaultLocale; | ||
const isPrefixed = !(isDefaultLocale && RESOLVED_PREFIXED.has(_strategy)) && !(_strategy === STRATEGIES.NO_PREFIX); | ||
if (isPrefixed) { | ||
localizedRoute.path = `/${_locale}${localizedRoute.path}`; | ||
} | ||
localizedRoute.path = trailingSlash ? withTrailingSlash(localizedRoute.path, true) : withoutTrailingSlash(localizedRoute.path, true); | ||
} | ||
} else { | ||
localizedRoute.name = getLocaleRouteName(localizedRoute.name, _locale, { | ||
defaultLocale: _defaultLocale, | ||
strategy: _strategy, | ||
routesNameSeparator: _routesNameSeparator, | ||
defaultLocaleRouteNameSuffix: _defaultLocaleRouteNameSuffix | ||
}); | ||
const { params } = localizedRoute; | ||
if (params && params["0"] === void 0 && params.pathMatch) { | ||
params["0"] = params.pathMatch; | ||
} | ||
} | ||
const resolvedRoute = router.resolve(localizedRoute); | ||
if (isVue3 ? resolvedRoute.name : resolvedRoute.route.name) { | ||
return resolvedRoute; | ||
} | ||
return router.resolve(route); | ||
} | ||
function switchLocalePath(locale, options) { | ||
const route = options && options.route || useRoute(); | ||
const name = getRouteBaseName(route, options); | ||
if (!name) { | ||
return ""; | ||
} | ||
const _a = !isVue3 && isRef(route) ? route.value : route, { params } = _a, routeCopy = __objRest(_a, ["params"]); | ||
const langSwitchParams = {}; | ||
const baseRoute = assign({}, routeCopy, { | ||
name, | ||
params: __spreadProps(__spreadValues(__spreadValues({}, params), langSwitchParams), { | ||
0: params.pathMatch | ||
}) | ||
}); | ||
const path = localePath(baseRoute, locale, options); | ||
return path; | ||
} | ||
function useI18nHead({ | ||
addDirAttribute = false, | ||
addSeoAttributes = false, | ||
strategy = DEFAULT_STRATEGY, | ||
defaultLocale = DEFAULT_LOCALE, | ||
route = useRoute(), | ||
router = useRouter(), | ||
i18n = useI18n() | ||
} = {}) { | ||
const _defaultLocale = defaultLocale || router.__defaultLocale; | ||
const _strategy = strategy || router.__strategy; | ||
const metaObject = ref({ | ||
htmlAttrs: {}, | ||
link: [], | ||
meta: [] | ||
}); | ||
function cleanMeta() { | ||
metaObject.value = { | ||
htmlAttrs: {}, | ||
link: [], | ||
meta: [] | ||
}; | ||
} | ||
function updateMeta(_route) { | ||
if (i18n.locales == null || i18n.__baseUrl == null) { | ||
return; | ||
} | ||
const locale = getLocale(i18n); | ||
const currentLocale = getNormalizedLocales(i18n.locales.value).find((l) => l.code === locale) || { | ||
code: locale | ||
}; | ||
const currentLocaleIso = currentLocale.iso; | ||
const currentLocaleDir = currentLocale.dir || router.__defaultDirection; | ||
if (addDirAttribute) { | ||
metaObject.value.htmlAttrs.dir = currentLocaleDir; | ||
} | ||
if (addSeoAttributes && locale && i18n.locales) { | ||
if (currentLocaleIso) { | ||
metaObject.value.htmlAttrs.lang = currentLocaleIso; | ||
} | ||
const locales = i18n.locales.value; | ||
addHreflangLinks(locales, i18n.__baseUrl, metaObject.value.link, { | ||
defaultLocale: _defaultLocale, | ||
strategy: _strategy, | ||
route, | ||
router, | ||
i18n | ||
}); | ||
addCanonicalLinks(i18n.__baseUrl, metaObject.value.link, addSeoAttributes, { route: _route, router, i18n }); | ||
addCurrentOgLocale(currentLocale, currentLocaleIso, metaObject.value.meta); | ||
addAlternateOgLocales(locales, currentLocaleIso, metaObject.value.meta); | ||
} | ||
} | ||
if (inBrowser) { | ||
watchEffect(() => { | ||
cleanMeta(); | ||
updateMeta(toRawRoute(router.currentRoute)); | ||
}); | ||
} else { | ||
updateMeta(toRawRoute(router.currentRoute)); | ||
} | ||
return metaObject; | ||
} | ||
function addHreflangLinks(locales, baseUrl, link, options) { | ||
if (options.strategy === STRATEGIES.NO_PREFIX) { | ||
return; | ||
} | ||
const localeMap = /* @__PURE__ */ new Map(); | ||
for (const locale of locales) { | ||
const localeIso = locale.iso; | ||
if (!localeIso) { | ||
warn("Locale ISO code is required to generate alternate link"); | ||
continue; | ||
} | ||
const [language, region] = localeIso.split("-"); | ||
if (language && region && (locale.isCatchallLocale || !localeMap.has(language))) { | ||
localeMap.set(language, locale); | ||
} | ||
localeMap.set(localeIso, locale); | ||
} | ||
for (const [iso, mapLocale] of localeMap.entries()) { | ||
const localePath2 = switchLocalePath(mapLocale.code, options); | ||
if (localePath2) { | ||
link.push({ | ||
hid: `i18n-alt-${iso}`, | ||
rel: "alternate", | ||
href: toAbsoluteUrl(localePath2, baseUrl), | ||
hreflang: iso | ||
}); | ||
} | ||
} | ||
if (options.defaultLocale) { | ||
const localePath2 = switchLocalePath(options.defaultLocale, options); | ||
if (localePath2) { | ||
link.push({ | ||
hid: "i18n-xd", | ||
rel: "alternate", | ||
href: toAbsoluteUrl(localePath2, baseUrl), | ||
hreflang: "x-default" | ||
}); | ||
} | ||
} | ||
} | ||
function addCanonicalLinks(baseUrl, link, seoAttributesOptions, options) { | ||
const { route } = options; | ||
const currentRoute = localeRoute(__spreadProps(__spreadValues({}, route), { | ||
name: getRouteBaseName(route, options) | ||
}), void 0, options); | ||
if (currentRoute) { | ||
let href = toAbsoluteUrl(currentRoute.path, baseUrl); | ||
const canonicalQueries = !isBoolean(seoAttributesOptions) && seoAttributesOptions.canonicalQueries || []; | ||
if (canonicalQueries.length) { | ||
const currentRouteQueryParams = currentRoute.query; | ||
const params = new URLSearchParams(); | ||
for (const queryParamName of canonicalQueries) { | ||
if (queryParamName in currentRouteQueryParams) { | ||
const queryParamValue = currentRouteQueryParams[queryParamName]; | ||
if (isArray(queryParamValue)) { | ||
queryParamValue.forEach((v) => params.append(queryParamName, v || "")); | ||
} else { | ||
params.append(queryParamName, queryParamValue || ""); | ||
} | ||
} | ||
} | ||
const queryString = params.toString(); | ||
if (queryString) { | ||
href = `${href}?${queryString}`; | ||
} | ||
} | ||
link.push({ | ||
hid: "i18n-can", | ||
rel: "canonical", | ||
href | ||
}); | ||
} | ||
} | ||
function addCurrentOgLocale(currentLocale, currentLocaleIso, meta) { | ||
const hasCurrentLocaleAndIso = currentLocale && currentLocaleIso; | ||
if (!hasCurrentLocaleAndIso) { | ||
return; | ||
} | ||
meta.push({ | ||
hid: "i18n-og", | ||
property: "og:locale", | ||
content: hypenToUnderscore(currentLocaleIso) | ||
}); | ||
} | ||
function addAlternateOgLocales(locales, currentLocaleIso, meta) { | ||
const localesWithoutCurrent = locales.filter((locale) => { | ||
const localeIso = locale.iso; | ||
return localeIso && localeIso !== currentLocaleIso; | ||
}); | ||
if (localesWithoutCurrent.length) { | ||
const alternateLocales = localesWithoutCurrent.map((locale) => ({ | ||
hid: `i18n-og-alt-${locale.iso}`, | ||
property: "og:locale:alternate", | ||
content: hypenToUnderscore(locale.iso) | ||
})); | ||
meta.push(...alternateLocales); | ||
} | ||
} | ||
function hypenToUnderscore(str) { | ||
return (str || "").replace(/-/g, "_"); | ||
} | ||
function toAbsoluteUrl(urlOrPath, baseUrl) { | ||
if (urlOrPath.match(/^https?:\/\//)) { | ||
return urlOrPath; | ||
} | ||
return baseUrl + urlOrPath; | ||
} | ||
function localizeRoutes(routes, { | ||
@@ -114,3 +440,4 @@ defaultLocale = DEFAULT_LOCALE, | ||
includeUprefixedFallback = false, | ||
localeCodes = [] | ||
optionsResolver = void 0, | ||
locales = [] | ||
} = {}) { | ||
@@ -120,3 +447,3 @@ if (strategy === "no_prefix") { | ||
} | ||
const _localeCodes = localeCodes.map((locale) => isString(locale) ? locale : locale.code); | ||
const _localeCodes = locales.map((locale) => isString(locale) ? locale : locale.code); | ||
function makeLocalizedRoutes(route, allowedLocaleCodes, isChild = false, isExtraPageTree = false) { | ||
@@ -126,2 +453,9 @@ if (route.redirect && (!route.component || !route.file)) { | ||
} | ||
let routeOptions = null; | ||
if (optionsResolver != null) { | ||
routeOptions = optionsResolver(route, allowedLocaleCodes); | ||
if (routeOptions == null) { | ||
return [route]; | ||
} | ||
} | ||
const targetLocales = allowedLocaleCodes; | ||
@@ -174,2 +508,67 @@ return targetLocales.reduce((_routes, locale) => { | ||
} | ||
function extendI18n(i18n, { locales = [], localeCodes = [], baseUrl = DEFAULT_BASE_URL } = {}) { | ||
if (!isComposer(i18n.global, i18n.mode)) { | ||
throw new Error("TODO:"); | ||
} | ||
const _locales = ref(locales); | ||
const _localeCodes = ref(localeCodes); | ||
i18n.global.locales = computed(() => _locales.value); | ||
i18n.global.localeCodes = computed(() => _localeCodes.value); | ||
i18n.global.__baseUrl = resolveBaseUrl(baseUrl, {}); | ||
} | ||
function createRouter(i18n, options = {}) { | ||
const { | ||
version, | ||
defaultLocale, | ||
locales, | ||
strategy, | ||
trailingSlash, | ||
routesNameSeparator, | ||
defaultLocaleRouteNameSuffix, | ||
defaultDirection, | ||
baseUrl, | ||
routes, | ||
routeOptionsResolver: optionsResolver | ||
} = asDefaultVueI18nRouterOptions(options); | ||
const normalizedLocaleCodes = getNormalizedLocales(locales); | ||
const localeCodes = normalizedLocaleCodes.map((l) => l.code); | ||
const getLocaleFromRoute = createLocaleFromRouteGetter(localeCodes, routesNameSeparator, defaultLocaleRouteNameSuffix); | ||
extendI18n(i18n, { locales: normalizedLocaleCodes, baseUrl, localeCodes }); | ||
const localizedRoutes = localizeRoutes(routes, { | ||
locales, | ||
defaultLocale, | ||
strategy, | ||
trailingSlash, | ||
routesNameSeparator, | ||
defaultLocaleRouteNameSuffix, | ||
optionsResolver | ||
}); | ||
options.routes = localizedRoutes; | ||
const router = createVueRouter(options, version); | ||
router.__defaultLocale = defaultLocale; | ||
router.__localeCodes = localeCodes; | ||
router.__strategy = strategy; | ||
router.__trailingSlash = trailingSlash; | ||
router.__routesNameSeparator = routesNameSeparator; | ||
router.__defaultLocaleRouteNameSuffix = defaultLocaleRouteNameSuffix; | ||
router.__defaultDirection = defaultDirection; | ||
router.beforeEach((to, from, next) => { | ||
const currentLocale = getLocale(i18n); | ||
const finalLocale = getLocaleFromRoute(to) || currentLocale || defaultLocale || ""; | ||
if (currentLocale !== finalLocale) { | ||
setLocale(i18n, finalLocale); | ||
} | ||
next(); | ||
}); | ||
return router; | ||
} | ||
function createVueRouter(options, version) { | ||
if (isVue3 && version === 4) { | ||
return createRouter$1(options); | ||
} else if (isVue2 && version === 3) { | ||
return new VueRouter3(options); | ||
} else { | ||
throw new Error("TODO:"); | ||
} | ||
} | ||
function getLocalesRegex(localeCodes) { | ||
@@ -184,10 +583,17 @@ return new RegExp(`^/(${localeCodes.join("|")})(?:/|$)`, "i"); | ||
const getLocaleFromRoute = (route) => { | ||
if (route.name) { | ||
const name = isString(route.name) ? route.name : route.name.toString(); | ||
const matches = name.match(regexpName); | ||
if (matches && matches.length > 1) { | ||
return matches[1]; | ||
if (isObject(route)) { | ||
if (route.name) { | ||
const name = isString(route.name) ? route.name : route.name.toString(); | ||
const matches = name.match(regexpName); | ||
if (matches && matches.length > 1) { | ||
return matches[1]; | ||
} | ||
} else if (route.path) { | ||
const matches = route.path.match(regexpPath); | ||
if (matches && matches.length > 1) { | ||
return matches[1]; | ||
} | ||
} | ||
} else if (route.path) { | ||
const matches = route.path.match(regexpPath); | ||
} else if (isString(route)) { | ||
const matches = route.match(regexpPath); | ||
if (matches && matches.length > 1) { | ||
@@ -201,205 +607,17 @@ return matches[1]; | ||
} | ||
function extendRouter({ | ||
router, | ||
i18n, | ||
defaultLocale = DEFAULT_LOCALE, | ||
strategy = DEFAULT_STRATEGY, | ||
trailingSlash = DEFAULT_TRAILING_SLASH, | ||
routesNameSeparator = DEFAULT_ROUTES_NAME_SEPARATOR, | ||
defaultLocaleRouteNameSuffix = DEFAULT_LOCALE_ROUTE_NAME_SUFFIX, | ||
localeCodes = [] | ||
} = {}) { | ||
const normalizedLocaleCodes = getNormalizedLocales(localeCodes); | ||
const getLocaleFromRoute = createLocaleFromRouteGetter(normalizedLocaleCodes.map((l) => l.code), routesNameSeparator, defaultLocaleRouteNameSuffix); | ||
extendI18n(i18n, { localeCodes: normalizedLocaleCodes }); | ||
if (isVue2) { | ||
const _router = router; | ||
const _VueRouter = _router.constructor; | ||
const routes = _router.options.routes || []; | ||
const localizedRoutes = localizeRoutes(routes, { | ||
localeCodes, | ||
defaultLocale, | ||
strategy, | ||
trailingSlash, | ||
routesNameSeparator, | ||
defaultLocaleRouteNameSuffix | ||
}); | ||
console.log("vue2 routes", routes, localizedRoutes); | ||
const newRouter = new _VueRouter({ | ||
mode: "history", | ||
base: _router.options.base, | ||
routes: localizedRoutes | ||
}); | ||
newRouter.__defaultLocale = defaultLocale; | ||
newRouter.__strategy = strategy; | ||
newRouter.__trailingSlash = trailingSlash; | ||
newRouter.__routesNameSeparator = routesNameSeparator; | ||
newRouter.__defaultLocaleRouteNameSuffix = defaultLocaleRouteNameSuffix; | ||
newRouter.beforeEach((to, from, next) => { | ||
console.log("beforeEach", to, from); | ||
const currentLocale = getLocale(i18n); | ||
const finalLocale = getLocaleFromRoute(to) || currentLocale || defaultLocale || ""; | ||
console.log("currentLocale", currentLocale, "finalLocale", finalLocale); | ||
if (currentLocale !== finalLocale) { | ||
setLocale(i18n, finalLocale); | ||
} | ||
next(); | ||
}); | ||
return newRouter; | ||
} else { | ||
const _router = router; | ||
const routes = _router.options.routes || []; | ||
const localizedRoutes = localizeRoutes(routes, { | ||
localeCodes, | ||
defaultLocale, | ||
strategy, | ||
trailingSlash, | ||
routesNameSeparator, | ||
defaultLocaleRouteNameSuffix | ||
}); | ||
console.log("vue3 routes", routes, localizedRoutes, _router); | ||
routes.forEach((r) => _router.removeRoute(r.name)); | ||
localizedRoutes.forEach((route) => _router.addRoute(route)); | ||
_router.__defaultLocale = defaultLocale; | ||
_router.__strategy = strategy; | ||
_router.__trailingSlash = trailingSlash; | ||
_router.__routesNameSeparator = routesNameSeparator; | ||
_router.__defaultLocaleRouteNameSuffix = defaultLocaleRouteNameSuffix; | ||
_router.beforeEach((to, from, next) => { | ||
console.log("beforeEach", to, from); | ||
const currentLocale = getLocale(i18n); | ||
const finalLocale = getLocaleFromRoute(to) || currentLocale || defaultLocale || ""; | ||
console.log("currentLocale", currentLocale, "finalLocale", finalLocale); | ||
if (currentLocale !== finalLocale) { | ||
setLocale(i18n, finalLocale); | ||
} | ||
next(); | ||
}); | ||
return _router; | ||
} | ||
function asDefaultVueI18nRouterOptions(options) { | ||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j; | ||
options.version = (_a = options.version) != null ? _a : 4; | ||
options.defaultLocale = (_b = options.defaultLocale) != null ? _b : DEFAULT_LOCALE; | ||
options.strategy = (_c = options.strategy) != null ? _c : DEFAULT_STRATEGY; | ||
options.trailingSlash = (_d = options.trailingSlash) != null ? _d : DEFAULT_TRAILING_SLASH; | ||
options.routesNameSeparator = (_e = options.routesNameSeparator) != null ? _e : DEFAULT_ROUTES_NAME_SEPARATOR; | ||
options.defaultLocaleRouteNameSuffix = (_f = options.defaultLocaleRouteNameSuffix) != null ? _f : DEFAULT_LOCALE_ROUTE_NAME_SUFFIX; | ||
options.locales = (_g = options.locales) != null ? _g : []; | ||
options.defaultDirection = (_h = options.defaultDirection) != null ? _h : DEFAULT_DETECTION_DIRECTION; | ||
options.baseUrl = (_i = options.baseUrl) != null ? _i : DEFAULT_BASE_URL; | ||
options.routes = (_j = options.routes) != null ? _j : []; | ||
return options; | ||
} | ||
function useI18n() { | ||
return useI18n$1(); | ||
} | ||
function useI18nRouting(options = {}) { | ||
const $i18n = useI18n(); | ||
const $router = useRouter(); | ||
const $route = useRoute(); | ||
const defaultLocaleRouteNameSuffix = options.defaultLocaleRouteNameSuffix || $router.__defaultLocaleRouteNameSuffix; | ||
const defaultLocale = options.defaultLocale || $router.__defaultLocale; | ||
const routesNameSeparator = options.routesNameSeparator || $router.__routesNameSeparator; | ||
const strategy = options.strategy || $router.__strategy; | ||
function getRouteBaseName(givenRoute) { | ||
const route = givenRoute != null ? givenRoute : isRef$1($route) ? $route.value : $route; | ||
if (!route.name) { | ||
return; | ||
} | ||
const name = getRouteName(route.name); | ||
return name.split(routesNameSeparator)[0]; | ||
} | ||
function getLocaleRouteName(routeName, locale) { | ||
let name = getRouteName(routeName) + (strategy === "no_prefix" ? "" : routesNameSeparator + locale); | ||
if (locale === defaultLocale && strategy === "prefix_and_default") { | ||
name += routesNameSeparator + defaultLocaleRouteNameSuffix; | ||
} | ||
return name; | ||
} | ||
function resolveRoute(route, locale) { | ||
const _locale = locale || getLocale($i18n); | ||
let _route = route; | ||
if (isString(route)) { | ||
if (route[0] === "/") { | ||
_route = { path: route }; | ||
} else { | ||
_route = { name: route }; | ||
} | ||
} | ||
let localizedRoute = assign({}, _route); | ||
if (localizedRoute.path && !localizedRoute.name) { | ||
const _resolvedRoute = $router.resolve(localizedRoute); | ||
const resolvedRoute2 = !isVue2 ? _resolvedRoute : _resolvedRoute.route; | ||
const resolvedRouteName = getRouteBaseName(resolvedRoute2); | ||
if (isString(resolvedRouteName)) { | ||
localizedRoute = { | ||
name: getLocaleRouteName(resolvedRouteName, _locale), | ||
params: resolvedRoute2.params, | ||
query: resolvedRoute2.query, | ||
hash: resolvedRoute2.hash | ||
}; | ||
} | ||
} else { | ||
localizedRoute.name = getLocaleRouteName(localizedRoute.name, _locale); | ||
const { params } = localizedRoute; | ||
if (params && params["0"] === void 0 && params.pathMatch) { | ||
params["0"] = params.pathMatch; | ||
} | ||
} | ||
const resolvedRoute = $router.resolve(localizedRoute); | ||
if (isVue2 ? resolvedRoute.route.name : resolvedRoute.name) { | ||
return resolvedRoute; | ||
} | ||
return $router.resolve(route); | ||
} | ||
function localePath(route, locale) { | ||
const localizedRoute = resolveRoute(route, locale); | ||
return localizedRoute == null ? "" : isVue2 ? localizedRoute.route.redirectedFrom || localizedRoute.route.fullPath : localizedRoute.redirectedFrom || localizedRoute.fullPath; | ||
} | ||
function localeRoute(route, locale) { | ||
const resolved = resolveRoute(route, locale); | ||
return resolved == null ? void 0 : isVue2 ? resolved.route : resolved; | ||
} | ||
function localeLocation(route, locale) { | ||
const resolved = resolveRoute(route, locale); | ||
return resolved == null ? void 0 : isVue2 ? resolved.location : resolved.href; | ||
} | ||
function switchLocalePath(locale) { | ||
const name = getRouteBaseName(); | ||
if (!name) { | ||
return ""; | ||
} | ||
const _a = isVue2 && isRef$1($route) ? $route.value : $route, { params } = _a, routeCopy = __objRest(_a, ["params"]); | ||
const langSwitchParams = {}; | ||
const baseRoute = assign({}, routeCopy, { | ||
name, | ||
params: __spreadProps(__spreadValues(__spreadValues({}, params), langSwitchParams), { | ||
0: params.pathMatch | ||
}) | ||
}); | ||
const path = localePath(baseRoute, locale); | ||
console.log("switchLocalePath", $i18n.locale.value, locale, path); | ||
return path; | ||
} | ||
return { | ||
localePath, | ||
localeRoute, | ||
localeLocation, | ||
switchLocalePath | ||
}; | ||
} | ||
function getRouteName(routeName) { | ||
return isString(routeName) ? routeName : isSymbol$1(routeName) ? routeName.toString() : ""; | ||
} | ||
function extendRouting({ | ||
router, | ||
i18n, | ||
defaultLocale = DEFAULT_LOCALE, | ||
trailingSlash = DEFAULT_TRAILING_SLASH, | ||
routesNameSeparator = DEFAULT_ROUTES_NAME_SEPARATOR, | ||
defaultLocaleRouteNameSuffix = DEFAULT_LOCALE_ROUTE_NAME_SUFFIX, | ||
localeCodes = [] | ||
} = {}) { | ||
if (router == null) { | ||
throw new Error("TODO"); | ||
} | ||
return extendRouter({ | ||
router, | ||
i18n, | ||
defaultLocale, | ||
trailingSlash, | ||
routesNameSeparator, | ||
defaultLocaleRouteNameSuffix, | ||
localeCodes | ||
}); | ||
} | ||
const VERSION = ""; | ||
export { VERSION, extendRouting, localizeRoutes, useI18nRouting }; | ||
const VERSION = "0.0.0"; | ||
export { VERSION, createLocaleFromRouteGetter, createRouter, getLocale, getRouteBaseName, localeLocation, localePath, localeRoute, localizeRoutes, setLocale, switchLocalePath, useI18nHead }; |
@@ -1,5 +0,5 @@ | ||
var ue=Object.defineProperty,ie=Object.defineProperties;var fe=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable;var H=(r,s,f)=>s in r?ue(r,s,{enumerable:!0,configurable:!0,writable:!0,value:f}):r[s]=f,v=(r,s)=>{for(var f in s||(s={}))W.call(s,f)&&H(r,f,s[f]);if(x)for(var f of x(s))k.call(s,f)&&H(r,f,s[f]);return r},j=(r,s)=>ie(r,fe(s));var Y=(r,s)=>{var f={};for(var $ in r)W.call(r,$)&&s.indexOf($)<0&&(f[$]=r[$]);if(r!=null&&x)for(var $ of x(r))s.indexOf($)<0&&k.call(r,$)&&(f[$]=r[$]);return f};var VueI18nRouting=function(r,s,f,$){"use strict";/*! | ||
* shared v9.2.0-beta.25 | ||
* (c) 2021 kazuya kawaguchi | ||
var Ve=Object.defineProperty,je=Object.defineProperties;var Me=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var se=Object.prototype.hasOwnProperty,ue=Object.prototype.propertyIsEnumerable;var re=(u,r,_)=>r in u?Ve(u,r,{enumerable:!0,configurable:!0,writable:!0,value:_}):u[r]=_,y=(u,r)=>{for(var _ in r||(r={}))se.call(r,_)&&re(u,_,r[_]);if(x)for(var _ of x(r))ue.call(r,_)&&re(u,_,r[_]);return u},X=(u,r)=>je(u,Me(r));var fe=(u,r)=>{var _={};for(var p in u)se.call(u,p)&&r.indexOf(p)<0&&(_[p]=u[p]);if(u!=null&&x)for(var p of x(u))r.indexOf(p)<0&&ue.call(u,p)&&(_[p]=u[p]);return _};var VueI18nRouting=function(u,r,_,p){"use strict";function ie(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var de=ie(_);/*! | ||
* shared v9.2.0-beta.30 | ||
* (c) 2022 kazuya kawaguchi | ||
* Released under the MIT License. | ||
*/const C=Object.assign,T=e=>typeof e=="string",J=e=>typeof e=="symbol",K=e=>typeof e=="symbol";new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(K));function y(e){return Boolean(e&&e.__v_isRef===!0)}Promise.resolve();function Q(e){e=e||[];const l=[];for(const n of e)T(n)?l.push({code:n}):l.push(n);return l}function O(e,l){return y(e.locale)&&l==="composition"}function G(e){return"global"in e&&"mode"in e}function V(e){return G(e)?O(e.global,e.mode)?e.global.locale.value:e.global.locale:y(e.locale)?e.locale.value:e.locale}function q(e,l){G(e)?O(e.global,e.mode)?e.global.locale.value=l:e.global.locale=l:y(e.locale)&&(e.locale.value=l)}function Z(e,l,n){return e.replace(/\/+$/,"")+(l?"/":"")||(n?"":"/")}function ee(e,{localeCodes:l=[]}={}){if(!O(e.global,e.mode))throw new Error("");const n=s.ref(l);e.global.locales=s.computed(()=>n.value),console.log("... extends i18n done")}const oe={PREFIX:"prefix",PREFIX_EXCEPT_DEFAULT:"prefix_except_default",PREFIX_AND_DEFAULT:"prefix_and_default",NO_PREFIX:"no_prefix"},w="",B=oe.PREFIX_EXCEPT_DEFAULT,z=!1,U="___",N="default";function X(e,{defaultLocale:l=w,strategy:n=B,trailingSlash:_=z,routesNameSeparator:h=U,defaultLocaleRouteNameSuffix:m=N,includeUprefixedFallback:d=!1,localeCodes:I=[]}={}){if(n==="no_prefix")return e;const R=I.map(o=>T(o)?o:o.code);function g(o,E,F=!1,p=!1){return o.redirect&&(!o.component||!o.file)?[o]:E.reduce((c,a)=>{const{name:t}=o;let{path:i}=o;const u=v({},o);t&&(u.name=`${t}${h}${a}`),o.children&&(u.children=o.children.reduce((A,M)=>[...A,...g(M,[a],!0,p)],[]));const S=a===l;if(S&&n==="prefix_and_default")if(F)F&&p&&t&&(u.name+=`${h}${m}`);else{const A=j(v({},u),{path:i});if(t&&(A.name=`${u.name}${h}${m}`),o.children){A.children=[];for(const M of o.children)A.children=A.children.concat(g(M,[a],!0,!0))}c.push(A)}const L=F&&!i.startsWith("/"),P=!L&&!(S&&n==="prefix_except_default");return P&&(i=`/${a}${i}`),i&&(i=Z(i,_,L)),P&&S&&n==="prefix"&&d&&c.push(v({},o)),u.path=i,c.push(u),c},[])}return e.reduce((o,E)=>[...o,...g(E,R||[])],[])}function te(e){return new RegExp(`^/(${e.join("|")})(?:/|$)`,"i")}function ne(e,l,n){const _=`(${e.join("|")})`,h=`(?:${l}${n})?`,m=new RegExp(`${l}${_}${h}$`,"i"),d=te(e);return R=>{if(R.name){const o=(T(R.name)?R.name:R.name.toString()).match(m);if(o&&o.length>1)return o[1]}else if(R.path){const g=R.path.match(d);if(g&&g.length>1)return g[1]}return""}}function ce({router:e,i18n:l,defaultLocale:n=w,strategy:_=B,trailingSlash:h=z,routesNameSeparator:m=U,defaultLocaleRouteNameSuffix:d=N,localeCodes:I=[]}={}){const R=Q(I),g=ne(R.map(o=>o.code),m,d);if(ee(l,{localeCodes:R}),s.isVue2){const o=e,E=o.constructor,F=o.options.routes||[],p=X(F,{localeCodes:I,defaultLocale:n,strategy:_,trailingSlash:h,routesNameSeparator:m,defaultLocaleRouteNameSuffix:d});console.log("vue2 routes",F,p);const b=new E({mode:"history",base:o.options.base,routes:p});return b.__defaultLocale=n,b.__strategy=_,b.__trailingSlash=h,b.__routesNameSeparator=m,b.__defaultLocaleRouteNameSuffix=d,b.beforeEach((c,a,t)=>{console.log("beforeEach",c,a);const i=V(l),u=g(c)||i||n||"";console.log("currentLocale",i,"finalLocale",u),i!==u&&q(l,u),t()}),b}else{const o=e,E=o.options.routes||[],F=X(E,{localeCodes:I,defaultLocale:n,strategy:_,trailingSlash:h,routesNameSeparator:m,defaultLocaleRouteNameSuffix:d});return console.log("vue3 routes",E,F,o),E.forEach(p=>o.removeRoute(p.name)),F.forEach(p=>o.addRoute(p)),o.__defaultLocale=n,o.__strategy=_,o.__trailingSlash=h,o.__routesNameSeparator=m,o.__defaultLocaleRouteNameSuffix=d,o.beforeEach((p,b,c)=>{console.log("beforeEach",p,b);const a=V(l),t=g(p)||a||n||"";console.log("currentLocale",a,"finalLocale",t),a!==t&&q(l,t),c()}),o}}function le(){return $.useI18n()}function ae(e={}){const l=le(),n=f.useRouter(),_=f.useRoute(),h=e.defaultLocaleRouteNameSuffix||n.__defaultLocaleRouteNameSuffix,m=e.defaultLocale||n.__defaultLocale,d=e.routesNameSeparator||n.__routesNameSeparator,I=e.strategy||n.__strategy;function R(c){const a=c!=null?c:s.isRef(_)?_.value:_;return a.name?D(a.name).split(d)[0]:void 0}function g(c,a){let t=D(c)+(I==="no_prefix"?"":d+a);return a===m&&I==="prefix_and_default"&&(t+=d+h),t}function o(c,a){const t=a||V(l);let i=c;T(c)&&(c[0]==="/"?i={path:c}:i={name:c});let u=C({},i);if(u.path&&!u.name){const L=n.resolve(u),P=s.isVue2?L.route:L,A=R(P);T(A)&&(u={name:g(A,t),params:P.params,query:P.query,hash:P.hash})}else{u.name=g(u.name,t);const{params:L}=u;L&&L["0"]===void 0&&L.pathMatch&&(L["0"]=L.pathMatch)}const S=n.resolve(u);return(s.isVue2?S.route.name:S.name)?S:n.resolve(c)}function E(c,a){const t=o(c,a);return t==null?"":s.isVue2?t.route.redirectedFrom||t.route.fullPath:t.redirectedFrom||t.fullPath}function F(c,a){const t=o(c,a);return t==null?void 0:s.isVue2?t.route:t}function p(c,a){const t=o(c,a);return t==null?void 0:s.isVue2?t.location:t.href}function b(c){const a=R();if(!a)return"";const P=s.isVue2&&s.isRef(_)?_.value:_,{params:t}=P,i=Y(P,["params"]),u={},S=C({},i,{name:a,params:j(v(v({},t),u),{0:t.pathMatch})}),L=E(S,c);return console.log("switchLocalePath",l.locale.value,c,L),L}return{localePath:E,localeRoute:F,localeLocation:p,switchLocalePath:b}}function D(e){return T(e)?e:J(e)?e.toString():""}function se({router:e,i18n:l,defaultLocale:n=w,trailingSlash:_=z,routesNameSeparator:h=U,defaultLocaleRouteNameSuffix:m=N,localeCodes:d=[]}={}){if(e==null)throw new Error("TODO");return ce({router:e,i18n:l,defaultLocale:n,trailingSlash:_,routesNameSeparator:h,defaultLocaleRouteNameSuffix:m,localeCodes:d})}const re="";return r.VERSION=re,r.extendRouting=se,r.localizeRoutes=X,r.useI18nRouting=ae,Object.defineProperty(r,"__esModule",{value:!0}),r[Symbol.toStringTag]="Module",r}({},VueDemi,VueRouterComposable,VueI18n); | ||
*/const G=Object.assign,he=Array.isArray,_e=e=>typeof e=="function",P=e=>typeof e=="string",ge=e=>typeof e=="boolean",Le=e=>typeof e=="symbol",Re=e=>e!==null&&typeof e=="object",me=/\/$|\/\?/;function D(e="",t=!1){return t?me.test(e):e.endsWith("/")}function Ee(e="",t=!1){if(!t)return(D(e)?e.slice(0,-1):e)||"/";if(!D(e,!0))return e||"/";const[a,...n]=e.split("?");return(a.slice(0,-1)||"/")+(n.length?`?${n.join("?")}`:"")}function Se(e="",t=!1){if(!t)return e.endsWith("/")?e:e+"/";if(D(e,!0))return e||"/";const[a,...n]=e.split("?");return a+"/"+(n.length?`?${n.join("?")}`:"")}const pe=typeof window!="undefined";function Ae(e,t){typeof console!="undefined"&&(console.warn("[vue-i18n-routing] "+e),t&&console.warn(t.stack))}function B(e){e=e||[];const t=[];for(const a of e)P(a)?t.push({code:a}):t.push(a);return t}function V(e,t){return r.isRef(e.locale)&&t==="composition"}function H(e){return"global"in e&&"mode"in e}function U(e){return H(e)?V(e.global,e.mode)?e.global.locale.value:e.global.locale:e.locale.value}function W(e,t){H(e)?V(e.global,e.mode)?e.global.locale.value=t:e.global.locale=t:r.isRef(e.locale)&&(e.locale.value=t)}function Ie(e,t,a){return e.replace(/\/+$/,"")+(t?"/":"")||(a?"":"/")}function Q(e){return _.isVueRouter4,r.isRef(e)?e.value:e}function Y(e){return P(e)?e:Le(e)?e.toString():"(null)"}function J(e,t,{defaultLocale:a,strategy:n,routesNameSeparator:o,defaultLocaleRouteNameSuffix:l}){let c=Y(e)+(n==="no_prefix"?"":o+t);return t===a&&n==="prefix_and_default"&&(c+=o+l),c}function Te(e,t){return _e(e)?e(t):e}const O={PREFIX:"prefix",PREFIX_EXCEPT_DEFAULT:"prefix_except_default",PREFIX_AND_DEFAULT:"prefix_and_default",NO_PREFIX:"no_prefix"},w="",b=O.PREFIX_EXCEPT_DEFAULT,K=!1,v="___",j="default",Fe="ltr",Z="",Pe=new Set([O.PREFIX_AND_DEFAULT,O.PREFIX_EXCEPT_DEFAULT]);function C(e=_.useRoute(),{router:t=_.useRouter(),routesNameSeparator:a=v}={}){const n=a||t.__routesNameSeparator,o=r.unref(e);return o.name?Y(o.name).split(n)[0]:null}function ee(e,t,a){const n=M(e,t,a);return n==null?"":r.isVue3?n.redirectedFrom||n.fullPath:n.route.redirectedFrom||n.route.fullPath}function te(e,t,a){const n=M(e,t,a);return n==null?void 0:r.isVue3?n:n.route}function Ne(e,t,a){const n=M(e,t,a);return n==null?void 0:r.isVue3?n:n.location}function M(e,t,{router:a=_.useRouter(),i18n:n=p.useI18n(),defaultLocale:o=w,defaultLocaleRouteNameSuffix:l=j,routesNameSeparator:c=v,strategy:h=b,trailingSlash:i=!1}={}){const s=a.__defaultLocaleRouteNameSuffix||l,L=a.__defaultLocale||o,f=a.__routesNameSeparator||c,R=a.__strategy||h,m=t||U(n);let E=e;P(e)&&(E[0]==="/"?E={path:e}:E={name:e});let g=G({},E);if(g.path&&!g.name){const d=a.resolve(g),S=r.isVue3?d:d.route,F=C(S);P(F)?g={name:J(F,m,{defaultLocale:L,strategy:R,routesNameSeparator:f,defaultLocaleRouteNameSuffix:s}),params:S.params,query:S.query,hash:S.hash}:(!(m===o&&Pe.has(R))&&R!==O.NO_PREFIX&&(g.path=`/${m}${g.path}`),g.path=i?Se(g.path,!0):Ee(g.path,!0))}else{g.name=J(g.name,m,{defaultLocale:L,strategy:R,routesNameSeparator:f,defaultLocaleRouteNameSuffix:s});const{params:d}=g;d&&d["0"]===void 0&&d.pathMatch&&(d["0"]=d.pathMatch)}const T=a.resolve(g);return(r.isVue3?T.name:T.route.name)?T:a.resolve(e)}function z(e,t){const a=t&&t.route||_.useRoute(),n=C(a,t);if(!n)return"";const s=!r.isVue3&&r.isRef(a)?a.value:a,{params:o}=s,l=fe(s,["params"]),c={},h=G({},l,{name:n,params:X(y(y({},o),c),{0:o.pathMatch})});return ee(h,e,t)}function ye({addDirAttribute:e=!1,addSeoAttributes:t=!1,strategy:a=b,defaultLocale:n=w,route:o=_.useRoute(),router:l=_.useRouter(),i18n:c=p.useI18n()}={}){const h=n||l.__defaultLocale,i=a||l.__strategy,s=r.ref({htmlAttrs:{},link:[],meta:[]});function L(){s.value={htmlAttrs:{},link:[],meta:[]}}function f(R){if(c.locales==null||c.__baseUrl==null)return;const m=U(c),E=B(c.locales.value).find(d=>d.code===m)||{code:m},g=E.iso,T=E.dir||l.__defaultDirection;if(e&&(s.value.htmlAttrs.dir=T),t&&m&&c.locales){g&&(s.value.htmlAttrs.lang=g);const d=c.locales.value;$e(d,c.__baseUrl,s.value.link,{defaultLocale:h,strategy:i,route:o,router:l,i18n:c}),Oe(c.__baseUrl,s.value.link,t,{route:R,router:l,i18n:c}),Ue(E,g,s.value.meta),we(d,g,s.value.meta)}}return pe?r.watchEffect(()=>{L(),f(Q(l.currentRoute))}):f(Q(l.currentRoute)),s}function $e(e,t,a,n){if(n.strategy===O.NO_PREFIX)return;const o=new Map;for(const l of e){const c=l.iso;if(!c){Ae("Locale ISO code is required to generate alternate link");continue}const[h,i]=c.split("-");h&&i&&(l.isCatchallLocale||!o.has(h))&&o.set(h,l),o.set(c,l)}for(const[l,c]of o.entries()){const h=z(c.code,n);h&&a.push({hid:`i18n-alt-${l}`,rel:"alternate",href:k(h,t),hreflang:l})}if(n.defaultLocale){const l=z(n.defaultLocale,n);l&&a.push({hid:"i18n-xd",rel:"alternate",href:k(l,t),hreflang:"x-default"})}}function Oe(e,t,a,n){const{route:o}=n,l=te(X(y({},o),{name:C(o,n)}),void 0,n);if(l){let c=k(l.path,e);const h=!ge(a)&&a.canonicalQueries||[];if(h.length){const i=l.query,s=new URLSearchParams;for(const f of h)if(f in i){const R=i[f];he(R)?R.forEach(m=>s.append(f,m||"")):s.append(f,R||"")}const L=s.toString();L&&(c=`${c}?${L}`)}t.push({hid:"i18n-can",rel:"canonical",href:c})}}function Ue(e,t,a){!(e&&t)||a.push({hid:"i18n-og",property:"og:locale",content:ae(t)})}function we(e,t,a){const n=e.filter(o=>{const l=o.iso;return l&&l!==t});if(n.length){const o=n.map(l=>({hid:`i18n-og-alt-${l.iso}`,property:"og:locale:alternate",content:ae(l.iso)}));a.push(...o)}}function ae(e){return(e||"").replace(/-/g,"_")}function k(e,t){return e.match(/^https?:\/\//)?e:t+e}function ne(e,{defaultLocale:t=w,strategy:a=b,trailingSlash:n=K,routesNameSeparator:o=v,defaultLocaleRouteNameSuffix:l=j,includeUprefixedFallback:c=!1,optionsResolver:h=void 0,locales:i=[]}={}){if(a==="no_prefix")return e;const s=i.map(f=>P(f)?f:f.code);function L(f,R,m=!1,E=!1){if(f.redirect&&(!f.component||!f.file))return[f];let g=null;return h!=null&&(g=h(f,R),g==null)?[f]:R.reduce((d,S)=>{const{name:F}=f;let{path:A}=f;const I=y({},f);F&&(I.name=`${F}${o}${S}`),f.children&&(I.children=f.children.reduce((N,q)=>[...N,...L(q,[S],!0,E)],[]));const $=S===t;if($&&a==="prefix_and_default")if(m)m&&E&&F&&(I.name+=`${o}${l}`);else{const N=X(y({},I),{path:A});if(F&&(N.name=`${I.name}${o}${l}`),f.children){N.children=[];for(const q of f.children)N.children=N.children.concat(L(q,[S],!0,!0))}d.push(N)}const oe=m&&!A.startsWith("/"),ce=!oe&&!($&&a==="prefix_except_default");return ce&&(A=`/${S}${A}`),A&&(A=Ie(A,n,oe)),ce&&$&&a==="prefix"&&c&&d.push(y({},f)),I.path=A,d.push(I),d},[])}return e.reduce((f,R)=>[...f,...L(R,s||[])],[])}function be(e,{locales:t=[],localeCodes:a=[],baseUrl:n=Z}={}){if(!V(e.global,e.mode))throw new Error("TODO:");const o=r.ref(t),l=r.ref(a);e.global.locales=r.computed(()=>o.value),e.global.localeCodes=r.computed(()=>l.value),e.global.__baseUrl=Te(n,{})}function ve(e,t={}){const{version:a,defaultLocale:n,locales:o,strategy:l,trailingSlash:c,routesNameSeparator:h,defaultLocaleRouteNameSuffix:i,defaultDirection:s,baseUrl:L,routes:f,routeOptionsResolver:R}=Xe(t),m=B(o),E=m.map(S=>S.code),g=le(E,h,i);be(e,{locales:m,baseUrl:L,localeCodes:E});const T=ne(f,{locales:o,defaultLocale:n,strategy:l,trailingSlash:c,routesNameSeparator:h,defaultLocaleRouteNameSuffix:i,optionsResolver:R});t.routes=T;const d=Ce(t,a);return d.__defaultLocale=n,d.__localeCodes=E,d.__strategy=l,d.__trailingSlash=c,d.__routesNameSeparator=h,d.__defaultLocaleRouteNameSuffix=i,d.__defaultDirection=s,d.beforeEach((S,F,A)=>{const I=U(e),$=g(S)||I||n||"";I!==$&&W(e,$),A()}),d}function Ce(e,t){if(r.isVue3&&t===4)return _.createRouter(e);if(r.isVue2&&t===3)return new de.default(e);throw new Error("TODO:")}function xe(e){return new RegExp(`^/(${e.join("|")})(?:/|$)`,"i")}function le(e,t,a){const n=`(${e.join("|")})`,o=`(?:${t}${a})?`,l=new RegExp(`${t}${n}${o}$`,"i"),c=xe(e);return i=>{if(Re(i)){if(i.name){const L=(P(i.name)?i.name:i.name.toString()).match(l);if(L&&L.length>1)return L[1]}else if(i.path){const s=i.path.match(c);if(s&&s.length>1)return s[1]}}else if(P(i)){const s=i.match(c);if(s&&s.length>1)return s[1]}return""}}function Xe(e){var t,a,n,o,l,c,h,i,s,L;return e.version=(t=e.version)!=null?t:4,e.defaultLocale=(a=e.defaultLocale)!=null?a:w,e.strategy=(n=e.strategy)!=null?n:b,e.trailingSlash=(o=e.trailingSlash)!=null?o:K,e.routesNameSeparator=(l=e.routesNameSeparator)!=null?l:v,e.defaultLocaleRouteNameSuffix=(c=e.defaultLocaleRouteNameSuffix)!=null?c:j,e.locales=(h=e.locales)!=null?h:[],e.defaultDirection=(i=e.defaultDirection)!=null?i:Fe,e.baseUrl=(s=e.baseUrl)!=null?s:Z,e.routes=(L=e.routes)!=null?L:[],e}const De="0.0.0";return u.VERSION=De,u.createLocaleFromRouteGetter=le,u.createRouter=ve,u.getLocale=U,u.getRouteBaseName=C,u.localeLocation=Ne,u.localePath=ee,u.localeRoute=te,u.localizeRoutes=ne,u.setLocale=W,u.switchLocalePath=z,u.useI18nHead=ye,Object.defineProperty(u,"__esModule",{value:!0}),u[Symbol.toStringTag]="Module",u}({},VueDemi,VueRouter,VueI18n); |
{ | ||
"name": "vue-i18n-routing", | ||
"description": "The i18n routing with using vue-i18n", | ||
"version": "0.0.0-b5558e5", | ||
"version": "0.0.0-ba58b59", | ||
"dependencies": { | ||
"@intlify/shared": "beta", | ||
"@intlify/vue-router-composable": "0.0.0-b5558e5", | ||
"vue-demi": "*" | ||
"@intlify/vue-i18n-bridge": "^0.3.5", | ||
"@intlify/vue-router-bridge": "^0.3.5", | ||
"ufo": "^0.7.9", | ||
"vue-demi": "^0.12.1" | ||
}, | ||
"devDependencies": { | ||
"@microsoft/api-extractor": "^7.18.20", | ||
"@vue/test-utils": "^1.3.0", | ||
"api-docs-gen": "^0.4.0", | ||
"rimraf": "^3.0.2", | ||
"vite": "^2.7.4", | ||
"typescript": "^4.5.4", | ||
"vite": "latest", | ||
"vite-plugin-dts": "^0.9.6", | ||
"vitest": "^0.2.8", | ||
"vue": "^3.2.23", | ||
"vue-i18n": "npm:vue-i18n@next", | ||
"vue-i18n-bridge": "beta", | ||
"vue-i18n-legacy": "npm:vue-i18n@latest", | ||
"vue-i18n-legacy": "npm:vue-i18n@8", | ||
"vue-router": "^4.0.12", | ||
"vue-router3": "npm:vue-router@latest", | ||
"vue-router3": "npm:vue-router@3", | ||
"vue-template-compiler": "^2.6.14", | ||
"vue2": "npm:vue@2" | ||
@@ -27,2 +33,4 @@ }, | ||
"vue": "^2.6.14 || ^3.2.0", | ||
"vue-i18n": "^8.26.1 || ^9.2.0-beta.30", | ||
"vue-i18n-bridge": "^9.2.0-beta.30", | ||
"vue-router": "^3.5.3 || ^4.0.0" | ||
@@ -58,4 +66,7 @@ }, | ||
}, | ||
"require": "./dist/vue-i18n-routing.cjs.js" | ||
} | ||
"require": "./dist/vue-i18n-routing.cjs.js", | ||
"types": "./dist/vue-i18n-routing.d.ts" | ||
}, | ||
"./dist/*": "./dist/*", | ||
"./package.json": "./package.json" | ||
}, | ||
@@ -87,4 +98,7 @@ "license": "MIT", | ||
"typecheck": "tsc -p . --noEmit", | ||
"test": "vitest run", | ||
"test:watch": "vitest", | ||
"test:cover": "vitest --coverage", | ||
"build:docs": "api-docs-gen ./temp/vue-i18n-routing.api.json -c ./docsgen.config.js -o ./ -g noprefix" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Wildcard dependency
QualityPackage has a dependency with a floating version range. This can cause issues if the dependency publishes a new major version.
Found 1 instance in 1 package
60039
69.44%1063
89.48%0
-100%10
66.67%16
33.33%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
Updated