diff --git a/src/gh.ts b/src/core/gh.ts similarity index 77% rename from src/gh.ts rename to src/core/gh.ts index cf19fa1..b831655 100644 --- a/src/gh.ts +++ b/src/core/gh.ts @@ -20,7 +20,14 @@ import { OwnerFromGetContributors, ResponseFromGetContributors, } from './types'; -import { createAppStore, ActionsType, ApplicationState, ActionNames, FilterSteps, FilterStatus } from './store'; +import { + createAppStore, + ActionsType, + ApplicationState, + ActionNames, + FilterSteps, + FilterStatus, +} from './store'; import { Store } from 'redux'; // +++ General init +++ @@ -43,20 +50,20 @@ octokit.authenticate({ }); // --- End General init --- +const defaultStore: Store = createAppStore(); + class GithubDetectUnusedRepos { private username: string; - reduxStore: Store; constructor(username: string) { this.username = username; - this.reduxStore = createAppStore(); // Update username in redux store - this.reduxStore.dispatch({ + defaultStore.dispatch({ type: ActionNames.InitUserName, payload: { - userName: username - } + userName: username, + }, }); } @@ -67,25 +74,25 @@ class GithubDetectUnusedRepos { const repos: ResponseWithDataArray< RepoFromGetUserRepo - > = await this.paginate( - ( - tmpFirstParam: Octokit.ReposGetForUserParams - ): Promise => { - return (octokit.repos.getForUser(tmpFirstParam) as any) as Promise< - ResponseFromGetUserRepo - >; - }, - params - ); + > = await this.paginate( + ( + tmpFirstParam: Octokit.ReposGetForUserParams + ): Promise => { + return (octokit.repos.getForUser(tmpFirstParam) as any) as Promise< + ResponseFromGetUserRepo + >; + }, + params + ); // Update all repo names in redux store repos.data.forEach(repoData => { - this.reduxStore.dispatch({ + defaultStore.dispatch({ type: ActionNames.InitRepo, payload: { - repoName: repoData.name - } - }) + repoName: repoData.name, + }, + }); }); const forkedRepoNames = repos.data @@ -98,28 +105,26 @@ class GithubDetectUnusedRepos { // Update fork filter in redux store repos.data.forEach(repoData => { if (forkedRepoNames.includes(repoData.name)) { - - this.reduxStore.dispatch({ + defaultStore.dispatch({ type: ActionNames.AddRepoFilterStatus, payload: { repoName: repoData.name, filterStep: FilterSteps.forked, filterState: { - status: FilterStatus.pass - } - } + status: FilterStatus.pass, + }, + }, }); - } else { - this.reduxStore.dispatch({ + defaultStore.dispatch({ type: ActionNames.AddRepoFilterStatus, payload: { repoName: repoData.name, filterStep: FilterSteps.forked, filterState: { - status: FilterStatus.fail - } - } + status: FilterStatus.fail, + }, + }, }); } }); @@ -217,48 +222,42 @@ class GithubDetectUnusedRepos { { // Update redux state for these 3 filters allRepoWithFlagFromCommitAhead.forEach(tmp => { - this.reduxStore.dispatch( - { - type: ActionNames.AddRepoFilterStatus, - payload: { - repoName: tmp.repoName, - filterStep: FilterSteps.eachBranchBehindOrEven, - filterState: { - status: tmp.unused ? FilterStatus.pass : FilterStatus.fail - } - } - } - ) + defaultStore.dispatch({ + type: ActionNames.AddRepoFilterStatus, + payload: { + repoName: tmp.repoName, + filterStep: FilterSteps.eachBranchBehindOrEven, + filterState: { + status: tmp.unused ? FilterStatus.pass : FilterStatus.fail, + }, + }, + }); }); allRepoWithFlagFromForkContrib.forEach(tmp => { - this.reduxStore.dispatch( - { - type: ActionNames.AddRepoFilterStatus, - payload: { - repoName: tmp.repoName, - filterStep: FilterSteps.notForkContributor, - filterState: { - status: tmp.unused ? FilterStatus.pass : FilterStatus.fail - } - } - } - ) + defaultStore.dispatch({ + type: ActionNames.AddRepoFilterStatus, + payload: { + repoName: tmp.repoName, + filterStep: FilterSteps.notForkContributor, + filterState: { + status: tmp.unused ? FilterStatus.pass : FilterStatus.fail, + }, + }, + }); }); allRepoWithFlagFromParentContrib.forEach(tmp => { - this.reduxStore.dispatch( - { - type: ActionNames.AddRepoFilterStatus, - payload: { - repoName: tmp.repoName, - filterStep: FilterSteps.notParentContributor, - filterState: { - status: tmp.unused ? FilterStatus.pass : FilterStatus.fail - } - } - } - ) + defaultStore.dispatch({ + type: ActionNames.AddRepoFilterStatus, + payload: { + repoName: tmp.repoName, + filterStep: FilterSteps.notParentContributor, + filterState: { + status: tmp.unused ? FilterStatus.pass : FilterStatus.fail, + }, + }, + }); }); } @@ -298,6 +297,21 @@ class GithubDetectUnusedRepos { tmpObjFromForkContrib.unused && tmpObjFromParentContrib.unused, }); + + allRepoWithFlagTillStep4.forEach(tmp => { + defaultStore.dispatch( + { + type: ActionNames.AddRepoFilterStatus, + payload: { + repoName: tmp.repoName, + filterStep: FilterSteps.noCommits, + filterState: { + status: tmp.unused ? FilterStatus.pass : FilterStatus.fail + } + } + } + ) + }); } } } @@ -344,16 +358,16 @@ class GithubDetectUnusedRepos { const branchesResponse: ResponseWithDataArray< BranchFromGetBranches - > = await this.paginate( - ( - tmpFirstParam: Octokit.ReposGetBranchesParams - ): Promise => { - return (octokit.repos.getBranches(tmpFirstParam) as any) as Promise< - ResponseFromGetBranches - >; - }, - params - ); + > = await this.paginate( + ( + tmpFirstParam: Octokit.ReposGetBranchesParams + ): Promise => { + return (octokit.repos.getBranches(tmpFirstParam) as any) as Promise< + ResponseFromGetBranches + >; + }, + params + ); return { repoName, @@ -462,31 +476,31 @@ class GithubDetectUnusedRepos { const responseFromGetContributors: ResponseWithDataArray< OwnerFromGetContributors - > = await this.paginate( - async ( - tmpFirstParam: Octokit.ReposGetContributorsParams - ): Promise> => { - // Modify getContributors to return empty contributor data array instead of undefined for empty repos - const response = await ((octokit.repos.getContributors( - tmpFirstParam - ) as any) as Promise); + > = await this.paginate( + async ( + tmpFirstParam: Octokit.ReposGetContributorsParams + ): Promise> => { + // Modify getContributors to return empty contributor data array instead of undefined for empty repos + const response = await ((octokit.repos.getContributors( + tmpFirstParam + ) as any) as Promise); - let dataNormalized = response.data; - if (dataNormalized === undefined) { - dataNormalized = []; - } + let dataNormalized = response.data; + if (dataNormalized === undefined) { + dataNormalized = []; + } - const responseNormalized: ResponseWithDataArrayAndMeta< - OwnerFromGetContributors - > = { - data: dataNormalized, - meta: response.meta, - }; + const responseNormalized: ResponseWithDataArrayAndMeta< + OwnerFromGetContributors + > = { + data: dataNormalized, + meta: response.meta, + }; - return responseNormalized; - }, - params - ); + return responseNormalized; + }, + params + ); const contributors = responseFromGetContributors.data; @@ -502,20 +516,18 @@ class GithubDetectUnusedRepos { } } -export function runMain(username: string = 'bendtherules') { +function runMain(username: string = 'bendtherules') { const instance = new GithubDetectUnusedRepos(username); - - instance - .fetchUnusedForkedRepos() - .then(unusedRepoNames => { - // tslint:disable-next-line:no-console - console.log(unusedRepoNames); - console.log(instance.reduxStore.getState()); - }); - + instance.fetchUnusedForkedRepos().then(unusedRepoNames => { + // tslint:disable-next-line:no-console + console.log(unusedRepoNames); + console.log(defaultStore.getState()); + }); } +export { defaultStore, runMain }; + // Next steps // // 1. Get all forked repos for a user diff --git a/src/store/actions.ts b/src/core/store/actions.ts similarity index 97% rename from src/store/actions.ts rename to src/core/store/actions.ts index b818578..bcbc99d 100644 --- a/src/store/actions.ts +++ b/src/core/store/actions.ts @@ -29,6 +29,6 @@ export interface AddRepoFilterStatusArgs } export type ActionsType = - InitUserNameArgs + | InitUserNameArgs | InitRepoArgs | AddRepoFilterStatusArgs; diff --git a/src/store/index.ts b/src/core/store/index.ts similarity index 100% rename from src/store/index.ts rename to src/core/store/index.ts diff --git a/src/store/model.ts b/src/core/store/model.ts similarity index 99% rename from src/store/model.ts rename to src/core/store/model.ts index 096fdc2..701779a 100644 --- a/src/store/model.ts +++ b/src/core/store/model.ts @@ -59,7 +59,7 @@ export type RepoFilterStateMap = Map< { filterState: RepoFilterState; } - >; +>; export interface ApplicationState { username: string; diff --git a/src/core/store/reducers.ts b/src/core/store/reducers.ts new file mode 100644 index 0000000..d007c11 --- /dev/null +++ b/src/core/store/reducers.ts @@ -0,0 +1,79 @@ +import { Reducer, createStore, Store } from 'redux'; +import { ApplicationState, FilterStatus, RepoFilterState } from './model'; +import { + ActionNames, + InitUserNameArgs, + InitRepoArgs, + AddRepoFilterStatusArgs, + ActionsType, +} from './actions'; + +export const initialState: ApplicationState = { + username: '', + repoStateMap: new Map(), +}; + +export const reducer: Reducer = ( + state: ApplicationState = initialState, + action +) => { + // We'll augment the action type on the switch case to make sure we have + // all the cases handled. + switch (action.type) { + case ActionNames.InitUserName: + return { ...state, username: action.payload.userName }; + + case ActionNames.InitRepo: { + const clonedAppState = new Map(state.repoStateMap); + clonedAppState.set(action.payload.repoName, { + filterState: { + forked: { + status: FilterStatus.waiting, + }, + eachBranchBehindOrEven: { + status: FilterStatus.waiting, + }, + notForkContributor: { + status: FilterStatus.waiting, + }, + notParentContributor: { + status: FilterStatus.waiting, + }, + noCommits: { + status: FilterStatus.waiting, + }, + }, + }); + return { ...state, repoStateMap: clonedAppState }; + } + case ActionNames.AddRepoFilterStatus: { + const clonedAppState = new Map(state.repoStateMap); + let clonedRepoState = JSON.parse( + JSON.stringify(clonedAppState.get(action.payload.repoName)) + ) as + | { + filterState: RepoFilterState; + } + | undefined; + + if (clonedRepoState !== undefined) { + clonedRepoState.filterState[action.payload.filterStep] = + action.payload.filterState; + + clonedAppState.set(action.payload.repoName, clonedRepoState); + return { ...state, repoStateMap: clonedAppState }; + } else { + return state; + } + } + default: + return state; + } +}; + +export function createAppStore(): Store { + return (createStore( + reducer, + initialState + ) as any) as Store; +} diff --git a/src/types/index.ts b/src/core/types/index.ts similarity index 100% rename from src/types/index.ts rename to src/core/types/index.ts diff --git a/src/index.ts b/src/index.ts index 41d3562..546367e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import 'babel-polyfill'; // tslint:disable-next-line:ordered-imports -import { runMain } from './gh'; +import { runMain } from './core/gh'; // tslint:disable-next-line:only-arrow-functions (function(currentWindow: Window) { diff --git a/src/store/reducers.ts b/src/store/reducers.ts deleted file mode 100644 index 72bdd2e..0000000 --- a/src/store/reducers.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Reducer, createStore, Store } from 'redux'; -import { ApplicationState, FilterStatus, RepoFilterState } from './model'; -import { ActionNames, InitUserNameArgs, InitRepoArgs, AddRepoFilterStatusArgs, ActionsType } from './actions'; - -export const initialState: ApplicationState = { - username: '', - repoStateMap: new Map() -}; - -export const reducer: Reducer = (state: ApplicationState = initialState, action) => { - // We'll augment the action type on the switch case to make sure we have - // all the cases handled. - switch (action.type) { - case ActionNames.InitUserName: - return { ...state, username: action.payload.userName }; - - case ActionNames.InitRepo: - { - const clonedAppState = new Map(state.repoStateMap); - clonedAppState.set(action.payload.repoName, { - filterState: { - forked: { - status: FilterStatus.waiting - }, - eachBranchBehindOrEven: { - status: FilterStatus.waiting - }, - notForkContributor: { - status: FilterStatus.waiting - }, - notParentContributor: { - status: FilterStatus.waiting - }, - noCommits: { - status: FilterStatus.waiting - } - } - }); - return { ...state, repoStateMap: clonedAppState }; - } - case ActionNames.AddRepoFilterStatus: - { - const clonedAppState = new Map(state.repoStateMap); - let clonedRepoState = JSON.parse(JSON.stringify(clonedAppState.get(action.payload.repoName))) as ( - { - filterState: RepoFilterState; - } | undefined - ); - - if (clonedRepoState !== undefined) { - clonedRepoState.filterState[action.payload.filterStep] = action.payload.filterState; - - clonedAppState.set(action.payload.repoName, clonedRepoState); - return { ...state, repoStateMap: clonedAppState }; - } else { - return state; - } - } - default: - return state; - } -}; - -export function createAppStore(): Store { - return createStore< - ApplicationState, ActionsType, {}, {} - >( - reducer, - initialState - ) as any as Store; -}; \ No newline at end of file