@simulacrum/github-api-simulator
Version:
Provides common functionality to frontend app and plugins.
106 lines • 4.53 kB
JavaScript
import { convertInitialStateToStoreState, } from "./entities.js";
const inputSchema = (initialState, extendedSchema) => ({ slice }) => {
const storeInitialState = convertInitialStateToStoreState(initialState);
const extended = extendedSchema ? extendedSchema({ slice }) : {};
let slices = {
users: slice.table(!storeInitialState ? {} : { initialState: storeInitialState.users }),
installations: slice.table(!storeInitialState
? {}
: { initialState: storeInitialState.installations }),
repositories: slice.table(!storeInitialState
? {}
: { initialState: storeInitialState.repositories }),
branches: slice.table(!storeInitialState ? {} : { initialState: storeInitialState.branches }),
organizations: slice.table(!storeInitialState
? {}
: { initialState: storeInitialState.organizations }),
blobs: slice.table(!storeInitialState ? {} : { initialState: storeInitialState.blobs }),
...extended,
};
return slices;
};
const inputActions = (args) => {
return {};
};
const extendActions = (extendedActions) => (args) => {
return extendedActions
? // @ts-expect-error schema is cyclical, ignore extension for now
{ ...inputActions(args), ...extendedActions(args) }
: inputActions(args);
};
const inputSelectors = (args) => {
const { createSelector, schema } = args;
const allGithubOrganizations = createSelector(schema.organizations.selectTableAsList, (ghOrgs) => {
return ghOrgs;
});
const getAppInstallation = createSelector(schema.installations.selectTableAsList, schema.organizations.selectTableAsList, schema.repositories.selectTableAsList, (_, org, repo) => ({ org, repo }), (installations, orgs, repos, { org, repo }) => {
const appInstall = installations.find((install) => install.account === org);
if (!appInstall)
return undefined;
let account = undefined;
if (repo) {
const repoData = repos.find((r) => r.owner === appInstall?.account && r.name === repo);
if (repoData)
account = orgs.find((o) => o.login === repoData.owner);
}
else {
account = orgs.find((o) => o.login === appInstall?.account);
}
if (!account)
return undefined;
return {
...appInstall,
account: { ...account },
target_id: account?.id,
target_type: account?.type,
};
});
const allReposWithOrgs = createSelector(schema.repositories.selectTableAsList, schema.organizations.selectTable, (_, org) => org, (allRepos, orgMap, org) => {
if (org && !orgMap?.[org])
return undefined;
const repos = !org ? allRepos : allRepos.filter((r) => r.owner === org);
return repos.map((repo) => {
const linkedRepo = { ...repo, owner: { ...orgMap[repo.owner] } };
// TODO better option than delete?
delete linkedRepo.owner.name;
delete linkedRepo.owner.email;
return linkedRepo;
});
});
const getBlob = createSelector(schema.blobs.selectTableAsList, (_state, owner, repo, sha_or_path) => ({
owner,
repo,
sha_or_path,
}), (blobs, { owner, repo, sha_or_path }) => {
const blob = blobs.find((blob) => blob.owner === owner &&
blob.repo === repo &&
(blob.path === sha_or_path || blob.sha === sha_or_path));
return blob;
});
const getBlobAtOwnerRepo = createSelector(schema.blobs.selectTableAsList, (_state, owner, repo) => ({
owner,
repo,
}), (blobs, { owner, repo }) => {
const blob = blobs.filter((blob) => blob.owner === owner && blob.repo === repo);
return blob;
});
return {
allGithubOrganizations,
getAppInstallation,
allReposWithOrgs,
getBlob,
getBlobAtOwnerRepo,
};
};
const extendSelectors = (extendedSelectors) => (args) => {
return extendedSelectors
? // @ts-expect-error schema is cyclical, ignore extension for now
{ ...inputSelectors(args), ...extendedSelectors(args) }
: inputSelectors(args);
};
export const extendStore = (initialState, extended) => ({
actions: extendActions(extended?.actions),
selectors: extendSelectors(extended?.selectors),
schema: inputSchema(initialState, extended?.schema),
});
//# sourceMappingURL=index.js.map