mirror of
https://github.com/noodlapp/noodl.git
synced 2026-01-12 15:22:52 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e514f2521 | ||
|
|
8a88290dab | ||
|
|
418eff7dc7 | ||
|
|
c95725ec08 | ||
|
|
eae223a817 | ||
|
|
57932fef3c | ||
|
|
42e065b586 | ||
|
|
78af7d6c2a | ||
|
|
6115782eed | ||
|
|
dedd2f4f14 | ||
|
|
5976008ae3 | ||
|
|
48010f2c29 | ||
|
|
9bce91d5b3 |
32
README.md
32
README.md
@@ -2,11 +2,22 @@
|
|||||||
|
|
||||||
[Noodl](https://noodl.net) is a low-code platform where designers and developers build custom applications and experiences. Designed as a visual programming environment, it aims to expedite your development process. It promotes the swift and efficient creation of applications, requiring minimal coding knowledge.
|
[Noodl](https://noodl.net) is a low-code platform where designers and developers build custom applications and experiences. Designed as a visual programming environment, it aims to expedite your development process. It promotes the swift and efficient creation of applications, requiring minimal coding knowledge.
|
||||||
|
|
||||||
## Requirements
|
## Documentation
|
||||||
|
Documentation for how to use Noodl can be found here:
|
||||||
|
[https://noodlapp.github.io/noodl-docs/](https://noodlapp.github.io/noodl-docs/)
|
||||||
|
|
||||||
[Node.js](https://nodejs.org/)
|
## Community
|
||||||
|
Main support channel is Discord: [https://www.noodl.net/community](https://www.noodl.net/community)
|
||||||
|
|
||||||
## Getting Started
|
## Download releases
|
||||||
|
Pre-built binaries can be [downloaded from Github](https://github.com/noodlapp/noodl/releases)
|
||||||
|
|
||||||
|
## Note for users who are migrating from the deprecated closed source version
|
||||||
|
- [Migrating the project files and workspaces to a Git provider](https://noodlapp.github.io/noodl-docs/docs/guides/collaboration/migrating-from-noodl-hosted-git)
|
||||||
|
- [Migrate backend and database](https://noodlapp.github.io/noodl-docs/docs/guides/deploy/using-an-external-backend#migrating-from-a-noodl-cloud-service)
|
||||||
|
- [Self-host frontend](https://noodlapp.github.io/noodl-docs/docs/guides/deploy/hosting-frontend)
|
||||||
|
|
||||||
|
## Building from source
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Install all dependencies
|
# Install all dependencies
|
||||||
@@ -22,3 +33,18 @@ $ npm run dev
|
|||||||
# Start Noodl Editor test runner
|
# Start Noodl Editor test runner
|
||||||
$ npm run test:editor
|
$ npm run test:editor
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Licenses
|
||||||
|
This repository contains two different licenses for different parts of the Noodl platform.
|
||||||
|
|
||||||
|
- Components related to the editor, used to edit Noodl projects, are under GPLv3
|
||||||
|
- Components related to the end applications, used by the applications Noodl deploys, are under MIT
|
||||||
|
|
||||||
|
All of the source code of applications created with Noodl are under MIT. This means you can do project specific changes to the runtime without having to redistribute your changes.
|
||||||
|
|
||||||
|
Packaged licensed under MIT:
|
||||||
|
- `noodl-runtime`
|
||||||
|
- `noodl-viewer-cloud`
|
||||||
|
- `noodl-viewer-react`
|
||||||
|
|
||||||
|
You can find a MIT LICENSE file in each of these packages. The rest of the repository is licensed under GPLv3.
|
||||||
|
|||||||
7
package-lock.json
generated
7
package-lock.json
generated
@@ -35443,7 +35443,7 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/Noodl": {
|
"node_modules/noodl-editor": {
|
||||||
"resolved": "packages/noodl-editor",
|
"resolved": "packages/noodl-editor",
|
||||||
"link": true
|
"link": true
|
||||||
},
|
},
|
||||||
@@ -48967,8 +48967,7 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"packages/noodl-editor": {
|
"packages/noodl-editor": {
|
||||||
"name": "Noodl",
|
"version": "1.0.1",
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "^2.1.1",
|
"@electron/remote": "^2.1.1",
|
||||||
"@jaames/iro": "^5.5.2",
|
"@jaames/iro": "^5.5.2",
|
||||||
@@ -80984,7 +80983,7 @@
|
|||||||
"version": "2.0.10",
|
"version": "2.0.10",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"Noodl": {
|
"noodl-editor": {
|
||||||
"version": "file:packages/noodl-editor",
|
"version": "file:packages/noodl-editor",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/core": "^7.19.1",
|
"@babel/core": "^7.19.1",
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"graph": "npx nx graph",
|
"graph": "npx nx graph",
|
||||||
"ci:prepare:editor": "ts-node ./scripts/ci-editor-prepare.ts",
|
"ci:prepare:editor": "ts-node ./scripts/ci-editor-prepare.ts",
|
||||||
"ci:build:viewer": "lerna exec --scope @noodl/noodl-viewer-react -- npm run build",
|
"ci:build:viewer": "lerna exec --scope @noodl/noodl-viewer-react -- npm run build",
|
||||||
"ci:build:editor": "lerna exec --scope Noodl -- npm run ci:build",
|
"ci:build:editor": "lerna exec --scope noodl-editor -- npm run ci:build",
|
||||||
"build:editor": "ts-node ./scripts/build-editor.ts",
|
"build:editor": "ts-node ./scripts/build-editor.ts",
|
||||||
"build:editor:_viewer": "ts-node ./scripts/noodl-editor/build-viewer.ts",
|
"build:editor:_viewer": "ts-node ./scripts/noodl-editor/build-viewer.ts",
|
||||||
"build:editor:_editor": "ts-node ./scripts/noodl-editor/build-editor.ts",
|
"build:editor:_editor": "ts-node ./scripts/noodl-editor/build-editor.ts",
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"build:cloud-runtime": "lerna run build --scope @noodl/cloud-runtime --stream && lerna run build:pack --scope @noodl/cloud-runtime --stream",
|
"build:cloud-runtime": "lerna run build --scope @noodl/cloud-runtime --stream && lerna run build:pack --scope @noodl/cloud-runtime --stream",
|
||||||
"start:storybook": "lerna exec --scope @noodl/noodl-core-ui -- npm run start",
|
"start:storybook": "lerna exec --scope @noodl/noodl-core-ui -- npm run start",
|
||||||
"start:viewer": "lerna run start --scope @noodl/noodl-viewer-react --stream",
|
"start:viewer": "lerna run start --scope @noodl/noodl-viewer-react --stream",
|
||||||
"start:editor": "lerna run start --scope Noodl --stream",
|
"start:editor": "lerna run start --scope noodl-editor --stream",
|
||||||
"dev": "ts-node ./scripts/start.ts",
|
"dev": "ts-node ./scripts/start.ts",
|
||||||
"start": "ts-node ./scripts/start.ts -- --build-viewer",
|
"start": "ts-node ./scripts/start.ts -- --build-viewer",
|
||||||
"test:editor": "ts-node ./scripts/test-editor.ts",
|
"test:editor": "ts-node ./scripts/test-editor.ts",
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "Noodl",
|
"name": "noodl-editor",
|
||||||
"productName": "Noodl Editor",
|
"productName": "Noodl Editor",
|
||||||
"description": "Low-code for when experience matter",
|
"description": "Low-code for when experience matter",
|
||||||
"author": "Noodl <info@noodl.net>",
|
"author": "Noodl <info@noodl.net>",
|
||||||
"homepage": "https://noodl.net",
|
"homepage": "https://noodl.net",
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"main": "src/main/main.js",
|
"main": "src/main/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npx ts-node -P ./tsconfig.build.json ./scripts/build.ts",
|
"build": "npx ts-node -P ./tsconfig.build.json ./scripts/build.ts",
|
||||||
@@ -15,7 +15,13 @@
|
|||||||
"test:ci": "webpack-cli --config=webpackconfigs/webpack.test-ci.js && electron test.js"
|
"test:ci": "webpack-cli --config=webpackconfigs/webpack.test-ci.js && electron test.js"
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"appId": "noodl.net.noodl",
|
"appId": "noodl.net.noodl-editor",
|
||||||
|
"win": {
|
||||||
|
"target": "nsis"
|
||||||
|
},
|
||||||
|
"nsis": {
|
||||||
|
"guid": "noodl.net.noodl-editor"
|
||||||
|
},
|
||||||
"protocols": {
|
"protocols": {
|
||||||
"name": "noodl",
|
"name": "noodl",
|
||||||
"schemes": [
|
"schemes": [
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AppRouter } from "Noodl/src/editor/src/pages/AppRouter";
|
import { AppRouter } from "noodl-editor/src/editor/src/pages/AppRouter";
|
||||||
|
|
||||||
export class AppRoute {
|
export class AppRoute {
|
||||||
constructor(public readonly router: AppRouter) {}
|
constructor(public readonly router: AppRouter) {}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { verifyOpenAiApiKey } from '@noodl-models/AiAssistant/api';
|
|||||||
import { PrimaryButton, PrimaryButtonSize, PrimaryButtonVariant } from '@noodl-core-ui/components/inputs/PrimaryButton';
|
import { PrimaryButton, PrimaryButtonSize, PrimaryButtonVariant } from '@noodl-core-ui/components/inputs/PrimaryButton';
|
||||||
import { Box } from '@noodl-core-ui/components/layout/Box';
|
import { Box } from '@noodl-core-ui/components/layout/Box';
|
||||||
import { VStack } from '@noodl-core-ui/components/layout/Stack';
|
import { VStack } from '@noodl-core-ui/components/layout/Stack';
|
||||||
|
import { PropertyPanelButton } from '@noodl-core-ui/components/property-panel/PropertyPanelButton';
|
||||||
import { PropertyPanelRow } from '@noodl-core-ui/components/property-panel/PropertyPanelInput';
|
import { PropertyPanelRow } from '@noodl-core-ui/components/property-panel/PropertyPanelInput';
|
||||||
import { PropertyPanelPasswordInput } from '@noodl-core-ui/components/property-panel/PropertyPanelPasswordInput';
|
import { PropertyPanelPasswordInput } from '@noodl-core-ui/components/property-panel/PropertyPanelPasswordInput';
|
||||||
import { PropertyPanelSelectInput } from '@noodl-core-ui/components/property-panel/PropertyPanelSelectInput';
|
import { PropertyPanelSelectInput } from '@noodl-core-ui/components/property-panel/PropertyPanelSelectInput';
|
||||||
@@ -31,14 +32,14 @@ export function OpenAiSection() {
|
|||||||
const haveGpt4 = !!models['gpt-4'];
|
const haveGpt4 = !!models['gpt-4'];
|
||||||
if (haveGpt4) {
|
if (haveGpt4) {
|
||||||
OpenAiStore.setIsAiApiKeyVerified(true);
|
OpenAiStore.setIsAiApiKeyVerified(true);
|
||||||
ToastLayer.showSuccess('Open AI, API Key is valid with GPT-4!');
|
ToastLayer.showSuccess('OpenAI API Key is valid with GPT-4!');
|
||||||
} else {
|
} else {
|
||||||
OpenAiStore.setIsAiApiKeyVerified(false);
|
OpenAiStore.setIsAiApiKeyVerified(false);
|
||||||
ToastLayer.showError('Open AI, API Key is missing gpt-4 model Support!');
|
ToastLayer.showError('OpenAI API Key is missing gpt-4 model Support!');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
OpenAiStore.setIsAiApiKeyVerified(false);
|
OpenAiStore.setIsAiApiKeyVerified(false);
|
||||||
ToastLayer.showError('Open AI, API Key is invalid!');
|
ToastLayer.showError('OpenAI API Key is invalid!');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,6 +96,20 @@ export function OpenAiSection() {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</PropertyPanelRow>
|
</PropertyPanelRow>
|
||||||
|
<PropertyPanelRow label="API Key" isChanged={false}>
|
||||||
|
<PropertyPanelButton
|
||||||
|
properties={{
|
||||||
|
isPrimary: true,
|
||||||
|
buttonLabel: 'Verify API Key',
|
||||||
|
onClick() {
|
||||||
|
onVerifyApiKey();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</PropertyPanelRow>
|
||||||
|
<Box hasYSpacing>
|
||||||
|
<Text>Verify your OpenAI API key to start using AI Commands.</Text>
|
||||||
|
</Box>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export function DeploySection() {
|
|||||||
text="All these settings are temporary and will be moved to another place in a future version."
|
text="All these settings are temporary and will be moved to another place in a future version."
|
||||||
/>
|
/>
|
||||||
<Box hasBottomSpacing>
|
<Box hasBottomSpacing>
|
||||||
<Text>The Base Url will be automatically filled in when deploying to Noodl hosting.</Text>
|
<Text>The Base Url.</Text>
|
||||||
</Box>
|
</Box>
|
||||||
<PropertyPanelRow label="Custom Base Url">
|
<PropertyPanelRow label="Custom Base Url">
|
||||||
<PropertyPanelTextInput value={baseUrl} onChange={handleBaseUrl} />
|
<PropertyPanelTextInput value={baseUrl} onChange={handleBaseUrl} />
|
||||||
|
|||||||
@@ -324,6 +324,11 @@ export function GitStatusButton({ openGitSettingsPopout }: GitStatusButtonProps)
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ToastLayer.showError('Failed to push. ' + error);
|
ToastLayer.showError('Failed to push. ' + error);
|
||||||
|
|
||||||
|
// If the error is a rejected push, we need to fetch again to get the latest state where we can pull and rebase
|
||||||
|
if (error?.toString().includes('rejected')) {
|
||||||
|
await fetchRemote();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ export function BaseWindow({
|
|||||||
variant={variant === BaseWindowVariant.Shallow ? TitleBarVariant.Shallow : TitleBarVariant.Default}
|
variant={variant === BaseWindowVariant.Shallow ? TitleBarVariant.Shallow : TitleBarVariant.Default}
|
||||||
version={platform.getVersionWithTag()}
|
version={platform.getVersionWithTag()}
|
||||||
state={newVersionAvailable ? TitleBarState.UpdateAvailable : TitleBarState.Default}
|
state={newVersionAvailable ? TitleBarState.UpdateAvailable : TitleBarState.Default}
|
||||||
isWindows={process.platform === 'win32'}
|
isWindows={['win32', 'linux'].includes(process.platform)}
|
||||||
onMinimizeClicked={() => App.instance.minimize()}
|
onMinimizeClicked={() => App.instance.minimize()}
|
||||||
onMaximizeClicked={() => App.instance.maximize()}
|
onMaximizeClicked={() => App.instance.maximize()}
|
||||||
onCloseClicked={() => App.instance.close()}
|
onCloseClicked={() => App.instance.close()}
|
||||||
|
|||||||
@@ -70,10 +70,10 @@ import { getCurrentPlatform } from '../helper';
|
|||||||
// NOTE: Getting error "Cannot set properties of null (setting 'dev')" here,
|
// NOTE: Getting error "Cannot set properties of null (setting 'dev')" here,
|
||||||
// It basically means that some package is not relative to this path.
|
// It basically means that some package is not relative to this path.
|
||||||
console.log("--- Run 'npm install' ...");
|
console.log("--- Run 'npm install' ...");
|
||||||
execSync(`npm install --arch=${arch} --scope Noodl`, {
|
execSync(`npm install --arch=${arch} --scope noodl-editor`, {
|
||||||
stdio: 'inherit',
|
stdio: 'inherit',
|
||||||
env: process.env
|
env: process.env
|
||||||
});
|
})
|
||||||
console.log("--- 'npm install' done!");
|
console.log("--- 'npm install' done!");
|
||||||
|
|
||||||
// NOTE: npm install --arch= does this too
|
// NOTE: npm install --arch= does this too
|
||||||
@@ -89,7 +89,7 @@ import { getCurrentPlatform } from '../helper';
|
|||||||
// Build: Replace "dugite"
|
// Build: Replace "dugite"
|
||||||
// Build: Replace "desktop-trampoline"
|
// Build: Replace "desktop-trampoline"
|
||||||
console.log("--- Run 'npm run build' ...");
|
console.log("--- Run 'npm run build' ...");
|
||||||
execSync('npx lerna exec --scope Noodl -- npm run build', {
|
execSync('npx lerna exec --scope noodl-editor -- npm run build', {
|
||||||
stdio: 'inherit',
|
stdio: 'inherit',
|
||||||
env: {
|
env: {
|
||||||
...process.env,
|
...process.env,
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ const cloudRuntimeProcess = attachStdio(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const editorProcess = attachStdio(exec('npx lerna exec --scope Noodl -- npm run start', processOptions), {
|
const editorProcess = attachStdio(exec('npx lerna exec --scope noodl-editor -- npm run start', processOptions), {
|
||||||
prefix: 'Editor',
|
prefix: 'Editor',
|
||||||
color: ConsoleColor.FgCyan
|
color: ConsoleColor.FgCyan
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ console.log(
|
|||||||
);
|
);
|
||||||
console.log("---");
|
console.log("---");
|
||||||
|
|
||||||
execSync("npx lerna exec --scope Noodl -- npm run test", {
|
execSync("npx lerna exec --scope noodl-editor -- npm run test", {
|
||||||
cwd: CWD,
|
cwd: CWD,
|
||||||
stdio: "inherit",
|
stdio: "inherit",
|
||||||
env: {
|
env: {
|
||||||
|
|||||||
Reference in New Issue
Block a user