first steps

pull/2086/head
filip mertens 3 years ago
parent b625db3ef7
commit c9dd9fb9ab
  1. 9
      apps/remix-ide/src/app.js
  2. 10
      apps/remix-ide/src/app/files/fileManager.ts
  3. 34
      apps/remix-ide/src/app/tabs/search.tsx
  4. 77
      apps/remix-ide/src/assets/img/Search_Icon.svg
  5. 4
      libs/remix-ui/search/.babelrc
  6. 19
      libs/remix-ui/search/.eslintrc.json
  7. 5
      libs/remix-ui/search/.prettierrc
  8. 7
      libs/remix-ui/search/README.md
  9. 1
      libs/remix-ui/search/src/index.ts
  10. 0
      libs/remix-ui/search/src/lib/components/Exclude.tsx
  11. 17
      libs/remix-ui/search/src/lib/components/Find.tsx
  12. 0
      libs/remix-ui/search/src/lib/components/Include.tsx
  13. 16
      libs/remix-ui/search/src/lib/components/Replace.tsx
  14. 25
      libs/remix-ui/search/src/lib/components/Search.tsx
  15. 0
      libs/remix-ui/search/src/lib/components/results/ResultFileName.tsx
  16. 0
      libs/remix-ui/search/src/lib/components/results/ResultItem.tsx
  17. 0
      libs/remix-ui/search/src/lib/components/results/ResultSummary.tsx
  18. 81
      libs/remix-ui/search/src/lib/components/results/Results.tsx
  19. 88
      libs/remix-ui/search/src/lib/context/context.tsx
  20. 70
      libs/remix-ui/search/src/lib/reducers/Reducer.ts
  21. 19
      libs/remix-ui/search/tsconfig.json
  22. 13
      libs/remix-ui/search/tsconfig.lib.json
  23. 3
      nx.json
  24. 70
      package-lock.json
  25. 1
      tsconfig.base.json
  26. 15
      workspace.json

@ -30,6 +30,7 @@ const isElectron = require('is-electron')
const remixLib = require('@remix-project/remix-lib')
import { QueryParams } from '@remix-project/remix-lib'
import { SearchPlugin } from './app/tabs/search'
const Storage = remixLib.Storage
const RemixDProvider = require('./app/files/remixDProvider')
const Config = require('./config')
@ -147,6 +148,9 @@ class AppComponent {
// ----------------- Storage plugin ---------------------------------
const storagePlugin = new StoragePlugin()
//----- search
const search = new SearchPlugin()
// ----------------- import content service ------------------------
const contentImport = new CompilerImports()
@ -221,7 +225,8 @@ class AppComponent {
dGitProvider,
storagePlugin,
hardhatProvider,
this.walkthroughService
this.walkthroughService,
search
])
// LAYOUT & SYSTEM VIEWS
@ -332,7 +337,7 @@ class AppComponent {
await this.appManager.activatePlugin(['settings', 'config'])
await this.appManager.activatePlugin(['hiddenPanel', 'pluginManager', 'contextualListener', 'terminal', 'blockchain', 'fetchAndCompile', 'contentImport', 'gistHandler'])
await this.appManager.activatePlugin(['settings'])
await this.appManager.activatePlugin(['walkthrough','storage'])
await this.appManager.activatePlugin(['walkthrough','storage', 'search'])
this.appManager.on(
'filePanel',

@ -19,7 +19,7 @@ const profile = {
icon: 'assets/img/fileManager.webp',
permission: true,
version: packageJson.version,
methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', 'saveCurrentFile', 'setBatchFiles'],
methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', 'saveCurrentFile', 'setBatchFiles', 'findInFile'],
kind: 'file-system'
}
const errorMsg = {
@ -396,6 +396,14 @@ class FileManager extends Plugin {
}
}
async findInFile(query) {
const browserProvider = this.getProvider('browser')
await browserProvider.copyFolderToJson('/.workspaces/default_workspace', ({ path, content }) => {
console.log(path, content)
})
}
init() {
this._deps = {
config: this._components.registry.get('config').api,

@ -0,0 +1,34 @@
import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line
import { PluginViewWrapper } from '@remix-ui/helper'
import { SearchTab } from '@remix-ui/search'
const profile = {
name: 'search',
displayName: 'Search',
methods: [''],
events: [],
icon: 'assets/img/Search_Icon.svg',
description: '',
kind: '',
location: 'sidePanel',
documentation: '',
version: packageJson.version
}
export class SearchPlugin extends ViewPlugin {
dispatch: React.Dispatch<any> = () => {}
constructor () {
super(profile)
}
render() {
return (
<div id='searchTab'>
<SearchTab plugin={this}></SearchTab>
</div>
);
}
}

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
viewBox="0 0 500.00001 500.00001"
id="svg4162"
version="1.1"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="Search_Icon.svg">
<defs
id="defs4164" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.954"
inkscape:cx="250"
inkscape:cy="250"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1366"
inkscape:window-height="706"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata4167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-552.36216)">
<g
id="g1400"
transform="translate(-4.3609793,-7.6704785)">
<path
inkscape:connector-curvature="0"
id="path4714"
d="M 232.83952,614.96702 A 154.04816,154.04794 0 0 0 78.79153,769.01382 154.04816,154.04794 0 0 0 232.83952,923.06184 154.04816,154.04794 0 0 0 386.88751,769.01382 154.04816,154.04794 0 0 0 232.83952,614.96702 Z m 0,26.77613 A 129.95832,127.2707 0 0 1 362.79832,769.01382 129.95832,127.2707 0 0 1 232.83952,896.28449 129.95832,127.2707 0 0 1 102.88194,769.01382 129.95832,127.2707 0 0 1 232.83952,641.74315 Z"
style="opacity:1;fill:#2b0000;fill-opacity:1;stroke:none;stroke-opacity:1" />
<rect
ry="18.08342"
rx="33.249443"
transform="matrix(0.65316768,0.7572133,-0.60689051,0.79478545,0,0)"
y="319.55432"
x="794.8775"
height="36.16684"
width="173.02675"
id="rect4721"
style="opacity:1;fill:#2b0000;fill-opacity:1;stroke:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@ -0,0 +1,4 @@
{
"presets": ["@nrwl/react/babel"],
"plugins": []
}

@ -0,0 +1,19 @@
{
"env": {
"browser": true,
"es6": true
},
"ignorePatterns": ["!**/*"],
"extends": "../../../.eslintrc.json",
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaVersion": 11,
"sourceType": "module"
},
"rules": {
"standard/no-callback-literal": "off"
}
}

@ -0,0 +1,5 @@
{
"tabWidth": 2,
"singleQuote": true,
"semi": false
}

@ -0,0 +1,7 @@
# remix-ui-vertical-icons-panel
React library for RemixIde vertical icons Panel
## Running unit tests
Run `nx test remix-ui-vertical-icons-panel` to execute the unit tests via [Jest](https://jestjs.io).

@ -0,0 +1 @@
export { SearchTab } from './lib/components/Search';

@ -0,0 +1,17 @@
import React, { useContext, useReducer } from "react"
import { SearchContext } from "../context/context"
import { SearchingInitialState, SearchReducer } from "../reducers/Reducer"
export const Find = props => {
const { setFind } = useContext(SearchContext)
const change = (e) => {
setFind(e.target.value)
}
return(<>
<input placeholder="Search" className="form-control" onChange={change}></input>
</>)
}

@ -0,0 +1,16 @@
import React, { useContext, useEffect } from 'react'
import { SearchContext } from '../context/context'
export const Replace = props => {
const { state, setReplace } = useContext(SearchContext)
const change = e => {
setReplace(e.target.value)
}
return (
<>
<input placeholder='Replace' className="form-control" onChange={change}></input>
</>
)
}

@ -0,0 +1,25 @@
import React, { useContext, useEffect, useReducer } from 'react'
import { SearchContext, SearchProvider } from '../context/context'
import { SearchingInitialState, SearchReducer } from '../reducers/Reducer'
import { Find } from './Find'
import { Replace } from './Replace'
import { Results } from './results/Results'
export const SearchTab = props => {
const plugin = props.plugin
useEffect(() => {
console.log (plugin)
},[])
return (
<>
<SearchProvider>
<Find></Find>
<Replace></Replace>
<Results plugin={plugin}></Results>
</SearchProvider>
</>
)
}

@ -0,0 +1,81 @@
import { ViewPlugin } from "@remixproject/engine-web"
import React, { useContext, useEffect } from "react"
import { SearchContext } from "../../context/context"
import { SearchResult } from "../../reducers/Reducer"
interface ResultsProps {
plugin: ViewPlugin
}
export const Results = (props: ResultsProps) => {
const { state, setSearchResults } = useContext(SearchContext)
const { plugin } = props
const getDirectory = async (dir) => {
let result = []
const files = await plugin.call('fileManager', 'readdir', dir)
const fileArray = normalize(files)
for (const fi of fileArray) {
if (fi) {
const type = fi.data.isDirectory
if (type === true) {
result = [
...result,
...(await getDirectory(
`${fi.filename}`
))
]
} else {
result = [...result, fi.filename]
}
}
}
return result
}
const normalize = (filesList) => {
const folders = []
const files = []
Object.keys(filesList || {}).forEach(key => {
if (filesList[key].isDirectory) {
folders.push({
filename: key,
data: filesList[key]
})
} else {
files.push({
filename: key,
data: filesList[key]
})
}
})
return [...folders, ...files]
}
useEffect(() => {
if (state.find) {
getDirectory('/').then(res => {
const ob = res.map(file => {
const r:SearchResult = {
filename: file,
lines: [],
path: file,
searchComplete: false
}
return r
})
console.log(ob)
setSearchResults(ob)
})
}
},[state.find])
useEffect(() => {
console.log(state.searchResults)
},[state.searchResults])
return(<></>)
}

@ -0,0 +1,88 @@
import React from 'react'
import { createContext, useReducer } from 'react'
import {
SearchingInitialState,
SearchReducer,
SearchResult,
SearchState
} from '../reducers/Reducer'
export interface SearchingStateInterface {
state: SearchState
setFind: (value: string) => void
setReplace: (value: string) => void
setInclude: (value: string) => void,
setExclude: (value: string) => void,
setCaseSensitive: (value: boolean) => void,
setRegex: (value: boolean) => void,
setWholeWord: (value: boolean) => void,
setSearchResults: (value: SearchResult[]) => void,
}
export const SearchContext = createContext<SearchingStateInterface>(null)
export const SearchProvider = ({
children = [],
reducer = SearchReducer,
initialState = SearchingInitialState
} = {}) => {
const [state, dispatch] = useReducer(reducer, initialState)
const value = {
state,
setFind: (value: string) => {
dispatch({
type: 'SET_FIND',
payload: value
})
},
setReplace: (value: string) => {
dispatch({
type: 'SET_REPLACE',
payload: value
})
},
setInclude: (value: string) => {
dispatch({
type: 'SET_INCLUDE',
payload: value
})
},
setExclude(value: string) {
dispatch({
type: 'SET_EXCLUDE',
payload: value
})
},
setCaseSensitive(value: boolean) {
dispatch({
type: 'SET_CASE_SENSITIVE',
payload: value
})
},
setWholeWord(value: boolean) {
dispatch({
type: 'SET_WHOLE_WORD',
payload: value
})
},
setRegex(value: boolean) {
dispatch({
type: 'SET_REGEX',
payload: value
})
},
setSearchResults(value: SearchResult[]) {
dispatch({
type: 'SET_SEARCH_RESULTS',
payload: value
})
}
}
return (
<>
<SearchContext.Provider value={value}>{children}</SearchContext.Provider>
</>
)
}

@ -0,0 +1,70 @@
interface Action {
type: string
payload: any
}
export interface SearchResultLine {
lineNumber: number
text: string
}
export interface SearchResult {
filename: string,
path: string,
lines: SearchResultLine[],
searchComplete: boolean
}
export interface SearchState {
find: string,
searchResults: SearchResult[],
replace: string,
include: string,
exclude: string,
}
export const SearchingInitialState: SearchState = {
find: '',
replace: '',
include: '',
exclude: '',
searchResults: []
}
export const SearchReducer = (state: SearchState = SearchingInitialState, action: Action) => {
console.log(state)
switch (action.type) {
case 'SET_FIND':
return {
...state,
find: action.payload,
}
break;
case 'SET_REPLACE':
return {
...state,
replace: action.payload,
}
break;
case 'SET_INCLUDE':
return {
...state,
include: action.payload,
}
break;
case 'SET_EXCLUDE':
return {
...state,
exclude: action.payload,
}
break;
case 'SET_SEARCH_RESULTS':
return {
...state,
searchResults: action.payload,
}
break;
default:
}
}

@ -0,0 +1,19 @@
{
"extends": "../../../tsconfig.base.json",
"compilerOptions": {
"jsx": "react",
"allowJs": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
]
}

@ -0,0 +1,13 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"types": ["node"]
},
"files": [
"../../../node_modules/@nrwl/react/typings/cssmodule.d.ts",
"../../../node_modules/@nrwl/react/typings/image.d.ts"
],
"exclude": ["**/*.spec.ts", "**/*.spec.tsx"],
"include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"]
}

@ -139,6 +139,9 @@
"remix-ui-vertical-icons-panel": {
"tags": []
},
"remix-ui-search": {
"tags": []
},
"remix-ui-home-tab": {
"tags": []
},

70
package-lock.json generated

@ -9782,46 +9782,46 @@
"integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ=="
},
"@remixproject/engine": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.26.tgz",
"integrity": "sha512-6Rq6aTUyhtXAaoQamAI8ocFSVy2txpGwu1aoYZGrqova/p/tRWn4/+PU713sffyiAQVBCk7C1z/5VKLm7tUYrQ==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.28.tgz",
"integrity": "sha512-27SHaCrG3KrPfMa1MYud4tE9xUIJKITEUsql99fhN7x12lOmgGZFjiqIG/WWjCMmT7OMG3vtLayiZrsYkzHCVw==",
"requires": {
"@remixproject/plugin-api": "0.3.26",
"@remixproject/plugin-utils": "0.3.26"
"@remixproject/plugin-api": "0.3.28",
"@remixproject/plugin-utils": "0.3.28"
}
},
"@remixproject/engine-web": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/engine-web/-/engine-web-0.3.26.tgz",
"integrity": "sha512-QSW9KVOgHWuRDNqTZIp1jjBeDOXlXQZWYABgljTsC+Nig8EwlyRTfIza9PuCb+MDYT/kID8VgSPXnMrlOtvhjQ==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/engine-web/-/engine-web-0.3.28.tgz",
"integrity": "sha512-JTwTuonW+pI7WsSsgGHAzPynGjIdG34VnPrspR9XKBQO4+NX7m3lbNIMUUviyrbqIoGiGtgYd/ry98uLpTHr4g==",
"requires": {
"@remixproject/engine": "0.3.26",
"@remixproject/plugin-api": "0.3.26",
"@remixproject/plugin-utils": "0.3.26"
"@remixproject/engine": "0.3.28",
"@remixproject/plugin-api": "0.3.28",
"@remixproject/plugin-utils": "0.3.28"
}
},
"@remixproject/plugin": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.26.tgz",
"integrity": "sha512-j0sgl4yDOVJLCuRWOEb/Wo9/fumrWlIpsO0MrtficuhVc1FGhZxKVv8Vdu3x3HgWhXkuhLUMs8VoJ1Ntd9ZkUQ==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.28.tgz",
"integrity": "sha512-sw+cow3GKAcEacXLvdJwtHHIphPty4KRMZ6tcQHdtx/iCKTMNdw2hribKPnvTO+6mXE+4oAKCrFqeTdVp/rd1w==",
"requires": {
"@remixproject/plugin-api": "0.3.26",
"@remixproject/plugin-utils": "0.3.26",
"@remixproject/plugin-api": "0.3.28",
"@remixproject/plugin-utils": "0.3.28",
"events": "3.2.0"
}
},
"@remixproject/plugin-api": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.26.tgz",
"integrity": "sha512-6vR9nVF4EfXDHA0r8MrlLyVYRMJMG7J3Y3jzpaAumetW+YpvfJqgE/uhGgm2me2ypDM8vW0POQGhRaGeZTGwFg==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.28.tgz",
"integrity": "sha512-tOzVFR504037weEkNHQGZsk+Ebxcu/xnBsVCkJaQaBMb+H/i6YevKQmoR1aGcH+JfQxc8eS8LGC65MaV8zmcWg==",
"requires": {
"@remixproject/plugin-utils": "0.3.26"
"@remixproject/plugin-utils": "0.3.28"
}
},
"@remixproject/plugin-utils": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.26.tgz",
"integrity": "sha512-K/v+TXYOMV13dLf1LEgiF7CfqbOc105hC/2oapkSoHKSf3WVyWIUDlBsChRQl7osfUs/zT93q2+jNlLofWQUxg==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.28.tgz",
"integrity": "sha512-5CayTgMqRiOguanTy6kpuRgCmjEFLUu2K4Rs7Zmt+GOzHucmwkDxYQO+3hFv0Jz/M/6yC5wkKYTx8vfPLLdEBQ==",
"requires": {
"tslib": "2.0.1"
},
@ -9834,13 +9834,13 @@
}
},
"@remixproject/plugin-webview": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-webview/-/plugin-webview-0.3.26.tgz",
"integrity": "sha512-hqWaFapUfcAX2Odsj0ANKvLXQbkzZ/xNONMqE0wRxFRYTIhFGZqFzJVzwSD+U4bSehP1JtzkrxwKBqNyjz5GxQ==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-webview/-/plugin-webview-0.3.28.tgz",
"integrity": "sha512-DodSkN0vMSo2DEEoBOWyKxC/ElvBA826vhX+JVGXA8HGS45aavplZIN967hsc+SdzjV1UZfSNKEHttLGwM1BIw==",
"requires": {
"@remixproject/plugin": "0.3.26",
"@remixproject/plugin-api": "0.3.26",
"@remixproject/plugin-utils": "0.3.26",
"@remixproject/plugin": "0.3.28",
"@remixproject/plugin-api": "0.3.28",
"@remixproject/plugin-utils": "0.3.28",
"axios": "^0.21.1"
},
"dependencies": {
@ -9855,13 +9855,13 @@
}
},
"@remixproject/plugin-ws": {
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.26.tgz",
"integrity": "sha512-Nerd/2vGb96G6B8pGRCRNAGlO97KnJpbFmpa47SYipgjaq5Yj5iCUY+fbQzMWdGW2W4BrUPE+YBZCkq/KlfbGw==",
"version": "0.3.28",
"resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.28.tgz",
"integrity": "sha512-i3He9t4qvcBQxzshFx66D6drqLlySmV7Cb+NeYtMOYlWxQSJtUakp/Px1Tl3IDFQXDfpXxvDvYhn2w0AWPBOqw==",
"requires": {
"@remixproject/plugin": "0.3.26",
"@remixproject/plugin-api": "0.3.26",
"@remixproject/plugin-utils": "0.3.26"
"@remixproject/plugin": "0.3.28",
"@remixproject/plugin-api": "0.3.28",
"@remixproject/plugin-utils": "0.3.28"
}
},
"@restart/context": {

@ -40,6 +40,7 @@
],
"@remix-project/remixd": ["dist/libs/remixd/index.js"],
"@remix-ui/tree-view": ["libs/remix-ui/tree-view/src/index.ts"],
"@remix-ui/search": ["libs/remix-ui/search/src/index.ts"],
"@remix-ui/debugger-ui": ["libs/remix-ui/debugger-ui/src/index.ts"],
"@remix-ui/utils": ["libs/remix-ui/utils/src/index.ts"],
"@remix-ui/clipboard": ["libs/remix-ui/clipboard/src/index.ts"],

@ -1108,6 +1108,21 @@
}
}
},
"remix-ui-search": {
"root": "libs/remix-ui/search",
"sourceRoot": "libs/remix-ui/search/src",
"projectType": "library",
"architect": {
"lint": {
"builder": "@nrwl/linter:lint",
"options": {
"linter": "eslint",
"tsConfig": ["libs/remix-ui/search/tsconfig.lib.json"],
"exclude": ["**/node_modules/**", "!libs/remix-ui/search/**/*"]
}
}
}
},
"remix-ui-panel": {
"root": "libs/remix-ui/panel",
"sourceRoot": "libs/remix-ui/panel/src",

Loading…
Cancel
Save