Commit c3e2a91b authored by Eduardo Sanz García's avatar Eduardo Sanz García Committed by Eduardo

Convert the rest of the default export into named exports

parent b1209d74
import { startApp } from '@hypothesis/frontend-shared/lib/pattern-library'; import { startApp } from '@hypothesis/frontend-shared/lib/pattern-library';
import ButtonPatterns from './components/ButtonPatterns'; import ButtonPatterns from './components/ButtonPatterns';
import sidebarIcons from '../../src/sidebar/icons'; import { sidebarIcons } from '../../src/sidebar/icons';
/** @type {import('@hypothesis/frontend-shared/lib/pattern-library').PlaygroundRoute[]} */ /** @type {import('@hypothesis/frontend-shared/lib/pattern-library').PlaygroundRoute[]} */
const extraRoutes = [ const extraRoutes = [
......
/* global PDFViewerApplication */ /* global PDFViewerApplication */
import warnOnce from '../../shared/warn-once'; import { warnOnce } from '../../shared/warn-once';
import { matchQuote } from './match-quote'; import { matchQuote } from './match-quote';
import { createPlaceholder } from './placeholder'; import { createPlaceholder } from './placeholder';
import { TextPosition, TextRange } from './text-range'; import { TextPosition, TextRange } from './text-range';
......
...@@ -251,7 +251,7 @@ class FakePDFViewer { ...@@ -251,7 +251,7 @@ class FakePDFViewer {
* *
* The original is defined at https://github.com/mozilla/pdf.js/blob/master/web/app.js * The original is defined at https://github.com/mozilla/pdf.js/blob/master/web/app.js
*/ */
export default class FakePDFViewerApplication { export class FakePDFViewerApplication {
/** /**
* @param {Options} options * @param {Options} options
*/ */
......
...@@ -27,7 +27,7 @@ import minimalJSON from './minimal.json'; ...@@ -27,7 +27,7 @@ import minimalJSON from './minimal.json';
import wikipediaDoc from './wikipedia-regression-testing.html'; import wikipediaDoc from './wikipedia-regression-testing.html';
import wikipediaJSON from './wikipedia-regression-testing.json'; import wikipediaJSON from './wikipedia-regression-testing.json';
export default [ export const htmlBaselines = [
{ {
name: 'Minimal Document', name: 'Minimal Document',
html: minimalDoc, html: minimalDoc,
......
import * as html from '../html'; import * as html from '../html';
import fixture from './html-anchoring-fixture.html'; import fixture from './html-anchoring-fixture.html';
import htmlBaselines from './html-baselines'; import { htmlBaselines } from './html-baselines';
/** Return all text node children of `container`. */ /** Return all text node children of `container`. */
function textNodes(container) { function textNodes(container) {
......
...@@ -3,7 +3,7 @@ import * as pdfAnchoring from '../pdf'; ...@@ -3,7 +3,7 @@ import * as pdfAnchoring from '../pdf';
import { matchQuote } from '../match-quote'; import { matchQuote } from '../match-quote';
import { TextRange } from '../text-range'; import { TextRange } from '../text-range';
import FakePDFViewerApplication from './fake-pdf-viewer-application'; import { FakePDFViewerApplication } from './fake-pdf-viewer-application';
/** /**
* Return a DOM Range which refers to the specified `text` in `container`. * Return a DOM Range which refers to the specified `text` in `container`.
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* @return {object} - Any config settings returned by hypothesisConfig() * @return {object} - Any config settings returned by hypothesisConfig()
* *
*/ */
export default function configFuncSettingsFrom(window_) { export function configFuncSettingsFrom(window_) {
if (!window_.hasOwnProperty('hypothesisConfig')) { if (!window_.hasOwnProperty('hypothesisConfig')) {
return {}; return {};
} }
......
import { isBrowserExtension } from './is-browser-extension'; import { isBrowserExtension } from './is-browser-extension';
import settingsFrom from './settings'; import { settingsFrom } from './settings';
import { toBoolean } from '../../shared/type-coercions'; import { toBoolean } from '../../shared/type-coercions';
import { urlFromLinkTag } from './url-from-link-tag'; import { urlFromLinkTag } from './url-from-link-tag';
......
import { parseJsonConfig } from '../../boot/parse-json-config'; import { parseJsonConfig } from '../../boot/parse-json-config';
import { toBoolean } from '../../shared/type-coercions'; import { toBoolean } from '../../shared/type-coercions';
import configFuncSettingsFrom from './config-func-settings-from'; import { configFuncSettingsFrom } from './config-func-settings-from';
import { urlFromLinkTag } from './url-from-link-tag'; import { urlFromLinkTag } from './url-from-link-tag';
/** /**
...@@ -20,7 +20,7 @@ import { urlFromLinkTag } from './url-from-link-tag'; ...@@ -20,7 +20,7 @@ import { urlFromLinkTag } from './url-from-link-tag';
/** /**
* @return {SettingsGetters} * @return {SettingsGetters}
*/ */
export default function settingsFrom(window_) { export function settingsFrom(window_) {
// Prioritize the `window.hypothesisConfig` function over the JSON format // Prioritize the `window.hypothesisConfig` function over the JSON format
// Via uses `window.hypothesisConfig` and makes it non-configurable and non-writable. // Via uses `window.hypothesisConfig` and makes it non-configurable and non-writable.
// In addition, Via sets the `ignoreOtherConfiguration` option to prevent configuration merging. // In addition, Via sets the `ignoreOtherConfiguration` option to prevent configuration merging.
......
import configFuncSettingsFrom from '../config-func-settings-from'; import { configFuncSettingsFrom } from '../config-func-settings-from';
describe('annotator.config.configFuncSettingsFrom', () => { describe('annotator.config.configFuncSettingsFrom', () => {
const sandbox = sinon.createSandbox(); const sandbox = sinon.createSandbox();
......
import { getConfig } from '../index'; import { getConfig, $imports } from '../index';
import { $imports } from '../index';
describe('annotator/config/index', () => { describe('annotator/config/index', () => {
let fakeSettingsFrom; let fakeSettingsFrom;
...@@ -20,7 +19,7 @@ describe('annotator/config/index', () => { ...@@ -20,7 +19,7 @@ describe('annotator/config/index', () => {
fakeIsBrowserExtension = sinon.stub(); fakeIsBrowserExtension = sinon.stub();
$imports.$mock({ $imports.$mock({
'./settings': fakeSettingsFrom, './settings': { settingsFrom: fakeSettingsFrom },
'./is-browser-extension': { './is-browser-extension': {
isBrowserExtension: fakeIsBrowserExtension, isBrowserExtension: fakeIsBrowserExtension,
}, },
...@@ -135,16 +134,18 @@ describe('annotator/config/index', () => { ...@@ -135,16 +134,18 @@ describe('annotator/config/index', () => {
beforeEach(() => { beforeEach(() => {
// Remove all fake values // Remove all fake values
$imports.$mock({ $imports.$mock({
'./settings': sinon.stub().returns({ './settings': {
hostPageSetting: sinon.stub().returns(undefined), settingsFrom: sinon.stub().returns({
annotations: undefined, hostPageSetting: sinon.stub().returns(undefined),
clientUrl: undefined, annotations: undefined,
group: undefined, clientUrl: undefined,
notebookAppUrl: undefined, group: undefined,
showHighlights: undefined, notebookAppUrl: undefined,
sidebarAppUrl: undefined, showHighlights: undefined,
query: undefined, sidebarAppUrl: undefined,
}), query: undefined,
}),
},
}); });
}); });
......
import settingsFrom from '../settings'; import { settingsFrom, $imports } from '../settings';
import { $imports } from '../settings';
describe('annotator/config/settingsFrom', () => { describe('annotator/config/settingsFrom', () => {
let fakeConfigFuncSettingsFrom; let fakeConfigFuncSettingsFrom;
...@@ -12,7 +11,9 @@ describe('annotator/config/settingsFrom', () => { ...@@ -12,7 +11,9 @@ describe('annotator/config/settingsFrom', () => {
fakeParseJsonConfig = sinon.stub().returns({}); fakeParseJsonConfig = sinon.stub().returns({});
$imports.$mock({ $imports.$mock({
'./config-func-settings-from': fakeConfigFuncSettingsFrom, './config-func-settings-from': {
configFuncSettingsFrom: fakeConfigFuncSettingsFrom,
},
'./url-from-link-tag': { './url-from-link-tag': {
urlFromLinkTag: fakeUrlFromLinkTag, urlFromLinkTag: fakeUrlFromLinkTag,
}, },
......
import warnOnce from '../shared/warn-once'; import { warnOnce } from '../shared/warn-once';
let _features = {}; let _features = {};
......
...@@ -20,7 +20,7 @@ import pointerIcon from '../images/icons/pointer.svg'; ...@@ -20,7 +20,7 @@ import pointerIcon from '../images/icons/pointer.svg';
* Set of icons used by the annotator part of the application via the `SvgIcon` * Set of icons used by the annotator part of the application via the `SvgIcon`
* component. * component.
*/ */
export default { export const annotatorIcons = {
annotate: annotateIcon, annotate: annotateIcon,
cancel, cancel,
caution, caution,
......
...@@ -6,8 +6,8 @@ import 'preact/debug'; ...@@ -6,8 +6,8 @@ import 'preact/debug';
// Load icons. // Load icons.
import { registerIcons } from '@hypothesis/frontend-shared'; import { registerIcons } from '@hypothesis/frontend-shared';
import iconSet from './icons'; import { annotatorIcons } from './icons';
registerIcons(iconSet); registerIcons(annotatorIcons);
import { PortProvider } from '../shared/messaging'; import { PortProvider } from '../shared/messaging';
import { getConfig } from './config/index'; import { getConfig } from './config/index';
......
import { delay } from '../../../test-util/wait'; import { delay } from '../../../test-util/wait';
import FakePDFViewerApplication from '../../anchoring/test/fake-pdf-viewer-application'; import { FakePDFViewerApplication } from '../../anchoring/test/fake-pdf-viewer-application';
import { RenderingStates } from '../../anchoring/pdf'; import { RenderingStates } from '../../anchoring/pdf';
import { createPlaceholder } from '../../anchoring/placeholder'; import { createPlaceholder } from '../../anchoring/placeholder';
import { PDFIntegration, isPDF, $imports } from '../pdf'; import { PDFIntegration, isPDF, $imports } from '../pdf';
......
...@@ -8,7 +8,7 @@ const SIDEBAR_TRIGGER_BTN_ATTR = 'data-hypothesis-trigger'; ...@@ -8,7 +8,7 @@ const SIDEBAR_TRIGGER_BTN_ATTR = 'data-hypothesis-trigger';
* @param {object} showFn - Function which shows the sidebar. * @param {object} showFn - Function which shows the sidebar.
*/ */
export default function trigger(rootEl, showFn) { export function sidebarTrigger(rootEl, showFn) {
const triggerElems = rootEl.querySelectorAll( const triggerElems = rootEl.querySelectorAll(
'[' + SIDEBAR_TRIGGER_BTN_ATTR + ']' '[' + SIDEBAR_TRIGGER_BTN_ATTR + ']'
); );
......
...@@ -9,7 +9,7 @@ import { annotationCounts } from './annotation-counts'; ...@@ -9,7 +9,7 @@ import { annotationCounts } from './annotation-counts';
import { BucketBar } from './bucket-bar'; import { BucketBar } from './bucket-bar';
import { createAppConfig } from './config/app'; import { createAppConfig } from './config/app';
import { features } from './features'; import { features } from './features';
import sidebarTrigger from './sidebar-trigger'; import { sidebarTrigger } from './sidebar-trigger';
import { ToolbarController } from './toolbar'; import { ToolbarController } from './toolbar';
import { createShadowRoot } from './util/shadow-root'; import { createShadowRoot } from './util/shadow-root';
......
...@@ -16,7 +16,7 @@ describe('features - annotation layer', () => { ...@@ -16,7 +16,7 @@ describe('features - annotation layer', () => {
beforeEach(() => { beforeEach(() => {
fakeWarnOnce = sinon.stub(); fakeWarnOnce = sinon.stub();
$imports.$mock({ $imports.$mock({
'../shared/warn-once': fakeWarnOnce, '../shared/warn-once': { warnOnce: fakeWarnOnce },
}); });
features.init({ features.init({
......
import sidebarTrigger from '../sidebar-trigger'; import { sidebarTrigger } from '../sidebar-trigger';
describe('sidebarTrigger', () => { describe('sidebarTrigger', () => {
let triggerEl1; let triggerEl1;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
import { parseJsonConfig } from './parse-json-config'; import { parseJsonConfig } from './parse-json-config';
import { bootHypothesisClient, bootSidebarApp } from './boot'; import { bootHypothesisClient, bootSidebarApp } from './boot';
import processUrlTemplate from './url-template'; import { processUrlTemplate } from './url-template';
import { isBrowserSupported } from './browser-check'; import { isBrowserSupported } from './browser-check';
// @ts-ignore - This file is generated before the boot bundle is built. // @ts-ignore - This file is generated before the boot bundle is built.
......
import processUrlTemplate from '../url-template'; import { processUrlTemplate } from '../url-template';
describe('processUrlTemplate', () => { describe('processUrlTemplate', () => {
let fakeDocument; let fakeDocument;
......
...@@ -36,7 +36,7 @@ function currentScriptOrigin(document_ = document) { ...@@ -36,7 +36,7 @@ function currentScriptOrigin(document_ = document) {
* @param {string} url * @param {string} url
* @param {Document} document_ * @param {Document} document_
*/ */
export default function processUrlTemplate(url, document_ = document) { export function processUrlTemplate(url, document_ = document) {
if (url.indexOf('{') === -1) { if (url.indexOf('{') === -1) {
// Not a template. This should always be the case in production. // Not a template. This should always be the case in production.
return url; return url;
......
import warnOnce from '../warn-once'; import { warnOnce } from '../warn-once';
describe('warnOnce', () => { describe('warnOnce', () => {
beforeEach(() => { beforeEach(() => {
......
...@@ -11,7 +11,7 @@ let shownWarnings = {}; ...@@ -11,7 +11,7 @@ let shownWarnings = {};
* are concatenated into a string key which is used to determine if the warning * are concatenated into a string key which is used to determine if the warning
* has been logged before. * has been logged before.
*/ */
export default function warnOnce(...args) { export function warnOnce(...args) {
const key = args.join(); const key = args.join();
if (key in shownWarnings) { if (key in shownWarnings) {
return; return;
......
...@@ -2,7 +2,7 @@ import { LinkButton } from '@hypothesis/frontend-shared'; ...@@ -2,7 +2,7 @@ import { LinkButton } from '@hypothesis/frontend-shared';
import classnames from 'classnames'; import classnames from 'classnames';
import { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks'; import { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';
import observeElementSize from '../util/observe-element-size'; import { observeElementSize } from '../util/observe-element-size';
import { withServices } from '../service-context'; import { withServices } from '../service-context';
import { applyTheme } from '../helpers/theme'; import { applyTheme } from '../helpers/theme';
......
...@@ -3,7 +3,7 @@ import { useMemo, useState } from 'preact/hooks'; ...@@ -3,7 +3,7 @@ import { useMemo, useState } from 'preact/hooks';
import { serviceConfig } from '../../config/service-config'; import { serviceConfig } from '../../config/service-config';
import { isThirdPartyUser } from '../../helpers/account-id'; import { isThirdPartyUser } from '../../helpers/account-id';
import { orgName } from '../../helpers/group-list-item-common'; import { orgName } from '../../helpers/group-list-item-common';
import groupsByOrganization from '../../helpers/group-organizations'; import { groupsByOrganization } from '../../helpers/group-organizations';
import { isThirdPartyService } from '../../helpers/is-third-party-service'; import { isThirdPartyService } from '../../helpers/is-third-party-service';
import { withServices } from '../../service-context'; import { withServices } from '../../service-context';
import { useStoreProxy } from '../../store/use-store'; import { useStoreProxy } from '../../store/use-store';
......
...@@ -110,10 +110,12 @@ describe('GroupList', () => { ...@@ -110,10 +110,12 @@ describe('GroupList', () => {
it('sorts groups within each section by organization', () => { it('sorts groups within each section by organization', () => {
const testGroups = populateGroupSections(); const testGroups = populateGroupSections();
const fakeGroupOrganizations = groups => const fakeGroupsByOrganization = groups =>
groups.sort((a, b) => a.id.localeCompare(b.id)); groups.sort((a, b) => a.id.localeCompare(b.id));
$imports.$mock({ $imports.$mock({
'../../helpers/group-organizations': fakeGroupOrganizations, '../../helpers/group-organizations': {
groupsByOrganization: fakeGroupsByOrganization,
},
}); });
const wrapper = createGroupList(); const wrapper = createGroupList();
...@@ -123,7 +125,7 @@ describe('GroupList', () => { ...@@ -123,7 +125,7 @@ describe('GroupList', () => {
sections.forEach(section => { sections.forEach(section => {
assert.deepEqual( assert.deepEqual(
section.prop('groups'), section.prop('groups'),
fakeGroupOrganizations(testGroups) fakeGroupsByOrganization(testGroups)
); );
}); });
}); });
......
...@@ -3,7 +3,7 @@ import { useCallback, useMemo, useState } from 'preact/hooks'; ...@@ -3,7 +3,7 @@ import { useCallback, useMemo, useState } from 'preact/hooks';
import { useStoreProxy } from '../store/use-store'; import { useStoreProxy } from '../store/use-store';
import { withServices } from '../service-context'; import { withServices } from '../service-context';
import VersionData from '../helpers/version-data'; import { VersionData } from '../helpers/version-data';
import SidebarPanel from './SidebarPanel'; import SidebarPanel from './SidebarPanel';
import Tutorial from './Tutorial'; import Tutorial from './Tutorial';
......
...@@ -2,7 +2,7 @@ import classnames from 'classnames'; ...@@ -2,7 +2,7 @@ import classnames from 'classnames';
import { useEffect, useMemo, useRef } from 'preact/hooks'; import { useEffect, useMemo, useRef } from 'preact/hooks';
import { replaceLinksWithEmbeds } from '../media-embedder'; import { replaceLinksWithEmbeds } from '../media-embedder';
import renderMarkdown from '../render-markdown'; import { renderMathAndMarkdown as renderMarkdown } from '../render-markdown';
/** /**
* @typedef MarkdownViewProps * @typedef MarkdownViewProps
......
...@@ -5,7 +5,7 @@ import { withServices } from '../service-context'; ...@@ -5,7 +5,7 @@ import { withServices } from '../service-context';
/** /**
* @typedef VersionInfoProps * @typedef VersionInfoProps
* @prop {import('../helpers/version-data').default} versionData - Object with version information * @prop {import('../helpers/version-data').VersionData} versionData - Object with version information
* @prop {import('../services/toast-messenger').ToastMessengerService} toastMessenger * @prop {import('../services/toast-messenger').ToastMessengerService} toastMessenger
*/ */
......
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import useRootThread from '../use-root-thread'; import useRootThread, { $imports } from '../use-root-thread';
import { $imports } from '../use-root-thread';
describe('sidebar/components/hooks/use-root-thread', () => { describe('sidebar/components/hooks/use-root-thread', () => {
let fakeStore; let fakeStore;
...@@ -20,7 +19,9 @@ describe('sidebar/components/hooks/use-root-thread', () => { ...@@ -20,7 +19,9 @@ describe('sidebar/components/hooks/use-root-thread', () => {
$imports.$mock({ $imports.$mock({
'../../store/use-store': { useStoreProxy: () => fakeStore }, '../../store/use-store': { useStoreProxy: () => fakeStore },
'../../helpers/thread-annotations': fakeThreadAnnotations, '../../helpers/thread-annotations': {
threadAnnotations: fakeThreadAnnotations,
},
}); });
// Mount a dummy component to be able to use the `useRootThread` hook // Mount a dummy component to be able to use the `useRootThread` hook
......
import { useMemo } from 'preact/hooks'; import { useMemo } from 'preact/hooks';
import { useStoreProxy } from '../../store/use-store'; import { useStoreProxy } from '../../store/use-store';
import threadAnnotations from '../../helpers/thread-annotations'; import { threadAnnotations } from '../../helpers/thread-annotations';
/** @typedef {import('../../helpers/build-thread').Thread} Thread */ /** @typedef {import('../../helpers/build-thread').Thread} Thread */
......
...@@ -39,7 +39,9 @@ describe('Excerpt', () => { ...@@ -39,7 +39,9 @@ describe('Excerpt', () => {
document.body.appendChild(container); document.body.appendChild(container);
$imports.$mock({ $imports.$mock({
'../util/observe-element-size': fakeObserveElementSize, '../util/observe-element-size': {
observeElementSize: fakeObserveElementSize,
},
}); });
}); });
......
...@@ -41,7 +41,7 @@ describe('HelpPanel', () => { ...@@ -41,7 +41,7 @@ describe('HelpPanel', () => {
$imports.$mock(mockImportedComponents()); $imports.$mock(mockImportedComponents());
$imports.$mock({ $imports.$mock({
'../store/use-store': { useStoreProxy: () => fakeStore }, '../store/use-store': { useStoreProxy: () => fakeStore },
'../helpers/version-data': FakeVersionData, '../helpers/version-data': { VersionData: FakeVersionData },
}); });
}); });
......
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import MarkdownView from '../MarkdownView'; import MarkdownView, { $imports } from '../MarkdownView';
import { $imports } from '../MarkdownView';
import { checkAccessibility } from '../../../test-util/accessibility'; import { checkAccessibility } from '../../../test-util/accessibility';
describe('MarkdownView', () => { describe('MarkdownView', () => {
let fakeMediaEmbedder; let fakeRenderMathAndMarkdown;
let fakeRenderMarkdown; let fakeReplaceLinksWithEmbeds;
beforeEach(() => { beforeEach(() => {
fakeRenderMarkdown = markdown => `rendered:${markdown}`; fakeRenderMathAndMarkdown = markdown => `rendered:${markdown}`;
fakeMediaEmbedder = { fakeReplaceLinksWithEmbeds = sinon.stub();
replaceLinksWithEmbeds: sinon.stub(),
};
$imports.$mock({ $imports.$mock({
'../render-markdown': fakeRenderMarkdown, '../render-markdown': {
'../media-embedder': fakeMediaEmbedder, renderMathAndMarkdown: fakeRenderMathAndMarkdown,
},
'../media-embedder': {
replaceLinksWithEmbeds: fakeReplaceLinksWithEmbeds,
},
}); });
}); });
...@@ -46,7 +47,7 @@ describe('MarkdownView', () => { ...@@ -46,7 +47,7 @@ describe('MarkdownView', () => {
it('replaces links with embeds in rendered output', () => { it('replaces links with embeds in rendered output', () => {
const wrapper = mount(<MarkdownView markdown="**test**" />); const wrapper = mount(<MarkdownView markdown="**test**" />);
const rendered = wrapper.find('.MarkdownView').getDOMNode(); const rendered = wrapper.find('.MarkdownView').getDOMNode();
assert.calledWith(fakeMediaEmbedder.replaceLinksWithEmbeds, rendered, { assert.calledWith(fakeReplaceLinksWithEmbeds, rendered, {
className: 'MarkdownView__embed', className: 'MarkdownView__embed',
}); });
}); });
......
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { act } from 'preact/test-utils'; import { act } from 'preact/test-utils';
import MenuItem from '../MenuItem'; import MenuItem, { $imports } from '../MenuItem';
import { $imports } from '../MenuItem';
import { checkAccessibility } from '../../../test-util/accessibility'; import { checkAccessibility } from '../../../test-util/accessibility';
import { mockImportedComponents } from '../../../test-util/mock-imported-components'; import { mockImportedComponents } from '../../../test-util/mock-imported-components';
......
import getApiUrl from './get-api-url'; import { getApiUrl } from './get-api-url';
import hostConfig from './host-config'; import { hostPageConfig as hostConfig } from './host-config';
import * as postMessageJsonRpc from '../util/postmessage-json-rpc'; import * as postMessageJsonRpc from '../util/postmessage-json-rpc';
/** /**
......
...@@ -8,7 +8,7 @@ import { serviceConfig } from './service-config'; ...@@ -8,7 +8,7 @@ import { serviceConfig } from './service-config';
* @throws {Error} If the settings has a service but the service doesn't have an apiUrl * @throws {Error} If the settings has a service but the service doesn't have an apiUrl
* *
*/ */
export default function getApiUrl(settings) { export function getApiUrl(settings) {
const service = serviceConfig(settings); const service = serviceConfig(settings);
if (service) { if (service) {
......
...@@ -15,7 +15,7 @@ import { ...@@ -15,7 +15,7 @@ import {
* @param {Window} window * @param {Window} window
* @return {HostConfig} * @return {HostConfig}
*/ */
export default function hostPageConfig(window) { export function hostPageConfig(window) {
const config = parseConfigFragment(window.location.href); const config = parseConfigFragment(window.location.href);
// Known configuration parameters which we will import from the host page. // Known configuration parameters which we will import from the host page.
......
import { fetchConfig, $imports } from '../fetch-config'; import { fetchConfig, $imports } from '../fetch-config';
describe('sidebar/config/fetch-config', () => { describe('sidebar/config/fetch-config', () => {
let fakeHostConfig; let fakeHostPageConfig;
let fakeJsonRpc; let fakeJsonRpc;
let fakeWindow; let fakeWindow;
let fakeApiUrl; let fakeApiUrl;
let fakeTopWindow; let fakeTopWindow;
beforeEach(() => { beforeEach(() => {
fakeHostConfig = sinon.stub(); fakeHostPageConfig = sinon.stub();
fakeJsonRpc = { fakeJsonRpc = {
call: sinon.stub(), call: sinon.stub(),
}; };
fakeApiUrl = sinon.stub().returns('https://dev.hypothes.is/api/'); fakeApiUrl = sinon.stub().returns('https://dev.hypothes.is/api/');
$imports.$mock({ $imports.$mock({
'./host-config': fakeHostConfig, './host-config': { hostPageConfig: fakeHostPageConfig },
'../util/postmessage-json-rpc': fakeJsonRpc, '../util/postmessage-json-rpc': fakeJsonRpc,
'./get-api-url': fakeApiUrl, './get-api-url': { getApiUrl: fakeApiUrl },
}); });
// By default, embedder provides no custom config. // By default, embedder provides no custom config.
fakeHostConfig.returns({}); fakeHostPageConfig.returns({});
// By default, fetching config from parent frames fails. // By default, fetching config from parent frames fails.
fakeJsonRpc.call.throws(new Error('call() response not set')); fakeJsonRpc.call.throws(new Error('call() response not set'));
...@@ -59,7 +59,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -59,7 +59,7 @@ describe('sidebar/config/fetch-config', () => {
it('merges the hostPageConfig onto appConfig and returns the result', async () => { it('merges the hostPageConfig onto appConfig and returns the result', async () => {
// hostPageConfig shall take precedent over appConfig // hostPageConfig shall take precedent over appConfig
const appConfig = { foo: 'bar', appType: 'via' }; const appConfig = { foo: 'bar', appType: 'via' };
fakeHostConfig.returns({ foo: 'baz' }); fakeHostPageConfig.returns({ foo: 'baz' });
const mergedConfig = await fetchConfig(appConfig); const mergedConfig = await fetchConfig(appConfig);
assert.deepEqual(mergedConfig, { assert.deepEqual(mergedConfig, {
foo: 'baz', foo: 'baz',
...@@ -79,7 +79,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -79,7 +79,7 @@ describe('sidebar/config/fetch-config', () => {
// exposed to the document itself. // exposed to the document itself.
const expectedTimeout = 3000; const expectedTimeout = 3000;
beforeEach(() => { beforeEach(() => {
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: 'https://embedder.com', requestConfigFromFrame: 'https://embedder.com',
}); });
sinon.stub(console, 'warn'); sinon.stub(console, 'warn');
...@@ -169,7 +169,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -169,7 +169,7 @@ describe('sidebar/config/fetch-config', () => {
// exposed to the document itself. // exposed to the document itself.
beforeEach(() => { beforeEach(() => {
fakeJsonRpc.call.resolves({}); fakeJsonRpc.call.resolves({});
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: { requestConfigFromFrame: {
origin: 'https://embedder.com', origin: 'https://embedder.com',
ancestorLevel: 2, ancestorLevel: 2,
...@@ -192,7 +192,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -192,7 +192,7 @@ describe('sidebar/config/fetch-config', () => {
[0, 1, 2].forEach(level => { [0, 1, 2].forEach(level => {
it(`finds ${level}'th ancestor window according to how high the level is`, async () => { it(`finds ${level}'th ancestor window according to how high the level is`, async () => {
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: { requestConfigFromFrame: {
origin: 'https://embedder.com', origin: 'https://embedder.com',
ancestorLevel: level, ancestorLevel: level,
...@@ -205,7 +205,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -205,7 +205,7 @@ describe('sidebar/config/fetch-config', () => {
}); });
it('throws an error when target ancestor exceeds top window', async () => { it('throws an error when target ancestor exceeds top window', async () => {
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: { requestConfigFromFrame: {
origin: 'https://embedder.com', origin: 'https://embedder.com',
ancestorLevel: 10, // The top window is only 2 levels high ancestorLevel: 10, // The top window is only 2 levels high
...@@ -279,7 +279,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -279,7 +279,7 @@ describe('sidebar/config/fetch-config', () => {
}); });
it('creates a merged config and also adds back the `group` value from the host config', async () => { it('creates a merged config and also adds back the `group` value from the host config', async () => {
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: { requestConfigFromFrame: {
origin: 'https://embedder.com', origin: 'https://embedder.com',
ancestorLevel: 2, ancestorLevel: 2,
...@@ -306,7 +306,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -306,7 +306,7 @@ describe('sidebar/config/fetch-config', () => {
}); });
it('missing ancestorLevel', async () => { it('missing ancestorLevel', async () => {
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: { requestConfigFromFrame: {
origin: 'https://embedder.com', origin: 'https://embedder.com',
// missing ancestorLevel // missing ancestorLevel
...@@ -319,7 +319,7 @@ describe('sidebar/config/fetch-config', () => { ...@@ -319,7 +319,7 @@ describe('sidebar/config/fetch-config', () => {
}); });
it('missing origin', async () => { it('missing origin', async () => {
fakeHostConfig.returns({ fakeHostPageConfig.returns({
requestConfigFromFrame: { requestConfigFromFrame: {
// missing origin // missing origin
ancestorLevel: 2, ancestorLevel: 2,
......
import getApiUrl from '../get-api-url'; import { getApiUrl } from '../get-api-url';
describe('sidebar/config/get-api-url', () => { describe('sidebar/config/get-api-url', () => {
context('when there is a service object in settings', () => { context('when there is a service object in settings', () => {
......
import { addConfigFragment } from '../../../shared/config-fragment'; import { addConfigFragment } from '../../../shared/config-fragment';
import hostPageConfig from '../host-config'; import { hostPageConfig } from '../host-config';
function fakeWindow(config) { function fakeWindow(config) {
return { return {
......
import warnOnce from '../shared/warn-once'; import { warnOnce } from '../shared/warn-once';
import { normalizeGroupIds } from './helpers/groups'; import { normalizeGroupIds } from './helpers/groups';
......
...@@ -284,7 +284,7 @@ const replySortCompareFn = (a, b) => { ...@@ -284,7 +284,7 @@ const replySortCompareFn = (a, b) => {
* @return {Thread} - The root thread, whose children are the top-level * @return {Thread} - The root thread, whose children are the top-level
* annotations to display. * annotations to display.
*/ */
export default function buildThread(annotations, options) { export function buildThread(annotations, options) {
const hasSelection = options.selected.length > 0; const hasSelection = options.selected.length > 0;
const hasForcedVisible = options.forcedVisible.length > 0; const hasForcedVisible = options.forcedVisible.length > 0;
......
import immutable from '../util/immutable'; import { immutable } from '../util/immutable';
/** /**
* @typedef {import('../../types/api').Group} Group * @typedef {import('../../types/api').Group} Group
...@@ -83,7 +83,7 @@ function organizations(groups) { ...@@ -83,7 +83,7 @@ function organizations(groups) {
* @param {Array<Group>} groups * @param {Array<Group>} groups
* @return {Array<object>} - groups sorted by which organization they're in * @return {Array<object>} - groups sorted by which organization they're in
*/ */
export default function groupsByOrganization(groups) { export function groupsByOrganization(groups) {
const orgs = organizations(groups); const orgs = organizations(groups);
const defaultOrganizationGroups = []; const defaultOrganizationGroups = [];
const sortedGroups = []; const sortedGroups = [];
......
import buildThread from '../build-thread'; import { buildThread } from '../build-thread';
import * as metadata from '../../helpers/annotation-metadata'; import * as metadata from '../../helpers/annotation-metadata';
// Fixture with two top level annotations, one note and one reply // Fixture with two top level annotations, one note and one reply
......
import * as orgFixtures from '../../test/group-fixtures'; import * as orgFixtures from '../../test/group-fixtures';
import groupsByOrganization from '../group-organizations'; import { groupsByOrganization } from '../group-organizations';
describe('sidebar/helpers/group-organizations', () => { describe('sidebar/helpers/group-organizations', () => {
context('when sorting organizations and their contained groups', () => { context('when sorting organizations and their contained groups', () => {
......
import * as annotationFixtures from '../../test/annotation-fixtures'; import * as annotationFixtures from '../../test/annotation-fixtures';
import threadAnnotations from '../thread-annotations'; import { threadAnnotations, $imports } from '../thread-annotations';
import { sorters } from '../thread-sorters'; import { sorters } from '../thread-sorters';
import { $imports } from '../thread-annotations'; import { immutable } from '../../util/immutable';
import immutable from '../../util/immutable';
const fixtures = immutable({ const fixtures = immutable({
emptyThread: { emptyThread: {
...@@ -45,9 +44,9 @@ describe('sidebar/helpers/thread-annotations', () => { ...@@ -45,9 +44,9 @@ describe('sidebar/helpers/thread-annotations', () => {
}; };
$imports.$mock({ $imports.$mock({
'./build-thread': fakeBuildThread, './build-thread': { buildThread: fakeBuildThread },
'../util/search-filter': fakeSearchFilter, '../util/search-filter': fakeSearchFilter,
'./view-filter': fakeFilterAnnotations, './view-filter': { filterAnnotations: fakeFilterAnnotations },
}); });
}); });
......
import VersionData from '../version-data'; import { VersionData } from '../version-data';
describe('sidebar/helpers/version-data', () => { describe('sidebar/helpers/version-data', () => {
let clock; let clock;
......
import filterAnnotations, { $imports } from '../view-filter'; import { filterAnnotations, $imports } from '../view-filter';
function isoDateWithAge(age) { function isoDateWithAge(age) {
return new Date(Date.now() - age * 1000).toISOString(); return new Date(Date.now() - age * 1000).toISOString();
......
import buildThread from './build-thread'; import { buildThread } from './build-thread';
import memoize from '../util/memoize'; import { memoize } from '../util/memoize';
import { generateFacetedFilter } from '../util/search-filter'; import { generateFacetedFilter } from '../util/search-filter';
import filterAnnotations from './view-filter'; import { filterAnnotations } from './view-filter';
import { shouldShowInTab } from './tabs'; import { shouldShowInTab } from './tabs';
import { sorters } from './thread-sorters'; import { sorters } from './thread-sorters';
...@@ -71,6 +71,4 @@ function buildRootThread(threadState) { ...@@ -71,6 +71,4 @@ function buildRootThread(threadState) {
return buildThread(threadState.annotations, options); return buildThread(threadState.annotations, options);
} }
const threadAnnotations = memoize(buildRootThread); export const threadAnnotations = memoize(buildRootThread);
export default threadAnnotations;
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
* @prop {DocMetadata} [metadata] - Document metadata * @prop {DocMetadata} [metadata] - Document metadata
*/ */
export default class VersionData { export class VersionData {
/** /**
* @param {AuthState} userInfo * @param {AuthState} userInfo
* @param {DocumentInfo[]} documentInfo - Metadata for connected frames. * @param {DocumentInfo[]} documentInfo - Metadata for connected frames.
......
...@@ -158,7 +158,7 @@ const fieldMatchers = { ...@@ -158,7 +158,7 @@ const fieldMatchers = {
* `generateFacetedFilter`. * `generateFacetedFilter`.
* @return {string[]} IDs of matching annotations. * @return {string[]} IDs of matching annotations.
*/ */
export default function filterAnnotations(annotations, filters) { export function filterAnnotations(annotations, filters) {
// Convert the input filter object into a filter tree, expanding "any" // Convert the input filter object into a filter tree, expanding "any"
// filters. // filters.
const fieldFilters = Object.entries(filters) const fieldFilters = Object.entries(filters)
......
...@@ -56,7 +56,7 @@ import pointerIcon from '../images/icons/pointer.svg'; ...@@ -56,7 +56,7 @@ import pointerIcon from '../images/icons/pointer.svg';
* Set of icons used by the sidebar application via the `SvgIcon` * Set of icons used by the sidebar application via the `SvgIcon`
* component. * component.
*/ */
export default { export const sidebarIcons = {
add: plus, add: plus,
annotate: annotateIcon, annotate: annotateIcon,
'arrow-left': arrowLeft, 'arrow-left': arrowLeft,
......
...@@ -7,7 +7,7 @@ import { ...@@ -7,7 +7,7 @@ import {
startServer as startRPCServer, startServer as startRPCServer,
preStartServer as preStartRPCServer, preStartServer as preStartRPCServer,
} from './cross-origin-rpc.js'; } from './cross-origin-rpc.js';
import disableOpenerForExternalLinks from './util/disable-opener-for-external-links'; import { disableOpenerForExternalLinks } from './util/disable-opener-for-external-links';
import * as sentry from './util/sentry'; import * as sentry from './util/sentry';
// Read settings rendered into sidebar app HTML by service/extension. // Read settings rendered into sidebar app HTML by service/extension.
...@@ -100,9 +100,9 @@ function setupFrameSync(frameSync, store) { ...@@ -100,9 +100,9 @@ function setupFrameSync(frameSync, store) {
// Register icons used by the sidebar app (and maybe other assets in future). // Register icons used by the sidebar app (and maybe other assets in future).
import { registerIcons } from '@hypothesis/frontend-shared'; import { registerIcons } from '@hypothesis/frontend-shared';
import iconSet from './icons'; import { sidebarIcons } from './icons';
registerIcons(iconSet); registerIcons(sidebarIcons);
// The entry point component for the app. // The entry point component for the app.
import { render } from 'preact'; import { render } from 'preact';
......
...@@ -131,7 +131,7 @@ function insertMath(html, mathBlocks) { ...@@ -131,7 +131,7 @@ function insertMath(html, mathBlocks) {
}, html); }, html);
} }
export default function renderMathAndMarkdown(markdown) { export function renderMathAndMarkdown(markdown) {
// KaTeX takes care of escaping its input, so we want to avoid passing its // KaTeX takes care of escaping its input, so we want to avoid passing its
// output through the HTML sanitizer. Therefore we first extract the math // output through the HTML sanitizer. Therefore we first extract the math
// blocks from the input, render and sanitize the remaining markdown and then // blocks from the input, render and sanitize the remaining markdown and then
......
import { TinyEmitter } from 'tiny-emitter'; import { TinyEmitter } from 'tiny-emitter';
import { serviceConfig } from '../config/service-config'; import { serviceConfig } from '../config/service-config';
import OAuthClient from '../util/oauth-client'; import { OAuthClient } from '../util/oauth-client';
import { resolve } from '../util/url'; import { resolve } from '../util/url';
/** /**
......
import { generateHexString } from '../../shared/random'; import { generateHexString } from '../../shared/random';
import warnOnce from '../../shared/warn-once'; import { warnOnce } from '../../shared/warn-once';
import { Socket } from '../websocket';
import { watch } from '../util/watch'; import { watch } from '../util/watch';
import { Socket } from '../websocket';
/** /**
* `StreamerService` manages the WebSocket connection to the Hypothesis Real-Time * `StreamerService` manages the WebSocket connection to the Hypothesis Real-Time
......
import { Injector } from '../../../shared/injector'; import { Injector } from '../../../shared/injector';
import FakeWindow from '../../test/fake-window'; import { FakeWindow } from '../../test/fake-window';
import { AuthService, $imports } from '../auth'; import { AuthService, $imports } from '../auth';
const DEFAULT_TOKEN_EXPIRES_IN_SECS = 1000; const DEFAULT_TOKEN_EXPIRES_IN_SECS = 1000;
...@@ -87,7 +87,7 @@ describe('AuthService', () => { ...@@ -87,7 +87,7 @@ describe('AuthService', () => {
fakeWindow = new FakeWindow(); fakeWindow = new FakeWindow();
$imports.$mock({ $imports.$mock({
'../util/oauth-client': FakeOAuthClient, '../util/oauth-client': { OAuthClient: FakeOAuthClient },
}); });
auth = new Injector() auth = new Injector()
......
import * as annotationFixtures from '../../test/annotation-fixtures'; import * as annotationFixtures from '../../test/annotation-fixtures';
import createFakeStore from '../../test/fake-redux-store'; import { fakeReduxStore } from '../../test/fake-redux-store';
import { waitFor } from '../../../test-util/wait'; import { waitFor } from '../../../test-util/wait';
import { AutosaveService, $imports } from '../autosave'; import { AutosaveService, $imports } from '../autosave';
...@@ -14,7 +14,7 @@ describe('AutosaveService', () => { ...@@ -14,7 +14,7 @@ describe('AutosaveService', () => {
fakeAnnotationsService = { save: sinon.stub().resolves() }; fakeAnnotationsService = { save: sinon.stub().resolves() };
fakeNewHighlights = sinon.stub().returns([]); fakeNewHighlights = sinon.stub().returns([]);
fakeRetryPromiseOperation = sinon.stub().callsFake(callback => callback()); fakeRetryPromiseOperation = sinon.stub().callsFake(callback => callback());
fakeStore = createFakeStore({}, { newHighlights: fakeNewHighlights }); fakeStore = fakeReduxStore({}, { newHighlights: fakeNewHighlights });
$imports.$mock({ $imports.$mock({
'../util/retry': { '../util/retry': {
......
...@@ -2,7 +2,7 @@ import EventEmitter from 'tiny-emitter'; ...@@ -2,7 +2,7 @@ import EventEmitter from 'tiny-emitter';
import { Injector } from '../../../shared/injector'; import { Injector } from '../../../shared/injector';
import * as annotationFixtures from '../../test/annotation-fixtures'; import * as annotationFixtures from '../../test/annotation-fixtures';
import createFakeStore from '../../test/fake-redux-store'; import { fakeReduxStore } from '../../test/fake-redux-store';
import { delay } from '../../../test-util/wait'; import { delay } from '../../../test-util/wait';
import { FrameSyncService, $imports, formatAnnot } from '../frame-sync'; import { FrameSyncService, $imports, formatAnnot } from '../frame-sync';
...@@ -91,7 +91,7 @@ describe('FrameSyncService', () => { ...@@ -91,7 +91,7 @@ describe('FrameSyncService', () => {
discover: sinon.stub().resolves(sidebarPort), discover: sinon.stub().resolves(sidebarPort),
}; };
fakeStore = createFakeStore( fakeStore = fakeReduxStore(
{ annotations: [] }, { annotations: [] },
{ {
allAnnotations() { allAnnotations() {
......
import { delay, waitFor } from '../../../test-util/wait'; import { delay, waitFor } from '../../../test-util/wait';
import fakeReduxStore from '../../test/fake-redux-store'; import { fakeReduxStore } from '../../test/fake-redux-store';
import { GroupsService, $imports } from '../groups'; import { GroupsService, $imports } from '../groups';
/** /**
......
import fakeReduxStore from '../../test/fake-redux-store'; import { fakeReduxStore } from '../../test/fake-redux-store';
import { PersistedDefaultsService } from '../persisted-defaults'; import { PersistedDefaultsService } from '../persisted-defaults';
const DEFAULT_KEYS = { const DEFAULT_KEYS = {
......
import EventEmitter from 'tiny-emitter'; import EventEmitter from 'tiny-emitter';
import { delay } from '../../../test-util/wait'; import { delay } from '../../../test-util/wait';
import fakeReduxStore from '../../test/fake-redux-store'; import { fakeReduxStore } from '../../test/fake-redux-store';
import { StreamerService, $imports } from '../streamer'; import { StreamerService, $imports } from '../streamer';
const fixtures = { const fixtures = {
...@@ -129,7 +129,7 @@ describe('StreamerService', () => { ...@@ -129,7 +129,7 @@ describe('StreamerService', () => {
fakeWarnOnce = sinon.stub(); fakeWarnOnce = sinon.stub();
$imports.$mock({ $imports.$mock({
'../../shared/warn-once': fakeWarnOnce, '../../shared/warn-once': { warnOnce: fakeWarnOnce },
'../websocket': { Socket: FakeSocket }, '../websocket': { Socket: FakeSocket },
}); });
}); });
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
import * as redux from 'redux'; import * as redux from 'redux';
import thunk from 'redux-thunk'; import thunk from 'redux-thunk';
import immutable from '../util/immutable'; import { immutable } from '../util/immutable';
import { createReducer, bindSelectors } from './util'; import { createReducer, bindSelectors } from './util';
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* @param {import("redux").Store} store * @param {import("redux").Store} store
*/ */
export default function debugMiddleware(store) { export function debugMiddleware(store) {
/* eslint-disable no-console */ /* eslint-disable no-console */
let serial = 0; let serial = 0;
......
import { createStore } from './create-store'; import { createStore } from './create-store';
import debugMiddleware from './debug-middleware'; import { debugMiddleware } from './debug-middleware';
import activity from './modules/activity'; import { activity } from './modules/activity';
import annotations from './modules/annotations'; import { annotations } from './modules/annotations';
import defaults from './modules/defaults'; import { defaults } from './modules/defaults';
import directLinked from './modules/direct-linked'; import { directLinked } from './modules/direct-linked';
import drafts from './modules/drafts'; import { drafts } from './modules/drafts';
import filters from './modules/filters'; import { filters } from './modules/filters';
import frames from './modules/frames'; import { framesModule as frames } from './modules/frames';
import groups from './modules/groups'; import { groups } from './modules/groups';
import links from './modules/links'; import { links } from './modules/links';
import realTimeUpdates from './modules/real-time-updates'; import { realTimeUpdates } from './modules/real-time-updates';
import route from './modules/route'; import { routeModule as route } from './modules/route';
import selection from './modules/selection'; import { selection } from './modules/selection';
import session from './modules/session'; import { session } from './modules/session';
import sidebarPanels from './modules/sidebar-panels'; import { sidebarPanels } from './modules/sidebar-panels';
import toastMessages from './modules/toast-messages'; import { toastMessages } from './modules/toast-messages';
import viewer from './modules/viewer'; import { viewer } from './modules/viewer';
/** /**
* @template M * @template M
......
...@@ -190,7 +190,7 @@ function isSavingAnnotation(state, annotation) { ...@@ -190,7 +190,7 @@ function isSavingAnnotation(state, annotation) {
/** @typedef {import('../../../types/api').Annotation} Annotation */ /** @typedef {import('../../../types/api').Annotation} Annotation */
export default createStoreModule(initialState, { export const activity = createStoreModule(initialState, {
reducers, reducers,
namespace: 'activity', namespace: 'activity',
......
...@@ -19,7 +19,7 @@ import { countIf, toTrueMap, trueKeys } from '../../util/collections'; ...@@ -19,7 +19,7 @@ import { countIf, toTrueMap, trueKeys } from '../../util/collections';
import * as util from '../util'; import * as util from '../util';
import { createStoreModule } from '../create-store'; import { createStoreModule } from '../create-store';
import route from './route'; import { routeModule as route } from './route';
/** /**
* Return a copy of `current` with all matching annotations in `annotations` * Return a copy of `current` with all matching annotations in `annotations`
...@@ -559,7 +559,7 @@ function savedAnnotations(state) { ...@@ -559,7 +559,7 @@ function savedAnnotations(state) {
}); });
} }
export default createStoreModule(initialState, { export const annotations = createStoreModule(initialState, {
namespace: 'annotations', namespace: 'annotations',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -49,7 +49,7 @@ function getDefaults(state) { ...@@ -49,7 +49,7 @@ function getDefaults(state) {
return state; return state;
} }
export default createStoreModule(initialState, { export const defaults = createStoreModule(initialState, {
namespace: 'defaults', namespace: 'defaults',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -142,7 +142,7 @@ function directLinkedGroupFetchFailed(state) { ...@@ -142,7 +142,7 @@ function directLinkedGroupFetchFailed(state) {
return state.directLinkedGroupFetchFailed; return state.directLinkedGroupFetchFailed;
} }
export default createStoreModule(initialState, { export const directLinked = createStoreModule(initialState, {
namespace: 'directLinked', namespace: 'directLinked',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -186,7 +186,7 @@ const unsavedAnnotations = createSelector( ...@@ -186,7 +186,7 @@ const unsavedAnnotations = createSelector(
drafts => drafts.filter(d => !d.annotation.id).map(d => d.annotation) drafts => drafts.filter(d => !d.annotation.id).map(d => d.annotation)
); );
export default createStoreModule(initialState, { export const drafts = createStoreModule(initialState, {
namespace: 'drafts', namespace: 'drafts',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -279,7 +279,7 @@ function hasAppliedFilter(state) { ...@@ -279,7 +279,7 @@ function hasAppliedFilter(state) {
return !!(state.query || Object.keys(getFilters(state)).length); return !!(state.query || Object.keys(getFilters(state)).length);
} }
export default createStoreModule(initialState, { export const filters = createStoreModule(initialState, {
namespace: 'filters', namespace: 'filters',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -155,7 +155,7 @@ const searchUris = createShallowEqualSelector( ...@@ -155,7 +155,7 @@ const searchUris = createShallowEqualSelector(
uris => uris uris => uris
); );
export default createStoreModule(initialState, { export const framesModule = createStoreModule(initialState, {
namespace: 'frames', namespace: 'frames',
reducers, reducers,
......
...@@ -3,7 +3,7 @@ import { createSelector } from 'reselect'; ...@@ -3,7 +3,7 @@ import { createSelector } from 'reselect';
import * as util from '../util'; import * as util from '../util';
import { createStoreModule } from '../create-store'; import { createStoreModule } from '../create-store';
import session from './session'; import { session } from './session';
/** /**
* @typedef {import('../../../types/api').Group} Group * @typedef {import('../../../types/api').Group} Group
...@@ -261,7 +261,7 @@ const getCurrentlyViewingGroups = createSelector( ...@@ -261,7 +261,7 @@ const getCurrentlyViewingGroups = createSelector(
} }
); );
export default createStoreModule(initialState, { export const groups = createStoreModule(initialState, {
namespace: 'groups', namespace: 'groups',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -51,7 +51,7 @@ function getLink(state, linkName, params = {}) { ...@@ -51,7 +51,7 @@ function getLink(state, linkName, params = {}) {
return url; return url;
} }
export default createStoreModule(initialState, { export const links = createStoreModule(initialState, {
namespace: 'links', namespace: 'links',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -12,9 +12,9 @@ import { createSelector } from 'reselect'; ...@@ -12,9 +12,9 @@ import { createSelector } from 'reselect';
import { createStoreModule } from '../create-store'; import { createStoreModule } from '../create-store';
import { actionTypes } from '../util'; import { actionTypes } from '../util';
import annotations from './annotations'; import { annotations } from './annotations';
import groups from './groups'; import { groups } from './groups';
import route from './route'; import { routeModule as route } from './route';
const initialState = { const initialState = {
/** /**
...@@ -193,7 +193,7 @@ function hasPendingDeletion(state, id) { ...@@ -193,7 +193,7 @@ function hasPendingDeletion(state, id) {
return state.pendingDeletions.hasOwnProperty(id); return state.pendingDeletions.hasOwnProperty(id);
} }
export default createStoreModule(initialState, { export const realTimeUpdates = createStoreModule(initialState, {
namespace: 'realTimeUpdates', namespace: 'realTimeUpdates',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -63,7 +63,7 @@ function routeParams(state) { ...@@ -63,7 +63,7 @@ function routeParams(state) {
return state.params; return state.params;
} }
export default createStoreModule(initialState, { export const routeModule = createStoreModule(initialState, {
namespace: 'route', namespace: 'route',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -381,7 +381,7 @@ const sortKeys = createSelector( ...@@ -381,7 +381,7 @@ const sortKeys = createSelector(
} }
); );
export default createStoreModule(initialState, { export const selection = createStoreModule(initialState, {
namespace: 'selection', namespace: 'selection',
reducers, reducers,
......
...@@ -117,7 +117,7 @@ function profile(state) { ...@@ -117,7 +117,7 @@ function profile(state) {
return state.profile; return state.profile;
} }
export default createStoreModule(initialState, { export const session = createStoreModule(initialState, {
namespace: 'session', namespace: 'session',
reducers, reducers,
......
...@@ -121,7 +121,7 @@ function isSidebarPanelOpen(state, panelName) { ...@@ -121,7 +121,7 @@ function isSidebarPanelOpen(state, panelName) {
return state.activePanelName === panelName; return state.activePanelName === panelName;
} }
export default createStoreModule(initialState, { export const sidebarPanels = createStoreModule(initialState, {
namespace: 'sidebarPanels', namespace: 'sidebarPanels',
reducers, reducers,
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import activity from '../activity'; import { activity } from '../activity';
describe('sidebar/store/modules/activity', () => { describe('sidebar/store/modules/activity', () => {
let store; let store;
......
import * as fixtures from '../../../test/annotation-fixtures'; import * as fixtures from '../../../test/annotation-fixtures';
import * as metadata from '../../../helpers/annotation-metadata'; import * as metadata from '../../../helpers/annotation-metadata';
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import annotations from '../annotations'; import { annotations } from '../annotations';
import route from '../route'; import { routeModule as route } from '../route';
function createTestStore() { function createTestStore() {
return createStore([annotations, route], [{}]); return createStore([annotations, route], [{}]);
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import defaults from '../defaults'; import { defaults } from '../defaults';
describe('store/modules/defaults', () => { describe('store/modules/defaults', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import directLinked from '../direct-linked'; import { directLinked } from '../direct-linked';
describe('sidebar/store/modules/direct-linked', () => { describe('sidebar/store/modules/direct-linked', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import annotations from '../annotations'; import { annotations } from '../annotations';
import drafts from '../drafts'; import { drafts } from '../drafts';
import { Draft } from '../drafts'; import { Draft } from '../drafts';
import selection from '../selection'; import { selection } from '../selection';
import immutable from '../../../util/immutable'; import { immutable } from '../../../util/immutable';
const fixtures = immutable({ const fixtures = immutable({
draftWithText: { draftWithText: {
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import filters from '../filters'; import { filters } from '../filters';
import selection from '../selection'; import { selection } from '../selection';
describe('sidebar/store/modules/filters', () => { describe('sidebar/store/modules/filters', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import frames from '../frames'; import { framesModule as frames } from '../frames';
describe('sidebar/store/modules/frames', () => { describe('sidebar/store/modules/frames', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import groups from '../groups'; import { groups } from '../groups';
import session from '../session'; import { session } from '../session';
import immutable from '../../../util/immutable'; import { immutable } from '../../../util/immutable';
describe('sidebar/store/modules/groups', () => { describe('sidebar/store/modules/groups', () => {
const publicGroup = immutable({ const publicGroup = immutable({
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import links from '../links'; import { links } from '../links';
describe('sidebar/store/modules/links', () => { describe('sidebar/store/modules/links', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import annotations from '../annotations'; import { annotations } from '../annotations';
import groups from '../groups'; import { groups } from '../groups';
import realTimeUpdates from '../real-time-updates'; import { realTimeUpdates, $imports } from '../real-time-updates';
import { $imports } from '../real-time-updates'; import { selection } from '../selection';
import selection from '../selection';
const { removeAnnotations } = annotations.actionCreators; const { removeAnnotations } = annotations.actionCreators;
const { focusGroup } = groups.actionCreators; const { focusGroup } = groups.actionCreators;
...@@ -38,17 +37,17 @@ describe('sidebar/store/modules/real-time-updates', () => { ...@@ -38,17 +37,17 @@ describe('sidebar/store/modules/real-time-updates', () => {
$imports.$mock({ $imports.$mock({
'./annotations': { './annotations': {
default: { annotations: {
selectors: { annotationExists: fakeAnnotationExists }, selectors: { annotationExists: fakeAnnotationExists },
}, },
}, },
'./groups': { './groups': {
default: { groups: {
selectors: { focusedGroupId: fakeFocusedGroupId }, selectors: { focusedGroupId: fakeFocusedGroupId },
}, },
}, },
'./route': { './route': {
default: { routeModule: {
selectors: { route: fakeRoute }, selectors: { route: fakeRoute },
}, },
}, },
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import route from '../route'; import { routeModule as route } from '../route';
describe('store/modules/route', () => { describe('store/modules/route', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import annotations from '../annotations'; import { annotations } from '../annotations';
import filters from '../filters'; import { filters } from '../filters';
import selection from '../selection'; import { selection } from '../selection';
import route from '../route'; import { routeModule as route } from '../route';
import * as fixtures from '../../../test/annotation-fixtures'; import * as fixtures from '../../../test/annotation-fixtures';
describe('sidebar/store/modules/selection', () => { describe('sidebar/store/modules/selection', () => {
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import session from '../session'; import { session } from '../session';
describe('sidebar/store/modules/session', () => { describe('sidebar/store/modules/session', () => {
let fakeSettings; let fakeSettings;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import sidebarPanels from '../sidebar-panels'; import { sidebarPanels } from '../sidebar-panels';
describe('sidebar/store/modules/sidebar-panels', () => { describe('sidebar/store/modules/sidebar-panels', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import toastMessages from '../toast-messages'; import { toastMessages } from '../toast-messages';
describe('store/modules/toast-messages', () => { describe('store/modules/toast-messages', () => {
let store; let store;
......
import { createStore } from '../../create-store'; import { createStore } from '../../create-store';
import viewer from '../viewer'; import { viewer } from '../viewer';
describe('store/modules/viewer', () => { describe('store/modules/viewer', () => {
let store; let store;
......
...@@ -112,7 +112,7 @@ function hasMessage(state, type, text) { ...@@ -112,7 +112,7 @@ function hasMessage(state, type, text) {
}); });
} }
export default createStoreModule(initialState, { export const toastMessages = createStoreModule(initialState, {
namespace: 'toastMessages', namespace: 'toastMessages',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -43,7 +43,7 @@ function hasSidebarOpened(state) { ...@@ -43,7 +43,7 @@ function hasSidebarOpened(state) {
return state.sidebarHasOpened; return state.sidebarHasOpened;
} }
export default createStoreModule(initialState, { export const viewer = createStoreModule(initialState, {
namespace: 'viewer', namespace: 'viewer',
reducers, reducers,
actionCreators: { actionCreators: {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import * as redux from 'redux'; import * as redux from 'redux';
import debugMiddleware from '../debug-middleware'; import { debugMiddleware } from '../debug-middleware';
function id(state) { function id(state) {
return state; return state;
......
import * as annotationFixtures from '../../test/annotation-fixtures'; import * as annotationFixtures from '../../test/annotation-fixtures';
import { createSidebarStore } from '../index'; import { createSidebarStore } from '../index';
import immutable from '../../util/immutable'; import { immutable } from '../../util/immutable';
const defaultAnnotation = annotationFixtures.defaultAnnotation; const defaultAnnotation = annotationFixtures.defaultAnnotation;
const newAnnotation = annotationFixtures.newAnnotation; const newAnnotation = annotationFixtures.newAnnotation;
......
import fakeStore from '../../test/fake-redux-store'; import { fakeReduxStore } from '../../test/fake-redux-store';
import * as util from '../util'; import * as util from '../util';
...@@ -194,7 +194,7 @@ describe('sidebar/store/util', () => { ...@@ -194,7 +194,7 @@ describe('sidebar/store/util', () => {
let store; let store;
beforeEach(() => { beforeEach(() => {
store = fakeStore({ store = fakeReduxStore({
fake: { val: 0 }, fake: { val: 0 },
}); });
}); });
......
...@@ -16,8 +16,8 @@ configure({ adapter: new Adapter() }); ...@@ -16,8 +16,8 @@ configure({ adapter: new Adapter() });
// Make all the icons that are available for use with `SvgIcon` in the actual // Make all the icons that are available for use with `SvgIcon` in the actual
// app available in the tests. This enables validation of icon names passed to // app available in the tests. This enables validation of icon names passed to
// `SvgIcon`. // `SvgIcon`.
import sidebarIcons from '../icons'; import { sidebarIcons } from '../icons';
import annotatorIcons from '../../annotator/icons'; import { annotatorIcons } from '../../annotator/icons';
import { registerIcons } from '@hypothesis/frontend-shared'; import { registerIcons } from '@hypothesis/frontend-shared';
registerIcons({ registerIcons({
...sidebarIcons, ...sidebarIcons,
......
...@@ -38,7 +38,7 @@ describe('sidebar/cross-origin-rpc', () => { ...@@ -38,7 +38,7 @@ describe('sidebar/cross-origin-rpc', () => {
$imports.$mock({ $imports.$mock({
'./helpers/groups': { normalizeGroupIds: fakeNormalizeGroupIds }, './helpers/groups': { normalizeGroupIds: fakeNormalizeGroupIds },
'../shared/warn-once': fakeWarnOnce, '../shared/warn-once': { warnOnce: fakeWarnOnce },
}); });
}); });
......
...@@ -11,7 +11,7 @@ import * as redux from 'redux'; ...@@ -11,7 +11,7 @@ import * as redux from 'redux';
* returned store. * returned store.
* @return {object} Redux store * @return {object} Redux store
*/ */
export default function fakeStore(initialState, methods) { export function fakeReduxStore(initialState, methods) {
function update(state, action) { function update(state, action) {
if (action.state) { if (action.state) {
return Object.assign({}, state, action.state); return Object.assign({}, state, action.state);
......
export default class FakeWindow { export class FakeWindow {
constructor() { constructor() {
this.callbacks = []; this.callbacks = [];
......
import renderMarkdown from '../render-markdown'; import { renderMathAndMarkdown, $imports } from '../render-markdown';
import { $imports } from '../render-markdown';
describe('render-markdown', () => { describe('render-markdown', () => {
let render; let render;
...@@ -19,7 +18,7 @@ describe('render-markdown', () => { ...@@ -19,7 +18,7 @@ describe('render-markdown', () => {
}, },
}); });
render = markdown => renderMarkdown(markdown); render = markdown => renderMathAndMarkdown(markdown);
}); });
afterEach(() => { afterEach(() => {
...@@ -61,21 +60,21 @@ describe('render-markdown', () => { ...@@ -61,21 +60,21 @@ describe('render-markdown', () => {
// library. This is not an extensive test of sanitization behavior, that // library. This is not an extensive test of sanitization behavior, that
// is left to DOMPurify's tests. // is left to DOMPurify's tests.
assert.equal( assert.equal(
renderMarkdown('one **two** <script>alert("three")</script>'), renderMathAndMarkdown('one **two** <script>alert("three")</script>'),
'<p>one <strong>two</strong> </p>' '<p>one <strong>two</strong> </p>'
); );
}); });
it('should open links in a new window', () => { it('should open links in a new window', () => {
assert.equal( assert.equal(
renderMarkdown('<a href="http://example.com">test</a>'), renderMathAndMarkdown('<a href="http://example.com">test</a>'),
'<p><a href="http://example.com" target="_blank">test</a></p>' '<p><a href="http://example.com" target="_blank">test</a></p>'
); );
}); });
it('should render strikethrough', () => { it('should render strikethrough', () => {
assert.equal( assert.equal(
renderMarkdown('This is ~~no longer the case~~'), renderMathAndMarkdown('This is ~~no longer the case~~'),
'<p>This is <del>no longer the case</del></p>' '<p>This is <del>no longer the case</del></p>'
); );
}); });
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
* @param {Element} root - Root element * @param {Element} root - Root element
*/ */
export default function disableOpenerForExternalLinks(root) { export function disableOpenerForExternalLinks(root) {
root.addEventListener('click', event => { root.addEventListener('click', event => {
const target = /** @type {HTMLElement} */ (event.target); const target = /** @type {HTMLElement} */ (event.target);
......
...@@ -28,7 +28,7 @@ function deepFreeze(object) { ...@@ -28,7 +28,7 @@ function deepFreeze(object) {
* @param {object} object * @param {object} object
* @return {object} Returns the input object * @return {object} Returns the input object
*/ */
export default function immutable(object) { export function immutable(object) {
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
return object; return object;
} else { } else {
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* @param {(arg: Arg) => Result} fn * @param {(arg: Arg) => Result} fn
* @return {(arg: Arg) => Result} * @return {(arg: Arg) => Result}
*/ */
export default function memoize(fn) { export function memoize(fn) {
if (fn.length !== 1) { if (fn.length !== 1) {
throw new Error('Memoize input must be a function of one argument'); throw new Error('Memoize input must be a function of one argument');
} }
......
...@@ -39,7 +39,7 @@ export class TokenError extends Error { ...@@ -39,7 +39,7 @@ export class TokenError extends Error {
* OAuthClient handles interaction with the annotation service's OAuth * OAuthClient handles interaction with the annotation service's OAuth
* endpoints. * endpoints.
*/ */
export default class OAuthClient { export class OAuthClient {
/** /**
* Create a new OAuthClient * Create a new OAuthClient
* *
......
...@@ -13,7 +13,7 @@ import { ListenerCollection } from '../../shared/listener-collection'; ...@@ -13,7 +13,7 @@ import { ListenerCollection } from '../../shared/listener-collection';
* element when a change in its size is detected. * element when a change in its size is detected.
* @return {() => void} * @return {() => void}
*/ */
export default function observeElementSize(element, onSizeChanged) { export function observeElementSize(element, onSizeChanged) {
if (typeof ResizeObserver !== 'undefined') { if (typeof ResizeObserver !== 'undefined') {
const observer = new ResizeObserver(() => const observer = new ResizeObserver(() =>
onSizeChanged(element.clientWidth, element.clientHeight) onSizeChanged(element.clientWidth, element.clientHeight)
......
...@@ -2,7 +2,7 @@ import * as Sentry from '@sentry/browser'; ...@@ -2,7 +2,7 @@ import * as Sentry from '@sentry/browser';
import { parseConfigFragment } from '../../shared/config-fragment'; import { parseConfigFragment } from '../../shared/config-fragment';
import { handleErrorsInFrames } from '../../shared/frame-error-capture'; import { handleErrorsInFrames } from '../../shared/frame-error-capture';
import warnOnce from '../../shared/warn-once'; import { warnOnce } from '../../shared/warn-once';
/** /**
* @typedef SentryConfig * @typedef SentryConfig
......
import disableOpenerForExternalLinks from '../disable-opener-for-external-links'; import { disableOpenerForExternalLinks } from '../disable-opener-for-external-links';
describe('sidebar.util.disable-opener-for-external-links', () => { describe('sidebar.util.disable-opener-for-external-links', () => {
let containerEl; let containerEl;
......
import immutable from '../immutable'; import { immutable } from '../immutable';
describe('immutable', () => { describe('immutable', () => {
it('deeply freezes objects', () => { it('deeply freezes objects', () => {
......
import memoize from '../memoize'; import { memoize } from '../memoize';
describe('memoize', () => { describe('memoize', () => {
let count = 0; let count = 0;
......
import fetchMock from 'fetch-mock'; import fetchMock from 'fetch-mock';
import FakeWindow from '../../test/fake-window'; import { FakeWindow } from '../../test/fake-window';
import OAuthClient, { TokenError, $imports } from '../oauth-client'; import { OAuthClient, TokenError, $imports } from '../oauth-client';
const fixtures = { const fixtures = {
tokenResponse: { tokenResponse: {
......
import observeElementSize from '../observe-element-size'; import { observeElementSize } from '../observe-element-size';
/** /**
* Wait for a condition to become true. * Wait for a condition to become true.
......
...@@ -27,7 +27,7 @@ describe('sidebar/util/sentry', () => { ...@@ -27,7 +27,7 @@ describe('sidebar/util/sentry', () => {
'../../shared/frame-error-capture': { '../../shared/frame-error-capture': {
handleErrorsInFrames: fakeHandleErrorsInFrames, handleErrorsInFrames: fakeHandleErrorsInFrames,
}, },
'../../shared/warn-once': fakeWarnOnce, '../../shared/warn-once': { warnOnce: fakeWarnOnce },
}); });
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment