UNPKG

@simulacrum/github-api-simulator

Version:

Provides common functionality to frontend app and plugins.

106 lines 4.53 kB
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