Merge branch 'main' into feature/get-supercharged

This commit is contained in:
Ajai Shankar 2023-02-19 23:38:27 -06:00
commit 8300830a95
16 changed files with 118 additions and 55 deletions

View File

@ -21,3 +21,5 @@ jobs:
run: npm run test --workspace=packages/bruno-schema
- name: Test Package bruno-app
run: npm run test --workspace=packages/bruno-app
- name: Test Package bruno-js
run: npm run test --workspace=packages/bruno-js

View File

@ -23,25 +23,7 @@ You would need [Node v14.x or the latest LTS version](https://nodejs.org/en/) an
### Lets start coding
```bash
# clone and cd into bruno
# use Node 14.x, Npm 8.x
# Install deps (note that we use npm workspaces)
npm i
# run next app
npm run dev:web
# run electron app
# neededonly if you want to test changes related to electron app
# please note that both web and electron use the same code
# if it works in web, then it should also work in electron
npm run dev:electron
# open in browser
open http://localhost:3000
```
Please reference [development.md](docs/development.md) for instructions on running the local development environment.
### Raising Pull Request

View File

@ -1,40 +1,40 @@
## development
## Development
Bruno is deing developed as a desktop app. You need to load the app by running the nextjs app in one terminal and then run the electron app in another terminal.
### Dependencies
* NodeJS v18
###
### Local Development
```bash
# use nodejs 18 version
nvm use
# install deps
npm i
npm i --legacy-peer-deps
# run next app
npm run dev --workspace=packages/bruno-app
# build graphql docs
npm run build:graphql-docs
# run electron app
npm run dev --workspace=packages/bruno-electron
# run next app (terminal 1)
npm run dev:web
# build next app
npm run build --workspace=packages/bruno-app
# run electron app (terminal 2)
npm run dev:electron
```
### fix
### Troubleshooting
You might encounter a `Unsupported platform` error when you run `npm install`. To fix this, you will need to delete `node_modules` and `package-lock.json` and run `npm install`. This should install all the necessary packages needed to run the app.
### testing
### Testing
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-schema
npm test --workspace=packages/bruno-lang
```

View File

@ -1,5 +1,6 @@
import React, { useEffect, useState, forwardRef, useRef } from 'react';
import { findEnvironmentInCollection } from 'utils/collections';
import usePrevious from 'hooks/usePrevious';
import EnvironmentDetails from './EnvironmentDetails';
import CreateEnvironment from '../CreateEnvironment/index';
import StyledWrapper from './StyledWrapper';
@ -9,14 +10,36 @@ const EnvironmentList = ({ collection }) => {
const [selectedEnvironment, setSelectedEnvironment] = useState(null);
const [openCreateModal, setOpenCreateModal] = useState(false);
const envUids = environments ? environments.map((env) => env.uid) : [];
const prevEnvUids = usePrevious(envUids);
useEffect(() => {
if(selectedEnvironment) {
return;
}
const environment = findEnvironmentInCollection(collection, collection.activeEnvironmentUid);
if(environment) {
setSelectedEnvironment(environment);
} else {
setSelectedEnvironment(environments && environments.length ? environments[0] : null);
}
}, [collection, environments]);
}, [collection, environments, selectedEnvironment]);
useEffect(() => {
// check env add
if (prevEnvUids && prevEnvUids.length && envUids.length > prevEnvUids.length) {
const newEnv = environments.find((env) => !prevEnvUids.includes(env.uid));
if(newEnv){
setSelectedEnvironment(newEnv);
}
}
// check env delete
if (prevEnvUids && prevEnvUids.length && envUids.length < prevEnvUids.length) {
setSelectedEnvironment(environments && environments.length ? environments[0] : null);
}
}, [envUids, environments, prevEnvUids]);
if (!selectedEnvironment) {
return null;
@ -31,7 +54,11 @@ const EnvironmentList = ({ collection }) => {
{environments &&
environments.length &&
environments.map((env) => (
<div key={env.uid} className={selectedEnvironment.uid === env.uid ? 'environment-item active' : 'environment-item'} onClick={() => setSelectedEnvironment(env)}>
<div
key={env.uid}
className={selectedEnvironment.uid === env.uid ? 'environment-item active' : 'environment-item'}
onClick={() => setSelectedEnvironment(env)}
>
<span>{env.name}</span>
</div>
))}

View File

@ -25,7 +25,7 @@ const NewFolder = ({ collection, item, onClose }) => {
if(item && item.uid) {
return true;
}
return !(value.trim().toLowerCase().includes('environments'))
return value && !(value.trim().toLowerCase().includes('environments'))
}
})
}),

View File

@ -30,7 +30,7 @@ const NewRequest = ({ collection, item, isEphermal, onClose }) => {
.test({
name: 'requestName',
message: 'The request name "index" is reserved in bruno',
test: value => !(value.trim().toLowerCase().includes('index')),
test: value => value && !(value.trim().toLowerCase().includes('index')),
})
}),
onSubmit: (values) => {

View File

@ -117,7 +117,7 @@ const Sidebar = () => {
</GitHubButton>
)}
</div>
<div className="flex flex-grow items-center justify-end text-xs mr-2">v0.9.3</div>
<div className="flex flex-grow items-center justify-end text-xs mr-2">v0.9.4</div>
</div>
</div>
</div>

View File

@ -0,0 +1,13 @@
import { useRef, useEffect } from 'react';
function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value; //assign the value of ref to the argument
},[value]); //this code will run when the value of 'value' changes
return ref.current; //in the end, return the current ref value.
}
export default usePrevious;

View File

@ -1,6 +1,6 @@
{
"name": "@usebruno/cli",
"version": "0.2.1",
"version": "0.2.3",
"main": "src/index.js",
"bin": {
"bru": "./bin/bru.js"
@ -12,7 +12,7 @@
],
"dependencies": {
"@usebruno/js": "0.1.1",
"@usebruno/lang": "0.2.0",
"@usebruno/lang": "0.2.2",
"axios": "^1.3.2",
"chai": "^4.3.7",
"chalk": "^3.0.0",

View File

@ -1,5 +1,5 @@
{
"version": "0.9.3",
"version": "0.9.4",
"name": "bruno",
"description": "Opensource API Client",
"homepage": "https://www.usebruno.com",
@ -14,8 +14,8 @@
},
"dependencies": {
"@usebruno/js": "0.1.0",
"@usebruno/lang": "0.1.0",
"@usebruno/schema": "0.1.0",
"@usebruno/lang": "0.2.2",
"@usebruno/schema": "0.3.1",
"axios": "^0.26.0",
"chai": "^4.3.7",
"chokidar": "^3.5.3",

View File

@ -18,7 +18,7 @@ const template = [
submenu: [
{ role: 'undo'},
{ role: 'redo'},
{ role: 'separator'},
{ type: 'separator'},
{ role: 'cut'},
{ role: 'copy'},
{ role: 'paste'}
@ -27,13 +27,12 @@ const template = [
{
label: 'View',
submenu: [
{ role: 'reload'},
{ role: 'toggledevtools'},
{ role: 'separator'},
{ type: 'separator'},
{ role: 'resetzoom'},
{ role: 'zoomin'},
{ role: 'zoomout'},
{ role: 'separator'},
{ type: 'separator'},
{ role: 'togglefullscreen'}
]
},

View File

@ -1,6 +1,6 @@
{
"name": "@usebruno/lang",
"version": "0.2.0",
"version": "0.2.2",
"main": "src/index.js",
"files": [
"src",

View File

@ -57,11 +57,12 @@ const grammar = ohm.grammar(`Bru {
meta = "meta" dictionary
http = get | post | put | delete | options | head | connect | trace
http = get | post | put | delete | patch | options | head | connect | trace
get = "get" dictionary
post = "post" dictionary
put = "put" dictionary
delete = "delete" dictionary
patch = "patch" dictionary
options = "options" dictionary
head = "head" dictionary
connect = "connect" dictionary
@ -237,6 +238,14 @@ const sem = grammar.createSemantics().addAttribute('ast', {
}
};
},
patch(_1, dictionary) {
return {
http: {
method: 'patch',
...mapPairListToKeyValPair(dictionary.ast)
}
};
},
options(_1, dictionary) {
return {
http: {

View File

@ -6,16 +6,18 @@ const grammar = ohm.grammar(`Bru {
nl = "\\r"? "\\n"
st = " " | "\\t"
stnl = st | nl
tagend = nl "}"
validkey = ~(st | ":") any
validvalue = ~nl any
optionalnl = ~tagend nl
keychar = ~(tagend | st | nl | ":") any
valuechar = ~(nl | tagend) any
// Dictionary Blocks
dictionary = st* "{" pairlist? tagend
pairlist = nl* pair (~tagend nl pair)* (~tagend space)*
pair = st* key st* ":" st* value? st*
key = ~tagend validkey*
value = ~tagend validvalue*
pairlist = optionalnl* pair (~tagend stnl* pair)* (~tagend space)*
pair = st* key st* ":" st* value st*
key = keychar*
value = valuechar*
vars = "vars" dictionary
}`);
@ -68,7 +70,7 @@ const sem = grammar.createSemantics().addAttribute('ast', {
},
pair(_1, key, _2, _3, _4, value, _5) {
let res = {};
res[key.ast] = _.get(value, 'ast[0]', '');
res[key.ast] = value.ast ? value.ast.trim() : '';
return res;
},
key(chars) {

View File

@ -85,4 +85,33 @@ vars {
expect(output).toEqual(expected);
});
it("should parse vars with empty values", () => {
const input = `
vars {
url:
phone:
api-key:
}
`;
const output = parser(input);
const expected = {
"variables": [{
"name": "url",
"value": "",
"enabled" : true,
}, {
"name": "phone",
"value": "",
"enabled" : true,
}, {
"name": "api-key",
"value": "",
"enabled" : true,
}]
};
expect(output).toEqual(expected);
});
});

View File

@ -1,6 +1,6 @@
{
"name": "@usebruno/schema",
"version": "0.3.0",
"version": "0.3.1",
"main": "src/index.js",
"files": [
"src",