@@ -5,6 +5,7 @@ const path = require('path');
55const fs = require ( 'fs' ) ;
66const rimraf = require ( 'rimraf' ) ;
77const chokidar = require ( 'chokidar' ) ;
8+ const _ = require ( 'lodash' )
89
910exports . coalesceLocales = paths => {
1011 console . time ( 'per-locale coalesce' ) ;
@@ -22,30 +23,69 @@ exports.coalesceLocales = paths => {
2223 directory : paths . appPath ,
2324 tsConfig : index . includes ( '.tsx' ) && `${ paths . appPath } /tsconfig.json` ,
2425 noTypeDefinitions : true , // optional
26+ detective : {
27+ es6 : {
28+ mixedImports : true
29+ }
30+ } ,
2531 nodeModulesConfig : {
2632 entry : 'module' ,
2733 } ,
28- filter : p => p . includes ( 'src' ) || p . includes ( '@fs' ) ,
34+ filter : p => p . includes ( paths . appSrc ) || p . includes ( '@fs' ) ,
2935 } ) ;
3036 const realList = list . filter ( p => p . includes ( 'locales/index.js' ) ) ;
3137 const allLocales = { } ;
38+ const collisionReport = {
39+ collisions : [ ] ,
40+ potentialCollisions : [ ] ,
41+ }
42+ const statsReport = {
43+ namespaces : new Set ( ) ,
44+ locales : new Set ( ) ,
45+ keys : new Set ( ) ,
46+ }
3247 realList . forEach ( p => {
3348 const dir = path . dirname ( p ) ;
34- const locales = fs . readdirSync ( dir ) . filter ( d => ! d . includes ( '.' ) ) ;
49+ // console.log('dir', dir)
50+ const locales = fs . readdirSync ( dir ) . filter ( d => ! d . includes ( '.' ) && d !== 'dist' ) ;
3551 locales . forEach ( locale => {
52+ statsReport . locales . add ( locale )
3653 const namespaces = fs
3754 . readdirSync ( path . join ( dir , locale ) )
3855 . map ( d => d . split ( '.' ) [ 0 ] ) ;
3956 allLocales [ locale ] = allLocales [ locale ] || { } ;
4057 namespaces . forEach ( ns => {
58+ statsReport . namespaces . add ( ns )
4159 const strings = jsonfile . readFileSync (
4260 `${ path . join ( dir , locale , ns ) } .json`
4361 ) ;
4462 allLocales [ locale ] [ ns ] = allLocales [ locale ] [ ns ] || { } ;
63+ // console.log('strings', Object.keys(strings))
64+ // console.log('allLocales', Object.keys(allLocales[locale][ns]||{}))
65+ Object . keys ( strings ) . map ( key => statsReport . keys . add ( key ) )
66+ const collisions = _ . intersection ( Object . keys ( allLocales [ locale ] [ ns ] ) , Object . keys ( strings ) )
67+ if ( collisions && collisions . length > 0 ) {
68+ collisions . forEach ( collisionKey => {
69+ if ( allLocales [ locale ] [ ns ] [ collisionKey ] !== strings [ collisionKey ] ) {
70+ collisionReport . collisions . push ( { key :collisionKey , locale, ns, oldValue : allLocales [ locale ] [ ns ] [ collisionKey ] , newValue : strings [ collisionKey ] } )
71+ // console.error(`COLLISION: key=${collisionKey} locale=${locale} namespace=${ns} "${strings[collisionKey]}" overrides "${allLocales[locale][ns][collisionKey]}"`)
72+ } else {
73+ collisionReport . potentialCollisions . push ( { key :collisionKey , locale, ns, oldValue : allLocales [ locale ] [ ns ] [ collisionKey ] , newValue : strings [ collisionKey ] } )
74+ }
75+ } )
76+ }
4577 allLocales [ locale ] [ ns ] = { ...allLocales [ locale ] [ ns ] , ...strings } ;
4678 } ) ;
4779 } ) ;
4880 } ) ;
81+ if ( collisionReport . potentialCollisions . length > 0 ) {
82+ console . warn ( `WARNING: The following ${ collisionReport . potentialCollisions . length } potential collisions were detected when coalescing locales, the values were the same, but could diverge in the future:` )
83+ collisionReport . potentialCollisions . forEach ( ( { key, locale, ns, newValue } ) => console . warn ( `\tkey=${ key } namespace=${ ns } locale=${ locale } value="${ newValue } "` ) )
84+ }
85+ if ( collisionReport . collisions . length > 0 ) {
86+ console . error ( `ERROR: The following ${ collisionReport . collisions . length } collisions were detected when coalescing locales:` , collisionReport . collisions )
87+ collisionReport . collisions . forEach ( ( { key, locale, ns, newValue, oldValue } ) => console . error ( `\tkey=${ key } namespace=${ ns } locale=${ locale } newValue="${ newValue } " oldValue="${ oldValue } "` ) )
88+ }
4989 Object . keys ( allLocales ) . forEach ( locale => {
5090 fs . mkdirSync ( path . join ( builtLocalesDir , locale ) ) ;
5191 Object . keys ( allLocales [ locale ] ) . forEach ( namespace => {
@@ -57,6 +97,14 @@ exports.coalesceLocales = paths => {
5797 } ) ;
5898
5999 console . timeEnd ( 'per-locale coalesce' ) ;
100+
101+ console . log ( `Locales Stats` , {
102+ namespaces : statsReport . namespaces ,
103+ locales : statsReport . locales ,
104+ keys : statsReport . keys . size ,
105+ } )
106+ // console.dir(allLocales)
107+ // throw new Error('boom')
60108} ;
61109
62110exports . watchCoalesce = paths => {
0 commit comments