packages/schema-diff/docs/js/search/search_index.js
var COMPODOC_SEARCH_INDEX = {
"index": {"version":"2.3.9","fields":["title","body"],"fieldVectors":[["title/interfaces/BranchState.html",[0,0.565,1,0.744]],["body/interfaces/BranchState.html",[0,0.316,1,0.808,2,1.196,3,0.687,4,0.687,5,0.518,6,0.23,7,0.23,8,0.654,9,1.362,10,1.362,11,1.744,12,0.995,13,0.102,14,1.512,15,0.687,16,0.687,17,1.334,18,1.609,19,0.687,20,0.687,21,0.687,22,0.687,23,1.856,24,0.416,25,0.843,26,0.537,27,0.416,28,0.537,29,0.808,30,0.537,31,0.808,32,0.537,33,0.537,34,1.056,35,1.307,36,0.687,37,0.808,38,0.843,39,1.424,40,1.362,41,0.843,42,1.041,43,0.843,44,1.67,45,1.801,46,0.537,47,0.537,48,0.537,49,0.537,50,1.744,51,1.041,52,0.687,53,0.687,54,0.687,55,0.687,56,0.416,57,0.537,58,1.18,59,0.537,60,1.686,61,0.843,62,0.843,63,0.537,64,0.843,65,0.537,66,0.843,67,0.537,68,0.843,69,0.537,70,0.537,71,0.537,72,1.041,73,0.537,74,0.843,75,0.654,76,1.283,77,0.995,78,1.041,79,1.041,80,1.041,81,0.843,82,0.843,83,0.537,84,0.537,85,0.537,86,0.537,87,0.537,88,0.537,89,0.537,90,1.283,91,0.537,92,1.18,93,0.995,94,0.843,95,1.041,96,1.041,97,0.537,98,0.537,99,0.537,100,0.537,101,0.537,102,0.537,103,0.843,104,0.537,105,0.537,106,0.537,107,1.517,108,1.041,109,1.041,110,0.416,111,1.041,112,0.416,113,1.18,114,0.537,115,0.537,116,0.537,117,0.537,118,0.537,119,0.537,120,1.18,121,0.537,122,0.537,123,0.537,124,0.537,125,0.537,126,0.843,127,0.537,128,0.537,129,0.61,130,0.416,131,1.283,132,1.553,133,0.537,134,0.537,135,0.537,136,0.537,137,0.687,138,0.687,139,0.416,140,0.537,141,0.537,142,1.18,143,0.537,144,0.537,145,0.537,146,0.537,147,0.537,148,0.537,149,0.537,150,0.537,151,0.537,152,1.041,153,1.553,154,0.496,155,1.643,156,0.687,157,1.334,158,1.08,159,1.08,160,1.08,161,1.08,162,1.08,163,1.08,164,0.687,165,0.687,166,0.687,167,1.334,168,1.08,169,0.687,170,0.687,171,1.643,172,0.687,173,1.08,174,0.687,175,0.687,176,1.08,177,1.08,178,0.687,179,0.687,180,0.687,181,1.08,182,0.687,183,1.08,184,0.687,185,0.687,186,0.687,187,0.687,188,0.687,189,0.687,190,0.687,191,0.687,192,0.687,193,0.687,194,0.687,195,0.687,196,0.687,197,1.08,198,1.512,199,0.687,200,0.687,201,1.08,202,0.687,203,0.687,204,0.687,205,0.687,206,1.08,207,0.687,208,0.687,209,0.687,210,0.416,211,0.537,212,0.537,213,0.537,214,0.537,215,0.537,216,1.475,217,1.517,218,0.654,219,1.041,220,0.537,221,0.537,222,1.283,223,0.537,224,0.537,225,0.416,226,0.537,227,0.537,228,0.843,229,0.843,230,0.843,231,0.687,232,0.687,233,0.687,234,0.687,235,0.687,236,0.416,237,0.843,238,0.537,239,0.537,240,0.537,241,0.537,242,0.843,243,0.843,244,0.537,245,0.843,246,0.843,247,0.843,248,0.537,249,0.687,250,0.687,251,0.687,252,0.687,253,0.687,254,0.687,255,0.687,256,0.687,257,0.687,258,0.687,259,0.687,260,1.744,261,0.687,262,0.687,263,0.687,264,0.687,265,1.08,266,0.687,267,0.687,268,0.687,269,0.687,270,0.687,271,0.687,272,0.687,273,1.08,274,0.687,275,0.687,276,0.687,277,0.687,278,0.687,279,0.687,280,0.687,281,0.687,282,0.687,283,1.643,284,1.643,285,1.334,286,1.08,287,0.687,288,0.687,289,0.687,290,1.643,291,1.08,292,0.687,293,0.687,294,0.687,295,0.687,296,1.512,297,0.537,298,0.687,299,0.687,300,0.687,301,0.687,302,1.512,303,1.08,304,0.687,305,0.687,306,0.687,307,1.334,308,1.334,309,1.334,310,0.687,311,1.334,312,1.08,313,1.334,314,1.08,315,0.687,316,1.08,317,0.687,318,0.687,319,0.687,320,1.08,321,1.08,322,1.08,323,1.08,324,1.08,325,0.687,326,0.687,327,0.687,328,0.687,329,1.08,330,1.08,331,0.687,332,0.687,333,1.08,334,0.687,335,0.687,336,0.687,337,1.08,338,0.687,339,0.044,340,0.044]],["title/classes/Directory.html",[129,0.411,154,0.565]],["body/classes/Directory.html",[0,0.288,1,0.608,3,0.628,4,0.628,5,0.515,6,0.21,7,0.21,8,0.608,9,0.981,10,0.981,11,1.005,12,1.255,13,0.101,14,1.437,15,0.628,16,0.628,17,1.257,18,1.618,19,0.628,20,0.628,21,0.628,22,0.628,23,1.843,24,0.38,25,0.784,26,0.49,27,0.38,28,0.49,29,0.761,30,0.49,31,0.761,32,0.49,33,0.49,34,1.015,35,1.283,36,0.628,37,0.761,38,0.784,39,1.375,40,1.309,41,0.784,42,1.121,43,1.121,44,1.637,45,1.832,46,0.49,47,0.49,48,0.49,49,0.49,50,1.677,51,0.981,52,0.628,53,0.628,54,0.628,55,0.628,56,0.38,57,0.49,58,1.121,59,0.49,60,1.655,61,0.784,62,0.784,63,0.49,64,0.784,65,0.49,66,0.784,67,0.784,68,0.784,69,0.49,70,0.49,71,0.49,72,0.981,73,0.49,74,0.784,75,0.608,76,1.309,77,0.951,78,0.981,79,0.981,80,0.981,81,0.784,82,0.784,83,0.49,84,0.49,85,0.49,86,0.49,87,0.49,88,0.49,89,0.49,90,1.227,91,0.49,92,1.121,93,0.951,94,0.784,95,0.981,96,0.981,97,0.49,98,0.49,99,0.49,100,0.49,101,0.49,102,0.49,103,0.784,104,0.49,105,0.49,106,0.49,107,1.473,108,0.981,109,0.981,110,0.38,111,0.981,112,0.38,113,1.572,114,0.49,115,0.49,116,0.49,117,0.49,118,0.49,119,0.49,120,1.121,121,0.49,122,0.49,123,0.49,124,0.49,125,0.49,126,0.784,127,0.49,128,0.49,129,0.631,130,0.38,131,1.473,132,1.511,133,0.49,134,0.49,135,0.49,136,0.49,137,0.628,138,0.628,139,0.38,140,0.49,141,0.49,142,1.121,143,0.49,144,0.49,145,0.49,146,0.49,147,0.49,148,0.49,149,0.49,150,0.49,151,0.49,152,1.227,153,1.655,154,0.462,155,2.014,156,0.628,157,1.677,158,1.257,159,1.005,160,1.005,161,1.005,162,1.005,163,1.005,164,0.628,165,0.628,166,0.628,167,1.761,168,1.257,169,0.628,170,0.628,171,1.887,172,1.005,173,1.005,174,0.628,175,1.257,176,1.005,177,1.005,178,0.628,179,0.628,180,1.005,181,1.005,182,0.628,183,1.005,184,0.628,185,0.628,186,0.628,187,0.628,188,0.628,189,0.628,190,0.628,191,0.628,192,0.628,193,0.628,194,1.005,195,1.257,196,1.005,197,1.257,198,2.014,199,1.005,200,1.437,201,1.005,202,0.628,203,0.628,204,0.628,205,1.005,206,1.005,207,1.005,208,1.437,209,0.628,210,0.38,211,0.49,212,0.49,213,0.49,214,0.49,215,0.49,216,1.428,217,1.473,218,0.608,219,0.981,220,0.49,221,0.49,222,1.227,223,0.49,224,0.49,225,0.38,226,0.49,227,0.49,228,0.784,229,0.784,230,0.784,231,0.628,232,0.628,233,0.628,234,0.628,235,0.628,236,0.38,237,0.784,238,0.49,239,0.49,240,0.49,241,0.49,242,0.784,243,0.784,244,0.49,245,0.784,246,0.784,247,0.784,248,0.49,249,0.628,250,0.628,251,0.628,252,0.628,253,0.628,254,0.628,255,0.628,256,0.628,257,0.628,258,0.628,259,0.628,260,1.677,261,0.628,262,0.628,263,0.628,264,0.628,265,1.005,266,0.628,267,0.628,268,0.628,269,0.628,270,0.628,271,0.628,272,0.628,273,1.005,274,0.628,275,0.628,276,0.628,277,0.628,278,0.628,279,0.628,280,0.628,281,0.628,282,0.628,283,1.572,284,1.572,285,1.257,286,1.005,287,0.628,288,0.628,289,0.628,290,1.572,291,1.005,292,0.628,293,0.628,294,0.628,295,0.628,296,1.437,297,0.49,298,0.628,299,0.628,300,0.628,301,0.628,302,1.437,303,1.005,304,0.628,305,0.628,306,0.628,307,1.257,308,1.257,309,1.257,310,0.628,311,1.257,312,1.005,313,1.257,314,1.005,315,0.628,316,1.005,317,0.628,318,0.628,319,0.628,320,1.005,321,1.005,322,1.005,323,1.005,324,1.005,325,0.628,326,0.628,327,0.628,328,0.628,329,1.005,330,1.005,331,0.628,332,0.628,333,1.005,334,0.628,335,0.628,336,0.628,337,1.005,338,0.628,339,0.041,340,0.041,341,0.628,342,1.3,343,1.3,344,1.749,345,1.749,346,1.749,347,1.749,348,0.812,349,2.605,350,1.749,351,2.17,352,2.17,353,0.812,354,1.092,355,1.092,356,1.092,357,1.092,358,1.092,359,0.628,360,2.17,361,1.092,362,1.092,363,1.092,364,1.092,365,1.092,366,1.092,367,1.092]],["title/classes/File.html",[5,0.277,154,0.565]],["body/classes/File.html",[0,0.305,1,0.636,3,0.664,4,0.664,5,0.517,6,0.222,7,0.222,8,0.636,9,1.018,10,1.018,11,1.051,12,1.192,13,0.102,14,1.483,15,0.664,16,0.664,17,1.305,18,1.639,19,0.664,20,0.664,21,0.664,22,0.664,23,1.851,24,0.402,25,0.82,26,0.518,27,0.402,28,0.518,29,0.79,30,0.518,31,0.79,32,0.518,33,0.518,34,1.041,35,1.298,36,0.664,37,0.79,38,0.82,39,1.406,40,1.342,41,0.82,42,1.158,43,0.82,44,1.658,45,1.838,46,0.518,47,0.518,48,0.518,49,0.518,50,1.719,51,1.018,52,0.664,53,0.664,54,0.664,55,0.664,56,0.402,57,0.518,58,1.158,59,0.518,60,1.674,61,0.82,62,0.82,63,0.518,64,0.82,65,0.518,66,0.82,67,0.518,68,0.82,69,0.518,70,0.518,71,0.518,72,1.018,73,0.518,74,0.82,75,0.636,76,1.262,77,0.978,78,1.018,79,1.018,80,1.018,81,0.82,82,0.82,83,0.518,84,0.518,85,0.518,86,0.518,87,0.518,88,0.518,89,0.518,90,1.262,91,0.518,92,1.158,93,0.978,94,0.82,95,1.018,96,1.018,97,0.518,98,0.518,99,0.518,100,0.518,101,0.518,102,0.518,103,0.82,104,0.518,105,0.518,106,0.518,107,1.501,108,1.018,109,1.018,110,0.402,111,1.018,112,0.402,113,1.458,114,0.518,115,0.518,116,0.518,117,0.518,118,0.518,119,0.518,120,1.158,121,0.518,122,0.518,123,0.518,124,0.518,125,0.518,126,0.82,127,0.518,128,0.518,129,0.602,130,0.402,131,1.406,132,1.537,133,0.518,134,0.518,135,0.518,136,0.518,137,0.664,138,0.664,139,0.402,140,0.518,141,0.518,142,1.458,143,0.518,144,0.518,145,0.518,146,0.518,147,0.518,148,0.518,149,0.518,150,0.518,151,0.518,152,1.018,153,1.537,154,0.483,155,1.923,156,1.305,157,1.483,158,1.305,159,1.051,160,1.051,161,1.051,162,1.051,163,1.051,164,0.664,165,0.664,166,0.664,167,1.616,168,1.305,169,0.664,170,0.664,171,1.616,172,0.664,173,1.051,174,0.664,175,0.664,176,1.051,177,1.051,178,0.664,179,0.664,180,0.664,181,1.051,182,0.664,183,1.051,184,0.664,185,0.664,186,0.664,187,0.664,188,0.664,189,0.664,190,0.664,191,0.664,192,0.664,193,0.664,194,0.664,195,0.664,196,0.664,197,1.051,198,1.483,199,0.664,200,0.664,201,1.051,202,0.664,203,0.664,204,0.664,205,0.664,206,1.051,207,0.664,208,0.664,209,0.664,210,0.402,211,0.518,212,0.518,213,0.518,214,0.518,215,0.518,216,1.458,217,1.501,218,0.636,219,1.018,220,0.518,221,0.518,222,1.262,223,0.518,224,0.518,225,0.402,226,0.518,227,0.518,228,0.82,229,0.82,230,0.82,231,0.664,232,0.664,233,0.664,234,0.664,235,0.664,236,0.402,237,0.82,238,0.518,239,0.518,240,0.518,241,0.518,242,0.82,243,0.82,244,0.518,245,0.82,246,0.82,247,0.82,248,0.518,249,0.664,250,0.664,251,0.664,252,0.664,253,0.664,254,0.664,255,0.664,256,0.664,257,0.664,258,0.664,259,0.664,260,1.719,261,0.664,262,0.664,263,0.664,264,0.664,265,1.051,266,0.664,267,0.664,268,0.664,269,0.664,270,0.664,271,0.664,272,0.664,273,1.051,274,0.664,275,0.664,276,0.664,277,0.664,278,0.664,279,0.664,280,0.664,281,0.664,282,0.664,283,1.616,284,1.616,285,1.305,286,1.051,287,0.664,288,0.664,289,0.664,290,1.616,291,1.051,292,0.664,293,0.664,294,0.664,295,0.664,296,1.483,297,0.518,298,0.664,299,0.664,300,0.664,301,0.664,302,1.483,303,1.051,304,0.664,305,0.664,306,0.664,307,1.305,308,1.305,309,1.305,310,0.664,311,1.305,312,1.051,313,1.305,314,1.051,315,0.664,316,1.051,317,0.664,318,0.664,319,0.664,320,1.051,321,1.051,322,1.051,323,1.051,324,1.051,325,0.664,326,0.664,327,0.664,328,0.664,329,1.051,330,1.051,331,0.664,332,0.664,333,1.051,334,0.664,335,0.664,336,0.664,337,1.051,338,0.664,339,0.043,340,0.043,341,0.664,342,1.36,343,1.36,348,0.859,349,2.33,351,1.36,352,1.36,360,0.859,368,1.829,369,1.156,370,1.156,371,1.156,372,1.156,373,1.156]],["title/coverage.html",[374,2.137]],["body/coverage.html",[0,0.753,1,0.992,5,0.447,6,0.815,12,0.992,13,0.099,24,0.992,27,0.992,29,0.992,31,0.992,56,0.992,75,0.992,77,0.992,93,1.429,110,0.992,129,0.548,130,0.992,139,0.992,154,0.912,210,0.992,218,0.992,225,0.992,236,0.992,339,0.081,340,0.081,374,2.12,375,2.851,376,2.851,377,2.851,378,2.851,379,2.851,380,2.851,381,2.851,382,4.209,383,4.023,384,4.071,385,4.071,386,2.851,387,2.851]],["title/miscellaneous/enumerations.html",[388,0.477,389,1.903]],["body/miscellaneous/enumerations.html",[5,0.411,6,0.611,7,0.611,13,0.097,33,1.426,34,1.106,35,1.106,37,1.282,38,1.653,39,1.653,40,1.653,41,1.653,42,1.653,339,0.086,340,0.086,359,2.342,388,0.839,389,2.363,390,1.827]],["title/index.html",[7,0.411,391,1.59]],["body/index.html",[0,0.874,13,0.088,339,0.088,340,0.088,341,1.903,391,2.463,392,3.312,393,3.312]],["title/modules.html",[394,2.137]],["body/modules.html",[13,0.088,339,0.088,340,0.088,394,2.479]],["title/properties.html",[8,0.89,395,1.808]],["body/properties.html",[8,1.097,13,0.099,112,1.276,297,1.646,339,0.086,340,0.086,396,3.154,397,3.154,398,3.154,399,3.154,400,3.154,401,3.154,402,3.154,403,3.154,404,3.154,405,3.668,406,3.154,407,3.154,408,3.154,409,3.154,410,3.154,411,3.154,412,3.154,413,3.154,414,3.154,415,3.154,416,3.154,417,3.154]],["title/miscellaneous/typealiases.html",[388,0.477,418,2.56]],["body/miscellaneous/typealiases.html",[5,0.418,6,0.621,7,0.621,12,1.362,13,0.091,43,1.668,129,0.621,152,1.668,153,1.668,339,0.087,340,0.087,353,2.765,388,0.852,390,2.251,419,3.228]],["title/miscellaneous/variables.html",[388,0.477,420,1.903]],["body/miscellaneous/variables.html",[5,0.352,6,0.379,7,0.379,9,1.219,10,1.219,13,0.101,18,1.505,23,1.784,24,0.945,25,1.219,26,0.883,27,0.945,28,0.883,29,1.083,30,0.883,31,1.083,32,0.883,34,1.083,35,1.167,37,0.685,44,1.633,45,1.752,46,0.883,47,0.883,48,0.883,49,0.883,51,1.219,56,0.945,57,0.883,58,1.505,59,0.883,60,1.705,61,0.883,62,0.883,63,0.883,64,0.883,65,0.883,66,0.883,67,1.808,68,0.883,69,0.883,70,0.883,71,0.883,72,1.396,73,0.883,74,1.219,75,0.945,76,1.505,77,1.083,78,1.396,79,1.396,80,1.396,81,1.219,82,1.219,83,0.883,84,0.883,85,0.883,86,0.883,87,0.883,88,0.883,89,0.883,90,1.579,91,0.883,92,1.505,93,0.945,94,1.219,95,1.219,96,1.396,97,0.883,98,0.883,99,0.883,100,0.883,101,0.883,102,0.883,103,1.219,104,0.883,105,0.883,106,0.883,107,1.219,108,1.396,109,0.883,110,0.945,111,1.396,112,0.685,113,0.883,114,0.883,115,0.883,116,0.883,117,0.883,118,0.883,119,0.883,120,1.396,121,0.883,122,0.883,123,0.883,124,0.883,125,0.883,126,1.219,127,0.883,128,0.883,129,0.598,130,0.945,131,0.883,132,0.883,133,0.883,134,0.883,135,0.883,136,0.883,139,0.945,140,0.883,141,0.883,142,0.883,143,0.883,144,0.883,145,0.883,146,0.883,147,0.883,148,0.883,149,0.883,150,0.883,151,0.883,210,0.945,211,0.883,212,0.883,213,0.883,214,0.883,215,0.883,216,1.219,217,1.219,218,0.945,219,1.219,220,0.883,221,0.883,222,0.883,223,0.883,224,0.883,225,0.945,226,0.883,227,0.883,228,0.883,229,0.883,230,0.883,236,0.945,237,1.219,238,0.883,239,0.883,240,0.883,241,0.883,242,1.219,243,1.219,244,0.883,245,1.219,246,1.219,247,1.219,248,0.883,339,0.063,340,0.063,359,2.302,388,0.52,390,2.302,420,1.464]]],"invertedIndex":[["",{"_index":13,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"modules.html":{},"properties.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["0",{"_index":93,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["0.0.0",{"_index":397,"title":{},"body":{"properties.html":{}}}],["0/1",{"_index":383,"title":{},"body":{"coverage.html":{}}}],["0/3",{"_index":381,"title":{},"body":{"coverage.html":{}}}],["0/8",{"_index":380,"title":{},"body":{"coverage.html":{}}}],["1",{"_index":393,"title":{},"body":{"index.html":{}}}],["1/1",{"_index":385,"title":{},"body":{"coverage.html":{}}}],["1/13",{"_index":379,"title":{},"body":{"coverage.html":{}}}],["100",{"_index":384,"title":{},"body":{"coverage.html":{}}}],["2",{"_index":392,"title":{},"body":{"index.html":{}}}],["3.0",{"_index":411,"title":{},"body":{"properties.html":{}}}],["7",{"_index":378,"title":{},"body":{"coverage.html":{}}}],["_deltafilemap",{"_index":175,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["absolute",{"_index":213,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["accurate",{"_index":258,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["added",{"_index":40,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{}}}],["addedfiles",{"_index":286,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["alexander",{"_index":416,"title":{},"body":{"properties.html":{}}}],["aliases",{"_index":419,"title":{},"body":{"miscellaneous/typealiases.html":{}}}],["aren't",{"_index":336,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["array",{"_index":172,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["array.from",{"_index":100,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["async",{"_index":131,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["asynchronously",{"_index":134,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["author",{"_index":415,"title":{},"body":{"properties.html":{}}}],["await",{"_index":132,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["b",{"_index":126,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["basev1name",{"_index":29,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["basev2name",{"_index":31,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["behind",{"_index":256,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["better",{"_index":250,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["between",{"_index":234,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["both",{"_index":303,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["branch",{"_index":72,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["branchstate",{"_index":1,"title":{"interfaces/BranchState.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{}}}],["branchstate.commitsbehind",{"_index":253,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["bugs",{"_index":407,"title":{},"body":{"properties.html":{}}}],["callback",{"_index":195,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["callback(child",{"_index":204,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["calls",{"_index":194,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["case",{"_index":58,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["change",{"_index":51,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["changed",{"_index":108,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["changed.on(\"close",{"_index":115,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["changed.stdout.on(\"data",{"_index":114,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["changedblob",{"_index":111,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["changes",{"_index":291,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["character",{"_index":53,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["check",{"_index":335,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["child",{"_index":201,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["child.walk(callback",{"_index":203,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["child_process",{"_index":22,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["childmap",{"_index":177,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["children",{"_index":176,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["class",{"_index":154,"title":{"classes/Directory.html":{},"classes/File.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{}}}],["classes",{"_index":341,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{},"index.html":{}}}],["code",{"_index":92,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["codes",{"_index":48,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["commitchanges",{"_index":96,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["commitsahead",{"_index":9,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["commitsbehind",{"_index":10,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["common",{"_index":233,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["compared",{"_index":73,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["console.log(`no",{"_index":267,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["console.warn",{"_index":290,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["console.warn(\"branch",{"_index":254,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["const",{"_index":23,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["constructor",{"_index":348,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["constructor(fullpath",{"_index":158,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["convert",{"_index":212,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["converts",{"_index":46,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["count",{"_index":87,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["coverage",{"_index":374,"title":{"coverage.html":{}},"body":{"coverage.html":{}}}],["create",{"_index":343,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["create(fullpath",{"_index":168,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["createhash",{"_index":19,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["createhash(\"md5",{"_index":143,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["createreadstream",{"_index":15,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["createreadstream(filepath",{"_index":141,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["crypto",{"_index":20,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["current",{"_index":71,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["currently",{"_index":255,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["currentpath",{"_index":184,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["d",{"_index":63,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["data",{"_index":90,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["default",{"_index":67,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["defined",{"_index":349,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["deleted",{"_index":38,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{}}}],["deletedfiles",{"_index":287,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["delta",{"_index":81,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["delta.on(\"close",{"_index":91,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["delta.stdout.on(\"data",{"_index":89,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["deltafilemap",{"_index":43,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/typealiases.html":{}}}],["description",{"_index":398,"title":{},"body":{"properties.html":{}}}],["design",{"_index":400,"title":{},"body":{"properties.html":{}}}],["detect",{"_index":292,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["detected",{"_index":268,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["determines",{"_index":127,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["diff",{"_index":112,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"properties.html":{},"miscellaneous/variables.html":{}}}],["diffdirectories",{"_index":236,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["diffdirectories(schemav1",{"_index":281,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["difference",{"_index":402,"title":{},"body":{"properties.html":{}}}],["dir",{"_index":187,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["dir.filemap",{"_index":190,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["directories",{"_index":197,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["directory",{"_index":129,"title":{"classes/Directory.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["directory(fullpath",{"_index":179,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["directory.create(currentpath",{"_index":188,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["directory.create(schemav1path",{"_index":272,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["directory.create(schemav2path",{"_index":274,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["directory1",{"_index":228,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["directory1.listfiles().map(directorymapper",{"_index":239,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["directory2",{"_index":229,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["directory2.listfiles().map(directorymapper",{"_index":241,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["directorymapper",{"_index":230,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["documentation",{"_index":375,"title":{},"body":{"coverage.html":{}}}],["doesn't",{"_index":333,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["don't",{"_index":331,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["double",{"_index":334,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["drift",{"_index":95,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["during",{"_index":327,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["ensure",{"_index":338,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["enum",{"_index":36,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["enumerations",{"_index":389,"title":{"miscellaneous/enumerations.html":{}},"body":{"miscellaneous/enumerations.html":{}}}],["equivalent",{"_index":49,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["error",{"_index":150,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["establish",{"_index":232,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["exist",{"_index":302,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["file",{"_index":5,"title":{"classes/File.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["file(fullpath",{"_index":169,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["file.create(currentpath",{"_index":191,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["file.includes(basev1name",{"_index":263,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["file.includes(basev2name",{"_index":264,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["file.relativepath",{"_index":330,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filechanges",{"_index":260,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filechanges.length",{"_index":266,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filelist1",{"_index":238,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filelist1.filter((x",{"_index":243,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filelist2",{"_index":240,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filelist2.filter((x",{"_index":248,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filelist2.includes(x",{"_index":244,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filemap",{"_index":153,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/typealiases.html":{}}}],["filemap[file.fullpath",{"_index":193,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filename",{"_index":183,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filenames",{"_index":181,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filepath",{"_index":44,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filepath.includes(basev1name",{"_index":211,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filepath.replace(basev1name",{"_index":226,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filepath.replace(basev2name",{"_index":227,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filepath.split(basev1name)[1",{"_index":220,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filepath.split(basev2name)[1",{"_index":221,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["files",{"_index":107,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filesinbothschemas",{"_index":279,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filesinbothschemas.includes(file",{"_index":310,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filestatus",{"_index":37,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/variables.html":{}}}],["filestatus.added",{"_index":62,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filestatus.deleted",{"_index":64,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filestatus.modified",{"_index":61,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filestatus.renamed",{"_index":66,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filestatus.unknown",{"_index":68,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filesuniqueto1",{"_index":245,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filesuniqueto2",{"_index":247,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["filesuniquetoschemav1",{"_index":278,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filesuniquetoschemav1.includes(file",{"_index":329,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filesuniquetoschemav2",{"_index":280,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["file}\\n",{"_index":300,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filter",{"_index":283,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["filter(([file",{"_index":309,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["find",{"_index":116,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["following",{"_index":295,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["foreach",{"_index":311,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["fromschemaroot",{"_index":218,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["fromschemaroot(filepath",{"_index":308,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["fs",{"_index":17,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["fs.lstat(filepath)).isdirectory",{"_index":133,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["fs.readdir(fullpath",{"_index":182,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["fsnode",{"_index":152,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/typealiases.html":{}}}],["full",{"_index":137,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["fullpath",{"_index":155,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["function",{"_index":367,"title":{},"body":{"classes/Directory.html":{}}}],["generate",{"_index":105,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["generates",{"_index":135,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["getbranchdrift",{"_index":75,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["getchangedfiles",{"_index":110,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["getchangedfiles()).filter",{"_index":262,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["getchildren",{"_index":344,"title":{},"body":{"classes/Directory.html":{}}}],["getchildren(fullpath",{"_index":180,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["getfile",{"_index":345,"title":{},"body":{"classes/Directory.html":{}}}],["getfile(fullpath",{"_index":207,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["git",{"_index":34,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/variables.html":{}}}],["git+https://github.com/alexrogalskiy/java",{"_index":413,"title":{},"body":{"properties.html":{}}}],["gitchangetofilestatus",{"_index":56,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["gitchangetofilestatus(status",{"_index":124,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["given",{"_index":128,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["gives",{"_index":69,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["gpl",{"_index":410,"title":{},"body":{"properties.html":{}}}],["handle",{"_index":252,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["happen",{"_index":323,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["hasfile",{"_index":346,"title":{},"body":{"classes/Directory.html":{}}}],["hasfile(fullpath",{"_index":205,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["hash",{"_index":142,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["hash.update(data",{"_index":145,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["hashfile",{"_index":139,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["hashfile(fullpath",{"_index":170,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["here",{"_index":319,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["homepage",{"_index":404,"title":{},"body":{"properties.html":{}}}],["https://github.com/alexrogalskiy/java",{"_index":405,"title":{},"body":{"properties.html":{}}}],["identifier",{"_index":376,"title":{},"body":{"coverage.html":{}}}],["import",{"_index":14,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["include",{"_index":138,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["index",{"_index":7,"title":{"index.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["info",{"_index":3,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["information",{"_index":70,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["instanceof",{"_index":202,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["interface",{"_index":0,"title":{"interfaces/BranchState.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"index.html":{}}}],["interfaces",{"_index":2,"title":{},"body":{"interfaces/BranchState.html":{}}}],["isdirectory",{"_index":130,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["isdirectory(currentpath",{"_index":186,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["isfromschemav1",{"_index":210,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["isfromschemav1(filepath",{"_index":219,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["java",{"_index":399,"title":{},"body":{"properties.html":{}}}],["keywords",{"_index":403,"title":{},"body":{"properties.html":{}}}],["left",{"_index":85,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["license",{"_index":409,"title":{},"body":{"properties.html":{}}}],["list",{"_index":84,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["listfiles",{"_index":208,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["literal",{"_index":353,"title":{},"body":{"classes/Directory.html":{},"miscellaneous/typealiases.html":{}}}],["m",{"_index":59,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["made",{"_index":332,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["main",{"_index":109,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["map",{"_index":106,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["map(([file",{"_index":284,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["map((filepath",{"_index":307,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["map((status",{"_index":119,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["map((x",{"_index":101,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["match",{"_index":120,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["matching",{"_index":340,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"modules.html":{},"properties.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["md5",{"_index":136,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["methods",{"_index":342,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["miscellaneous",{"_index":388,"title":{"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}},"body":{"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["modified",{"_index":39,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{}}}],["modifiedfiles",{"_index":285,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["modules",{"_index":394,"title":{"modules.html":{}},"body":{"modules.html":{}}}],["name",{"_index":113,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["new",{"_index":77,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["nodes",{"_index":171,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["nodes.push(dir",{"_index":189,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["nodes.push(file",{"_index":192,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["nothing",{"_index":318,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["now",{"_index":317,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["number",{"_index":11,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["number(x",{"_index":102,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["object.entries(await",{"_index":261,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["object.keys(this.filemap",{"_index":209,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["optional",{"_index":352,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["origin/main",{"_index":74,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["origin/main...head",{"_index":88,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["out",{"_index":276,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["output",{"_index":80,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["output.match(/(\\d+)\\s+(\\d",{"_index":97,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["overview",{"_index":391,"title":{"index.html":{}},"body":{"index.html":{}}}],["p",{"_index":237,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["package",{"_index":395,"title":{"properties.html":{}},"body":{}}],["param",{"_index":50,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["parameters",{"_index":351,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["partial",{"_index":214,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["path",{"_index":18,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["path.basename(fullpath",{"_index":160,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["path.basename(schemav1path",{"_index":30,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["path.basename(schemav2path",{"_index":32,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["path.dirname(fullpath",{"_index":162,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["path.join(fullpath",{"_index":185,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["path.join(process.cwd",{"_index":25,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["path.relative(process.cwd",{"_index":165,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["path.resolve(filepath",{"_index":123,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["patterns",{"_index":401,"title":{},"body":{"properties.html":{}}}],["patterns.git",{"_index":414,"title":{},"body":{"properties.html":{}}}],["patterns/issues",{"_index":408,"title":{},"body":{"properties.html":{}}}],["patterns/tree/master/packages/schema",{"_index":406,"title":{},"body":{"properties.html":{}}}],["places",{"_index":304,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["please",{"_index":293,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["private",{"_index":157,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["process.env.source_dir1}`).normalize",{"_index":26,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["process.env.source_dir2}`).normalize",{"_index":28,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["promise",{"_index":76,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["promise((resolve",{"_index":78,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["promises",{"_index":16,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["properties",{"_index":8,"title":{"properties.html":{}},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"properties.html":{}}}],["public",{"_index":198,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["r",{"_index":65,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["read",{"_index":270,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["reduce((a",{"_index":125,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["reflect",{"_index":257,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["reject",{"_index":79,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["reject(\"failed",{"_index":94,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["reject(\"something",{"_index":98,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["reject(error",{"_index":151,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["relativepath",{"_index":156,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["renamed",{"_index":41,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{}}}],["renamedfiles",{"_index":288,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["repository",{"_index":412,"title":{},"body":{"properties.html":{}}}],["represents",{"_index":33,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{}}}],["required",{"_index":337,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["resolve",{"_index":103,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["resolve(hash.digest(\"hex",{"_index":148,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["results",{"_index":339,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/enumerations.html":{},"index.html":{},"modules.html":{},"properties.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["return",{"_index":60,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["returns",{"_index":360,"title":{},"body":{"classes/Directory.html":{},"classes/File.html":{}}}],["rev",{"_index":83,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["right",{"_index":86,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["rogalskiy",{"_index":417,"title":{},"body":{"properties.html":{}}}],["same",{"_index":316,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["scenarios",{"_index":301,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schema",{"_index":297,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"properties.html":{}}}],["schemav1",{"_index":271,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav1.getfile(filepath",{"_index":313,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav1.getfile(switchschemapath(filepath",{"_index":326,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav1file",{"_index":312,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav1file.hash",{"_index":320,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav1file.relativepath",{"_index":322,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav1path",{"_index":24,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["schemav2",{"_index":273,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav2.getfile(filepath",{"_index":325,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav2.getfile(switchschemapath(filepath",{"_index":315,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav2file",{"_index":314,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav2file.hash",{"_index":321,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav2file.relativepath",{"_index":324,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["schemav2path",{"_index":27,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["script\\n",{"_index":298,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["shared",{"_index":277,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["sharedfiles",{"_index":242,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["sharedfiles.includes(x",{"_index":246,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["short",{"_index":47,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["shorthand",{"_index":54,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["single",{"_index":52,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["skip",{"_index":265,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["skipping...\\n",{"_index":269,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["sort",{"_index":275,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["source",{"_index":4,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["spawn",{"_index":21,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["spawn(\"git",{"_index":82,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["split(\"\\n",{"_index":118,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["src/.../index.ts",{"_index":390,"title":{},"body":{"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["src/index.ts",{"_index":6,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/typealiases.html":{},"miscellaneous/variables.html":{}}}],["src/index.ts:147",{"_index":370,"title":{},"body":{"classes/File.html":{}}}],["src/index.ts:148",{"_index":371,"title":{},"body":{"classes/File.html":{}}}],["src/index.ts:149",{"_index":369,"title":{},"body":{"classes/File.html":{}}}],["src/index.ts:150",{"_index":372,"title":{},"body":{"classes/File.html":{}}}],["src/index.ts:151",{"_index":368,"title":{},"body":{"classes/File.html":{}}}],["src/index.ts:161",{"_index":373,"title":{},"body":{"classes/File.html":{}}}],["src/index.ts:167",{"_index":355,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:168",{"_index":357,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:169",{"_index":354,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:170",{"_index":356,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:171",{"_index":350,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:181",{"_index":358,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:186",{"_index":361,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:209",{"_index":366,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:219",{"_index":363,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:223",{"_index":362,"title":{},"body":{"classes/Directory.html":{}}}],["src/index.ts:227",{"_index":364,"title":{},"body":{"classes/Directory.html":{}}}],["starts",{"_index":215,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["state",{"_index":55,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["state\\n",{"_index":259,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["statements",{"_index":377,"title":{},"body":{"coverage.html":{}}}],["static",{"_index":167,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["status",{"_index":35,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/variables.html":{}}}],["status.match(/([a",{"_index":121,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["stream",{"_index":140,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["stream.on(\"data",{"_index":144,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["stream.on(\"end",{"_index":147,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["stream.on(\"error",{"_index":149,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["string",{"_index":45,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["sub",{"_index":196,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["switch",{"_index":57,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["switchschemapath",{"_index":225,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/variables.html":{}}}],["table",{"_index":387,"title":{},"body":{"coverage.html":{}}}],["tablesort(document.getelementbyid('coverage",{"_index":386,"title":{},"body":{"coverage.html":{}}}],["this.filemap",{"_index":174,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.filemap[fullpath",{"_index":206,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.fullpath",{"_index":163,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.getchildren(fullpath",{"_index":178,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.hash",{"_index":166,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.name",{"_index":159,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.nodes",{"_index":173,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.path",{"_index":161,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["this.relativepath",{"_index":164,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["transition",{"_index":328,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["two",{"_index":235,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["type",{"_index":12,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"coverage.html":{},"miscellaneous/typealiases.html":{}}}],["typealiases",{"_index":418,"title":{"miscellaneous/typealiases.html":{}},"body":{}}],["undefined",{"_index":365,"title":{},"body":{"classes/Directory.html":{}}}],["unknown",{"_index":42,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/enumerations.html":{}}}],["unknownchanges",{"_index":282,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["unknownchanges.length",{"_index":289,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["unknownchanges.map((file",{"_index":299,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["update",{"_index":296,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["updates",{"_index":222,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["used",{"_index":231,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["uses",{"_index":104,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["utf8",{"_index":146,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["v1",{"_index":216,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["v1|v2",{"_index":305,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["v2",{"_index":217,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["v2|v1",{"_index":306,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["value",{"_index":359,"title":{},"body":{"classes/Directory.html":{},"miscellaneous/enumerations.html":{},"miscellaneous/variables.html":{}}}],["variable",{"_index":382,"title":{},"body":{"coverage.html":{}}}],["variables",{"_index":420,"title":{"miscellaneous/variables.html":{}},"body":{"miscellaneous/variables.html":{}}}],["verify",{"_index":294,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["versa",{"_index":224,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["version",{"_index":396,"title":{},"body":{"properties.html":{}}}],["via",{"_index":117,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["vice",{"_index":223,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["void",{"_index":200,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["walk",{"_index":347,"title":{},"body":{"classes/Directory.html":{}}}],["walk(callback",{"_index":199,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["way",{"_index":251,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["work",{"_index":249,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{}}}],["wrong",{"_index":99,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}],["z])\\s",{"_index":122,"title":{},"body":{"interfaces/BranchState.html":{},"classes/Directory.html":{},"classes/File.html":{},"miscellaneous/variables.html":{}}}]],"pipeline":["stemmer"]},
"store": {"interfaces/BranchState.html":{"url":"interfaces/BranchState.html","title":"interface - BranchState","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Interfaces\n \n BranchState\n\n\n\n \n Info\n \n \n Source\n \n\n\n\n \n \n File\n \n \n src/index.ts\n \n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n \n commitsAhead\n \n \n \n \n commitsBehind\n \n \n \n \n \n \n \n \n\n\n\n \n Properties\n \n \n \n \n \n commitsAhead\n \n \n \n \n \n \n \n \n commitsAhead: number\n\n \n \n\n\n \n \n Type : number\n\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n commitsBehind\n \n \n \n \n \n \n \n \n commitsBehind: number\n\n \n \n\n\n \n \n Type : number\n\n \n \n\n\n\n\n\n \n \n \n \n\n\n \n import {createReadStream, promises as fs} from \"fs\";\nimport path from \"path\";\nimport {createHash} from \"crypto\";\nimport {spawn} from \"child_process\";\n\nconst schemaV1Path = path.join(process.cwd(), `${process.env.SOURCE_DIR1}`).normalize()\nconst schemaV2Path = path.join(process.cwd(), `${process.env.SOURCE_DIR2}`).normalize()\n\nconst baseV1Name = path.basename(schemaV1Path)\nconst baseV2Name = path.basename(schemaV2Path)\n\n/** Represents the git status of a file */\nenum FileStatus {\n Deleted = \"deleted\",\n Modified = \"modified\",\n Added = \"added\",\n Renamed = \"renamed\",\n Unknown = \"unknown\",\n}\n\ntype DeltaFileMap = { [filePath: string]: FileStatus }\n\n/**\n * Converts git status short codes to their `FileStatus` equivalent.\n * @param change Single character shorthand git file state\n */\nconst GitChangeToFileStatus = (change: string) => {\n switch (change) {\n case \"M\":\n return FileStatus.Modified\n case \"A\":\n return FileStatus.Added\n case \"D\":\n return FileStatus.Deleted\n case \"R\":\n return FileStatus.Renamed\n default:\n return FileStatus.Unknown\n }\n}\n\ninterface BranchState {\n commitsAhead: number\n commitsBehind: number\n}\n\n/**\n * Gives status information on the current branch as compared to origin/main\n */\nconst getBranchDrift = (): Promise =>\n new Promise((resolve, reject) => {\n let output = \"\"\n const delta = spawn(\"git\", [\n \"rev-list\",\n \"--left-right\",\n \"--count\",\n \"origin/main...HEAD\",\n ])\n\n delta.stdout.on(\"data\", (data) => {\n output += data\n })\n\n delta.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to get branch drift\")\n } else {\n const commitChanges = output.match(/(\\d+)\\s+(\\d+)/)\n if (!commitChanges) {\n reject(\"Something was wrong with the branch drift output\")\n }\n\n let [, commitsBehind, commitsAhead] = Array.from(\n commitChanges!\n ).map((x) => Number(x))\n resolve({\n commitsAhead,\n commitsBehind,\n })\n }\n })\n })\n\n/**\n * Uses git to generate a delta map of files that have changed since main\n */\nconst getChangedFiles = (): Promise =>\n new Promise((resolve, reject) => {\n let changedBlob = \"\"\n const changed = spawn(\"git\", [\"diff\", \"--name-status\", \"origin/main\"])\n changed.stdout.on(\"data\", (data) => {\n changedBlob += data\n })\n\n changed.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to find changed files via git\")\n } else {\n resolve(\n changedBlob\n .split(\"\\n\")\n .map((status) => {\n const match = status.match(/([A-Z])\\s+(.+)/)\n if (match) {\n const [, status, filePath] = match\n return {\n [path.resolve(filePath)]: GitChangeToFileStatus(status),\n }\n }\n return {} as any\n })\n .reduce((a, b) => ({...a, ...b}), {})\n )\n }\n })\n })\n\n/**\n * Determines if a given path is a directory\n * @param filepath\n */\nconst isDirectory = async (filepath: string): Promise =>\n (await fs.lstat(filepath)).isDirectory()\n\n/**\n * Asynchronously generates an md5 of a file\n * @param filePath The full path to a file (include its name)\n */\nconst hashFile = (filePath: string): Promise =>\n new Promise((resolve, reject) => {\n const stream = createReadStream(filePath)\n const hash = createHash(\"md5\")\n\n stream.on(\"data\", (data: string) => hash.update(data, \"utf8\"))\n stream.on(\"end\", () => {\n resolve(hash.digest(\"hex\"))\n })\n stream.on(\"error\", (error) => {\n reject(error)\n })\n })\n\ntype FSNode = File | Directory\ntype FileMap = { [path: string]: File }\n\nclass File {\n name: string\n path: string\n fullPath: string\n relativePath: string\n hash: string\n\n private constructor(fullPath: string, hash: string) {\n this.name = path.basename(fullPath)\n this.path = path.dirname(fullPath)\n this.fullPath = fullPath\n this.relativePath = path.relative(process.cwd(), fullPath)\n this.hash = hash\n }\n\n static async create(fullPath: string) {\n return new File(fullPath, await hashFile(fullPath))\n }\n}\n\nclass Directory {\n name: string\n path: string\n fullPath: string\n nodes: Array\n fileMap: { [path: string]: File }\n\n private constructor(fullPath: string, nodes: FSNode[], fileMap: FileMap) {\n this.name = path.basename(fullPath)\n this.path = path.dirname(fullPath)\n this.fullPath = fullPath\n this.nodes = nodes\n this.fileMap = fileMap\n }\n\n static async create(fullPath: string, _deltaFileMap: DeltaFileMap = {}) {\n const [children, childMap] = await this.getChildren(fullPath)\n return new Directory(fullPath, children, childMap)\n }\n\n private static async getChildren(fullPath): Promise {\n const nodes: FSNode[] = []\n const fileNames = await fs.readdir(fullPath)\n let fileMap: FileMap = {}\n\n for (let fileName of fileNames) {\n const currentPath = path.join(fullPath, fileName)\n if (await isDirectory(currentPath)) {\n let dir = await Directory.create(currentPath)\n nodes.push(dir)\n fileMap = {...fileMap, ...dir.fileMap}\n } else {\n let file = await File.create(currentPath)\n nodes.push(file)\n fileMap[file.fullPath] = file\n }\n }\n return [nodes, fileMap]\n }\n\n /**\n * Calls a callback for every file of this directory and its sub directories\n */\n public walk(callback: (File) => void) {\n for (let child of this.nodes) {\n if (child instanceof Directory) {\n child.walk(callback)\n } else {\n callback(child)\n }\n }\n }\n\n public hasFile(fullPath: string) {\n !!this.fileMap[fullPath]\n }\n\n public getFile(fullPath: string): File {\n return this.fileMap[fullPath]\n }\n\n public listFiles(): string[] {\n return Object.keys(this.fileMap)\n }\n}\n\nconst isFromSchemaV1 = (filePath: string) => filePath.includes(baseV1Name)\n\n/** Convert an absolute file path to a partial path that starts after `/v1/` or `/v2/` */\nconst fromSchemaRoot = (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.split(baseV1Name)[1]\n : filePath.split(baseV2Name)[1]\n\n/** Updates a path from `/v1/` to `/v2/` or vice versa */\nconst switchSchemaPath = (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.replace(baseV1Name, baseV2Name)\n : filePath.replace(baseV2Name, baseV1Name)\n\n/**\n * @param directory1\n * @param directory2\n * @param directoryMapper Used to establish a common path between files of the two directories\n */\nconst diffDirectories = (\n directory1: Directory,\n directory2: Directory,\n directoryMapper = (p) => p\n ): [string[], string[], string[]] => {\n const fileList1 = directory1.listFiles().map(directoryMapper)\n const fileList2 = directory2.listFiles().map(directoryMapper)\n\n const sharedFiles = fileList1.filter((x) => fileList2.includes(x))\n const filesUniqueTo1 = fileList1.filter((x) => !sharedFiles.includes(x))\n const filesUniqueTo2 = fileList2.filter((x) => !sharedFiles.includes(x))\n\n return [filesUniqueTo1, sharedFiles, filesUniqueTo2]\n }\n\n// Main work\n;(async () => {\n const branchState = await getBranchDrift()\n\n // Is there a better way to handle this?\n if (branchState.commitsBehind > 0) {\n console.warn(\"Branch is currently behind main, might not reflect accurate state\\n\")\n }\n\n const fileChanges = Object.entries(await getChangedFiles()).filter(\n ([file]) => file.includes(baseV1Name) || file.includes(baseV2Name)\n )\n\n // If no file updates, skip\n if (fileChanges.length === 0) {\n console.log(`No updates detected in ${baseV1Name} or ${baseV2Name}, skipping...\\n`)\n return\n }\n\n // Read files from the FS\n const schemaV1 = await Directory.create(schemaV1Path)\n const schemaV2 = await Directory.create(schemaV2Path)\n\n // Sort out which files are shared by v1 and v2\n const [\n filesUniqueToSchemaV1,\n filesInBothSchemas,\n // filesUniqueToSchemaV2,\n ] = diffDirectories(schemaV1, schemaV2, fromSchemaRoot)\n\n const unknownChanges = fileChanges\n .filter(([, status]) => status === FileStatus.Unknown)\n .map(([file]) => file)\n\n const modifiedFiles = fileChanges\n .filter(([, status]) => status === FileStatus.Modified)\n .map(([file]) => file)\n\n const addedFiles = fileChanges\n .filter(([, status]) => status === FileStatus.Added)\n .map(([file]) => file)\n\n // const deletedFiles = fileChanges\n // .filter(([, status]) => status === FileStatus.Deleted)\n // .map(([file]) => file)\n\n // const renamedFiles = fileChanges\n // .filter(([, status]) => status === FileStatus.Renamed)\n // .map(([file]) => file)\n\n if (unknownChanges.length > 0) {\n console.warn(\n \"File changes detect with unknown git status, please verify the following and update the schema drift script\\n\" +\n unknownChanges.map((file) => `- ${file}\\n`)\n )\n }\n\n // Scenarios\n //\n // For files that exist in both places\n\n // File A was modified in (v1|v2), should it also be modified in (v2|v1)?\n modifiedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesInBothSchemas.includes(file))\n .forEach(([, filePath]) => {\n if (isFromSchemaV1(filePath)) {\n const schemaV1File = schemaV1.getFile(filePath)\n const schemaV2File = schemaV2.getFile(switchSchemaPath(filePath))\n\n // Both files are the same now, nothing to do here\n if (schemaV1File.hash === schemaV2File.hash) return\n\n console.warn(\n `${schemaV1File.relativePath} has been modified, should this update also happen in ${schemaV2File.relativePath}?`\n )\n } else {\n const schemaV2File = schemaV2.getFile(filePath)\n const schemaV1File = schemaV1.getFile(switchSchemaPath(filePath))\n\n // The files are the same, skip\n if (schemaV2File.hash === schemaV1File.hash) return\n\n console.warn(\n `${schemaV2File.relativePath} has been modified, should this update also happen in ${schemaV1File.relativePath}?`\n )\n }\n })\n\n // For files added during transition\n\n // File was added to v1, should it also exist in v2?\n addedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesUniqueToSchemaV1.includes(file))\n .forEach(([, filePath]) => {\n const file = schemaV1.getFile(filePath)\n console.warn(\n `${file.relativePath} was added to v1, should it also be added to v2?`\n )\n })\n\n // For updates in v1 that don't match to V2\n\n // An update was made to a file in v1, but it doesn't exist in V2. Double\n // check that there aren't updates required.\n modifiedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesUniqueToSchemaV1.includes(file))\n .forEach(([, filePath]) => {\n const file = schemaV1.getFile(filePath)\n console.warn(\n `${file.relativePath} was modified in v1, but doesn't exist in v2. Ensure no v2 changes are required.`\n )\n })\n})()\n\n \n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"classes/Directory.html":{"url":"classes/Directory.html","title":"class - Directory","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n Classes\n Directory\n\n\n\n \n Info\n \n \n Source\n \n\n\n\n \n \n File\n \n \n src/index.ts\n \n\n\n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n fileMap\n \n \n fullPath\n \n \n name\n \n \n nodes\n \n \n path\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n Static\n Async\n create\n \n \n Private\n Static\n Async\n getChildren\n \n \n Public\n getFile\n \n \n Public\n hasFile\n \n \n Public\n listFiles\n \n \n Public\n walk\n \n \n \n \n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \n Private\n constructor(fullPath: string, nodes: FSNode[], fileMap: FileMap)\n \n \n \n \n Defined in src/index.ts:171\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n fullPath\n \n \n string\n \n \n \n No\n \n \n \n \n nodes\n \n \n FSNode[]\n \n \n \n No\n \n \n \n \n fileMap\n \n \n FileMap\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n fileMap\n \n \n \n \n \n \n Type : literal type\n\n \n \n \n \n Defined in src/index.ts:171\n \n \n\n\n \n \n \n \n \n \n \n \n fullPath\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:169\n \n \n\n\n \n \n \n \n \n \n \n \n name\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:167\n \n \n\n\n \n \n \n \n \n \n \n \n nodes\n \n \n \n \n \n \n Type : Array\n\n \n \n \n \n Defined in src/index.ts:170\n \n \n\n\n \n \n \n \n \n \n \n \n path\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:168\n \n \n\n\n \n \n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n Static\n Async\n create\n \n \n \n \n \n \n \n create(fullPath: string, _deltaFileMap: DeltaFileMap)\n \n \n\n\n \n \n Defined in src/index.ts:181\n \n \n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n Default value\n \n \n \n \n fullPath\n \n string\n \n\n \n No\n \n\n \n \n\n \n \n _deltaFileMap\n \n DeltaFileMap\n \n\n \n No\n \n\n \n {}\n \n\n \n \n \n \n \n \n \n Returns : unknown\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Private\n Static\n Async\n getChildren\n \n \n \n \n \n \n \n getChildren(fullPath)\n \n \n\n\n \n \n Defined in src/index.ts:186\n \n \n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Optional\n \n \n \n \n fullPath\n\n \n No\n \n\n\n \n \n \n \n \n \n \n Returns : Promise<>\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Public\n getFile\n \n \n \n \n \n \n \n getFile(fullPath: string)\n \n \n\n\n \n \n Defined in src/index.ts:223\n \n \n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n fullPath\n \n string\n \n\n \n No\n \n\n\n \n \n \n \n \n \n \n Returns : File\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Public\n hasFile\n \n \n \n \n \n \n \n hasFile(fullPath: string)\n \n \n\n\n \n \n Defined in src/index.ts:219\n \n \n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n fullPath\n \n string\n \n\n \n No\n \n\n\n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Public\n listFiles\n \n \n \n \n \n \n \n listFiles()\n \n \n\n\n \n \n Defined in src/index.ts:227\n \n \n\n\n \n \n\n \n Returns : string[]\n\n \n \n \n \n \n \n \n \n \n \n \n Public\n walk\n \n \n \n \n \n \n \n walk(callback: (undefined) => void)\n \n \n\n\n \n \n Defined in src/index.ts:209\n \n \n\n\n \n \n Calls a callback for every file of this directory and its sub directories\n\n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n callback\n \n function\n \n\n \n No\n \n\n\n \n \n \n \n \n \n \n Returns : void\n\n \n \n \n \n \n \n \n \n\n\n\n\n\n\n \n\n\n \n import {createReadStream, promises as fs} from \"fs\";\nimport path from \"path\";\nimport {createHash} from \"crypto\";\nimport {spawn} from \"child_process\";\n\nconst schemaV1Path = path.join(process.cwd(), `${process.env.SOURCE_DIR1}`).normalize()\nconst schemaV2Path = path.join(process.cwd(), `${process.env.SOURCE_DIR2}`).normalize()\n\nconst baseV1Name = path.basename(schemaV1Path)\nconst baseV2Name = path.basename(schemaV2Path)\n\n/** Represents the git status of a file */\nenum FileStatus {\n Deleted = \"deleted\",\n Modified = \"modified\",\n Added = \"added\",\n Renamed = \"renamed\",\n Unknown = \"unknown\",\n}\n\ntype DeltaFileMap = { [filePath: string]: FileStatus }\n\n/**\n * Converts git status short codes to their `FileStatus` equivalent.\n * @param change Single character shorthand git file state\n */\nconst GitChangeToFileStatus = (change: string) => {\n switch (change) {\n case \"M\":\n return FileStatus.Modified\n case \"A\":\n return FileStatus.Added\n case \"D\":\n return FileStatus.Deleted\n case \"R\":\n return FileStatus.Renamed\n default:\n return FileStatus.Unknown\n }\n}\n\ninterface BranchState {\n commitsAhead: number\n commitsBehind: number\n}\n\n/**\n * Gives status information on the current branch as compared to origin/main\n */\nconst getBranchDrift = (): Promise =>\n new Promise((resolve, reject) => {\n let output = \"\"\n const delta = spawn(\"git\", [\n \"rev-list\",\n \"--left-right\",\n \"--count\",\n \"origin/main...HEAD\",\n ])\n\n delta.stdout.on(\"data\", (data) => {\n output += data\n })\n\n delta.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to get branch drift\")\n } else {\n const commitChanges = output.match(/(\\d+)\\s+(\\d+)/)\n if (!commitChanges) {\n reject(\"Something was wrong with the branch drift output\")\n }\n\n let [, commitsBehind, commitsAhead] = Array.from(\n commitChanges!\n ).map((x) => Number(x))\n resolve({\n commitsAhead,\n commitsBehind,\n })\n }\n })\n })\n\n/**\n * Uses git to generate a delta map of files that have changed since main\n */\nconst getChangedFiles = (): Promise =>\n new Promise((resolve, reject) => {\n let changedBlob = \"\"\n const changed = spawn(\"git\", [\"diff\", \"--name-status\", \"origin/main\"])\n changed.stdout.on(\"data\", (data) => {\n changedBlob += data\n })\n\n changed.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to find changed files via git\")\n } else {\n resolve(\n changedBlob\n .split(\"\\n\")\n .map((status) => {\n const match = status.match(/([A-Z])\\s+(.+)/)\n if (match) {\n const [, status, filePath] = match\n return {\n [path.resolve(filePath)]: GitChangeToFileStatus(status),\n }\n }\n return {} as any\n })\n .reduce((a, b) => ({...a, ...b}), {})\n )\n }\n })\n })\n\n/**\n * Determines if a given path is a directory\n * @param filepath\n */\nconst isDirectory = async (filepath: string): Promise =>\n (await fs.lstat(filepath)).isDirectory()\n\n/**\n * Asynchronously generates an md5 of a file\n * @param filePath The full path to a file (include its name)\n */\nconst hashFile = (filePath: string): Promise =>\n new Promise((resolve, reject) => {\n const stream = createReadStream(filePath)\n const hash = createHash(\"md5\")\n\n stream.on(\"data\", (data: string) => hash.update(data, \"utf8\"))\n stream.on(\"end\", () => {\n resolve(hash.digest(\"hex\"))\n })\n stream.on(\"error\", (error) => {\n reject(error)\n })\n })\n\ntype FSNode = File | Directory\ntype FileMap = { [path: string]: File }\n\nclass File {\n name: string\n path: string\n fullPath: string\n relativePath: string\n hash: string\n\n private constructor(fullPath: string, hash: string) {\n this.name = path.basename(fullPath)\n this.path = path.dirname(fullPath)\n this.fullPath = fullPath\n this.relativePath = path.relative(process.cwd(), fullPath)\n this.hash = hash\n }\n\n static async create(fullPath: string) {\n return new File(fullPath, await hashFile(fullPath))\n }\n}\n\nclass Directory {\n name: string\n path: string\n fullPath: string\n nodes: Array\n fileMap: { [path: string]: File }\n\n private constructor(fullPath: string, nodes: FSNode[], fileMap: FileMap) {\n this.name = path.basename(fullPath)\n this.path = path.dirname(fullPath)\n this.fullPath = fullPath\n this.nodes = nodes\n this.fileMap = fileMap\n }\n\n static async create(fullPath: string, _deltaFileMap: DeltaFileMap = {}) {\n const [children, childMap] = await this.getChildren(fullPath)\n return new Directory(fullPath, children, childMap)\n }\n\n private static async getChildren(fullPath): Promise {\n const nodes: FSNode[] = []\n const fileNames = await fs.readdir(fullPath)\n let fileMap: FileMap = {}\n\n for (let fileName of fileNames) {\n const currentPath = path.join(fullPath, fileName)\n if (await isDirectory(currentPath)) {\n let dir = await Directory.create(currentPath)\n nodes.push(dir)\n fileMap = {...fileMap, ...dir.fileMap}\n } else {\n let file = await File.create(currentPath)\n nodes.push(file)\n fileMap[file.fullPath] = file\n }\n }\n return [nodes, fileMap]\n }\n\n /**\n * Calls a callback for every file of this directory and its sub directories\n */\n public walk(callback: (File) => void) {\n for (let child of this.nodes) {\n if (child instanceof Directory) {\n child.walk(callback)\n } else {\n callback(child)\n }\n }\n }\n\n public hasFile(fullPath: string) {\n !!this.fileMap[fullPath]\n }\n\n public getFile(fullPath: string): File {\n return this.fileMap[fullPath]\n }\n\n public listFiles(): string[] {\n return Object.keys(this.fileMap)\n }\n}\n\nconst isFromSchemaV1 = (filePath: string) => filePath.includes(baseV1Name)\n\n/** Convert an absolute file path to a partial path that starts after `/v1/` or `/v2/` */\nconst fromSchemaRoot = (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.split(baseV1Name)[1]\n : filePath.split(baseV2Name)[1]\n\n/** Updates a path from `/v1/` to `/v2/` or vice versa */\nconst switchSchemaPath = (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.replace(baseV1Name, baseV2Name)\n : filePath.replace(baseV2Name, baseV1Name)\n\n/**\n * @param directory1\n * @param directory2\n * @param directoryMapper Used to establish a common path between files of the two directories\n */\nconst diffDirectories = (\n directory1: Directory,\n directory2: Directory,\n directoryMapper = (p) => p\n ): [string[], string[], string[]] => {\n const fileList1 = directory1.listFiles().map(directoryMapper)\n const fileList2 = directory2.listFiles().map(directoryMapper)\n\n const sharedFiles = fileList1.filter((x) => fileList2.includes(x))\n const filesUniqueTo1 = fileList1.filter((x) => !sharedFiles.includes(x))\n const filesUniqueTo2 = fileList2.filter((x) => !sharedFiles.includes(x))\n\n return [filesUniqueTo1, sharedFiles, filesUniqueTo2]\n }\n\n// Main work\n;(async () => {\n const branchState = await getBranchDrift()\n\n // Is there a better way to handle this?\n if (branchState.commitsBehind > 0) {\n console.warn(\"Branch is currently behind main, might not reflect accurate state\\n\")\n }\n\n const fileChanges = Object.entries(await getChangedFiles()).filter(\n ([file]) => file.includes(baseV1Name) || file.includes(baseV2Name)\n )\n\n // If no file updates, skip\n if (fileChanges.length === 0) {\n console.log(`No updates detected in ${baseV1Name} or ${baseV2Name}, skipping...\\n`)\n return\n }\n\n // Read files from the FS\n const schemaV1 = await Directory.create(schemaV1Path)\n const schemaV2 = await Directory.create(schemaV2Path)\n\n // Sort out which files are shared by v1 and v2\n const [\n filesUniqueToSchemaV1,\n filesInBothSchemas,\n // filesUniqueToSchemaV2,\n ] = diffDirectories(schemaV1, schemaV2, fromSchemaRoot)\n\n const unknownChanges = fileChanges\n .filter(([, status]) => status === FileStatus.Unknown)\n .map(([file]) => file)\n\n const modifiedFiles = fileChanges\n .filter(([, status]) => status === FileStatus.Modified)\n .map(([file]) => file)\n\n const addedFiles = fileChanges\n .filter(([, status]) => status === FileStatus.Added)\n .map(([file]) => file)\n\n // const deletedFiles = fileChanges\n // .filter(([, status]) => status === FileStatus.Deleted)\n // .map(([file]) => file)\n\n // const renamedFiles = fileChanges\n // .filter(([, status]) => status === FileStatus.Renamed)\n // .map(([file]) => file)\n\n if (unknownChanges.length > 0) {\n console.warn(\n \"File changes detect with unknown git status, please verify the following and update the schema drift script\\n\" +\n unknownChanges.map((file) => `- ${file}\\n`)\n )\n }\n\n // Scenarios\n //\n // For files that exist in both places\n\n // File A was modified in (v1|v2), should it also be modified in (v2|v1)?\n modifiedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesInBothSchemas.includes(file))\n .forEach(([, filePath]) => {\n if (isFromSchemaV1(filePath)) {\n const schemaV1File = schemaV1.getFile(filePath)\n const schemaV2File = schemaV2.getFile(switchSchemaPath(filePath))\n\n // Both files are the same now, nothing to do here\n if (schemaV1File.hash === schemaV2File.hash) return\n\n console.warn(\n `${schemaV1File.relativePath} has been modified, should this update also happen in ${schemaV2File.relativePath}?`\n )\n } else {\n const schemaV2File = schemaV2.getFile(filePath)\n const schemaV1File = schemaV1.getFile(switchSchemaPath(filePath))\n\n // The files are the same, skip\n if (schemaV2File.hash === schemaV1File.hash) return\n\n console.warn(\n `${schemaV2File.relativePath} has been modified, should this update also happen in ${schemaV1File.relativePath}?`\n )\n }\n })\n\n // For files added during transition\n\n // File was added to v1, should it also exist in v2?\n addedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesUniqueToSchemaV1.includes(file))\n .forEach(([, filePath]) => {\n const file = schemaV1.getFile(filePath)\n console.warn(\n `${file.relativePath} was added to v1, should it also be added to v2?`\n )\n })\n\n // For updates in v1 that don't match to V2\n\n // An update was made to a file in v1, but it doesn't exist in V2. Double\n // check that there aren't updates required.\n modifiedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesUniqueToSchemaV1.includes(file))\n .forEach(([, filePath]) => {\n const file = schemaV1.getFile(filePath)\n console.warn(\n `${file.relativePath} was modified in v1, but doesn't exist in v2. Ensure no v2 changes are required.`\n )\n })\n})()\n\n \n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"classes/File.html":{"url":"classes/File.html","title":"class - File","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n Classes\n File\n\n\n\n \n Info\n \n \n Source\n \n\n\n\n \n \n File\n \n \n src/index.ts\n \n\n\n\n\n\n\n \n Index\n \n \n \n \n Properties\n \n \n \n \n \n \n fullPath\n \n \n hash\n \n \n name\n \n \n path\n \n \n relativePath\n \n \n \n \n\n \n \n Methods\n \n \n \n \n \n \n Static\n Async\n create\n \n \n \n \n\n\n\n\n\n \n \n\n\n \n Constructor\n \n \n \n \n Private\n constructor(fullPath: string, hash: string)\n \n \n \n \n Defined in src/index.ts:151\n \n \n\n \n \n \n Parameters :\n \n \n \n Name\n Type\n Optional\n \n \n \n \n fullPath\n \n \n string\n \n \n \n No\n \n \n \n \n hash\n \n \n string\n \n \n \n No\n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n Properties\n \n \n \n \n \n \n \n fullPath\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:149\n \n \n\n\n \n \n \n \n \n \n \n \n hash\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:151\n \n \n\n\n \n \n \n \n \n \n \n \n name\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:147\n \n \n\n\n \n \n \n \n \n \n \n \n path\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:148\n \n \n\n\n \n \n \n \n \n \n \n \n relativePath\n \n \n \n \n \n \n Type : string\n\n \n \n \n \n Defined in src/index.ts:150\n \n \n\n\n \n \n\n\n \n \n \n Methods\n \n \n \n \n \n \n \n Static\n Async\n create\n \n \n \n \n \n \n \n create(fullPath: string)\n \n \n\n\n \n \n Defined in src/index.ts:161\n \n \n\n\n \n \n\n \n Parameters :\n \n \n \n \n Name\n Type\n Optional\n \n \n \n \n fullPath\n \n string\n \n\n \n No\n \n\n\n \n \n \n \n \n \n \n Returns : unknown\n\n \n \n \n \n \n \n \n \n\n\n\n\n\n\n \n\n\n \n import {createReadStream, promises as fs} from \"fs\";\nimport path from \"path\";\nimport {createHash} from \"crypto\";\nimport {spawn} from \"child_process\";\n\nconst schemaV1Path = path.join(process.cwd(), `${process.env.SOURCE_DIR1}`).normalize()\nconst schemaV2Path = path.join(process.cwd(), `${process.env.SOURCE_DIR2}`).normalize()\n\nconst baseV1Name = path.basename(schemaV1Path)\nconst baseV2Name = path.basename(schemaV2Path)\n\n/** Represents the git status of a file */\nenum FileStatus {\n Deleted = \"deleted\",\n Modified = \"modified\",\n Added = \"added\",\n Renamed = \"renamed\",\n Unknown = \"unknown\",\n}\n\ntype DeltaFileMap = { [filePath: string]: FileStatus }\n\n/**\n * Converts git status short codes to their `FileStatus` equivalent.\n * @param change Single character shorthand git file state\n */\nconst GitChangeToFileStatus = (change: string) => {\n switch (change) {\n case \"M\":\n return FileStatus.Modified\n case \"A\":\n return FileStatus.Added\n case \"D\":\n return FileStatus.Deleted\n case \"R\":\n return FileStatus.Renamed\n default:\n return FileStatus.Unknown\n }\n}\n\ninterface BranchState {\n commitsAhead: number\n commitsBehind: number\n}\n\n/**\n * Gives status information on the current branch as compared to origin/main\n */\nconst getBranchDrift = (): Promise =>\n new Promise((resolve, reject) => {\n let output = \"\"\n const delta = spawn(\"git\", [\n \"rev-list\",\n \"--left-right\",\n \"--count\",\n \"origin/main...HEAD\",\n ])\n\n delta.stdout.on(\"data\", (data) => {\n output += data\n })\n\n delta.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to get branch drift\")\n } else {\n const commitChanges = output.match(/(\\d+)\\s+(\\d+)/)\n if (!commitChanges) {\n reject(\"Something was wrong with the branch drift output\")\n }\n\n let [, commitsBehind, commitsAhead] = Array.from(\n commitChanges!\n ).map((x) => Number(x))\n resolve({\n commitsAhead,\n commitsBehind,\n })\n }\n })\n })\n\n/**\n * Uses git to generate a delta map of files that have changed since main\n */\nconst getChangedFiles = (): Promise =>\n new Promise((resolve, reject) => {\n let changedBlob = \"\"\n const changed = spawn(\"git\", [\"diff\", \"--name-status\", \"origin/main\"])\n changed.stdout.on(\"data\", (data) => {\n changedBlob += data\n })\n\n changed.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to find changed files via git\")\n } else {\n resolve(\n changedBlob\n .split(\"\\n\")\n .map((status) => {\n const match = status.match(/([A-Z])\\s+(.+)/)\n if (match) {\n const [, status, filePath] = match\n return {\n [path.resolve(filePath)]: GitChangeToFileStatus(status),\n }\n }\n return {} as any\n })\n .reduce((a, b) => ({...a, ...b}), {})\n )\n }\n })\n })\n\n/**\n * Determines if a given path is a directory\n * @param filepath\n */\nconst isDirectory = async (filepath: string): Promise =>\n (await fs.lstat(filepath)).isDirectory()\n\n/**\n * Asynchronously generates an md5 of a file\n * @param filePath The full path to a file (include its name)\n */\nconst hashFile = (filePath: string): Promise =>\n new Promise((resolve, reject) => {\n const stream = createReadStream(filePath)\n const hash = createHash(\"md5\")\n\n stream.on(\"data\", (data: string) => hash.update(data, \"utf8\"))\n stream.on(\"end\", () => {\n resolve(hash.digest(\"hex\"))\n })\n stream.on(\"error\", (error) => {\n reject(error)\n })\n })\n\ntype FSNode = File | Directory\ntype FileMap = { [path: string]: File }\n\nclass File {\n name: string\n path: string\n fullPath: string\n relativePath: string\n hash: string\n\n private constructor(fullPath: string, hash: string) {\n this.name = path.basename(fullPath)\n this.path = path.dirname(fullPath)\n this.fullPath = fullPath\n this.relativePath = path.relative(process.cwd(), fullPath)\n this.hash = hash\n }\n\n static async create(fullPath: string) {\n return new File(fullPath, await hashFile(fullPath))\n }\n}\n\nclass Directory {\n name: string\n path: string\n fullPath: string\n nodes: Array\n fileMap: { [path: string]: File }\n\n private constructor(fullPath: string, nodes: FSNode[], fileMap: FileMap) {\n this.name = path.basename(fullPath)\n this.path = path.dirname(fullPath)\n this.fullPath = fullPath\n this.nodes = nodes\n this.fileMap = fileMap\n }\n\n static async create(fullPath: string, _deltaFileMap: DeltaFileMap = {}) {\n const [children, childMap] = await this.getChildren(fullPath)\n return new Directory(fullPath, children, childMap)\n }\n\n private static async getChildren(fullPath): Promise {\n const nodes: FSNode[] = []\n const fileNames = await fs.readdir(fullPath)\n let fileMap: FileMap = {}\n\n for (let fileName of fileNames) {\n const currentPath = path.join(fullPath, fileName)\n if (await isDirectory(currentPath)) {\n let dir = await Directory.create(currentPath)\n nodes.push(dir)\n fileMap = {...fileMap, ...dir.fileMap}\n } else {\n let file = await File.create(currentPath)\n nodes.push(file)\n fileMap[file.fullPath] = file\n }\n }\n return [nodes, fileMap]\n }\n\n /**\n * Calls a callback for every file of this directory and its sub directories\n */\n public walk(callback: (File) => void) {\n for (let child of this.nodes) {\n if (child instanceof Directory) {\n child.walk(callback)\n } else {\n callback(child)\n }\n }\n }\n\n public hasFile(fullPath: string) {\n !!this.fileMap[fullPath]\n }\n\n public getFile(fullPath: string): File {\n return this.fileMap[fullPath]\n }\n\n public listFiles(): string[] {\n return Object.keys(this.fileMap)\n }\n}\n\nconst isFromSchemaV1 = (filePath: string) => filePath.includes(baseV1Name)\n\n/** Convert an absolute file path to a partial path that starts after `/v1/` or `/v2/` */\nconst fromSchemaRoot = (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.split(baseV1Name)[1]\n : filePath.split(baseV2Name)[1]\n\n/** Updates a path from `/v1/` to `/v2/` or vice versa */\nconst switchSchemaPath = (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.replace(baseV1Name, baseV2Name)\n : filePath.replace(baseV2Name, baseV1Name)\n\n/**\n * @param directory1\n * @param directory2\n * @param directoryMapper Used to establish a common path between files of the two directories\n */\nconst diffDirectories = (\n directory1: Directory,\n directory2: Directory,\n directoryMapper = (p) => p\n ): [string[], string[], string[]] => {\n const fileList1 = directory1.listFiles().map(directoryMapper)\n const fileList2 = directory2.listFiles().map(directoryMapper)\n\n const sharedFiles = fileList1.filter((x) => fileList2.includes(x))\n const filesUniqueTo1 = fileList1.filter((x) => !sharedFiles.includes(x))\n const filesUniqueTo2 = fileList2.filter((x) => !sharedFiles.includes(x))\n\n return [filesUniqueTo1, sharedFiles, filesUniqueTo2]\n }\n\n// Main work\n;(async () => {\n const branchState = await getBranchDrift()\n\n // Is there a better way to handle this?\n if (branchState.commitsBehind > 0) {\n console.warn(\"Branch is currently behind main, might not reflect accurate state\\n\")\n }\n\n const fileChanges = Object.entries(await getChangedFiles()).filter(\n ([file]) => file.includes(baseV1Name) || file.includes(baseV2Name)\n )\n\n // If no file updates, skip\n if (fileChanges.length === 0) {\n console.log(`No updates detected in ${baseV1Name} or ${baseV2Name}, skipping...\\n`)\n return\n }\n\n // Read files from the FS\n const schemaV1 = await Directory.create(schemaV1Path)\n const schemaV2 = await Directory.create(schemaV2Path)\n\n // Sort out which files are shared by v1 and v2\n const [\n filesUniqueToSchemaV1,\n filesInBothSchemas,\n // filesUniqueToSchemaV2,\n ] = diffDirectories(schemaV1, schemaV2, fromSchemaRoot)\n\n const unknownChanges = fileChanges\n .filter(([, status]) => status === FileStatus.Unknown)\n .map(([file]) => file)\n\n const modifiedFiles = fileChanges\n .filter(([, status]) => status === FileStatus.Modified)\n .map(([file]) => file)\n\n const addedFiles = fileChanges\n .filter(([, status]) => status === FileStatus.Added)\n .map(([file]) => file)\n\n // const deletedFiles = fileChanges\n // .filter(([, status]) => status === FileStatus.Deleted)\n // .map(([file]) => file)\n\n // const renamedFiles = fileChanges\n // .filter(([, status]) => status === FileStatus.Renamed)\n // .map(([file]) => file)\n\n if (unknownChanges.length > 0) {\n console.warn(\n \"File changes detect with unknown git status, please verify the following and update the schema drift script\\n\" +\n unknownChanges.map((file) => `- ${file}\\n`)\n )\n }\n\n // Scenarios\n //\n // For files that exist in both places\n\n // File A was modified in (v1|v2), should it also be modified in (v2|v1)?\n modifiedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesInBothSchemas.includes(file))\n .forEach(([, filePath]) => {\n if (isFromSchemaV1(filePath)) {\n const schemaV1File = schemaV1.getFile(filePath)\n const schemaV2File = schemaV2.getFile(switchSchemaPath(filePath))\n\n // Both files are the same now, nothing to do here\n if (schemaV1File.hash === schemaV2File.hash) return\n\n console.warn(\n `${schemaV1File.relativePath} has been modified, should this update also happen in ${schemaV2File.relativePath}?`\n )\n } else {\n const schemaV2File = schemaV2.getFile(filePath)\n const schemaV1File = schemaV1.getFile(switchSchemaPath(filePath))\n\n // The files are the same, skip\n if (schemaV2File.hash === schemaV1File.hash) return\n\n console.warn(\n `${schemaV2File.relativePath} has been modified, should this update also happen in ${schemaV1File.relativePath}?`\n )\n }\n })\n\n // For files added during transition\n\n // File was added to v1, should it also exist in v2?\n addedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesUniqueToSchemaV1.includes(file))\n .forEach(([, filePath]) => {\n const file = schemaV1.getFile(filePath)\n console.warn(\n `${file.relativePath} was added to v1, should it also be added to v2?`\n )\n })\n\n // For updates in v1 that don't match to V2\n\n // An update was made to a file in v1, but it doesn't exist in V2. Double\n // check that there aren't updates required.\n modifiedFiles\n .map((filePath) => [fromSchemaRoot(filePath), filePath])\n .filter(([file]) => filesUniqueToSchemaV1.includes(file))\n .forEach(([, filePath]) => {\n const file = schemaV1.getFile(filePath)\n console.warn(\n `${file.relativePath} was modified in v1, but doesn't exist in v2. Ensure no v2 changes are required.`\n )\n })\n})()\n\n \n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"coverage.html":{"url":"coverage.html","title":"coverage - coverage","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Documentation coverage\n\n\n\n \n\n\n\n \n \n File\n Type\n Identifier\n Statements\n \n \n \n \n \n \n src/index.ts\n \n class\n Directory\n \n 7 %\n (1/13)\n \n \n \n \n \n src/index.ts\n \n class\n File\n \n 0 %\n (0/8)\n \n \n \n \n \n src/index.ts\n \n interface\n BranchState\n \n 0 %\n (0/3)\n \n \n \n \n \n src/index.ts\n \n variable\n baseV1Name\n \n 0 %\n (0/1)\n \n \n \n \n \n src/index.ts\n \n variable\n baseV2Name\n \n 0 %\n (0/1)\n \n \n \n \n \n src/index.ts\n \n variable\n diffDirectories\n \n 0 %\n (0/1)\n \n \n \n \n \n src/index.ts\n \n variable\n fromSchemaRoot\n \n 100 %\n (1/1)\n \n \n \n \n \n src/index.ts\n \n variable\n getBranchDrift\n \n 100 %\n (1/1)\n \n \n \n \n \n src/index.ts\n \n variable\n getChangedFiles\n \n 100 %\n (1/1)\n \n \n \n \n \n src/index.ts\n \n variable\n GitChangeToFileStatus\n \n 100 %\n (1/1)\n \n \n \n \n \n src/index.ts\n \n variable\n hashFile\n \n 100 %\n (1/1)\n \n \n \n \n \n src/index.ts\n \n variable\n isDirectory\n \n 100 %\n (1/1)\n \n \n \n \n \n src/index.ts\n \n variable\n isFromSchemaV1\n \n 0 %\n (0/1)\n \n \n \n \n \n src/index.ts\n \n variable\n schemaV1Path\n \n 0 %\n (0/1)\n \n \n \n \n \n src/index.ts\n \n variable\n schemaV2Path\n \n 0 %\n (0/1)\n \n \n \n \n \n src/index.ts\n \n variable\n switchSchemaPath\n \n 100 %\n (1/1)\n \n \n \n\n\n\n\n\n new Tablesort(document.getElementById('coverage-table'));\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"miscellaneous/enumerations.html":{"url":"miscellaneous/enumerations.html","title":"miscellaneous-enumerations - enumerations","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Miscellaneous\n Enumerations\n\n\n\n Index\n \n \n \n \n \n \n FileStatus (src/.../index.ts)\n \n \n \n \n \n \n\n\n src/index.ts\n \n \n \n \n \n \n FileStatus\n \n \n \n \n Represents the git status of a file\n\n \n \n \n \n Deleted\n \n \n \n \n Value : deleted\n \n \n \n \n Modified\n \n \n \n \n Value : modified\n \n \n \n \n Added\n \n \n \n \n Value : added\n \n \n \n \n Renamed\n \n \n \n \n Value : renamed\n \n \n \n \n Unknown\n \n \n \n \n Value : unknown\n \n \n \n \n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"index.html":{"url":"index.html","title":"overview - index","body":"\n \n\n\n\n Overview\n\n \n\n \n \n \n \n \n 2 Classes\n \n \n \n \n \n \n \n 1 Interface\n \n \n \n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"modules.html":{"url":"modules.html","title":"modules - modules","body":"\n \n\n\n\n\n Modules\n\n\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"properties.html":{"url":"properties.html","title":"package-properties - properties","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n Properties\n \n \n \n Version : 0.0.0\n \n Description : Java Design Patterns schema difference\n \n Keywords : schema-diff\n \n Homepage : https://github.com/AlexRogalskiy/java-patterns/tree/master/packages/schema-diff\n \n Bugs : https://github.com/AlexRogalskiy/java-patterns/issues\n \n License : GPL-3.0\n \n Repository : git+https://github.com/AlexRogalskiy/java-patterns.git\n \n Author : Alexander Rogalskiy\n \n\n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"miscellaneous/typealiases.html":{"url":"miscellaneous/typealiases.html","title":"miscellaneous-typealiases - typealiases","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Miscellaneous\n Type aliases\n\n\n\n Index\n \n \n \n \n \n \n DeltaFileMap (src/.../index.ts)\n \n \n FileMap (src/.../index.ts)\n \n \n FSNode (src/.../index.ts)\n \n \n \n \n \n \n\n\n src/index.ts\n \n \n \n \n \n \n DeltaFileMap\n \n \n \n \n literal type\n\n \n \n \n \n \n \n \n \n \n FileMap\n \n \n \n \n literal type\n\n \n \n \n \n \n \n \n \n \n FSNode\n \n \n \n \n File | Directory\n\n \n \n \n \n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"},"miscellaneous/variables.html":{"url":"miscellaneous/variables.html","title":"miscellaneous-variables - variables","body":"\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Miscellaneous\n Variables\n\n\n\n Index\n \n \n \n \n \n \n baseV1Name (src/.../index.ts)\n \n \n baseV2Name (src/.../index.ts)\n \n \n diffDirectories (src/.../index.ts)\n \n \n fromSchemaRoot (src/.../index.ts)\n \n \n getBranchDrift (src/.../index.ts)\n \n \n getChangedFiles (src/.../index.ts)\n \n \n GitChangeToFileStatus (src/.../index.ts)\n \n \n hashFile (src/.../index.ts)\n \n \n isDirectory (src/.../index.ts)\n \n \n isFromSchemaV1 (src/.../index.ts)\n \n \n schemaV1Path (src/.../index.ts)\n \n \n schemaV2Path (src/.../index.ts)\n \n \n switchSchemaPath (src/.../index.ts)\n \n \n \n \n \n \n\n\n src/index.ts\n \n \n \n \n \n \n \n baseV1Name\n \n \n \n \n \n \n Default value : path.basename(schemaV1Path)\n \n \n\n\n \n \n \n \n \n \n \n \n baseV2Name\n \n \n \n \n \n \n Default value : path.basename(schemaV2Path)\n \n \n\n\n \n \n \n \n \n \n \n \n diffDirectories\n \n \n \n \n \n \n Default value : (\n directory1: Directory,\n directory2: Directory,\n directoryMapper = (p) => p\n ): [string[], string[], string[]] => {\n const fileList1 = directory1.listFiles().map(directoryMapper)\n const fileList2 = directory2.listFiles().map(directoryMapper)\n\n const sharedFiles = fileList1.filter((x) => fileList2.includes(x))\n const filesUniqueTo1 = fileList1.filter((x) => !sharedFiles.includes(x))\n const filesUniqueTo2 = fileList2.filter((x) => !sharedFiles.includes(x))\n\n return [filesUniqueTo1, sharedFiles, filesUniqueTo2]\n }\n \n \n\n\n \n \n \n \n \n \n \n \n fromSchemaRoot\n \n \n \n \n \n \n Default value : (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.split(baseV1Name)[1]\n : filePath.split(baseV2Name)[1]\n \n \n\n \n \n Convert an absolute file path to a partial path that starts after /v1/ or /v2/\n\n \n \n\n \n \n \n \n \n \n \n \n getBranchDrift\n \n \n \n \n \n \n Default value : (): Promise =>\n new Promise((resolve, reject) => {\n let output = \"\"\n const delta = spawn(\"git\", [\n \"rev-list\",\n \"--left-right\",\n \"--count\",\n \"origin/main...HEAD\",\n ])\n\n delta.stdout.on(\"data\", (data) => {\n output += data\n })\n\n delta.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to get branch drift\")\n } else {\n const commitChanges = output.match(/(\\d+)\\s+(\\d+)/)\n if (!commitChanges) {\n reject(\"Something was wrong with the branch drift output\")\n }\n\n let [, commitsBehind, commitsAhead] = Array.from(\n commitChanges!\n ).map((x) => Number(x))\n resolve({\n commitsAhead,\n commitsBehind,\n })\n }\n })\n })\n \n \n\n \n \n Gives status information on the current branch as compared to origin/main\n\n \n \n\n \n \n \n \n \n \n \n \n getChangedFiles\n \n \n \n \n \n \n Default value : (): Promise =>\n new Promise((resolve, reject) => {\n let changedBlob = \"\"\n const changed = spawn(\"git\", [\"diff\", \"--name-status\", \"origin/main\"])\n changed.stdout.on(\"data\", (data) => {\n changedBlob += data\n })\n\n changed.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\"Failed to find changed files via git\")\n } else {\n resolve(\n changedBlob\n .split(\"\\n\")\n .map((status) => {\n const match = status.match(/([A-Z])\\s+(.+)/)\n if (match) {\n const [, status, filePath] = match\n return {\n [path.resolve(filePath)]: GitChangeToFileStatus(status),\n }\n }\n return {} as any\n })\n .reduce((a, b) => ({...a, ...b}), {})\n )\n }\n })\n })\n \n \n\n \n \n Uses git to generate a delta map of files that have changed since main\n\n \n \n\n \n \n \n \n \n \n \n \n GitChangeToFileStatus\n \n \n \n \n \n \n Default value : (change: string) => {\n switch (change) {\n case \"M\":\n return FileStatus.Modified\n case \"A\":\n return FileStatus.Added\n case \"D\":\n return FileStatus.Deleted\n case \"R\":\n return FileStatus.Renamed\n default:\n return FileStatus.Unknown\n }\n}\n \n \n\n \n \n Converts git status short codes to their FileStatus equivalent.\n\n \n \n\n \n \n \n \n \n \n \n \n hashFile\n \n \n \n \n \n \n Default value : (filePath: string): Promise =>\n new Promise((resolve, reject) => {\n const stream = createReadStream(filePath)\n const hash = createHash(\"md5\")\n\n stream.on(\"data\", (data: string) => hash.update(data, \"utf8\"))\n stream.on(\"end\", () => {\n resolve(hash.digest(\"hex\"))\n })\n stream.on(\"error\", (error) => {\n reject(error)\n })\n })\n \n \n\n \n \n Asynchronously generates an md5 of a file\n\n \n \n\n \n \n \n \n \n \n \n \n isDirectory\n \n \n \n \n \n \n Default value : async (filepath: string): Promise =>\n (await fs.lstat(filepath)).isDirectory()\n \n \n\n \n \n Determines if a given path is a directory\n\n \n \n\n \n \n \n \n \n \n \n \n isFromSchemaV1\n \n \n \n \n \n \n Default value : (filePath: string) => filePath.includes(baseV1Name)\n \n \n\n\n \n \n \n \n \n \n \n \n schemaV1Path\n \n \n \n \n \n \n Default value : path.join(process.cwd(), `${process.env.SOURCE_DIR1}`).normalize()\n \n \n\n\n \n \n \n \n \n \n \n \n schemaV2Path\n \n \n \n \n \n \n Default value : path.join(process.cwd(), `${process.env.SOURCE_DIR2}`).normalize()\n \n \n\n\n \n \n \n \n \n \n \n \n switchSchemaPath\n \n \n \n \n \n \n Default value : (filePath: string) =>\n isFromSchemaV1(filePath)\n ? filePath.replace(baseV1Name, baseV2Name)\n : filePath.replace(baseV2Name, baseV1Name)\n \n \n\n \n \n Updates a path from /v1/ to /v2/ or vice versa\n\n \n \n\n \n \n\n\n\n\n \n \n results matching \"\"\n \n \n \n No results matching \"\"\n \n\n"}}
}