UNPKG

webpack-localize-assets-plugin

Version:
2 lines (1 loc) 8.17 kB
"use strict";var D=require("path"),J=require("astring"),K=require("webpack/lib/WebpackError.js"),Ee=require("module"),T=require("webpack"),G=require("assert"),V=require("acorn"),B=require("crypto"),O=require("webpack-sources"),Z=require("magic-string");function v(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var Q=v(D),w=v(K),X=v(T),N=v(G),Y=v(B),ee=v(Z),d="webpack-localize-assets-plugin";const te=Object.prototype.hasOwnProperty;function z(e,t){return te.call(e,t)}function ne(e){if(!e)throw new Error("Options are required");if(!e.locales)throw new Error("Locales are required");if(Object.keys(e.locales).length===0)throw new Error("locales must contain at least one locale");if(e.sourceMapForLocales&&e.sourceMapForLocales.some(t=>!z(e.locales,t)))throw new Error("sourceMapForLocales must contain valid locales");if(e.localizeCompiler){if(Object.keys(e.localizeCompiler).length===0)throw new Error("localizeCompiler can't be an empty object");if(e.functionName)throw new Error("Can't use localizeCompiler and also specify functionName")}}const oe=(e,t)=>{const o=e.readFileSync(t).toString();return JSON.parse(o)};function se({inputFileSystem:e},t){const o={},n=new Set;for(const s in t){if(!z(t,s))continue;const r=t[s];if(typeof r=="string"){const c=Q.default.resolve(r);o[s]=oe(e,c),n.add(c)}else o[s]=r}return{names:Object.keys(o),data:o,paths:n}}const A=e=>J.generate(e,{indent:"",lineEnd:""});function j(e,t,o){const n=t.callNode.arguments.map(A),s=t.callNode.callee.name;return e[s].call(t,n,o)}var q=require;const re=e=>{const[t]=e.version?e.version.split("."):[];return t==="5"},M=e=>"processAssets"in e.hooks,{toConstantDependency:ae}=re(X.default)?q("webpack/lib/javascript/JavascriptParserHelpers"):q("webpack/lib/ParserHelpers"),ce=(e,t,o)=>{if(M(e)){for(const n of e.chunks){if(n.files.has(t))for(const s of o)n.files.add(s);if(n.auxiliaryFiles.has(t))for(const s of o)n.auxiliaryFiles.add(s)}e.deleteAsset(t)}else{delete e.assets[t];for(const n of e.chunks){const s=n.files.indexOf(t);s>-1&&n.files.splice(s,1,...o)}}},L=(e,t)=>{e.find(n=>n.message===t.message)||e.push(t)},C=(e,t)=>{"addWarning"in e?e.addWarning(t):L(e.warnings,t)},le=(e,t)=>{"addError"in e?e.addError(t):L(e.errors,t)},ie=(e,t,o)=>{for(const n of t){const s=r=>{r.hooks.call.for(n).tap(d,c=>o(n,r,c))};e.hooks.parser.for("javascript/auto").tap(d,s),e.hooks.parser.for("javascript/dynamic").tap(d,s),e.hooks.parser.for("javascript/esm").tap(d,s)}},F=(e,t)=>{M(e)?e.hooks.assetPath.tap(d,t):e.mainTemplate.hooks.assetPath.tap(d,t)},ue=(e,t)=>{if(M(e)){const o=e.constructor;e.hooks.processAssets.tap({name:d,stage:o.PROCESS_ASSETS_STAGE_SUMMARIZE-1,additionalAssets:!0},t)}else e.hooks.optimizeAssets.tap(d,t)};function fe(e,t){const o=new Set;return(n,s,r)=>{if(o.has(n))return;o.add(n);const c=e.names.filter(f=>!z(e.data[f],n));if(!(c.length>0))return;const i=r.loc.start,u=new w.default(`[${d}] Missing localization for key "${n}" used in ${s.resource}:${i.line}:${i.column} from locales: ${c.join(", ")}`);if(u){if(t)throw u;C(s,u)}}}const I=(e,t,o)=>{ie(e,t,(n,s,r)=>{const{module:c}=s.state,a=r.arguments[0];if(!(r.arguments.length>0&&a.type==="Literal"&&typeof a.value=="string")){const u=r.loc.start;C(c,new w.default(`[${d}] Ignoring confusing usage of localization function "${n}" in ${c.resource}:${u.line}:${u.column}`));return}const i=o({key:a.value,callNode:r,module:c});if(i)return ae(s,i)(r),!0})},H=(e,t,o)=>{const n=fe(e,t.throwOnMissing);return s=>{n(s.key,s.module,s.callNode);for(const r of e.paths)s.module.buildInfo.fileDependencies.add(r);return o(s)}},b=(e,t)=>{const o=[];let n=e.indexOf(t);for(;n>-1;)o.push(n),n=e.indexOf(t,n+1);return o},$=(e,t,o)=>{const n=b(e,t);for(let s=n.length-1;s>=0;s-=1){const r=n[s];e=e.slice(0,r)+o+e.slice(r+t.length)}return e},x=(e,t,o)=>{const{filename:n,chunkFilename:s}=e.outputOptions;return o&&(typeof n=="string"&&N.default(n.includes("[locale]"),"output.filename must include [locale]"),typeof s=="string"&&N.default(s.includes("[locale]"),"output.chunkFilename must include [locale]")),(r,c)=>(typeof r=="function"&&(r=r(c)),r=$(r,"[locale]",t),r)},de=(e,t,o,n,s,r,c)=>{const[a]=n.names;I(t,r,H(n,o,({key:i,callNode:u,module:f})=>(c==null||c.delete(i),j(s,{callNode:u,resolveKey:(l=i)=>n.data[a][l],emitWarning:l=>C(f,new w.default(l)),emitError:l=>le(f,new w.default(l))},a)))),F(e,x(e,a))},E=e=>Y.default.createHash("sha256").update(e).digest("hex"),k=`_placeholder${E(d).slice(0,8)}`,he=(e,{module:t,key:o,callNode:n})=>{t.buildInfo.localized||(t.buildInfo.localized={}),t.buildInfo.localized[o]||(t.buildInfo.localized[o]=e.names.map(r=>e.data[r][o]));const s=A(n);return`${k}(${s},${k})`},pe=e=>{const t=b(e,k),o=[];for(;t.length>0;){const n=t.shift(),s=t.shift(),r=e.slice(n+k.length+1,s-1);o.push({code:r,location:{start:n,end:s+k.length+1}})}return o},ge=e=>e.replace(/\\(.)/g,"$1"),me=e=>JSON.stringify(e).slice(1,-1),we=e=>V.parseExpressionAt(e,0,{ecmaVersion:"latest"}),ve=(e,t,o,n,s)=>{const{devtool:r}=t.options,c=r&&r.includes("eval"),a=pe(e);return(i,{locale:u})=>{const f=n.data[u];for(const l of a){let{code:g}=l;c&&(g=ge(g));const m=we(g),S=m.arguments[0].value;let p=j(o,{callNode:m,resolveKey:(h=S)=>f[h],emitWarning:h=>{L(t.warnings,new w.default(h))},emitError:h=>{L(t.errors,new w.default(h))}},u);c&&(p=me(p)),i.overwrite(l.location.start,l.location.end,p),s==null||s.delete(S)}}},y=`[locale:${E("locale-placeholder").slice(0,8)}]`,W=(e,t)=>$(e,y,t),ze=e=>{const t=b(e,y);return(o,{locale:n})=>{for(const s of t)o.overwrite(s,s+y.length,n)}},ke=e=>e.flatMap(t=>{const{contenthash:o}=t.info;return o!=null?o:[]}),ye=(e,t)=>{const o=ke(e),n=new Map;for(const s of o)for(const r of t.names)n.set(s+r,E(s+r).slice(0,s.length));return{insertLocalizedContentHash(s,r,c){const{contenthash:a}=r;if(a){const i=u=>{var f;const l=(f=n.get(u+c))!=null?f:u;return s=$(s,u,l),l};r.contenthash=Array.isArray(a)?a.map(i):i(a)}return s},getHashLocations(s){const r=o.map(c=>[c,b(s,c)]);return(c,{locale:a})=>{for(const[i,u]of r){const f=n.get(i+a);for(const l of u)c.overwrite(l,l+i.length,f)}}}}},Se=(e,t,o)=>{const n=new ee.default(e.code);for(const r of t)r(n,e);const s=n.toString();if(o){const r=n.generateMap({source:e.name,includeContent:!0});return new O.SourceMapSource(s,e.name,r,e.code,o,!0)}return new O.RawSource(s)},Le=/\.js$/,be=/\.js\.map$/,Ae=(e,t,o,n,s)=>{const r=e.getAssets().filter(a=>a.name.includes(y)),c=ye(r,t);for(const a of r){const{source:i,map:u}=a.source.sourceAndMap(),f=[];if(Le.test(a.name)){const l=i.toString(),g=ve(l,e,s,t,n),m=ze(l),S=c.getHashLocations(l);for(const p of t.names){let h=W(a.name,p);const _={...a.info,locale:p};h=c.insertLocalizedContentHash(h,_,p),f.push(h),e.emitAsset(h,Se({name:h,code:l,locale:p},[g,m,S],u),_)}}else{const l=be.test(a.name)&&o?o:t.names;for(const g of l){const m=W(a.name,g);f.push(m),e.emitAsset(m,a.source,a.info)}}ce(e,a.name,f)}},Me=(e,t,o,n,s,r,c)=>{I(t,r,H(n,o,a=>he(n,a))),F(e,x(e,y,!0)),ue(e,()=>Ae(e,n,o.sourceMapForLocales||n.names,c,s)),e.hooks.chunkHash.tap(d,(a,i)=>{const f=(e.chunkGraph?e.chunkGraph.getChunkModules(a):a.getModules()).map(l=>l.buildInfo.localized).filter(Boolean);f.length>0&&i.update(JSON.stringify(f))})};function Ce(e){const t=new Set;for(const o in e)if(z(e,o))for(const n in e[o])z(e[o],n)&&t.add(n);return t}const $e=(e,t)=>{const o=Ce(t);return e.hooks.afterSeal.tap(d,()=>{if(o.size!==0)for(const n of o){const s=new w.default(`[${d}] Unused string key "${n}"`);e.warnings.push(s)}}),o},P="__";function R(e){const[t]=e;if(e.length>1){let n=A(this.callNode);return n.length>80&&(n=`${n.slice(0,80)}\u2026`),this.emitWarning(`[${d}] Ignoring confusing usage of localization function: ${n})`),t}const o=this.resolveKey();return o?JSON.stringify(o):t}class U{constructor(t){var o,n;ne(t),this.options=t,this.localizeCompiler=(n=t.localizeCompiler)!=null?n:{[(o=t.functionName)!=null?o:P]:R}}apply(t){const{options:o,localizeCompiler:n}=this;t.hooks.thisCompilation.tap(d,(s,{normalModuleFactory:r})=>{const c=se(t,o.locales),a=Object.keys(n),i=o.warnOnUnusedString?$e(s,c.data):void 0;(c.names.length===1?de:Me)(s,r,o,c,n,a,i)})}}U.defaultLocalizeCompiler={[P]:R},module.exports=U;