diff --git a/.eslintcache b/.eslintcache index d3cdf08..e60407d 100644 --- a/.eslintcache +++ b/.eslintcache @@ -1 +1 @@ -[{"/home/mauve/programming/natakanu/app/core/index.js":"1","/home/mauve/programming/natakanu/app/Routes.js":"2","/home/mauve/programming/natakanu/app/actions/counter.js":"3","/home/mauve/programming/natakanu/app/components/Counter.js":"4","/home/mauve/programming/natakanu/app/components/Home.js":"5","/home/mauve/programming/natakanu/app/components/MainMenu.js":"6","/home/mauve/programming/natakanu/app/components/NewProject.js":"7","/home/mauve/programming/natakanu/app/components/OpenLibrary.js":"8","/home/mauve/programming/natakanu/app/components/OpenProject.js":"9","/home/mauve/programming/natakanu/app/components/ProjectView.js":"10","/home/mauve/programming/natakanu/app/containers/App.js":"11","/home/mauve/programming/natakanu/app/containers/CounterPage.js":"12","/home/mauve/programming/natakanu/app/containers/HomePage.js":"13","/home/mauve/programming/natakanu/app/containers/NewProjectContainer.js":"14","/home/mauve/programming/natakanu/app/containers/OpenLibraryContainer.js":"15","/home/mauve/programming/natakanu/app/containers/OpenProjectContainer.js":"16","/home/mauve/programming/natakanu/app/containers/Root.js":"17","/home/mauve/programming/natakanu/app/index.js":"18","/home/mauve/programming/natakanu/app/main.dev.js":"19","/home/mauve/programming/natakanu/app/menu.js":"20","/home/mauve/programming/natakanu/app/reducers/counter.js":"21","/home/mauve/programming/natakanu/app/reducers/index.js":"22","/home/mauve/programming/natakanu/app/reducers/types.js":"23","/home/mauve/programming/natakanu/app/store/configureStore.dev.js":"24","/home/mauve/programming/natakanu/app/store/configureStore.js":"25","/home/mauve/programming/natakanu/app/store/configureStore.prod.js":"26","/home/mauve/programming/natakanu/babel.config.js":"27","/home/mauve/programming/natakanu/configs/webpack.config.base.js":"28","/home/mauve/programming/natakanu/configs/webpack.config.eslint.js":"29","/home/mauve/programming/natakanu/configs/webpack.config.main.prod.babel.js":"30","/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.babel.js":"31","/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.dll.babel.js":"32","/home/mauve/programming/natakanu/configs/webpack.config.renderer.prod.babel.js":"33","/home/mauve/programming/natakanu/internals/mocks/fileMock.js":"34","/home/mauve/programming/natakanu/internals/scripts/BabelRegister.js":"35","/home/mauve/programming/natakanu/internals/scripts/CheckBuildsExist.js":"36","/home/mauve/programming/natakanu/internals/scripts/CheckNativeDep.js":"37","/home/mauve/programming/natakanu/internals/scripts/CheckNodeEnv.js":"38","/home/mauve/programming/natakanu/internals/scripts/CheckPortInUse.js":"39","/home/mauve/programming/natakanu/internals/scripts/CheckYarn.js":"40","/home/mauve/programming/natakanu/internals/scripts/ElectronRebuild.js":"41","/home/mauve/programming/natakanu/test/actions/counter.spec.js":"42","/home/mauve/programming/natakanu/test/components/Counter.spec.js":"43","/home/mauve/programming/natakanu/test/containers/CounterPage.spec.js":"44","/home/mauve/programming/natakanu/test/e2e/HomePage.e2e.js":"45","/home/mauve/programming/natakanu/test/e2e/helpers.js":"46","/home/mauve/programming/natakanu/test/example.js":"47","/home/mauve/programming/natakanu/test/reducers/counter.spec.js":"48","/home/mauve/programming/natakanu/app/core/Account.js":"49","/home/mauve/programming/natakanu/app/core/Project.js":"50","/home/mauve/programming/natakanu/test/core/basic.spec.js":"51","/home/mauve/programming/natakanu/app/core/Database.js":"52","/home/mauve/programming/natakanu/app/core/ProjectStore.js":"53","/home/mauve/programming/natakanu/app/core/urlParser.js":"54","/home/mauve/programming/natakanu/app/core/AccountStore.js":"55","/home/mauve/programming/natakanu/app/actions/core.js":"56","/home/mauve/programming/natakanu/app/components/Test.js":"57","/home/mauve/programming/natakanu/app/constants/core.js":"58","/home/mauve/programming/natakanu/app/core/load.js":"59","/home/mauve/programming/natakanu/app/reducers/core.js":"60","/home/mauve/programming/natakanu/app/containers/TestPage.js":"61"},{"size":1395,"mtime":1583778386240,"results":"62","hashOfConfig":"63"},{"size":870,"mtime":1583533362159,"results":"64","hashOfConfig":"63"},{"size":710,"mtime":1581532732568,"results":"65","hashOfConfig":"63"},{"size":1762,"mtime":1581532732572,"results":"66","hashOfConfig":"63"},{"size":449,"mtime":1581532732572,"results":"67","hashOfConfig":"63"},{"size":715,"mtime":1583533346507,"results":"68","hashOfConfig":"63"},{"size":660,"mtime":1582237242667,"results":"69","hashOfConfig":"63"},{"size":360,"mtime":1582153244965,"results":"70","hashOfConfig":"63"},{"size":433,"mtime":1582237242667,"results":"71","hashOfConfig":"63"},{"size":1255,"mtime":1582153244965,"results":"72","hashOfConfig":"63"},{"size":243,"mtime":1581532732572,"results":"73","hashOfConfig":"63"},{"size":431,"mtime":1582153244965,"results":"74","hashOfConfig":"63"},{"size":235,"mtime":1581532732572,"results":"75","hashOfConfig":"63"},{"size":252,"mtime":1581532732572,"results":"76","hashOfConfig":"63"},{"size":253,"mtime":1581532732572,"results":"77","hashOfConfig":"63"},{"size":253,"mtime":1581532732572,"results":"78","hashOfConfig":"63"},{"size":506,"mtime":1581532732572,"results":"79","hashOfConfig":"63"},{"size":520,"mtime":1582153244965,"results":"80","hashOfConfig":"63"},{"size":2915,"mtime":1583531813474,"results":"81","hashOfConfig":"63"},{"size":7199,"mtime":1581532732572,"results":"82","hashOfConfig":"63"},{"size":361,"mtime":1581532732572,"results":"83","hashOfConfig":"63"},{"size":331,"mtime":1583533992089,"results":"84","hashOfConfig":"63"},{"size":338,"mtime":1583531679361,"results":"85","hashOfConfig":"63"},{"size":2130,"mtime":1583531813474,"results":"86","hashOfConfig":"63"},{"size":352,"mtime":1582153244965,"results":"87","hashOfConfig":"63"},{"size":687,"mtime":1581532732572,"results":"88","hashOfConfig":"63"},{"size":2135,"mtime":1582153244965,"results":"89","hashOfConfig":"63"},{"size":987,"mtime":1582153244965,"results":"90","hashOfConfig":"63"},{"size":169,"mtime":1582153244965,"results":"91","hashOfConfig":"63"},{"size":1766,"mtime":1582153244965,"results":"92","hashOfConfig":"63"},{"size":6783,"mtime":1582153244969,"results":"93","hashOfConfig":"63"},{"size":1715,"mtime":1582153244969,"results":"94","hashOfConfig":"63"},{"size":5155,"mtime":1582153244969,"results":"95","hashOfConfig":"63"},{"size":33,"mtime":1582153244969,"results":"96","hashOfConfig":"63"},{"size":104,"mtime":1582153244969,"results":"97","hashOfConfig":"63"},{"size":784,"mtime":1582153244969,"results":"98","hashOfConfig":"63"},{"size":2015,"mtime":1582153244969,"results":"99","hashOfConfig":"63"},{"size":396,"mtime":1581532732576,"results":"100","hashOfConfig":"63"},{"size":502,"mtime":1581532732576,"results":"101","hashOfConfig":"63"},{"size":188,"mtime":1582153244969,"results":"102","hashOfConfig":"63"},{"size":750,"mtime":1582153244969,"results":"103","hashOfConfig":"63"},{"size":1357,"mtime":1582153244969,"results":"104","hashOfConfig":"105"},{"size":1983,"mtime":1582153244969,"results":"106","hashOfConfig":"105"},{"size":1824,"mtime":1582234829686,"results":"107","hashOfConfig":"105"},{"size":2648,"mtime":1582153244969,"results":"108","hashOfConfig":"105"},{"size":161,"mtime":1582153244969,"results":"109","hashOfConfig":"105"},{"size":109,"mtime":1582153244969,"results":"110","hashOfConfig":"105"},{"size":706,"mtime":1582153244969,"results":"111","hashOfConfig":"105"},{"size":2305,"mtime":1583526234332,"results":"112","hashOfConfig":"63"},{"size":1052,"mtime":1583526392120,"results":"113","hashOfConfig":"63"},{"size":1308,"mtime":1583309334492,"results":"114","hashOfConfig":"105"},{"size":1082,"mtime":1583526377544,"results":"115","hashOfConfig":"63"},{"size":930,"mtime":1583309776869,"results":"116","hashOfConfig":"63"},{"size":879,"mtime":1583306326392,"results":"117","hashOfConfig":"63"},{"size":1365,"mtime":1583526264267,"results":"118","hashOfConfig":"63"},{"size":271,"mtime":1583776720680,"results":"119","hashOfConfig":"63"},{"size":677,"mtime":1583777051546,"results":"120","hashOfConfig":"63"},{"size":385,"mtime":1582851611035,"results":"121","hashOfConfig":"63"},{"size":417,"mtime":1583777051546,"results":"122","hashOfConfig":"63"},{"size":347,"mtime":1583777051546,"results":"123","hashOfConfig":"63"},{"size":391,"mtime":1583534243990,"results":"124","hashOfConfig":"63"},{"filePath":"125","messages":"126","errorCount":4,"warningCount":0,"fixableErrorCount":4,"fixableWarningCount":0,"source":null},"1bt96a6",{"filePath":"127","messages":"128","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"129","messages":"130","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"131","messages":"132","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"133","messages":"134","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"135","messages":"136","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"137","messages":"138","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"139","messages":"140","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"141","messages":"142","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"143","messages":"144","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"145","messages":"146","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"147","messages":"148","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"149","messages":"150","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"151","messages":"152","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"153","messages":"154","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"155","messages":"156","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"157","messages":"158","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"159","messages":"160","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"161","messages":"162","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"163","messages":"164","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"165","messages":"166","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"167","messages":"168","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"169","messages":"170","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"171","messages":"172","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"173","messages":"174","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"175","messages":"176","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"177","messages":"178","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"179","messages":"180","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"181","messages":"182","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"183","messages":"184","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"185","messages":"186","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"187","messages":"188","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"189","messages":"190","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"191","messages":"192","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"193","messages":"194","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"195","messages":"196","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"197","messages":"198","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"199","messages":"200","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"201","messages":"202","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"203","messages":"204","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"205","messages":"206","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"207","messages":"208","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1jyxw9w",{"filePath":"209","messages":"210","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"211","messages":"212","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"213","messages":"214","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"215","messages":"216","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"217","messages":"218","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"219","messages":"220","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"221","messages":"222","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"223","messages":"224","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"225","messages":"226","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"227","messages":"228","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"229","messages":"230","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"231","messages":"232","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"233","messages":"234","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"235","messages":"236","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"237","messages":"238","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"239","messages":"240","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"241","messages":"242","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"243","messages":"244","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"245","messages":"246","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/home/mauve/programming/natakanu/app/core/index.js",["247","248","249","250"],"/home/mauve/programming/natakanu/app/Routes.js",[],"/home/mauve/programming/natakanu/app/actions/counter.js",[],"/home/mauve/programming/natakanu/app/components/Counter.js",[],"/home/mauve/programming/natakanu/app/components/Home.js",[],"/home/mauve/programming/natakanu/app/components/MainMenu.js",[],"/home/mauve/programming/natakanu/app/components/NewProject.js",[],"/home/mauve/programming/natakanu/app/components/OpenLibrary.js",[],"/home/mauve/programming/natakanu/app/components/OpenProject.js",[],"/home/mauve/programming/natakanu/app/components/ProjectView.js",[],"/home/mauve/programming/natakanu/app/containers/App.js",[],"/home/mauve/programming/natakanu/app/containers/CounterPage.js",[],"/home/mauve/programming/natakanu/app/containers/HomePage.js",[],"/home/mauve/programming/natakanu/app/containers/NewProjectContainer.js",[],"/home/mauve/programming/natakanu/app/containers/OpenLibraryContainer.js",[],"/home/mauve/programming/natakanu/app/containers/OpenProjectContainer.js",[],"/home/mauve/programming/natakanu/app/containers/Root.js",[],"/home/mauve/programming/natakanu/app/index.js",[],"/home/mauve/programming/natakanu/app/main.dev.js",[],"/home/mauve/programming/natakanu/app/menu.js",[],"/home/mauve/programming/natakanu/app/reducers/counter.js",[],"/home/mauve/programming/natakanu/app/reducers/index.js",[],"/home/mauve/programming/natakanu/app/reducers/types.js",["251"],"/home/mauve/programming/natakanu/app/store/configureStore.dev.js",[],"/home/mauve/programming/natakanu/app/store/configureStore.js",[],"/home/mauve/programming/natakanu/app/store/configureStore.prod.js",[],"/home/mauve/programming/natakanu/babel.config.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.base.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.eslint.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.main.prod.babel.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.babel.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.dll.babel.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.renderer.prod.babel.js",[],"/home/mauve/programming/natakanu/internals/mocks/fileMock.js",[],"/home/mauve/programming/natakanu/internals/scripts/BabelRegister.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckBuildsExist.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckNativeDep.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckNodeEnv.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckPortInUse.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckYarn.js",[],"/home/mauve/programming/natakanu/internals/scripts/ElectronRebuild.js",[],"/home/mauve/programming/natakanu/test/actions/counter.spec.js",[],"/home/mauve/programming/natakanu/test/components/Counter.spec.js",[],"/home/mauve/programming/natakanu/test/containers/CounterPage.spec.js",[],"/home/mauve/programming/natakanu/test/e2e/HomePage.e2e.js",[],"/home/mauve/programming/natakanu/test/e2e/helpers.js",[],"/home/mauve/programming/natakanu/test/example.js",[],"/home/mauve/programming/natakanu/test/reducers/counter.spec.js",[],"/home/mauve/programming/natakanu/app/core/Account.js",[],"/home/mauve/programming/natakanu/app/core/Project.js",[],"/home/mauve/programming/natakanu/test/core/basic.spec.js",[],"/home/mauve/programming/natakanu/app/core/Database.js",[],"/home/mauve/programming/natakanu/app/core/ProjectStore.js",[],"/home/mauve/programming/natakanu/app/core/urlParser.js",[],"/home/mauve/programming/natakanu/app/core/AccountStore.js",[],"/home/mauve/programming/natakanu/app/actions/core.js",[],"/home/mauve/programming/natakanu/app/components/Test.js",["252"],"/home/mauve/programming/natakanu/app/constants/core.js",[],"/home/mauve/programming/natakanu/app/core/load.js",[],"/home/mauve/programming/natakanu/app/reducers/core.js",["253"],"/home/mauve/programming/natakanu/app/containers/TestPage.js",[],{"ruleId":"254","severity":2,"message":"255","line":4,"column":34,"nodeType":null,"endLine":4,"endColumn":34,"fix":"256"},{"ruleId":"254","severity":2,"message":"255","line":26,"column":52,"nodeType":null,"endLine":26,"endColumn":52,"fix":"257"},{"ruleId":"254","severity":2,"message":"255","line":29,"column":8,"nodeType":null,"endLine":29,"endColumn":8,"fix":"258"},{"ruleId":"254","severity":2,"message":"255","line":30,"column":54,"nodeType":null,"endLine":30,"endColumn":54,"fix":"259"},{"ruleId":"260","severity":1,"message":"261","line":9,"column":12,"nodeType":"262","endLine":9,"endColumn":15},{"ruleId":"260","severity":1,"message":"261","line":9,"column":9,"nodeType":"262","endLine":9,"endColumn":12},{"ruleId":"260","severity":1,"message":"261","line":6,"column":37,"nodeType":"262","endLine":6,"endColumn":40},"prettier/prettier","Insert `;`",{"range":"263","text":"264"},{"range":"265","text":"264"},{"range":"266","text":"264"},{"range":"267","text":"264"},"flowtype/no-weak-types","Unexpected use of weak type \"any\"","AnyTypeAnnotation",[125,125],";",[785,785],[849,849],[903,903]] \ No newline at end of file +[{"/home/mauve/programming/natakanu/app/core/index.js":"1","/home/mauve/programming/natakanu/app/Routes.js":"2","/home/mauve/programming/natakanu/app/actions/counter.js":"3","/home/mauve/programming/natakanu/app/components/Counter.js":"4","/home/mauve/programming/natakanu/app/components/Home.js":"5","/home/mauve/programming/natakanu/app/components/MainMenu.js":"6","/home/mauve/programming/natakanu/app/components/NewProject.js":"7","/home/mauve/programming/natakanu/app/components/OpenLibrary.js":"8","/home/mauve/programming/natakanu/app/components/OpenProject.js":"9","/home/mauve/programming/natakanu/app/components/ProjectView.js":"10","/home/mauve/programming/natakanu/app/containers/App.js":"11","/home/mauve/programming/natakanu/app/containers/CounterPage.js":"12","/home/mauve/programming/natakanu/app/containers/HomePage.js":"13","/home/mauve/programming/natakanu/app/containers/NewProjectContainer.js":"14","/home/mauve/programming/natakanu/app/containers/OpenLibraryContainer.js":"15","/home/mauve/programming/natakanu/app/containers/OpenProjectContainer.js":"16","/home/mauve/programming/natakanu/app/containers/Root.js":"17","/home/mauve/programming/natakanu/app/index.js":"18","/home/mauve/programming/natakanu/app/main.dev.js":"19","/home/mauve/programming/natakanu/app/menu.js":"20","/home/mauve/programming/natakanu/app/reducers/counter.js":"21","/home/mauve/programming/natakanu/app/reducers/index.js":"22","/home/mauve/programming/natakanu/app/reducers/types.js":"23","/home/mauve/programming/natakanu/app/store/configureStore.dev.js":"24","/home/mauve/programming/natakanu/app/store/configureStore.js":"25","/home/mauve/programming/natakanu/app/store/configureStore.prod.js":"26","/home/mauve/programming/natakanu/babel.config.js":"27","/home/mauve/programming/natakanu/configs/webpack.config.base.js":"28","/home/mauve/programming/natakanu/configs/webpack.config.eslint.js":"29","/home/mauve/programming/natakanu/configs/webpack.config.main.prod.babel.js":"30","/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.babel.js":"31","/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.dll.babel.js":"32","/home/mauve/programming/natakanu/configs/webpack.config.renderer.prod.babel.js":"33","/home/mauve/programming/natakanu/internals/mocks/fileMock.js":"34","/home/mauve/programming/natakanu/internals/scripts/BabelRegister.js":"35","/home/mauve/programming/natakanu/internals/scripts/CheckBuildsExist.js":"36","/home/mauve/programming/natakanu/internals/scripts/CheckNativeDep.js":"37","/home/mauve/programming/natakanu/internals/scripts/CheckNodeEnv.js":"38","/home/mauve/programming/natakanu/internals/scripts/CheckPortInUse.js":"39","/home/mauve/programming/natakanu/internals/scripts/CheckYarn.js":"40","/home/mauve/programming/natakanu/internals/scripts/ElectronRebuild.js":"41","/home/mauve/programming/natakanu/test/actions/counter.spec.js":"42","/home/mauve/programming/natakanu/test/components/Counter.spec.js":"43","/home/mauve/programming/natakanu/test/containers/CounterPage.spec.js":"44","/home/mauve/programming/natakanu/test/e2e/HomePage.e2e.js":"45","/home/mauve/programming/natakanu/test/e2e/helpers.js":"46","/home/mauve/programming/natakanu/test/example.js":"47","/home/mauve/programming/natakanu/test/reducers/counter.spec.js":"48","/home/mauve/programming/natakanu/app/core/Account.js":"49","/home/mauve/programming/natakanu/app/core/Project.js":"50","/home/mauve/programming/natakanu/test/core/basic.spec.js":"51","/home/mauve/programming/natakanu/app/core/Database.js":"52","/home/mauve/programming/natakanu/app/core/ProjectStore.js":"53","/home/mauve/programming/natakanu/app/core/urlParser.js":"54","/home/mauve/programming/natakanu/app/core/AccountStore.js":"55","/home/mauve/programming/natakanu/app/actions/core.js":"56","/home/mauve/programming/natakanu/app/components/Test.js":"57","/home/mauve/programming/natakanu/app/constants/core.js":"58","/home/mauve/programming/natakanu/app/core/load.js":"59","/home/mauve/programming/natakanu/app/reducers/core.js":"60","/home/mauve/programming/natakanu/app/containers/TestPage.js":"61","/home/mauve/programming/natakanu/app/components/Account.js":"62","/home/mauve/programming/natakanu/app/components/AccountIcon.js":"63","/home/mauve/programming/natakanu/app/components/Button.js":"64","/home/mauve/programming/natakanu/app/components/Login.js":"65","/home/mauve/programming/natakanu/app/components/PageContainer.js":"66","/home/mauve/programming/natakanu/app/containers/AccountPage.js":"67","/home/mauve/programming/natakanu/app/containers/LoginPage.js":"68","/home/mauve/programming/natakanu/app/containers/ProjectViewPage.js":"69"},{"size":1517,"mtime":1585167335443,"results":"70","hashOfConfig":"71"},{"size":1216,"mtime":1585167335439,"results":"72","hashOfConfig":"71"},{"size":710,"mtime":1581532732568,"results":"73","hashOfConfig":"71"},{"size":1762,"mtime":1581532732572,"results":"74","hashOfConfig":"71"},{"size":591,"mtime":1585167335439,"results":"75","hashOfConfig":"71"},{"size":908,"mtime":1585167335439,"results":"76","hashOfConfig":"71"},{"size":2151,"mtime":1585167335439,"results":"77","hashOfConfig":"71"},{"size":360,"mtime":1582153244965,"results":"78","hashOfConfig":"71"},{"size":433,"mtime":1582237242667,"results":"79","hashOfConfig":"71"},{"size":1663,"mtime":1585175148739,"results":"80","hashOfConfig":"71"},{"size":243,"mtime":1581532732572,"results":"81","hashOfConfig":"71"},{"size":431,"mtime":1582153244965,"results":"82","hashOfConfig":"71"},{"size":452,"mtime":1585167335439,"results":"83","hashOfConfig":"71"},{"size":470,"mtime":1585167335439,"results":"84","hashOfConfig":"71"},{"size":253,"mtime":1581532732572,"results":"85","hashOfConfig":"71"},{"size":253,"mtime":1581532732572,"results":"86","hashOfConfig":"71"},{"size":506,"mtime":1581532732572,"results":"87","hashOfConfig":"71"},{"size":520,"mtime":1582153244965,"results":"88","hashOfConfig":"71"},{"size":2914,"mtime":1584124477592,"results":"89","hashOfConfig":"71"},{"size":7199,"mtime":1581532732572,"results":"90","hashOfConfig":"71"},{"size":361,"mtime":1581532732572,"results":"91","hashOfConfig":"71"},{"size":331,"mtime":1583533992089,"results":"92","hashOfConfig":"71"},{"size":338,"mtime":1583531679361,"results":"93","hashOfConfig":"71"},{"size":2130,"mtime":1583531813474,"results":"94","hashOfConfig":"71"},{"size":352,"mtime":1582153244965,"results":"95","hashOfConfig":"71"},{"size":687,"mtime":1581532732572,"results":"96","hashOfConfig":"71"},{"size":2135,"mtime":1582153244965,"results":"97","hashOfConfig":"71"},{"size":987,"mtime":1582153244965,"results":"98","hashOfConfig":"71"},{"size":169,"mtime":1582153244965,"results":"99","hashOfConfig":"71"},{"size":1766,"mtime":1582153244965,"results":"100","hashOfConfig":"71"},{"size":6783,"mtime":1582153244969,"results":"101","hashOfConfig":"71"},{"size":1715,"mtime":1582153244969,"results":"102","hashOfConfig":"71"},{"size":5155,"mtime":1582153244969,"results":"103","hashOfConfig":"71"},{"size":33,"mtime":1582153244969,"results":"104","hashOfConfig":"71"},{"size":104,"mtime":1582153244969,"results":"105","hashOfConfig":"71"},{"size":784,"mtime":1582153244969,"results":"106","hashOfConfig":"71"},{"size":2015,"mtime":1582153244969,"results":"107","hashOfConfig":"71"},{"size":396,"mtime":1581532732576,"results":"108","hashOfConfig":"71"},{"size":502,"mtime":1581532732576,"results":"109","hashOfConfig":"71"},{"size":188,"mtime":1582153244969,"results":"110","hashOfConfig":"71"},{"size":750,"mtime":1582153244969,"results":"111","hashOfConfig":"71"},{"size":1357,"mtime":1582153244969,"results":"112","hashOfConfig":"113"},{"size":1983,"mtime":1582153244969,"results":"114","hashOfConfig":"113"},{"size":1824,"mtime":1582234829686,"results":"115","hashOfConfig":"113"},{"size":2648,"mtime":1582153244969,"results":"116","hashOfConfig":"113"},{"size":161,"mtime":1582153244969,"results":"117","hashOfConfig":"113"},{"size":109,"mtime":1582153244969,"results":"118","hashOfConfig":"113"},{"size":706,"mtime":1582153244969,"results":"119","hashOfConfig":"113"},{"size":2680,"mtime":1585167335439,"results":"120","hashOfConfig":"71"},{"size":2349,"mtime":1585170570776,"results":"121","hashOfConfig":"71"},{"size":1308,"mtime":1583309334492,"results":"122","hashOfConfig":"113"},{"size":1123,"mtime":1585167335439,"results":"123","hashOfConfig":"71"},{"size":960,"mtime":1585167335443,"results":"124","hashOfConfig":"71"},{"size":879,"mtime":1583306326392,"results":"125","hashOfConfig":"71"},{"size":1365,"mtime":1583526264267,"results":"126","hashOfConfig":"71"},{"size":2194,"mtime":1585174579028,"results":"127","hashOfConfig":"71"},{"size":677,"mtime":1583777051546,"results":"128","hashOfConfig":"71"},{"size":385,"mtime":1582851611035,"results":"129","hashOfConfig":"71"},{"size":417,"mtime":1583777051546,"results":"130","hashOfConfig":"71"},{"size":610,"mtime":1585167335443,"results":"131","hashOfConfig":"71"},{"size":391,"mtime":1583534243990,"results":"132","hashOfConfig":"71"},{"size":1485,"mtime":1585167368591,"results":"133","hashOfConfig":"71"},{"size":164,"mtime":1585167335439,"results":"134","hashOfConfig":"71"},{"size":221,"mtime":1585167335439,"results":"135","hashOfConfig":"71"},{"size":1925,"mtime":1585167335439,"results":"136","hashOfConfig":"71"},{"size":656,"mtime":1585167335439,"results":"137","hashOfConfig":"71"},{"size":461,"mtime":1585167335439,"results":"138","hashOfConfig":"71"},{"size":455,"mtime":1585167335439,"results":"139","hashOfConfig":"71"},{"size":1133,"mtime":1585175096924,"results":"140","hashOfConfig":"71"},{"filePath":"141","messages":"142","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1bt96a6",{"filePath":"143","messages":"144","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"145","messages":"146","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"147","messages":"148","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"149","messages":"150","errorCount":4,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"151","messages":"152","errorCount":2,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"153","messages":"154","errorCount":16,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"155","messages":"156","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"157","messages":"158","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"159","messages":"160","errorCount":12,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"161","messages":"162","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"163","messages":"164","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"165","messages":"166","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"167","messages":"168","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"169","messages":"170","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"171","messages":"172","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"173","messages":"174","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"175","messages":"176","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"177","messages":"178","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"179","messages":"180","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"181","messages":"182","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"183","messages":"184","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"185","messages":"186","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"187","messages":"188","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"189","messages":"190","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"191","messages":"192","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"193","messages":"194","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"195","messages":"196","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"197","messages":"198","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"199","messages":"200","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"201","messages":"202","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"203","messages":"204","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"205","messages":"206","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"207","messages":"208","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"209","messages":"210","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"211","messages":"212","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"213","messages":"214","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"215","messages":"216","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"217","messages":"218","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"219","messages":"220","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"221","messages":"222","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"223","messages":"224","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1jyxw9w",{"filePath":"225","messages":"226","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"227","messages":"228","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"229","messages":"230","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"231","messages":"232","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"233","messages":"234","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"235","messages":"236","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"237","messages":"238","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"239","messages":"240","errorCount":2,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"241","messages":"242","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"243","messages":"244","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"245","messages":"246","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"247","messages":"248","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"249","messages":"250","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"251","messages":"252","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"253","messages":"254","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"255","messages":"256","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"257","messages":"258","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"259","messages":"260","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"261","messages":"262","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"263","messages":"264","errorCount":17,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"265","messages":"266","errorCount":2,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"267","messages":"268","errorCount":4,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"269","messages":"270","errorCount":6,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"271","messages":"272","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"273","messages":"274","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"275","messages":"276","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"277","messages":"278","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/home/mauve/programming/natakanu/app/core/index.js",[],"/home/mauve/programming/natakanu/app/Routes.js",[],"/home/mauve/programming/natakanu/app/actions/counter.js",[],"/home/mauve/programming/natakanu/app/components/Counter.js",[],"/home/mauve/programming/natakanu/app/components/Home.js",["279","280","281","282"],"/home/mauve/programming/natakanu/app/components/MainMenu.js",["283","284"],"/home/mauve/programming/natakanu/app/components/NewProject.js",["285","286","287","288","289","290","291","292","293","294","295","296","297","298","299","300"],"/home/mauve/programming/natakanu/app/components/OpenLibrary.js",[],"/home/mauve/programming/natakanu/app/components/OpenProject.js",[],"/home/mauve/programming/natakanu/app/components/ProjectView.js",["301","302","303","304","305","306","307","308","309","310","311","312"],"/home/mauve/programming/natakanu/app/containers/App.js",[],"/home/mauve/programming/natakanu/app/containers/CounterPage.js",[],"/home/mauve/programming/natakanu/app/containers/HomePage.js",[],"/home/mauve/programming/natakanu/app/containers/NewProjectContainer.js",[],"/home/mauve/programming/natakanu/app/containers/OpenLibraryContainer.js",[],"/home/mauve/programming/natakanu/app/containers/OpenProjectContainer.js",[],"/home/mauve/programming/natakanu/app/containers/Root.js",[],"/home/mauve/programming/natakanu/app/index.js",[],"/home/mauve/programming/natakanu/app/main.dev.js",[],"/home/mauve/programming/natakanu/app/menu.js",[],"/home/mauve/programming/natakanu/app/reducers/counter.js",[],"/home/mauve/programming/natakanu/app/reducers/index.js",[],"/home/mauve/programming/natakanu/app/reducers/types.js",["313"],"/home/mauve/programming/natakanu/app/store/configureStore.dev.js",[],"/home/mauve/programming/natakanu/app/store/configureStore.js",[],"/home/mauve/programming/natakanu/app/store/configureStore.prod.js",[],"/home/mauve/programming/natakanu/babel.config.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.base.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.eslint.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.main.prod.babel.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.babel.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.renderer.dev.dll.babel.js",[],"/home/mauve/programming/natakanu/configs/webpack.config.renderer.prod.babel.js",[],"/home/mauve/programming/natakanu/internals/mocks/fileMock.js",[],"/home/mauve/programming/natakanu/internals/scripts/BabelRegister.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckBuildsExist.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckNativeDep.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckNodeEnv.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckPortInUse.js",[],"/home/mauve/programming/natakanu/internals/scripts/CheckYarn.js",[],"/home/mauve/programming/natakanu/internals/scripts/ElectronRebuild.js",[],"/home/mauve/programming/natakanu/test/actions/counter.spec.js",[],"/home/mauve/programming/natakanu/test/components/Counter.spec.js",[],"/home/mauve/programming/natakanu/test/containers/CounterPage.spec.js",[],"/home/mauve/programming/natakanu/test/e2e/HomePage.e2e.js",[],"/home/mauve/programming/natakanu/test/e2e/helpers.js",[],"/home/mauve/programming/natakanu/test/example.js",[],"/home/mauve/programming/natakanu/test/reducers/counter.spec.js",[],"/home/mauve/programming/natakanu/app/core/Account.js",[],"/home/mauve/programming/natakanu/app/core/Project.js",["314","315"],"/home/mauve/programming/natakanu/test/core/basic.spec.js",[],"/home/mauve/programming/natakanu/app/core/Database.js",[],"/home/mauve/programming/natakanu/app/core/ProjectStore.js",[],"/home/mauve/programming/natakanu/app/core/urlParser.js",[],"/home/mauve/programming/natakanu/app/core/AccountStore.js",[],"/home/mauve/programming/natakanu/app/actions/core.js",[],"/home/mauve/programming/natakanu/app/components/Test.js",["316"],"/home/mauve/programming/natakanu/app/constants/core.js",[],"/home/mauve/programming/natakanu/app/core/load.js",[],"/home/mauve/programming/natakanu/app/reducers/core.js",["317"],"/home/mauve/programming/natakanu/app/containers/TestPage.js",[],"/home/mauve/programming/natakanu/app/components/Account.js",["318","319","320","321","322","323","324","325","326","327","328","329","330","331","332","333","334"],"/home/mauve/programming/natakanu/app/components/AccountIcon.js",["335","336"],"/home/mauve/programming/natakanu/app/components/Button.js",["337","338","339","340"],"/home/mauve/programming/natakanu/app/components/Login.js",["341","342","343","344","345","346"],"/home/mauve/programming/natakanu/app/components/PageContainer.js",["347","348"],"/home/mauve/programming/natakanu/app/containers/AccountPage.js",[],"/home/mauve/programming/natakanu/app/containers/LoginPage.js",[],"/home/mauve/programming/natakanu/app/containers/ProjectViewPage.js",[],{"ruleId":"349","severity":2,"message":"350","line":3,"column":10,"nodeType":"351","endLine":3,"endColumn":14},{"ruleId":"352","severity":2,"message":"353","line":15,"column":19,"nodeType":"354","endLine":15,"endColumn":27},{"ruleId":"355","severity":2,"message":"356","line":17,"column":5,"nodeType":"357","messageId":"358","endLine":19,"endColumn":8},{"ruleId":"359","severity":2,"message":"360","line":17,"column":21,"nodeType":"361","endLine":19,"endColumn":6},{"ruleId":"349","severity":2,"message":"350","line":3,"column":10,"nodeType":"351","endLine":3,"endColumn":14},{"ruleId":"349","severity":2,"message":"362","line":4,"column":8,"nodeType":"351","endLine":4,"endColumn":14},{"ruleId":"349","severity":2,"message":"350","line":2,"column":10,"nodeType":"351","endLine":2,"endColumn":14},{"ruleId":"349","severity":2,"message":"362","line":5,"column":8,"nodeType":"351","endLine":5,"endColumn":14},{"ruleId":"363","severity":2,"message":"364","line":13,"column":21,"nodeType":"365","endLine":13,"endColumn":31},{"ruleId":"352","severity":2,"message":"366","line":31,"column":7,"nodeType":"354","endLine":31,"endColumn":33},{"ruleId":"352","severity":2,"message":"367","line":32,"column":7,"nodeType":"354","endLine":32,"endColumn":12},{"ruleId":"352","severity":2,"message":"368","line":33,"column":7,"nodeType":"354","endLine":33,"endColumn":11},{"ruleId":"352","severity":2,"message":"369","line":34,"column":7,"nodeType":"354","endLine":34,"endColumn":20},{"ruleId":"352","severity":2,"message":"370","line":38,"column":15,"nodeType":"354","endLine":38,"endColumn":22},{"ruleId":"352","severity":2,"message":"371","line":38,"column":33,"nodeType":"351","endLine":38,"endColumn":39},{"ruleId":"352","severity":2,"message":"370","line":45,"column":15,"nodeType":"354","endLine":45,"endColumn":22},{"ruleId":"352","severity":2,"message":"371","line":45,"column":33,"nodeType":"351","endLine":45,"endColumn":39},{"ruleId":"349","severity":2,"message":"372","line":62,"column":12,"nodeType":"351","endLine":62,"endColumn":17},{"ruleId":"352","severity":2,"message":"373","line":82,"column":17,"nodeType":"354","endLine":82,"endColumn":25},{"ruleId":"352","severity":2,"message":"374","line":82,"column":27,"nodeType":"354","endLine":82,"endColumn":32},{"ruleId":"375","severity":2,"message":"376","line":84,"column":5,"nodeType":"377","endLine":84,"endColumn":37},{"ruleId":"378","severity":2,"message":"379","line":86,"column":39,"nodeType":"380","endLine":86,"endColumn":49},{"ruleId":"352","severity":2,"message":"381","line":10,"column":13,"nodeType":"354","endLine":10,"endColumn":20},{"ruleId":"352","severity":2,"message":"382","line":10,"column":22,"nodeType":"354","endLine":10,"endColumn":35},{"ruleId":"352","severity":2,"message":"383","line":16,"column":13,"nodeType":"354","endLine":16,"endColumn":24},{"ruleId":"352","severity":2,"message":"384","line":16,"column":26,"nodeType":"354","endLine":16,"endColumn":36},{"ruleId":"352","severity":2,"message":"381","line":16,"column":38,"nodeType":"354","endLine":16,"endColumn":45},{"ruleId":"352","severity":2,"message":"385","line":16,"column":47,"nodeType":"354","endLine":16,"endColumn":61},{"ruleId":"352","severity":2,"message":"386","line":20,"column":13,"nodeType":"354","endLine":20,"endColumn":18},{"ruleId":"352","severity":2,"message":"387","line":20,"column":20,"nodeType":"354","endLine":20,"endColumn":31},{"ruleId":"352","severity":2,"message":"388","line":20,"column":33,"nodeType":"354","endLine":20,"endColumn":39},{"ruleId":"352","severity":2,"message":"389","line":20,"column":41,"nodeType":"354","endLine":20,"endColumn":50},{"ruleId":"352","severity":2,"message":"390","line":20,"column":52,"nodeType":"354","endLine":20,"endColumn":58},{"ruleId":"391","severity":2,"message":"392","line":38,"column":15,"nodeType":"393","endLine":41,"endColumn":56},{"ruleId":"394","severity":1,"message":"395","line":9,"column":12,"nodeType":"396","endLine":9,"endColumn":15},{"ruleId":"397","severity":2,"message":"398","line":82,"column":5,"nodeType":"399","endLine":91,"endColumn":6},{"ruleId":"400","severity":2,"message":"401","line":90,"column":7,"nodeType":"402","messageId":"403","endLine":90,"endColumn":51},{"ruleId":"394","severity":1,"message":"395","line":9,"column":9,"nodeType":"396","endLine":9,"endColumn":12},{"ruleId":"394","severity":1,"message":"395","line":11,"column":37,"nodeType":"396","endLine":11,"endColumn":40},{"ruleId":"352","severity":2,"message":"370","line":12,"column":13,"nodeType":"354","endLine":12,"endColumn":20},{"ruleId":"404","severity":2,"message":"405","line":12,"column":25,"nodeType":"406","endLine":12,"endColumn":41},{"ruleId":"352","severity":2,"message":"367","line":12,"column":36,"nodeType":"351","endLine":12,"endColumn":41},{"ruleId":"352","severity":2,"message":"371","line":12,"column":42,"nodeType":"351","endLine":12,"endColumn":48},{"ruleId":"404","severity":2,"message":"405","line":13,"column":5,"nodeType":"406","endLine":13,"endColumn":27},{"ruleId":"352","severity":2,"message":"407","line":13,"column":16,"nodeType":"351","endLine":13,"endColumn":27},{"ruleId":"352","severity":2,"message":"366","line":17,"column":13,"nodeType":"354","endLine":17,"endColumn":24},{"ruleId":"352","severity":2,"message":"408","line":17,"column":26,"nodeType":"354","endLine":17,"endColumn":34},{"ruleId":"352","severity":2,"message":"409","line":26,"column":13,"nodeType":"354","endLine":26,"endColumn":17},{"ruleId":"352","severity":2,"message":"410","line":26,"column":19,"nodeType":"354","endLine":26,"endColumn":24},{"ruleId":"352","severity":2,"message":"411","line":26,"column":26,"nodeType":"354","endLine":26,"endColumn":29},{"ruleId":"404","severity":2,"message":"405","line":26,"column":34,"nodeType":"406","endLine":26,"endColumn":56},{"ruleId":"352","severity":2,"message":"366","line":26,"column":45,"nodeType":"351","endLine":26,"endColumn":56},{"ruleId":"404","severity":2,"message":"405","line":27,"column":30,"nodeType":"406","endLine":27,"endColumn":45},{"ruleId":"352","severity":2,"message":"368","line":27,"column":41,"nodeType":"351","endLine":27,"endColumn":45},{"ruleId":"352","severity":2,"message":"412","line":41,"column":21,"nodeType":"351","endLine":41,"endColumn":24},{"ruleId":"413","severity":2,"message":"414","line":41,"column":28,"nodeType":"351","endLine":41,"endColumn":31},{"ruleId":"352","severity":2,"message":"415","line":4,"column":19,"nodeType":"354","endLine":4,"endColumn":24},{"ruleId":"416","severity":2,"message":"417","line":5,"column":10,"nodeType":"377","endLine":5,"endColumn":60},{"ruleId":"352","severity":2,"message":"418","line":5,"column":19,"nodeType":"354","endLine":5,"endColumn":33},{"ruleId":"352","severity":2,"message":"373","line":5,"column":35,"nodeType":"354","endLine":5,"endColumn":43},{"ruleId":"391","severity":2,"message":"392","line":6,"column":3,"nodeType":"393","endLine":8,"endColumn":12},{"ruleId":"378","severity":2,"message":"379","line":6,"column":55,"nodeType":"380","endLine":6,"endColumn":65},{"ruleId":"349","severity":2,"message":"350","line":3,"column":10,"nodeType":"351","endLine":3,"endColumn":14},{"ruleId":"349","severity":2,"message":"362","line":6,"column":8,"nodeType":"351","endLine":6,"endColumn":14},{"ruleId":"363","severity":2,"message":"419","line":19,"column":16,"nodeType":"365","endLine":19,"endColumn":42},{"ruleId":"352","severity":2,"message":"368","line":26,"column":31,"nodeType":"354","endLine":26,"endColumn":35},{"ruleId":"416","severity":2,"message":"417","line":38,"column":13,"nodeType":"377","endLine":38,"endColumn":58},{"ruleId":"349","severity":2,"message":"372","line":43,"column":19,"nodeType":"351","endLine":43,"endColumn":24},{"ruleId":"394","severity":1,"message":"395","line":7,"column":18,"nodeType":"396","endLine":7,"endColumn":21},{"ruleId":"394","severity":1,"message":"395","line":8,"column":13,"nodeType":"396","endLine":8,"endColumn":16},"no-unused-vars","'Link' is defined but never used.","Identifier","react/prop-types","'loadCore' is missing in props validation","Property","promise/catch-or-return","Expected catch() or return","ExpressionStatement","terminationMethod","promise/always-return","Each then() should return a value or throw","ArrowFunctionExpression","'routes' is defined but never used.","react/no-unused-prop-types","'onFolderSelected' PropType is defined but prop is never used","FunctionTypeAnnotation","'accountInfo' is missing in props validation","'match' is missing in props validation","'push' is missing in props validation","'createProject' is missing in props validation","'match.params.account' is missing in props validation","'match.params' is missing in props validation","'props' is defined but never used.","'children' is missing in props validation","'label' is missing in props validation","jsx-a11y/label-has-associated-control","A form label must be associated with a control.","JSXOpeningElement","react/jsx-props-no-spreading","Prop spreading is forbidden","JSXSpreadAttribute","'project' is missing in props validation","'onLoadProject' is missing in props validation","'projectInfo' is missing in props validation","'files' is missing in props validation","'onDownloadFile' is missing in props validation","'projectInfo.title' is missing in props validation","'projectInfo.description' is missing in props validation","'projectInfo.author' is missing in props validation","'projectInfo.community' is missing in props validation","'projectInfo.nation' is missing in props validation","react/button-has-type","Missing an explicit type attribute for button","JSXElement","flowtype/no-weak-types","Unexpected use of weak type \"any\"","AnyTypeAnnotation","no-restricted-syntax","iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.","ForOfStatement","no-await-in-loop","Unexpected `await` inside a loop.","AwaitExpression","unexpectedAwait","react/destructuring-assignment","Must use destructuring props assignment","MemberExpression","'loadAccount' is missing in props validation","'projects' is missing in props validation","'accountInfo.name' is missing in props validation","'accountInfo.image' is missing in props validation","'accountInfo.key' is missing in props validation","'projects.map' is missing in props validation","no-shadow","'key' is already declared in the upper scope.","'image' is missing in props validation","jsx-a11y/alt-text","img elements must have an alt prop, either with meaningful text, or an empty string for decorative images.","'className' is missing in props validation","'loadAccount' PropType is defined but prop is never used"] \ No newline at end of file diff --git a/app/Routes.js b/app/Routes.js index 9b537ab..a303b2d 100644 --- a/app/Routes.js +++ b/app/Routes.js @@ -9,7 +9,7 @@ import OpenLibraryContainer from './containers/OpenLibraryContainer'; import TestPage from './containers/TestPage'; import LoginPage from './containers/LoginPage'; import AccountPage from './containers/AccountPage'; -import ProjectViewPage from './containers/ProjectViewPage' +import ProjectViewPage from './containers/ProjectViewPage'; export default () => ( diff --git a/app/actions/core.js b/app/actions/core.js index ada0cb3..d271216 100644 --- a/app/actions/core.js +++ b/app/actions/core.js @@ -5,6 +5,9 @@ export const CORE_LOADED = 'CORE_LOADED'; export const ACCOUNT_LOADED = 'ACCOUNT_LOADED'; export const CREATED_PROJECT = 'CREATED_PROJECT'; export const LOADED_PROJECT = 'LOADED_PROJECT'; +export const ADDED_FILE = 'ADDED_FILE'; +export const DONWLOADED_FILE = 'DOWNLOADED_FILE'; +export const DELETED_FILE = 'DELETED_FILE'; const getCore = () => remote.getGlobal('loadCore')(); @@ -15,40 +18,84 @@ export const loadCore = createAction(CORE_LOADED, async () => { }; }); -export const loadAccount = createAction(ACCOUNT_LOADED, async (username) => { - const core = await getCore() - const account = await core.accounts.get(username) - const accountInfo = await account.getInfo() - const projects = await account.getProjectsInfo() - - return { - account, - accountInfo, - projects - }; -}) +export const loadAccount = createAction(ACCOUNT_LOADED, async username => { + const core = await getCore(); + const account = await core.accounts.get(username); + const accountInfo = await account.getInfo(); + const projects = await account.getProjectsInfo(); -export const createProject = createAction(CREATED_PROJECT, async (username, info) => { - const core = await getCore() - const account = await core.accounts.get(username) - const project = await account.createProject(info) - const projectInfo = await project.getInfo() + return { + account, + accountInfo, + projects + }; +}); - return { - project, - projectInfo - } -}) +export const createProject = createAction( + CREATED_PROJECT, + async (username, info) => { + const core = await getCore(); + const account = await core.accounts.get(username); + const project = await account.createProject(info); + const projectInfo = await project.getInfo(); + + return { + project, + projectInfo + }; + } +); + +export const loadProject = createAction( + LOADED_PROJECT, + async (key, path = '/') => { + const core = await getCore(); + const project = await core.projects.get(key); + const projectInfo = await project.getInfo(); + const files = await project.getFileList(path); + + return { + project, + projectInfo, + files + }; + } +); + +export const addFilesToProjectFolderWithDialog = createAction( + ADDED_FILE, + async (projectKey, path) => { + const core = await getCore(); + const project = await core.projects.get(projectKey); + const { filePaths } = await project.showLoadFile(path); + const files = await project.getFileList(path) + + return { + filePaths, + files + }; + } +); + +export const downloadFileFromProjectWithDialog = createAction( + DONWLOADED_FILE, + async (projectKey, path) => { + const core = await getCore(); + const project = await core.projects.get(projectKey); + + const { filePath } = await project.showSaveFile(path); + + return { filePath }; + } +); + +export const deleteFile = createAction(DELETED_FILE, async (projectKey, path) => { + const core = await getCore(); + const project = await core.projects.get(projectKey) + + await project.deleteFile(path) + + const files = await project.getFileList('/') -export const loadProject = createAction(LOADED_PROJECT, async (key, path="/") => { - const core = await getCore() - const project = await core.projects.get(key) - const projectInfo = await project.getInfo() - const files = await project.archive.readdir(path, {includeStats: true}) - - return { - project, - projectInfo, - files, - } + return {files} }) diff --git a/app/components/Account.css b/app/components/Account.css index 19c64eb..250f9ac 100644 --- a/app/components/Account.css +++ b/app/components/Account.css @@ -1,35 +1,36 @@ .background { - background: var(--t-color-lightgreen); + background: var(--t-color-lightgreen); } .accountInfo { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } .accountName { - font-weight: bold; + font-weight: bold; } .project { - background: var(--t-color-yellow); - width: 150px; - height: 150px; - margin: 1em; - display: flex; - align-items: center; - justify-content: center; - border-radius: var(--t-radius); - color: inherit; - text-decoration: none; + background: var(--t-color-yellow); + width: 150px; + height: 150px; + margin: 1em; + margin-bottom: 0; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--t-radius); + color: inherit; + text-decoration: none; } .projects { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; - align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; } diff --git a/app/components/Account.js b/app/components/Account.js index 34e0d36..b4b5fcb 100644 --- a/app/components/Account.js +++ b/app/components/Account.js @@ -1,49 +1,55 @@ -import React, {Component} from 'react' -import {Link} from 'react-router-dom' +import React, { Component } from 'react'; +import Link from './Link'; import PageContainer from './PageContainer'; import AccountIcon from './AccountIcon'; -import Button from './Button' +import Button from './Button'; -import routes from '../constants/routes.json' - -import styles from './Account.css' +import styles from './Account.css'; export default class Account extends Component { - - componentDidMount() { - const account = this.props.match.params.account - this.props.loadAccount(account) - } - - render() { - const {accountInfo, projects} = this.props; - - if(!accountInfo) return ( - - - - ) - - const {name, image, key} = this.props.accountInfo - const goToCreate = () => this.props.push(`/account/${key}/projects/new/`) - - const headerContent = ( - - ); - - return ( - -
- -
{name}
-
-
- {projects.map(({key, title}) => ( - {title} - ))} -
-
- ) - } + componentDidMount() { + const { account } = this.props.match.params; + this.props.loadAccount(account); + } + + render() { + const { accountInfo, projects } = this.props; + + if (!accountInfo) + return ( + + + + ); + + const { name, image, key } = this.props.accountInfo; + const goToCreate = () => this.props.push(`/account/${key}/projects/new/`); + + const headerContent = ; + + return ( + +
+ +
{name}
+
+
+ {projects.map(({ key, url, title }) => ( + + {title} + + ))} +
+
+ ); + } } diff --git a/app/components/AccountIcon.css b/app/components/AccountIcon.css index da5013a..1013c21 100644 --- a/app/components/AccountIcon.css +++ b/app/components/AccountIcon.css @@ -1,10 +1,9 @@ .accounticon { - width: 3em; - height: 3em; - border-radius: 50%; - background: magenta; - align-self: center; - margin-bottom: 1em; - overflow: hidden; + width: 3em; + height: 3em; + border-radius: 50%; + background: magenta; + align-self: center; + margin-bottom: 1em; + overflow: hidden; } - diff --git a/app/components/AccountIcon.js b/app/components/AccountIcon.js index 9a85ab9..fae1947 100644 --- a/app/components/AccountIcon.js +++ b/app/components/AccountIcon.js @@ -1,8 +1,6 @@ -import React from 'react' +import React from 'react'; import styles from './AccountIcon.css'; -export default ({image}) => { - return ( - - ) -} +export default ({ image }) => { + return ; +}; diff --git a/app/components/Button.css b/app/components/Button.css index 42dd7db..d663a52 100644 --- a/app/components/Button.css +++ b/app/components/Button.css @@ -1,9 +1,11 @@ .button { - padding: 0.5em; - min-width: 8em; - font-weight: bold; - border: none; - border-radius: var(--t-radius); - font-size: 1.2em; + padding: 0.5em; + min-width: 8em; + font-weight: bold; + border: none; + border-radius: var(--t-radius); } +.big { + font-size: 1.2em; +} diff --git a/app/components/Button.js b/app/components/Button.js index 496753d..3cdc998 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -1,7 +1,14 @@ -import React from 'react' +import React from 'react'; -import styles from './Button.css' +import styles from './Button.css'; -export default ({className="", children, ...props}) => ( - -) +export default function ({ className = '', children, big, ...props }) { + const classList = [styles.button] + if(className) classList.push(className) + if(big) classList.push(styles.big) + return ( + + ) +}; diff --git a/app/components/Home.js b/app/components/Home.js index 190fc6d..fd0c979 100644 --- a/app/components/Home.js +++ b/app/components/Home.js @@ -5,22 +5,24 @@ import routes from '../constants/routes.json'; import styles from './Home.css'; type Props = { - push: (url: string) => void + push: (url: string) => void }; export default class Home extends Component { props: Props; componentDidMount() { - const {push, loadCore} = this.props + const { push, loadCore } = this.props; - loadCore().then(() => {push(routes.LOGIN)}) + loadCore().then(() => { + push(routes.LOGIN); + }); } render() { return (
- +
); } diff --git a/app/components/Link.js b/app/components/Link.js new file mode 100644 index 0000000..389f7ef --- /dev/null +++ b/app/components/Link.js @@ -0,0 +1,19 @@ +import React from 'react' +import {Link as RouterLink} from 'react-router-dom' +import { PROTOCOL_SCHEME } from '../core/urlParser' + +const HAS_PROTOCOL = /^[^:]+:/ + +export default function Link({to='', ...props}) { + if(to.startsWith(PROTOCOL_SCHEME)) { + to = to.slice(PROTOCOL_SCHEME.length - 1) + } + + if(to.match(HAS_PROTOCOL)) return ( + {props.children} + ) + + return ( + + ) +} diff --git a/app/components/Login.css b/app/components/Login.css index 35de26f..70f5520 100644 --- a/app/components/Login.css +++ b/app/components/Login.css @@ -1,84 +1,84 @@ .container { - background: var(--t-color-green); + background: var(--t-color-green); } .column { - display: flex; - flex-direction: column; - flex: 1; + display: flex; + flex-direction: column; + flex: 1; } .row { - display: flex; - flex-direction: row; - justify-content: stretch; - flex: 1; + display: flex; + flex-direction: row; + justify-content: stretch; + flex: 1; } .header { - height: 3em; - background: var(--t-color-yellow); + height: 3em; + background: var(--t-color-yellow); } .content { - flex: 1; + flex: 1; } .urlbar { - display: block; - width: 100%; - margin: 0.5em 0; - margin-bottom: 1em; + display: block; + width: 100%; + margin: 0.5em 0; + margin-bottom: 1em; } .logo { - width: 14em; - height: 14em; - align-self: flex-start; + width: 14em; + height: 14em; + align-self: flex-start; } .usericon { - width: 3em; - height: 3em; - border-radius: 3em; - background: magenta; - align-self: center; - margin-bottom: 1em; + width: 3em; + height: 3em; + border-radius: 3em; + background: magenta; + align-self: center; + margin-bottom: 1em; } .userform { - display: flex; - flex-direction: column; - align-self: stretch; + display: flex; + flex-direction: column; + align-self: stretch; } .userinput { - text-align: center; - color: white; - font-size: 1.5em; - background: none; - border: none; - border-bottom: 2px solid white; - margin-bottom: 2em; - max-width: 10em; - align-self: center; + text-align: center; + color: white; + font-size: 1.5em; + background: none; + border: none; + border-bottom: 2px solid white; + margin-bottom: 2em; + max-width: 10em; + align-self: center; } .buttonContainer { - display: flex; - align-items: center; - justify-content: center; + display: flex; + align-items: center; + justify-content: center; } .button { - padding: 0.5em; - min-width: 8em; - font-weight: bold; - border: none; - border-radius: var(--t-radius); - font-size: 1.2em; + padding: 0.5em; + min-width: 8em; + font-weight: bold; + border: none; + border-radius: var(--t-radius); + font-size: 1.2em; } .red { - background: var(--t-color-red); + background: var(--t-color-red); } diff --git a/app/components/Login.js b/app/components/Login.js index a1ba667..db25687 100644 --- a/app/components/Login.js +++ b/app/components/Login.js @@ -1,58 +1,62 @@ // @flow import React, { Component } from 'react'; import { Link } from 'react-router-dom'; +import { Field, Formik, Form } from 'formik'; import styles from './Login.css'; import routes from '../constants/routes.json'; -import {Field, Formik, Form} from 'formik'; -import PageContainer from './PageContainer' -import AccountIcon from './AccountIcon' -import Button from './Button' +import PageContainer from './PageContainer'; +import AccountIcon from './AccountIcon'; +import Button from './Button'; import logoSrc from '../Natakanu.svg'; type Props = { - accountInfo: { - name: string, - description: string, - image: string - }, - loadAccount: (username: string) => void + accountInfo: { + name: string, + description: string, + image: string + }, + loadAccount: (username: string) => void }; export default class Login extends Component { props: Props; render() { - const { - accountInfo={}, - push, - } = this.props; - const {name, image} = accountInfo - const initialValues = {username: name} - const onLogin = ({username}) => { - push(`/account/${username}/projects/`) - } + const { accountInfo = {}, push } = this.props; + const { name, image } = accountInfo; + const initialValues = { username: name }; + const onLogin = ({ username }) => { + push(`/account/${username}/projects/`); + }; return ( - - -
-
- -
-
- - {({props}) => ( -
- -
- -
- - )} -
-
-
+ +
+
+ +
+
+ + + {({ props }) => ( +
+ +
+ +
+ + )} +
+
+
); } diff --git a/app/components/MainMenu.js b/app/components/MainMenu.js index 4ba221b..3bc7f05 100644 --- a/app/components/MainMenu.js +++ b/app/components/MainMenu.js @@ -3,7 +3,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import routes from '../constants/routes.json'; -import Login from './Login' +import Login from './Login'; class MainMenu extends React.Component { constructor(props) { @@ -11,15 +11,13 @@ class MainMenu extends React.Component { } render() { - const defaultAccount = { - name: 'Username', - description: 'Example User' - } - - return ( - - ); - /** + const defaultAccount = { + name: 'Username', + description: 'Example User' + }; + + return ; + /** return (

@@ -36,7 +34,7 @@ class MainMenu extends React.Component {

); - **/ + * */ } } diff --git a/app/components/NewProject.css b/app/components/NewProject.css index c6f0700..72ab8b4 100644 --- a/app/components/NewProject.css +++ b/app/components/NewProject.css @@ -1,35 +1,35 @@ .background { - background: var(--t-color-red); + background: var(--t-color-red); } .label { - display: flex; - flex-direction: row; - margin: 1em 0; - align-items: center; + display: flex; + flex-direction: row; + margin: 1em 0; + align-items: center; } .input { - flex: 1; - margin-left: 0.5em; + flex: 1; + margin-left: 0.5em; } .form { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .inputs { - flex: 1; - background: var(--t-color-yellow); - border-radius: var(--t-radius); - padding: 0.5em; + flex: 1; + background: var(--t-color-yellow); + border-radius: var(--t-radius); + padding: 0.5em; } .sharecontainer { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin-left: 2em; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-left: 2em; } diff --git a/app/components/NewProject.js b/app/components/NewProject.js index f18791e..ee3f08e 100644 --- a/app/components/NewProject.js +++ b/app/components/NewProject.js @@ -1,83 +1,91 @@ import React, { Component } from 'react'; import { Link } from 'react-router-dom'; -import {Field, Formik, Form} from 'formik'; +import { Field, Formik, Form } from 'formik'; import routes from '../constants/routes.json'; -import PageContainer from './PageContainer' -import Button from './Button' +import PageContainer from './PageContainer'; +import Button from './Button'; -import styles from './NewProject.css' +import styles from './NewProject.css'; type Props = { onFolderSelected: () => void }; const INITIAL_VALUES = { - title: "", - author: "", - nation: "", - community: "", - description: "" -} + title: '', + author: '', + nation: '', + community: '', + description: '' +}; const DEFAULT_INFO = { - name: "" -} + name: '' +}; class NewProject extends Component { render() { - const {accountInfo=DEFAULT_INFO, match, push, createProject} = this.props + const { + accountInfo = DEFAULT_INFO, + match, + push, + createProject + } = this.props; - const onGotProjectInfo = async (info) => { - const {account} = match.params + const onGotProjectInfo = async info => { + const { account } = match.params; - await createProject(account, info) - onGoBack() - } + await createProject(account, info); + onGoBack(); + }; - const onGoBack = () => { - const {account} = match.params + const onGoBack = () => { + const { account } = match.params; - push(`/account/${account}/projects/`) - } + push(`/account/${account}/projects/`); + }; - const {name: author} = accountInfo + const { name: author } = accountInfo; - const initialValues = {...INITIAL_VALUES, author} + const initialValues = { ...INITIAL_VALUES, author }; - const headerContent = ( - - ); + const headerContent = ; return ( - - {(props) => ( -
-
- - - - - -
-
- -
-
- )}
+ + + {props => ( +
+
+ + + + + +
+
+ +
+
+ )} +
); } } -function Item ({children, label, ...props}) { - return ( - - ); +function Item({ children, label, ...props }) { + return ( + + ); } export default NewProject; diff --git a/app/components/PageContainer.css b/app/components/PageContainer.css index 7415695..1b64cf2 100644 --- a/app/components/PageContainer.css +++ b/app/components/PageContainer.css @@ -1,17 +1,34 @@ .wrapper { - height: 100vh; - overflow: auto; + height: 100vh; + overflow: auto; } .header { - padding: 0.5em; - min-height: 3em; - background: var(--t-color-yellow); + padding: 0.5em; + min-height: 3em; + background: var(--t-color-yellow); } .content { + max-width: var(--t-content-size); + margin: 0 auto; + padding: 1em; +} + +.urlbar { max-width: var(--t-content-size); - margin: 0 auto; - padding: 1em; + margin: 0.5em auto; + margin-bottom: 1em; + display: flex; } +.urlbarinput { + flex: 1; + display: block; +} + +.backbutton { + background: none; + display: block; + border: none; +} diff --git a/app/components/PageContainer.js b/app/components/PageContainer.js index fa50fcd..50c9000 100644 --- a/app/components/PageContainer.js +++ b/app/components/PageContainer.js @@ -1,26 +1,45 @@ import React, { Component } from 'react'; import styles from './PageContainer.css'; +import {Formik, Form, Field} from 'formik' +import { PROTOCOL_SCHEME } from '../core/urlParser' type Props = { - contentClass: string, - backgroundClass: string, - headerContent: any, - children: any, -} + contentClass: string, + backgroundClass: string, + headerContent: any, + children: any, + push: (string) => void, + goBack: () => void, +}; export default class PageContainer extends Component { - props: Props; + props: Props; + + render() { + const { + contentClass = '', + backgroundClass = '', + headerContent, + children, + push, + goBack, + location + } = this.props; - render() { - const {contentClass='', backgroundClass='', headerContent, children} = this.props + const navigateTo = ({url}) => push(url.slice(PROTOCOL_SCHEME.length - 1)) + const initialValues = {url: `${PROTOCOL_SCHEME}${location.pathname.slice(1)}`} - return ( -
-
{headerContent}
-
- {children} -
-
- ) - } + return ( +
+
{headerContent}
+ {(props) => ( +
+ + + + )}
+
{children}
+
+ ); + } } diff --git a/app/components/ProjectView.css b/app/components/ProjectView.css index 990da32..de25454 100644 --- a/app/components/ProjectView.css +++ b/app/components/ProjectView.css @@ -1,29 +1,45 @@ .background { - background: var(--t-color-lightgreen); + background: var(--t-color-lightgreen); } .content { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .info { - background: var(--t-color-red); - flex: 1; - margin: 0.5em; - border-radius: var(--t-radius); - padding: var(--t-radius); + background: var(--t-color-red); + flex: 1; + margin: 0.5em; + border-radius: var(--t-radius); + padding: var(--t-radius); } .files { - background: var(--t-color-green); - flex: 1; - margin: 0.5em; - border-radius: var(--t-radius); - padding: var(--t-radius); + background: var(--t-color-green); + flex: 1; + margin: 0.5em; + border-radius: var(--t-radius); + padding: var(--t-radius); +} + +.filecontainer { + display: flex; + flex-direction: row; + margin: 0.5em 0; } .file { + background: none; + border: none; + display: block; + flex: 1; + text-align: start; +} + +.filedelete { background: none; border: none; + display: block; + color: var(--t-color-red); } diff --git a/app/components/ProjectView.js b/app/components/ProjectView.js index 925c147..7e77981 100644 --- a/app/components/ProjectView.js +++ b/app/components/ProjectView.js @@ -1,51 +1,83 @@ /* eslint-disable no-useless-constructor */ import React from 'react'; -import PageContainer from './PageContainer' +import PageContainer from './PageContainer'; +import Button from './Button'; -import styles from './ProjectView.css' +import styles from './ProjectView.css'; export default class ProjectView extends React.Component { - componentDidMount() { - console.log(this.props) - const {match, loadProject} = this.props; - const {project} = match.params; + componentDidMount() { + const { project, onLoadProject } = this.props; - loadProject(project) - } + onLoadProject(project); + } render() { - const {projectInfo, files=[]} = this.props + const { + projectInfo, + files = [], + project, + onDownloadFile, + onAddFiles, + onDeleteFile, + } = this.props; + + if (!projectInfo) return ; - if(!projectInfo) return ( - - ) + const { title, description, author, community, nation, writable } = projectInfo; - const {title,description, author, community, nation} = projectInfo + const addButton = writable ? ( + + ) : null return ( - -
-

{title}

- {files.map(({stat, name}) => { - const isDirectory = stat.isDirectory(); - const endSlash = isDirectory ? '/' : ''; - const icon = isDirectory ? '📁' : '📃'; - - return ( - - ); - })} -
-
-
-
Author
{author}
-
Community
{community}
-
Nation
{nation}
-
Credits
{description}
-
-
-
+ +
+

{title}

+ {files.map(({ stat, name }) => { + const isDirectory = stat.isDirectory(); + const endSlash = isDirectory ? '/' : ''; + const icon = isDirectory ? '📁' : '📃'; + const onClick = isDirectory + ? () => false + : () => onDownloadFile(project, name); + const onClickDelete = () => onDeleteFile(project, name) + const deleteButton = (!isDirectory && writable) ? ( + + ) : null + return ( +
+ + {deleteButton} +
+ ); + })} +
{addButton}
+
+
+
+
Author
+
{author}
+
Community
+
{community}
+
Nation
+
{nation}
+
Credits
+
{description}
+
+
+
); } } diff --git a/app/containers/AccountPage.js b/app/containers/AccountPage.js index 8f46de5..bd0747b 100644 --- a/app/containers/AccountPage.js +++ b/app/containers/AccountPage.js @@ -1,16 +1,16 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { push, goBack } from 'connected-react-router'; import * as CoreActions from '../actions/core'; -import {push} from 'connected-react-router'; -import Account from '../components/Account' +import Account from '../components/Account'; function mapStateToProps(state) { return state.core; } function mapDispatchToProps(dispatch) { - return bindActionCreators({...CoreActions, push}, dispatch); + return bindActionCreators({ ...CoreActions, push, goBack }, dispatch); } export default connect(mapStateToProps, mapDispatchToProps)(Account); diff --git a/app/containers/HomePage.js b/app/containers/HomePage.js index c0d27ca..604c31e 100644 --- a/app/containers/HomePage.js +++ b/app/containers/HomePage.js @@ -1,16 +1,16 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { push } from 'connected-react-router'; import * as CoreActions from '../actions/core'; -import {push} from 'connected-react-router'; -import Home from '../components/Home' +import Home from '../components/Home'; function mapStateToProps(state) { return state.core; } function mapDispatchToProps(dispatch) { - return bindActionCreators({...CoreActions, push}, dispatch); + return bindActionCreators({ ...CoreActions, push }, dispatch); } export default connect(mapStateToProps, mapDispatchToProps)(Home); diff --git a/app/containers/LoginPage.js b/app/containers/LoginPage.js index b0bf94d..40ee0b5 100644 --- a/app/containers/LoginPage.js +++ b/app/containers/LoginPage.js @@ -1,16 +1,16 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { push, goBack } from 'connected-react-router'; import * as CoreActions from '../actions/core'; -import {push} from 'connected-react-router'; -import Login from '../components/Login' +import Login from '../components/Login'; function mapStateToProps(state) { return state.core; } function mapDispatchToProps(dispatch) { - return bindActionCreators({...CoreActions, push}, dispatch); + return bindActionCreators({ ...CoreActions, push, goBack }, dispatch); } export default connect(mapStateToProps, mapDispatchToProps)(Login); diff --git a/app/containers/NewProjectContainer.js b/app/containers/NewProjectContainer.js index ef3380f..b197db3 100644 --- a/app/containers/NewProjectContainer.js +++ b/app/containers/NewProjectContainer.js @@ -1,16 +1,16 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { push } from 'connected-react-router'; import * as CoreActions from '../actions/core'; -import {push} from 'connected-react-router'; -import NewProject from '../components/NewProject' +import NewProject from '../components/NewProject'; function mapStateToProps(state) { return state.core; } function mapDispatchToProps(dispatch) { - return bindActionCreators({...CoreActions, push}, dispatch); + return bindActionCreators({ ...CoreActions, push }, dispatch); } export default connect(mapStateToProps, mapDispatchToProps)(NewProject); diff --git a/app/containers/ProjectViewPage.js b/app/containers/ProjectViewPage.js index 38a3736..566ae85 100644 --- a/app/containers/ProjectViewPage.js +++ b/app/containers/ProjectViewPage.js @@ -1,16 +1,53 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { push, goBack } from 'connected-react-router'; import * as CoreActions from '../actions/core'; -import {push} from 'connected-react-router'; -import ProjectView from '../components/ProjectView' +import ProjectView from '../components/ProjectView'; function mapStateToProps(state) { - return state.core; + return state.core; } function mapDispatchToProps(dispatch) { - return bindActionCreators({...CoreActions, push}, dispatch); + const actions = bindActionCreators({ ...CoreActions, push, goBack }, dispatch); + const { + loadProject, + deleteFile, + addFilesToProjectFolderWithDialog, + downloadFileFromProjectWithDialog + } = actions; + + async function onDownloadFile(project, path) { + await downloadFileFromProjectWithDialog(project, path); + } + + async function onAddFiles(project, path) { + await addFilesToProjectFolderWithDialog(project, path); + } + + async function onLoadProject(project) { + return loadProject(project); + } + + async function onDeleteFile(project, path) { + return deleteFile(project, path); + } + + return { + ...actions, + onDownloadFile, + onAddFiles, + onLoadProject, + onDeleteFile, + }; +} + +function mergeProps(stateProps, dispatchProps, ownProps) { + const {match} = ownProps + const {params} = match + + return {...stateProps, ...dispatchProps, ...ownProps, ...params} } -export default connect(mapStateToProps, mapDispatchToProps)(ProjectView); +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(ProjectView); diff --git a/app/core/Account.js b/app/core/Account.js index 2c8143a..85be2d0 100644 --- a/app/core/Account.js +++ b/app/core/Account.js @@ -46,16 +46,18 @@ export default class Account { return this.projects; } - async getProjectsInfo () { - const projects = await this.getProjects() + async getProjectsInfo() { + const projects = await this.getProjects(); - return Promise.all(projects.map(async (project) => { - const info = await project.getInfo() + return Promise.all( + projects.map(async project => { + const info = await project.getInfo(); - const url = project.url + const { url } = project; - return {...info, url} - })) + return { ...info, url }; + }) + ); } async createProject(info) { @@ -86,14 +88,14 @@ export default class Account { } async getInfo() { - const key = this.key.toString('hex') + const key = this.key.toString('hex'); try { const raw = await this.archive.readFile(ACCOUNT_INFO_FILE, 'utf8'); const parsed = JSON.parse(raw); - return {name: key, ...parsed, key} + return { name: key, ...parsed, key }; } catch (e) { - return {name: key, key}; + return { name: key, key }; } } diff --git a/app/core/Database.js b/app/core/Database.js index 559163a..eabdd09 100644 --- a/app/core/Database.js +++ b/app/core/Database.js @@ -46,7 +46,7 @@ export default class Database { async addRecentProjectName(name) { const names = await this.getRecentProjectNames(); - console.log('loaded names', names) + console.log('loaded names', names); names.unshift(name); diff --git a/app/core/Project.js b/app/core/Project.js index 049e140..3e0ba17 100644 --- a/app/core/Project.js +++ b/app/core/Project.js @@ -1,10 +1,9 @@ -import { PROJECT_INFO_FILE } from '../constants/core'; -import { encodeProject } from './urlParser'; import { dialog } from 'electron'; import { parse as parsePath, join as joinPaths } from 'path'; import fs from 'fs'; -import eosp from 'end-of-stream-promise'; -import pumpify from 'pumpify'; +import { encodeProject } from './urlParser'; +import { PROJECT_INFO_FILE } from '../constants/core'; +import pump from 'pump-promise'; export default class Project { static async load(key, Hyperdrive, db) { @@ -32,15 +31,17 @@ export default class Project { } async getInfo() { - const key = this.key.toString('hex') - try { + const key = this.key.toString('hex'); + const url = this.url + const writable = this.archive.writable + try { const raw = await this.archive.readFile(PROJECT_INFO_FILE, 'utf8'); const parsed = JSON.parse(raw); - const final = {title: key, ...parsed, key} - return parsed; - } catch(e) { - return {title: key, key} - } + const final = { title: key, ...parsed, key, url, writable }; + return final; + } catch (e) { + return { title: key, key, url, writable }; + } } async updateInfo(info) { @@ -55,43 +56,51 @@ export default class Project { return updated; } + async getFileList(path='/') { + return this.archive.readdir(path, { includeStats: true}); + } + + async deleteFile(path) { + return this.archive.unlink(path); + } + async showSaveFile(path) { - const {base : defaultPath} = parsePath(path) - const {canceled, filePath} = await dalog.showSaveDialog({ - defaultPath - }) + const { base: defaultPath } = parsePath(path); + const { canceled, filePath } = await dialog.showSaveDialog({ + defaultPath + }); - if(canceled) throw new Error('Cancelled file save') + if (canceled) throw new Error('Canceled file save'); - const readStream = this.archive.createReadStream(path) - const writeStream = fs.createWriteStream(filePath) + const readStream = this.archive.createReadStream(path); + const writeStream = fs.createWriteStream(filePath); - await eosp(pumpify(readStream, writeStream)) + await pump(readStream, writeStream) - return { - filePath - } + return { + filePath + }; } - async showLoadFile(basePath='/') { - const {cancelled, filePaths} = await dialog.showOpenDialog() + async showLoadFile(basePath = '/') { + const { canceled, filePaths } = await dialog.showOpenDialog(); - // If they cancelled, whatever - if(canceled) return {filePaths: []} + // If they cancelled, whatever + if (canceled) return { filePaths: [] }; - for(let filePath of filePaths) { - const {base: fileName} = parsePath(filePath) + for (const filePath of filePaths) { + const { base: fileName } = parsePath(filePath); - const destination = joinPaths(basePath, fileName) + const destination = joinPaths(basePath, fileName); - const writeStream = this.archive.createWriteStream(destination) - const readStream = fs.createReadStream(filePath) + const writeStream = this.archive.createWriteStream(destination); + const readStream = fs.createReadStream(filePath); - await eosp(pumpify(readStream, writeStream)) - } + await pump(readStream, writeStream) + } - return { - filePaths - } + return { + filePaths + }; } } diff --git a/app/core/ProjectStore.js b/app/core/ProjectStore.js index 19e9c1d..44d8bde 100644 --- a/app/core/ProjectStore.js +++ b/app/core/ProjectStore.js @@ -25,7 +25,7 @@ export default class ProjectStore { } async addRecent(key) { - return this.database.addRecentProjectName(key); + return this.database.addRecentProjectName(key); } async getRecent() { diff --git a/app/core/index.js b/app/core/index.js index 34703d7..a16e193 100644 --- a/app/core/index.js +++ b/app/core/index.js @@ -1,11 +1,11 @@ import SDK from 'dat-sdk'; import envPaths from 'env-paths'; import levelup from 'levelup'; -import leveldown from 'leveldown' +import leveldown from 'leveldown'; import encodingdown from 'encoding-down'; import EventEmitter from 'events'; import path from 'path'; -import fs from 'fs-extra' +import fs from 'fs-extra'; import { APPLICATION_NAME } from '../constants/core'; @@ -25,13 +25,13 @@ export default class NatakanuCore extends EventEmitter { const { applicationName } = this; const dataPath = envPaths(applicationName).data; if (!this.db) { - const dbPath = path.join(dataPath, 'levelup') + const dbPath = path.join(dataPath, 'levelup'); const dbOptions = { valueEncoding: 'json' - } + }; - await fs.ensureDir(dbPath) - this.db = levelup(encodingdown(leveldown(dbPath), dbOptions)) + await fs.ensureDir(dbPath); + this.db = levelup(encodingdown(leveldown(dbPath), dbOptions)); } if (!this.sdk) { this.sdk = await SDK({ diff --git a/app/core/urlParser.js b/app/core/urlParser.js index 3cea1ba..f4b3c93 100644 --- a/app/core/urlParser.js +++ b/app/core/urlParser.js @@ -1,6 +1,6 @@ -const PROTOCOL_SCHEME = 'natakanu://'; -const PROJECT_PATH = new RegExp(`^${PROTOCOL_SCHEME}project/([^/]+)(.*)`); -const ACCOUNT_PATH = new RegExp(`^${PROTOCOL_SCHEME}account/([^/]+)(.*)`); +export const PROTOCOL_SCHEME = 'natakanu://'; +export const PROJECT_PATH = new RegExp(`^${PROTOCOL_SCHEME}project/([^/]+)(.*)`); +export const ACCOUNT_PATH = new RegExp(`^${PROTOCOL_SCHEME}account/([^/]+)(.*)`); export function parseURL(url) { let match = null; diff --git a/app/main.dev.js b/app/main.dev.js index 7e622a2..4989a2c 100644 --- a/app/main.dev.js +++ b/app/main.dev.js @@ -97,6 +97,11 @@ const createWindow = async () => { * Add event listeners... */ +app.on('open-url', (event, data) => { + event.preventDefault() + console.log('Opened URL', data) +}) + app.on('window-all-closed', () => { // Respect the OSX convention of having the application in memory even // after all windows have been closed @@ -105,7 +110,10 @@ app.on('window-all-closed', () => { } }); -app.on('ready', createWindow); +app.on('ready', () => { + app.setAsDefaultProtocolClient('natakanu') + createWindow() +}); app.on('activate', () => { // On macOS it's common to re-create a window in the app when the diff --git a/app/reducers/core.js b/app/reducers/core.js index 4d45a3a..e12a359 100644 --- a/app/reducers/core.js +++ b/app/reducers/core.js @@ -1,23 +1,30 @@ // @flow import { - CORE_LOADED, - ACCOUNT_LOADED, - CREATED_PROJECT, - LOADED_PROJECT, + CORE_LOADED, + ACCOUNT_LOADED, + CREATED_PROJECT, + LOADED_PROJECT, + ADDED_FILE, + DELETED_FILE, } from '../actions/core'; import type { Action } from './types'; // TODO: Document types for core loading export default function core(state: any = {}, action: Action) { + console.log(action) switch (action.type) { case CORE_LOADED: - return {...state, ...action.payload} + return { ...state, ...action.payload }; case ACCOUNT_LOADED: - return {...state, ...action.payload} + return { ...state, ...action.payload }; case CREATED_PROJECT: - return {...state, ...action.payload} + return { ...state, ...action.payload }; case LOADED_PROJECT: - return {...state, ...action.payload} + return { ...state, ...action.payload }; + case ADDED_FILE: + return { ...state, ...action.payload }; + case DELETED_FILE: + return { ...state, ...action.payload }; default: return state || {}; } diff --git a/package.json b/package.json index 54e3164..bb296bd 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,10 @@ "build": { "productName": "Natakanu", "appId": "ca.wapikoni.Natakanu", + "protocols": { + "name": "natakanu-protocol", + "schemes": ["natakanu"] + }, "files": [ "dist/", "node_modules/", @@ -276,7 +280,7 @@ "fs-extra": "^8.1.0", "history": "^4.10.1", "levelup": "^4.3.2", - "pumpify": "^2.0.1", + "pump-promise": "^1.0.0", "react": "^16.12.0", "react-bootstrap": "^1.0.0-beta.16", "react-dom": "^16.12.0",