Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
import select from 'select-dom';
import onetime from 'onetime';
import {isRepo, isPR, isIssue} from './page-detect';
export const getUsername = onetime(() => select('meta[name="user-login"]')!.getAttribute('content')!);
export const getDiscussionNumber = (): string | undefined => {
if (isPR() || isIssue()) {
return getCleanPathname().split('/')[3];
}
return undefined;
};
// Drops leading and trailing slash to avoid /\/?/ everywhere
export const getCleanPathname = (): string => location.pathname.replace(/^[/]|[/]$/g, '');
// Parses a repo's subpage, e.g.
// '/user/repo/issues/' -> 'issues'
// '/user/repo/' -> ''
// returns undefined if the path is not a repo
// @flow
import onetime from 'onetime'
// Some of this functions are borrowed from https://github.com/sindresorhus/refined-github/blob/master/source/libs/page-detect.js
// Drops leading and trailing slash to avoid /\/?/ everywhere
const getCleanPathname = () => location.pathname.replace(/^[/]|[/]$/g, '')
// '/user/repo/.../...' -> 'user/repo'
// eslint-disable-next-line no-warning-comments
// FIXME TODO: I noticed much later that maybe this could simply be:
// `JSON.parse(document.body.dataset.currentRepo).fullslug`
// Confirm, compare perf and replace in better.
export const getRepoURL = onetime(() =>
location.pathname
.slice(1)
.split('/', 2)
.join('/')
)
// Parses a repo's subpage, e.g.
// '/user/repo/pull-requests/' -> 'pull-requests'
// '/user/repo/' -> ''
// returns false if the path is not a repo
const getRepoPath = () => {
const match = /^[^/]+[/][^/]+[/]?(.*)$/.exec(getCleanPathname())
return (match && match[1]) || ''
}
export const isPullRequestList = () => getRepoPath() === 'pull-requests'
/**
* @copyright 2016-present, Sitegen team
*/
import fs from 'fs';
import logUpdate from 'log-update';
import onetime from 'onetime';
import exitHook from 'exit-hook';
const NEWLINE = '\n';
let installExitHook = onetime(() =>
exitHook(() => OutputRenderer.done()));
let OutputRenderer = {
stdout: [],
stderr: [],
_stdoutWrite: process.stdout.write,
_stderrWrite: process.stderr.write,
_consoleLog: console.log, // eslint-disable-line no-console
_consoleWarning: console.warning, // eslint-disable-line no-console
_consoleError: console.error, // eslint-disable-line no-console
_consoleDebug: console.debug, // eslint-disable-line no-console
get hasBuffer() {
return this.stdout.length || this.stderr.length;
async function init(): Promise {
const icon = await fetchCIStatus();
if (!icon) {
return false;
}
if (onetime.callCount(fetchCIStatus) > 1) {
icon.style.animation = 'none';
}
// Append to title (aware of forks and private repos)
appendBefore('.pagehead h1', '.fork-flag', icon);
}
async function init() {
const icon = await fetchStatus();
if (!icon) {
return false;
}
if (callCount(fetchStatus) > 1) {
icon.style.animation = 'none';
}
// Append to title (aware of forks and private repos)
appendBefore('.pagehead h1', '.fork-flag', icon);
}
import React from 'dom-chef';
import select from 'select-dom';
import onetime from 'onetime';
import elementReady from 'element-ready';
import features from '../libs/features';
import {isUserProfile, isOwnOrganizationProfile, isOrganizationProfile} from '../libs/page-detect';
const addNewProjectLink = onetime(() => {
if (isUserProfile()) {
// The link already exists on our profile,
// and we can't create projects on others' profiles
return;
}
if (isOrganizationProfile() && !isOwnOrganizationProfile()) {
// We can only add projects to our organizations
return;
}
// We can't detect whether we can create projects on a repo,
// so we're just gonna show a potentially-404 link. 🤷
// URLs patterns:
// https://github.com/orgs/USER/projects/new
import features from '../libs/features';
import fetchDom from '../libs/fetch-dom';
import postForm from '../libs/post-form';
import {getDiscussionNumber, getRepoGQL, getRepoURL, getCurrentBranch} from '../libs/utils';
function showError(menuItem: HTMLButtonElement, error: string): void {
menuItem.disabled = true;
menuItem.style.background = 'none'; // Disables hover background color
menuItem.textContent = error;
}
/**
Get the current base commit of this PR. It should change after rebases and merges in this PR.
This value is not consistently available on the page (appears in `/files` but not when only 1 commit is selected)
*/
const getBaseReference = onetime(async (): Promise => {
const {repository} = await api.v4(`
repository(${getRepoGQL()}) {
pullRequest(number: ${getDiscussionNumber()!}) {
baseRefOid
}
}
`);
return repository.pullRequest.baseRefOid;
});
async function getFile(menuItem: Element): Promise<{isTruncated: boolean; text: string} | null> {
const filePath = menuItem.closest('[data-path]')!.dataset.path!;
const {repository} = await api.v4(`
repository(${getRepoGQL()}) {
file: object(expression: "${await getBaseReference()}:${filePath}") {
... on Blob {
import './wait-for-build.css';
import React from 'dom-chef';
import select from 'select-dom';
import onetime from 'onetime';
import infoIcon from 'octicon/info.svg';
import delegate, {DelegateEvent} from 'delegate-it';
import features from '../libs/features';
import * as prCiStatus from '../libs/pr-ci-status';
import onPrMergePanelOpen from '../libs/on-pr-merge-panel-open';
let waiting: symbol | undefined;
// Reuse the same checkbox to preserve its status
const generateCheckbox = onetime(() => (
<label>
<input checked="" name="rgh-pr-check-waiter" type="checkbox">
{' Wait for successful checks '}
<a aria-label="This only works if you keep this tab open while waiting." href="https://github.com/sindresorhus/refined-github/pull/975">
{infoIcon()}
</a>
</label>
));
function canMerge(): boolean {
return select.exists('[data-details-container=".js-merge-pr"]:not(:disabled)');
}
function getCheckbox(): HTMLInputElement | null {
return select('[name="rgh-pr-check-waiter"]');
}
// @flow
import onetime from 'onetime'
export const getApiToken: () => string = onetime(
(): string => {
const meta: HTMLMetaElement = (document.querySelector(
'meta[name="apitoken"]'
): any)
const apiTokenContent = meta.content
const parsedApiTokenContent = JSON.parse(apiTokenContent)
return parsedApiTokenContent.token
}
)
export const getMainBranch: () => string = onetime(
(): string =>
JSON.parse((document.body || {}).dataset.currentRepo).mainbranch.name
)
export function getFirstFileContents(
localUrls: string[],
externalUrl: string
): Promise {
const requests = localUrls.map(url =>
fetch(url, { credentials: 'include' })
)
if (externalUrl) {
requests.push(fetch(externalUrl))
}
import { h } from 'dom-chef'
import onetime from 'onetime'
export const cleanDocumentBody = () => {
while (document.body.hasChildNodes()) {
document.body.removeChild(document.body.lastChild)
}
}
export const addApiTokenMetadata = onetime(() => {
const meta = (
)
document.head.appendChild(meta)
})
export const setUrlLocation = () => {
global.location = new URL('https://www.bitbucket.org/user/repo')
}