Skip to content
This repository was archived by the owner on Jan 22, 2019. It is now read-only.

Commit 4128d35

Browse files
committed
feat: wip
feat: JSONEditor feat: options menu story feat: wip feat: wip
1 parent f74fa2d commit 4128d35

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1534
-1578
lines changed

package.json

+9-5
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
"cypress:open": "yarn run build && cypress open",
1717
"test:e2e": "yarn run build && cypress run --browser chrome",
1818
"prettier": "prettier '**/{*.{js?(on),ts?(x),graphql,md,scss},.*.js?(on)}' --write --list-different --config prettier.config.js",
19-
"storybook": "start-storybook -c ./config/storybook -p 6006",
20-
"build-storybook": "build-storybook -c ./config/storybook",
21-
"test": "mocha --require ts-node/register --watch --watch-extensions ts './src/**/*.test.ts?(x)'",
22-
"test:ci": "mocha --require ts-node/register './src/**/*.test.ts?(x)'"
19+
"test": "mocha --require ts-node/register --require jsdom-global/register --watch --watch-extensions 'ts?(x)' './src/**/*.test.ts?(x)'",
20+
"test:ci": "mocha --require ts-node/register --require jsdom-global/register './src/**/*.test.ts?(x)'",
21+
"storybook": "start-storybook -s ./src/extension/assets -c ./config/storybook -p 6006",
22+
"build-storybook": "build-storybook -c ./config/storybook"
2323
},
2424
"husky": {
2525
"hooks": {
@@ -87,11 +87,15 @@
8787
"get-graphql-schema": "^2.1.1",
8888
"gql2ts": "^1.2.1",
8989
"husky": "^1.1.0",
90+
"jsdom": "^12.2.0",
91+
"jsdom-global": "^3.0.2",
9092
"mocha": "^5.2.0",
9193
"node-sass": "^4.9.0",
9294
"postcss-loader": "^3.0.0",
9395
"prettier": "1.14.0",
96+
"raf": "^3.4.0",
9497
"raw-loader": "^0.5.1",
98+
"react-testing-library": "^5.2.1",
9599
"sass-loader": "^6.0.6",
96100
"semantic-release": "^15.9.9",
97101
"semantic-release-chrome": "^1.1.0",
@@ -129,7 +133,7 @@
129133
"mdi-react": "^4.0.0",
130134
"mermaid": "^8.0.0-rc.8",
131135
"node-sass-import-once": "^1.2.0",
132-
"omnicli": "0.1.13",
136+
"omnicli": "0.2.0",
133137
"open-color": "^1.6.3",
134138
"react": "^16.4.2",
135139
"react-dom": "^16.4.2",

src/app.scss

+2
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,15 @@ $theme-colors-light: (
8282
@import './shared/repo/tooltips';
8383
@import './highlight';
8484
@import './options';
85+
@import './libs/options/styles.scss';
8586
@import './shared/tree/tree';
8687
@import './shared/tree/repoRevSidebar';
8788
@import './shared/tree/resizable';
8889
@import './shared/components/alerts';
8990
@import './shared/components/symbols';
9091
@import './shared/components/codeIntelStatusIndicator';
9192
@import './shared/components/CodeViewToolbar.scss';
93+
@import './shared/components/JSONEditor';
9294
@import '@sourcegraph/codeintellify/lib/HoverOverlay.scss';
9395
@import './libs/code_intelligence/HoverOverlay.scss';
9496
@import '@sourcegraph/react-loading-spinner/lib/LoadingSpinner.css';

src/browser/storage.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ export { StorageItems, defaultStorageItems } from './types'
88
type MigrateFunc = (
99
items: StorageItems,
1010
set: (items: Partial<StorageItems>) => void,
11-
remove: (key: keyof StorageItems) => void
11+
/**
12+
* Remove an item from storage.
13+
*
14+
* @param key the key of the item you'd like to remove. We accept arbitary
15+
* strings so we can remove items that are no longer in our types.
16+
*/
17+
remove: (key: string) => void
1218
) => void
1319

1420
export interface Storage {

src/browser/types.ts

+63-22
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,73 @@ export interface PhabricatorMapping {
1111
* The feature flags available.
1212
*/
1313
export interface FeatureFlags {
14-
newTooltips: boolean
14+
/**
15+
* Whether or not to render [Mermaid](https://mermaidjs.github.io/) graphs
16+
* in markdown files viewed on GitHub.
17+
*
18+
* @duration permanent
19+
*/
20+
renderMermaidGraphsEnabled: boolean
21+
/**
22+
* Open files from the fuzzy file finder omnibar tool (src :f <file_name>)
23+
* on Sourcegraph or the codehost.
24+
*
25+
* @duration permanent
26+
*/
27+
openFileOnSourcegraph: boolean
28+
/**
29+
* Whether or not to use the new inject method for code intelligence.
30+
*
31+
* @duration temporary - to be removed November first.
32+
*/
1533
newInject: boolean
34+
/**
35+
* Enable the use of Sourcegraph extensions.
36+
*
37+
* @duration temporary - to be removed by @chris when extensions are stable and out of
38+
* beta.
39+
*/
40+
useExtensions: boolean
41+
/**
42+
* Enable inline symbol search by typing `!symbolQueryText` inside of GitHub PR comments (requires reload after toggling).
43+
*
44+
* @duration temporary - needs feedback from users.
45+
*/
46+
inlineSymbolSearchEnabled: boolean
47+
/**
48+
* Whether or not to execute a search on Sourcegraph when a search is
49+
* executed on the code host.
50+
*
51+
* @duration permanent
52+
*/
53+
executeSearchEnabled: boolean
54+
/**
55+
* Display the Sourcegraph file tree in the code host when viewing a repository.
56+
*
57+
* @duration permanent
58+
*/
59+
repositoryFileTreeEnabled: boolean
1660
}
1761

1862
export const featureFlagDefaults: FeatureFlags = {
19-
newTooltips: true,
2063
newInject: false,
64+
renderMermaidGraphsEnabled: false,
65+
useExtensions: false,
66+
openFileOnSourcegraph: true,
67+
inlineSymbolSearchEnabled: true,
68+
executeSearchEnabled: false,
69+
repositoryFileTreeEnabled: true,
70+
}
71+
72+
/** A map determining whether a feature flag is configurable by users or not. */
73+
export const configurableFeatureFlags = {
74+
newInject: false,
75+
renderMermaidGraphsEnabled: true,
76+
useExtensions: true,
77+
openFileOnSourcegraph: true,
78+
inlineSymbolSearchEnabled: true,
79+
executeSearchEnabled: false,
80+
repositoryFileTreeEnabled: true,
2181
}
2282

2383
export interface AccessToken {
@@ -42,28 +102,17 @@ export interface StorageItems {
42102

43103
gitHubEnterpriseURL: string
44104
phabricatorURL: string
45-
inlineSymbolSearchEnabled: boolean
46-
renderMermaidGraphsEnabled: boolean
47-
repositoryFileTreeEnabled: boolean
48-
executeSearchEnabled: boolean
49-
sourcegraphRepoSearchToggled: boolean
50-
openEditorEnabled: boolean
51105
identity: string
52106
serverUrls: string[]
53107
enterpriseUrls: string[]
54108
serverUserId: string
55109
hasSeenServerModal: boolean
56110
repoLocations: RepoLocations
57111
phabricatorMappings: PhabricatorMapping[]
58-
openFileOnSourcegraph: boolean
59112
sourcegraphAnonymousUid: string
60113
disableExtension: boolean
61114
/**
62-
* Enable the use of Sourcegraph extensions.
63-
*/
64-
useExtensions: boolean
65-
/**
66-
* Storage for feature flags
115+
* Storage for feature flags.
67116
*/
68117
featureFlags: FeatureFlags
69118
clientConfiguration: ClientConfigurationDetails
@@ -83,22 +132,14 @@ export const defaultStorageItems: StorageItems = {
83132
serverUrls: ['https://sourcegraph.com'],
84133
gitHubEnterpriseURL: '',
85134
phabricatorURL: '',
86-
inlineSymbolSearchEnabled: true,
87-
renderMermaidGraphsEnabled: false,
88-
repositoryFileTreeEnabled: true,
89-
executeSearchEnabled: false,
90-
sourcegraphRepoSearchToggled: true,
91-
openEditorEnabled: false,
92135
identity: '',
93136
enterpriseUrls: [],
94137
serverUserId: '',
95138
hasSeenServerModal: false,
96139
repoLocations: {},
97140
phabricatorMappings: [],
98-
openFileOnSourcegraph: true,
99141
sourcegraphAnonymousUid: '',
100142
disableExtension: false,
101-
useExtensions: false,
102143
featureFlags: featureFlagDefaults,
103144
clientConfiguration: {
104145
contentScriptUrls: [],

src/extension/scripts/background.tsx

+15-44
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import * as permissions from '../../browser/permissions'
1313
import * as runtime from '../../browser/runtime'
1414
import storage, { defaultStorageItems } from '../../browser/storage'
1515
import * as tabs from '../../browser/tabs'
16+
import { featureFlagDefaults } from '../../browser/types'
1617
import initializeCli from '../../libs/cli'
1718
import { ExtensionConnectionInfo, onFirstMessage } from '../../messaging'
1819
import { resolveClientConfiguration } from '../../shared/backend/server'
@@ -161,6 +162,7 @@ permissions.onRemoved(permissions => {
161162
})
162163
})
163164

165+
// Ensure access tokens are in storage and they are in the correct shape.
164166
storage.addSyncMigration((items, set, remove) => {
165167
if (!items.accessTokens) {
166168
set({ accessTokens: {} })
@@ -178,50 +180,22 @@ storage.addSyncMigration((items, set, remove) => {
178180

179181
set({ accessTokens })
180182
}
183+
})
181184

182-
if (items.phabricatorURL) {
183-
remove('phabricatorURL')
184-
185-
const newItems: {
186-
enterpriseUrls?: string[]
187-
} = {}
188-
189-
if (items.enterpriseUrls && !items.enterpriseUrls.find(u => u === items.phabricatorURL)) {
190-
newItems.enterpriseUrls = items.enterpriseUrls.concat(items.phabricatorURL)
191-
} else if (!items.enterpriseUrls) {
192-
newItems.enterpriseUrls = [items.phabricatorURL]
185+
// Ensure all feature flags are in storage.
186+
storage.addSyncMigration((items, set, remove) => {
187+
for (const key of Object.keys(featureFlagDefaults)) {
188+
if (typeof items.featureFlags[key] === 'undefined') {
189+
remove(key)
190+
set({ featureFlags: { ...featureFlagDefaults, ...items.featureFlags, [key]: featureFlagDefaults[key] } })
193191
}
194-
195-
set(newItems)
196-
}
197-
198-
if (!items.repoLocations) {
199-
set({ repoLocations: {} })
200-
}
201-
202-
if (items.openFileOnSourcegraph === undefined) {
203-
set({ openFileOnSourcegraph: true })
204-
}
205-
206-
if (items.featureFlags && !items.featureFlags.newInject) {
207-
set({ featureFlags: { ...items.featureFlags, newInject: true } })
208-
}
209-
210-
if (!items.inlineSymbolSearchEnabled) {
211-
set({ inlineSymbolSearchEnabled: true })
212192
}
193+
})
213194

214-
if (items.serverUrls) {
215-
if (items.sourcegraphURL) {
216-
if (items.sourcegraphURL === DEFAULT_SOURCEGRAPH_URL) {
217-
const urls = without(items.serverUrls, DEFAULT_SOURCEGRAPH_URL)
218-
if (urls.length) {
219-
set({ sourcegraphURL: urls[0], serverUrls: [urls[0]] })
220-
}
221-
} else {
222-
set({ serverUrls: [items.sourcegraphURL] })
223-
}
224-
}
195+
// Add access tokens to storage.
196+
storage.addSyncMigration((items, set) => {
197+
if (!items.accessTokens) {
198+
set({ accessTokens: {} })
225199
}
226200
})
227201

@@ -371,12 +345,9 @@ function handleManagedPermissionRequest(managedUrls: string[]): void {
371345

372346
function setDefaultBrowserAction(): void {
373347
browserAction.setBadgeText({ text: '' })
348+
browserAction.setPopup({ popup: 'options.html?popup=true' })
374349
}
375350

376-
browserAction.onClicked(() => {
377-
runtime.openOptionsPage()
378-
})
379-
380351
/**
381352
* Fetches JavaScript from a URL and runs it in a web worker.
382353
*/

src/extension/scripts/inject.tsx

+14-6
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,24 @@ function injectApplication(): void {
7878
if (isGitHub || isGitHubEnterprise) {
7979
setSourcegraphUrl(sourcegraphServerUrl)
8080
setRenderMermaidGraphsEnabled(
81-
items.renderMermaidGraphsEnabled === undefined ? false : items.renderMermaidGraphsEnabled
81+
items.featureFlags.renderMermaidGraphsEnabled === undefined
82+
? false
83+
: items.featureFlags.renderMermaidGraphsEnabled
8284
)
8385
setInlineSymbolSearchEnabled(
84-
items.inlineSymbolSearchEnabled === undefined ? false : items.inlineSymbolSearchEnabled
86+
items.featureFlags.inlineSymbolSearchEnabled === undefined
87+
? false
88+
: items.featureFlags.inlineSymbolSearchEnabled
8589
)
8690
setRepositoryFileTreeEnabled(
87-
items.repositoryFileTreeEnabled === undefined ? true : items.repositoryFileTreeEnabled
91+
items.featureFlags.repositoryFileTreeEnabled === undefined
92+
? true
93+
: items.featureFlags.repositoryFileTreeEnabled
8894
)
89-
setExecuteSearchEnabled(items.executeSearchEnabled === undefined ? true : items.executeSearchEnabled)
90-
injectGitHubApplication(extensionMarker)
95+
setExecuteSearchEnabled(
96+
items.featureFlags.executeSearchEnabled === undefined ? true : items.featureFlags.executeSearchEnabled
97+
)
98+
await injectGitHubApplication(extensionMarker)
9199
} else if (isSourcegraphServer || /^https?:\/\/(www.)?sourcegraph.com/.test(href)) {
92100
setSourcegraphUrl(sourcegraphServerUrl)
93101
injectSourcegraphApp(extensionMarker)
@@ -110,7 +118,7 @@ function injectApplication(): void {
110118
}
111119
}
112120

113-
setUseExtensions(items.useExtensions === undefined ? false : items.useExtensions)
121+
setUseExtensions(items.featureFlags.useExtensions === undefined ? false : items.featureFlags.useExtensions)
114122
}
115123

116124
storage.getSync(handleGetStorage)

src/extension/scripts/options.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import '../../config/polyfill'
55
import * as React from 'react'
66
import { render } from 'react-dom'
77
import storage from '../../browser/storage'
8-
import { OptionsDashboard } from '../../shared/components/options/OptionsDashboard'
8+
import { OptionsContainer } from '../../libs/options/OptionsContainer'
99
import { assertEnv } from '../envAssertion'
1010

1111
assertEnv('OPTIONS')
@@ -17,7 +17,7 @@ const inject = () => {
1717
document.body.appendChild(injectDOM)
1818

1919
storage.getSync(items => {
20-
render(<OptionsDashboard />, injectDOM)
20+
render(<OptionsContainer />, injectDOM)
2121
})
2222
}
2323

src/extension/views/options.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<!DOCTYPE html>
2-
<html style="height: 100%; width: 100%; display: flex;">
2+
<html>
33
<head>
44
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
55
<title>Sourcegraph extension</title>
66
<link href="./css/bootstrap.bundle.css" rel="stylesheet" type="text/css">
77
<link href="./css/style.bundle.css" rel="stylesheet" type="text/css">
88
</head>
9-
<body style="height: 100%; width: 100%; display: flex;">
9+
<body>
1010
<script type="text/javascript" src="./js/options.bundle.js"></script>
1111
</body>
1212
</html>

0 commit comments

Comments
 (0)