Thanks to visit codestin.com
Credit goes to github.com

Skip to content

chore(website): update config editor and add tabs to playground #5088

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
May 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
3462032
chore(website): fix issues with ts < 4.0.5, in case of fatal parsing …
armano2 May 26, 2022
a672e6c
fix: ensure all libs are loaded correctly for all ts targets
armano2 May 26, 2022
146994b
chore(website): remove unused LintMessage map from sandboxServices
armano2 May 26, 2022
4326f73
Merge remote-tracking branch 'origin/main' into fix/fallback-errors-t…
armano2 May 26, 2022
d6fd7b5
chore(website): do not report errors for imported dynamic libraries
armano2 May 26, 2022
e031ecd
chore(website): use sandbox for config editing
armano2 May 27, 2022
3354fe9
chore(website): remove json editor from modal
armano2 May 27, 2022
ffae163
chore(website): add basic styles to editor tabs
armano2 May 27, 2022
b015c79
chore(website): move visual editor to right side of tabs
armano2 May 27, 2022
b3b22e7
chore(website): add supper basic display fo mobile views
armano2 May 27, 2022
e527453
chore(website): deduplicate code and ensure that config provided by u…
armano2 May 27, 2022
14c6415
chore(website): do not warn of additionalProperties and minor adjustm…
armano2 May 27, 2022
b51b6b6
chore(website): refine config editor
armano2 May 28, 2022
3e48bc1
chore(website): drop no longer used jsonField property
armano2 May 29, 2022
c6363a5
Merge remote-tracking branch 'origin/main' into feat/poc-playground-tabs
armano2 May 29, 2022
2441068
fix: apply changes from code review
armano2 May 29, 2022
27e4a64
fix: correct regression with recursive elements
armano2 May 29, 2022
3d2d1f3
Merge remote-tracking branch 'origin/main' into feat/poc-playground-tabs
armano2 May 29, 2022
1b8d493
fix: add missing role tablist and role tab
armano2 May 29, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 8 additions & 13 deletions packages/website/src/components/ASTViewerESTree.tsx
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
import React, { useEffect, useState } from 'react';
import React, { useMemo } from 'react';

import ASTViewer from './ast/ASTViewer';
import type { ASTViewerBaseProps, ASTViewerModelMap } from './ast/types';
import type { ASTViewerBaseProps } from './ast/types';
import type { TSESTree } from '@typescript-eslint/utils';

import { serialize } from './ast/serializer/serializer';
import { createESTreeSerializer } from './ast/serializer/serializerESTree';

export interface ASTESTreeViewerProps extends ASTViewerBaseProps {
readonly value: TSESTree.BaseNode | string;
readonly value: TSESTree.BaseNode;
}

export default function ASTViewerESTree({
value,
position,
onSelectNode,
}: ASTESTreeViewerProps): JSX.Element {
const [model, setModel] = useState<string | ASTViewerModelMap>('');

useEffect(() => {
if (typeof value === 'string') {
setModel(value);
} else {
const astSerializer = createESTreeSerializer();
setModel(serialize(value, astSerializer));
}
}, [value]);
const model = useMemo(
() => serialize(value, createESTreeSerializer()),
[value],
);

return (
<ASTViewer value={model} position={position} onSelectNode={onSelectNode} />
Expand Down
20 changes: 7 additions & 13 deletions packages/website/src/components/ASTViewerScope.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,23 @@
import React, { useEffect, useState } from 'react';
import React, { useMemo } from 'react';

import ASTViewer from './ast/ASTViewer';
import type { ASTViewerBaseProps, ASTViewerModelMap } from './ast/types';
import type { ASTViewerBaseProps } from './ast/types';

import { serialize } from './ast/serializer/serializer';
import { createScopeSerializer } from './ast/serializer/serializerScope';

export interface ASTScopeViewerProps extends ASTViewerBaseProps {
readonly value: Record<string, unknown> | string;
readonly value: Record<string, unknown>;
}

export default function ASTViewerScope({
value,
onSelectNode,
}: ASTScopeViewerProps): JSX.Element {
const [model, setModel] = useState<string | ASTViewerModelMap>('');

useEffect(() => {
if (typeof value === 'string') {
setModel(value);
} else {
const scopeSerializer = createScopeSerializer();
setModel(serialize(value, scopeSerializer));
}
}, [value]);
const model = useMemo(
() => serialize(value, createScopeSerializer()),
[value],
);

return <ASTViewer value={model} onSelectNode={onSelectNode} />;
}
30 changes: 13 additions & 17 deletions packages/website/src/components/ASTViewerTS.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { serialize } from './ast/serializer/serializer';
import { createTsSerializer } from './ast/serializer/serializerTS';

export interface ASTTsViewerProps extends ASTViewerBaseProps {
readonly value: SourceFile | string;
readonly value: SourceFile;
}

function extractEnum(
Expand Down Expand Up @@ -41,22 +41,18 @@ export default function ASTViewerTS({
const [typeFlags] = useState(() => extractEnum(window.ts.TypeFlags));

useEffect(() => {
if (typeof value === 'string') {
setModel(value);
} else {
const scopeSerializer = createTsSerializer(
value,
syntaxKind,
['NodeFlags', nodeFlags],
['TokenFlags', tokenFlags],
['ModifierFlags', modifierFlags],
['ObjectFlags', objectFlags],
['SymbolFlags', symbolFlags],
['FlowFlags', flowFlags],
['TypeFlags', typeFlags],
);
setModel(serialize(value, scopeSerializer));
}
const scopeSerializer = createTsSerializer(
value,
syntaxKind,
['NodeFlags', nodeFlags],
['TokenFlags', tokenFlags],
['ModifierFlags', modifierFlags],
['ObjectFlags', objectFlags],
['SymbolFlags', symbolFlags],
['FlowFlags', flowFlags],
['TypeFlags', typeFlags],
);
setModel(serialize(value, scopeSerializer));
}, [value, syntaxKind]);

return (
Expand Down
45 changes: 45 additions & 0 deletions packages/website/src/components/EditorTabs.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import React from 'react';
import type { TabType } from './types';
import styles from './Playground.module.css';
import EditIcon from '@site/src/icons/edit.svg';

export interface FileTabsProps {
readonly tabs: TabType[];
readonly activeTab: TabType;
readonly change: (tab: TabType) => void;
readonly showModal: () => void;
}

export default function EditorTabs({
tabs,
activeTab,
change,
showModal,
}: FileTabsProps): JSX.Element {
return (
<div className={styles.tabContainer}>
<div role="tablist">
{tabs.map(item => {
return (
<button
role="tab"
className={styles.tabStyle}
key={item}
aria-selected={activeTab === item}
disabled={activeTab === item}
onClick={(): void => change(item)}
>
{item}
</button>
);
})}
</div>
{activeTab !== 'code' && (
<button className={styles.tabStyle} onClick={showModal}>
Visual Editor
<EditIcon width={12} height={12} />
</button>
)}
</div>
);
}
2 changes: 1 addition & 1 deletion packages/website/src/components/ErrorsViewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ function severityClass(severity: Monaco.MarkerSeverity): string {
case 8:
return 'danger';
case 4:
return 'caution';
return 'warning';
case 2:
return 'note';
}
Expand Down
60 changes: 2 additions & 58 deletions packages/website/src/components/OptionsSelector.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,21 @@
/* eslint-disable jsx-a11y/label-has-associated-control */
import React, { useCallback, useState } from 'react';
import React, { useCallback } from 'react';

import ConfigEslint from './config/ConfigEslint';
import ConfigTypeScript from './config/ConfigTypeScript';
import Expander from './layout/Expander';
import Dropdown from './inputs/Dropdown';
import Checkbox from './inputs/Checkbox';
import Tooltip from './inputs/Tooltip';
import EditIcon from '@site/src/icons/edit.svg';
import CopyIcon from '@site/src/icons/copy.svg';

import useDebouncedToggle from './hooks/useDebouncedToggle';

import { createMarkdown, createMarkdownParams } from './lib/markdown';

import type { RuleDetails } from './types';

import styles from './OptionsSelector.module.css';

import type { CompilerFlags, ConfigModel, RulesRecord } from './types';
import type { ConfigModel } from './types';

export interface OptionsSelectorParams {
readonly ruleOptions: RuleDetails[];
readonly state: ConfigModel;
readonly setState: (cfg: Partial<ConfigModel>) => void;
readonly tsVersions: readonly string[];
Expand All @@ -36,14 +30,11 @@ const ASTOptions = [
] as const;

function OptionsSelector({
ruleOptions,
state,
setState,
tsVersions,
isLoading,
}: OptionsSelectorParams): JSX.Element {
const [eslintModal, setEslintModal] = useState<boolean>(false);
const [typeScriptModal, setTypeScriptModal] = useState<boolean>(false);
const [copyLink, setCopyLink] = useDebouncedToggle<boolean>(false);
const [copyMarkdown, setCopyMarkdown] = useDebouncedToggle<boolean>(false);

Expand All @@ -54,26 +45,6 @@ function OptionsSelector({
[setState],
);

const updateRules = useCallback(
(rules?: RulesRecord) => {
if (rules) {
setState({ rules: rules });
}
setEslintModal(false);
},
[setState],
);

const updateTsConfig = useCallback(
(config?: CompilerFlags) => {
if (config) {
setState({ tsConfig: config });
}
setTypeScriptModal(false);
},
[setState],
);

const copyLinkToClipboard = useCallback(() => {
void navigator.clipboard
.writeText(document.location.toString())
Expand Down Expand Up @@ -107,19 +78,6 @@ function OptionsSelector({

return (
<>
{state.rules && ruleOptions.length > 0 && (
<ConfigEslint
isOpen={eslintModal}
ruleOptions={ruleOptions}
rules={state.rules}
onClose={updateRules}
/>
)}
<ConfigTypeScript
isOpen={typeScriptModal}
config={state.tsConfig}
onClose={updateTsConfig}
/>
<Expander label="Info">
<label className={styles.optionLabel}>
TypeScript
Expand Down Expand Up @@ -170,20 +128,6 @@ function OptionsSelector({
options={['script', 'module']}
/>
</label>
<button
className={styles.optionLabel}
onClick={(): void => setEslintModal(true)}
>
Eslint Config
<EditIcon />
</button>
<button
className={styles.optionLabel}
onClick={(): void => setTypeScriptModal(true)}
>
TypeScript Config
<EditIcon />
</button>
</Expander>
<Expander label="Actions">
<button className={styles.optionLabel} onClick={copyLinkToClipboard}>
Expand Down
75 changes: 72 additions & 3 deletions packages/website/src/components/Playground.module.css
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
:root {
--playground-main-color: var(--ifm-background-surface-color);
--playground-secondary-color: var(--ifm-color-emphasis-100);
}

.options {
width: 20rem;
background: var(--ifm-background-surface-color);
background: var(--playground-main-color);
overflow: auto;
}

.sourceCode {
height: 100%;
width: 50%;
border: 1px solid var(--ifm-color-emphasis-100);
border: 1px solid var(--playground-secondary-color);
}

.codeBlocks {
Expand All @@ -20,7 +25,7 @@
.astViewer {
height: 100%;
width: 50%;
border: 1px solid var(--ifm-color-emphasis-100);
border: 1px solid var(--playground-secondary-color);
padding: 0;
overflow: auto;
word-wrap: initial;
Expand All @@ -37,3 +42,67 @@
top: var(--ifm-navbar-height);
z-index: calc(var(--ifm-z-index-fixed) - 1);
}

.tabContainer {
display: flex;
justify-content: space-between;
background: var(--playground-main-color);
border-bottom: 1px solid var(--playground-secondary-color);
}

.tabCode {
height: calc(100%);
}

.tabStyle {
border: none;
border-right: 1px solid var(--playground-secondary-color);
background: var(--playground-main-color);
color: var(--ifm-color-emphasis-700);
padding: 0.5rem 1rem;
cursor: pointer;
}

.tabStyle svg {
margin-left: 0.3rem;
}

.tabStyle:hover {
background: var(--playground-secondary-color);
}

.tabStyle:disabled {
background: var(--playground-secondary-color);
color: var(--ifm-color-emphasis-900);
}

@media only screen and (max-width: 996px) {
.codeContainer {
display: block;
width: 100%;
position: static;
}
.codeBlocks {
display: block;
width: 100%;
}

.options {
width: 100%;
}

.tabCode {
height: calc(30rem - 3.2rem);
}

.astViewer,
.sourceCode {
height: 30rem;
width: 100%;
}

.astViewer {
height: auto;
max-height: 30rem;
}
}
Loading