@friggframework/devtools 2.0.0-next.4 → 2.0.0-next.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/frigg-cli/.eslintrc.js +141 -0
- package/frigg-cli/__tests__/jest.config.js +102 -0
- package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
- package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
- package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
- package/frigg-cli/__tests__/utils/command-tester.js +170 -0
- package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
- package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
- package/frigg-cli/__tests__/utils/test-setup.js +286 -0
- package/frigg-cli/build-command/index.js +54 -0
- package/frigg-cli/deploy-command/index.js +175 -0
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
- package/frigg-cli/generate-command/azure-generator.js +43 -0
- package/frigg-cli/generate-command/gcp-generator.js +47 -0
- package/frigg-cli/generate-command/index.js +332 -0
- package/frigg-cli/generate-command/terraform-generator.js +555 -0
- package/frigg-cli/generate-iam-command.js +115 -0
- package/frigg-cli/index.js +47 -1
- package/frigg-cli/index.test.js +1 -4
- package/frigg-cli/init-command/backend-first-handler.js +756 -0
- package/frigg-cli/init-command/index.js +93 -0
- package/frigg-cli/init-command/template-handler.js +143 -0
- package/frigg-cli/install-command/index.js +1 -4
- package/frigg-cli/package.json +51 -0
- package/frigg-cli/start-command/index.js +30 -4
- package/frigg-cli/start-command/start-command.test.js +155 -0
- package/frigg-cli/test/init-command.test.js +180 -0
- package/frigg-cli/test/npm-registry.test.js +319 -0
- package/frigg-cli/ui-command/index.js +154 -0
- package/frigg-cli/utils/app-resolver.js +319 -0
- package/frigg-cli/utils/backend-path.js +16 -17
- package/frigg-cli/utils/npm-registry.js +167 -0
- package/frigg-cli/utils/process-manager.js +199 -0
- package/frigg-cli/utils/repo-detection.js +405 -0
- package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
- package/infrastructure/GENERATE-IAM-DOCS.md +278 -0
- package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
- package/infrastructure/README.md +443 -0
- package/infrastructure/WEBSOCKET-CONFIGURATION.md +105 -0
- package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
- package/infrastructure/__tests__/helpers/test-utils.js +277 -0
- package/infrastructure/aws-discovery.js +1176 -0
- package/infrastructure/aws-discovery.test.js +1220 -0
- package/infrastructure/build-time-discovery.js +206 -0
- package/infrastructure/build-time-discovery.test.js +378 -0
- package/infrastructure/create-frigg-infrastructure.js +3 -5
- package/infrastructure/env-validator.js +77 -0
- package/infrastructure/frigg-deployment-iam-stack.yaml +401 -0
- package/infrastructure/iam-generator.js +836 -0
- package/infrastructure/iam-generator.test.js +172 -0
- package/infrastructure/iam-policy-basic.json +218 -0
- package/infrastructure/iam-policy-full.json +288 -0
- package/infrastructure/integration.test.js +383 -0
- package/infrastructure/run-discovery.js +110 -0
- package/infrastructure/serverless-template.js +1493 -138
- package/infrastructure/serverless-template.test.js +1804 -0
- package/management-ui/.eslintrc.js +22 -0
- package/management-ui/README.md +203 -0
- package/management-ui/components.json +21 -0
- package/management-ui/docs/phase2-integration-guide.md +320 -0
- package/management-ui/index.html +13 -0
- package/management-ui/package-lock.json +16517 -0
- package/management-ui/package.json +76 -0
- package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
- package/management-ui/postcss.config.js +6 -0
- package/management-ui/server/api/backend.js +256 -0
- package/management-ui/server/api/cli.js +315 -0
- package/management-ui/server/api/codegen.js +663 -0
- package/management-ui/server/api/connections.js +857 -0
- package/management-ui/server/api/discovery.js +185 -0
- package/management-ui/server/api/environment/index.js +1 -0
- package/management-ui/server/api/environment/router.js +378 -0
- package/management-ui/server/api/environment.js +328 -0
- package/management-ui/server/api/integrations.js +876 -0
- package/management-ui/server/api/logs.js +248 -0
- package/management-ui/server/api/monitoring.js +282 -0
- package/management-ui/server/api/open-ide.js +31 -0
- package/management-ui/server/api/project.js +1029 -0
- package/management-ui/server/api/users/sessions.js +371 -0
- package/management-ui/server/api/users/simulation.js +254 -0
- package/management-ui/server/api/users.js +362 -0
- package/management-ui/server/api-contract.md +275 -0
- package/management-ui/server/index.js +873 -0
- package/management-ui/server/middleware/errorHandler.js +93 -0
- package/management-ui/server/middleware/security.js +32 -0
- package/management-ui/server/processManager.js +296 -0
- package/management-ui/server/server.js +346 -0
- package/management-ui/server/services/aws-monitor.js +413 -0
- package/management-ui/server/services/npm-registry.js +347 -0
- package/management-ui/server/services/template-engine.js +538 -0
- package/management-ui/server/utils/cliIntegration.js +220 -0
- package/management-ui/server/utils/environment/auditLogger.js +471 -0
- package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
- package/management-ui/server/utils/environment/encryption.js +278 -0
- package/management-ui/server/utils/environment/envFileManager.js +286 -0
- package/management-ui/server/utils/import-commonjs.js +28 -0
- package/management-ui/server/utils/response.js +83 -0
- package/management-ui/server/websocket/handler.js +325 -0
- package/management-ui/src/App.jsx +109 -0
- package/management-ui/src/assets/FriggLogo.svg +1 -0
- package/management-ui/src/components/AppRouter.jsx +65 -0
- package/management-ui/src/components/Button.jsx +70 -0
- package/management-ui/src/components/Card.jsx +97 -0
- package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
- package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
- package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
- package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
- package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
- package/management-ui/src/components/ErrorBoundary.jsx +73 -0
- package/management-ui/src/components/IntegrationCard.jsx +481 -0
- package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
- package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
- package/management-ui/src/components/IntegrationStatus.jsx +336 -0
- package/management-ui/src/components/Layout.jsx +716 -0
- package/management-ui/src/components/LoadingSpinner.jsx +113 -0
- package/management-ui/src/components/RepositoryPicker.jsx +248 -0
- package/management-ui/src/components/SessionMonitor.jsx +350 -0
- package/management-ui/src/components/StatusBadge.jsx +208 -0
- package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
- package/management-ui/src/components/UserSimulation.jsx +327 -0
- package/management-ui/src/components/Welcome.jsx +434 -0
- package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
- package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
- package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
- package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
- package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
- package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
- package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
- package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
- package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
- package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
- package/management-ui/src/components/codegen/index.js +10 -0
- package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
- package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
- package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
- package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
- package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
- package/management-ui/src/components/connections/index.js +5 -0
- package/management-ui/src/components/index.js +21 -0
- package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
- package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
- package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
- package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
- package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
- package/management-ui/src/components/monitoring/index.js +6 -0
- package/management-ui/src/components/monitoring/monitoring.css +218 -0
- package/management-ui/src/components/theme-provider.jsx +52 -0
- package/management-ui/src/components/theme-toggle.jsx +39 -0
- package/management-ui/src/components/ui/badge.tsx +36 -0
- package/management-ui/src/components/ui/button.test.jsx +56 -0
- package/management-ui/src/components/ui/button.tsx +57 -0
- package/management-ui/src/components/ui/card.tsx +76 -0
- package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
- package/management-ui/src/components/ui/select.tsx +157 -0
- package/management-ui/src/components/ui/skeleton.jsx +15 -0
- package/management-ui/src/hooks/useFrigg.jsx +601 -0
- package/management-ui/src/hooks/useSocket.jsx +58 -0
- package/management-ui/src/index.css +193 -0
- package/management-ui/src/lib/utils.ts +6 -0
- package/management-ui/src/main.jsx +10 -0
- package/management-ui/src/pages/CodeGeneration.jsx +14 -0
- package/management-ui/src/pages/Connections.jsx +252 -0
- package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
- package/management-ui/src/pages/Dashboard.jsx +311 -0
- package/management-ui/src/pages/Environment.jsx +314 -0
- package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
- package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
- package/management-ui/src/pages/IntegrationTest.jsx +742 -0
- package/management-ui/src/pages/Integrations.jsx +253 -0
- package/management-ui/src/pages/Monitoring.jsx +17 -0
- package/management-ui/src/pages/Simulation.jsx +155 -0
- package/management-ui/src/pages/Users.jsx +492 -0
- package/management-ui/src/services/api.js +41 -0
- package/management-ui/src/services/apiModuleService.js +193 -0
- package/management-ui/src/services/websocket-handlers.js +120 -0
- package/management-ui/src/test/api/project.test.js +273 -0
- package/management-ui/src/test/components/Welcome.test.jsx +378 -0
- package/management-ui/src/test/mocks/server.js +178 -0
- package/management-ui/src/test/setup.js +61 -0
- package/management-ui/src/test/utils/test-utils.jsx +134 -0
- package/management-ui/src/utils/repository.js +98 -0
- package/management-ui/src/utils/repository.test.js +118 -0
- package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
- package/management-ui/tailwind.config.js +63 -0
- package/management-ui/tsconfig.json +37 -0
- package/management-ui/tsconfig.node.json +10 -0
- package/management-ui/vite.config.js +26 -0
- package/management-ui/vitest.config.js +38 -0
- package/package.json +20 -9
- package/infrastructure/app-handler-helpers.js +0 -57
- package/infrastructure/backend-utils.js +0 -90
- package/infrastructure/routers/auth.js +0 -26
- package/infrastructure/routers/integration-defined-routers.js +0 -37
- package/infrastructure/routers/middleware/loadUser.js +0 -15
- package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
- package/infrastructure/routers/user.js +0 -41
- package/infrastructure/routers/websocket.js +0 -55
- package/infrastructure/workers/integration-defined-workers.js +0 -24
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
export default {
|
|
3
|
+
darkMode: ["class"],
|
|
4
|
+
content: [
|
|
5
|
+
"./index.html",
|
|
6
|
+
"./src/**/*.{js,ts,jsx,tsx}",
|
|
7
|
+
],
|
|
8
|
+
theme: {
|
|
9
|
+
extend: {
|
|
10
|
+
colors: {
|
|
11
|
+
'frigg-blue': '#0066CC',
|
|
12
|
+
'frigg-dark': '#1A1A1A',
|
|
13
|
+
'frigg-gray': '#F5F5F5',
|
|
14
|
+
background: 'hsl(var(--background))',
|
|
15
|
+
foreground: 'hsl(var(--foreground))',
|
|
16
|
+
card: {
|
|
17
|
+
DEFAULT: 'hsl(var(--card))',
|
|
18
|
+
foreground: 'hsl(var(--card-foreground))'
|
|
19
|
+
},
|
|
20
|
+
popover: {
|
|
21
|
+
DEFAULT: 'hsl(var(--popover))',
|
|
22
|
+
foreground: 'hsl(var(--popover-foreground))'
|
|
23
|
+
},
|
|
24
|
+
primary: {
|
|
25
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
26
|
+
foreground: 'hsl(var(--primary-foreground))'
|
|
27
|
+
},
|
|
28
|
+
secondary: {
|
|
29
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
30
|
+
foreground: 'hsl(var(--secondary-foreground))'
|
|
31
|
+
},
|
|
32
|
+
muted: {
|
|
33
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
34
|
+
foreground: 'hsl(var(--muted-foreground))'
|
|
35
|
+
},
|
|
36
|
+
accent: {
|
|
37
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
38
|
+
foreground: 'hsl(var(--accent-foreground))'
|
|
39
|
+
},
|
|
40
|
+
destructive: {
|
|
41
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
42
|
+
foreground: 'hsl(var(--destructive-foreground))'
|
|
43
|
+
},
|
|
44
|
+
border: 'hsl(var(--border))',
|
|
45
|
+
input: 'hsl(var(--input))',
|
|
46
|
+
ring: 'hsl(var(--ring))',
|
|
47
|
+
chart: {
|
|
48
|
+
'1': 'hsl(var(--chart-1))',
|
|
49
|
+
'2': 'hsl(var(--chart-2))',
|
|
50
|
+
'3': 'hsl(var(--chart-3))',
|
|
51
|
+
'4': 'hsl(var(--chart-4))',
|
|
52
|
+
'5': 'hsl(var(--chart-5))'
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
borderRadius: {
|
|
56
|
+
lg: 'var(--radius)',
|
|
57
|
+
md: 'calc(var(--radius) - 2px)',
|
|
58
|
+
sm: 'calc(var(--radius) - 4px)'
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
plugins: [require("tailwindcss-animate")],
|
|
63
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"allowJs": true,
|
|
9
|
+
"checkJs": false,
|
|
10
|
+
|
|
11
|
+
/* Bundler mode */
|
|
12
|
+
"moduleResolution": "bundler",
|
|
13
|
+
"allowImportingTsExtensions": true,
|
|
14
|
+
"resolveJsonModule": true,
|
|
15
|
+
"isolatedModules": true,
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
"jsx": "react-jsx",
|
|
18
|
+
|
|
19
|
+
/* Linting */
|
|
20
|
+
"strict": true,
|
|
21
|
+
"noUnusedLocals": false,
|
|
22
|
+
"noUnusedParameters": false,
|
|
23
|
+
"noFallthroughCasesInSwitch": true,
|
|
24
|
+
|
|
25
|
+
/* Path mapping */
|
|
26
|
+
"baseUrl": ".",
|
|
27
|
+
"paths": {
|
|
28
|
+
"@/*": ["./src/*"],
|
|
29
|
+
"@/components/*": ["./src/components/*"],
|
|
30
|
+
"@/hooks/*": ["./src/hooks/*"],
|
|
31
|
+
"@/utils/*": ["./src/utils/*"],
|
|
32
|
+
"@/services/*": ["./src/services/*"]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"include": ["src"],
|
|
36
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
37
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineConfig } from 'vite'
|
|
2
|
+
import react from '@vitejs/plugin-react'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
|
|
5
|
+
// https://vitejs.dev/config/
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [react()],
|
|
8
|
+
resolve: {
|
|
9
|
+
alias: {
|
|
10
|
+
'@': path.resolve(__dirname, './src'),
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
server: {
|
|
14
|
+
port: 5173,
|
|
15
|
+
proxy: {
|
|
16
|
+
'/api': {
|
|
17
|
+
target: 'http://localhost:3001',
|
|
18
|
+
changeOrigin: true,
|
|
19
|
+
},
|
|
20
|
+
'/socket.io': {
|
|
21
|
+
target: 'http://localhost:3001',
|
|
22
|
+
ws: true,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
})
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config'
|
|
2
|
+
import react from '@vitejs/plugin-react'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [react()],
|
|
7
|
+
test: {
|
|
8
|
+
globals: true,
|
|
9
|
+
environment: 'jsdom',
|
|
10
|
+
setupFiles: ['./src/test/setup.js'],
|
|
11
|
+
coverage: {
|
|
12
|
+
provider: 'v8',
|
|
13
|
+
reporter: ['text', 'json', 'html'],
|
|
14
|
+
exclude: [
|
|
15
|
+
'node_modules/',
|
|
16
|
+
'dist/',
|
|
17
|
+
'server/',
|
|
18
|
+
'**/*.config.js',
|
|
19
|
+
'**/*.config.ts',
|
|
20
|
+
'**/test/**',
|
|
21
|
+
'**/__tests__/**',
|
|
22
|
+
'**/*.test.{js,ts,jsx,tsx}',
|
|
23
|
+
'**/*.spec.{js,ts,jsx,tsx}'
|
|
24
|
+
],
|
|
25
|
+
thresholds: {
|
|
26
|
+
statements: 70,
|
|
27
|
+
branches: 70,
|
|
28
|
+
functions: 70,
|
|
29
|
+
lines: 70
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
resolve: {
|
|
34
|
+
alias: {
|
|
35
|
+
'@': path.resolve(__dirname, './src'),
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
})
|
package/package.json
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@friggframework/devtools",
|
|
3
3
|
"prettier": "@friggframework/prettier-config",
|
|
4
|
-
"version": "2.0.0-next.
|
|
4
|
+
"version": "2.0.0-next.41",
|
|
5
5
|
"dependencies": {
|
|
6
|
+
"@aws-sdk/client-ec2": "^3.835.0",
|
|
7
|
+
"@aws-sdk/client-kms": "^3.835.0",
|
|
8
|
+
"@aws-sdk/client-sts": "^3.835.0",
|
|
6
9
|
"@babel/eslint-parser": "^7.18.9",
|
|
7
10
|
"@babel/parser": "^7.25.3",
|
|
8
11
|
"@babel/traverse": "^7.25.3",
|
|
9
|
-
"@friggframework/
|
|
10
|
-
"@friggframework/test": "2.0.0-next.
|
|
11
|
-
"@hapi/boom": "^
|
|
12
|
+
"@friggframework/schemas": "2.0.0-next.41",
|
|
13
|
+
"@friggframework/test": "2.0.0-next.41",
|
|
14
|
+
"@hapi/boom": "^10.0.1",
|
|
12
15
|
"@inquirer/prompts": "^5.3.8",
|
|
13
16
|
"axios": "^1.7.2",
|
|
14
17
|
"body-parser": "^1.20.2",
|
|
@@ -24,16 +27,24 @@
|
|
|
24
27
|
"express": "^4.19.2",
|
|
25
28
|
"express-async-handler": "^1.2.0",
|
|
26
29
|
"fs-extra": "^11.2.0",
|
|
27
|
-
"
|
|
30
|
+
"js-yaml": "^4.1.0",
|
|
31
|
+
"lodash": "4.17.21",
|
|
28
32
|
"serverless-http": "^2.7.0"
|
|
29
33
|
},
|
|
30
34
|
"devDependencies": {
|
|
31
|
-
"@friggframework/eslint-config": "2.0.0-next.
|
|
32
|
-
"@friggframework/prettier-config": "2.0.0-next.
|
|
35
|
+
"@friggframework/eslint-config": "2.0.0-next.41",
|
|
36
|
+
"@friggframework/prettier-config": "2.0.0-next.41",
|
|
37
|
+
"aws-sdk-client-mock": "^4.1.0",
|
|
38
|
+
"aws-sdk-client-mock-jest": "^4.1.0",
|
|
39
|
+
"jest": "^30.1.3",
|
|
40
|
+
"prettier": "^2.7.1",
|
|
41
|
+
"serverless": "3.39.0",
|
|
33
42
|
"serverless-dotenv-plugin": "^6.0.0",
|
|
43
|
+
"serverless-jetpack": "^0.11.2",
|
|
44
|
+
"serverless-kms-grants": "^1.0.0",
|
|
34
45
|
"serverless-offline": "^13.8.0",
|
|
35
46
|
"serverless-offline-sqs": "^8.0.0",
|
|
36
|
-
"serverless-
|
|
47
|
+
"serverless-plugin-monorepo": "^0.11.0"
|
|
37
48
|
},
|
|
38
49
|
"scripts": {
|
|
39
50
|
"lint:fix": "prettier --write --loglevel error . && eslint . --fix",
|
|
@@ -57,5 +68,5 @@
|
|
|
57
68
|
"publishConfig": {
|
|
58
69
|
"access": "public"
|
|
59
70
|
},
|
|
60
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "a5c413164c1b492a228689851d037706f7f869af"
|
|
61
72
|
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
const { createHandler, flushDebugLog } = require('@friggframework/core');
|
|
2
|
-
const express = require('express');
|
|
3
|
-
const bodyParser = require('body-parser');
|
|
4
|
-
const cors = require('cors');
|
|
5
|
-
const Boom = require('@hapi/boom');
|
|
6
|
-
const loadUserManager = require('./routers/middleware/loadUser');
|
|
7
|
-
const serverlessHttp = require('serverless-http');
|
|
8
|
-
|
|
9
|
-
const createApp = (applyMiddleware) => {
|
|
10
|
-
const app = express();
|
|
11
|
-
|
|
12
|
-
app.use(bodyParser.json({ limit: '10mb' }));
|
|
13
|
-
app.use(bodyParser.urlencoded({ extended: true }));
|
|
14
|
-
app.use(
|
|
15
|
-
cors({
|
|
16
|
-
origin: '*',
|
|
17
|
-
credentials: true,
|
|
18
|
-
})
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
app.use(loadUserManager);
|
|
22
|
-
|
|
23
|
-
if (applyMiddleware) applyMiddleware(app);
|
|
24
|
-
|
|
25
|
-
// Handle sending error response and logging server errors to console
|
|
26
|
-
app.use((err, req, res, next) => {
|
|
27
|
-
const boomError = err.isBoom ? err : Boom.boomify(err);
|
|
28
|
-
const {
|
|
29
|
-
output: { statusCode = 500 },
|
|
30
|
-
} = boomError;
|
|
31
|
-
|
|
32
|
-
if (statusCode >= 500) {
|
|
33
|
-
flushDebugLog(boomError);
|
|
34
|
-
res.status(statusCode).json({ error: 'Internal Server Error' });
|
|
35
|
-
} else {
|
|
36
|
-
res.status(statusCode).json({ error: err.message });
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
return app;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
function createAppHandler(eventName, router, shouldUseDatabase = true) {
|
|
44
|
-
const app = createApp((app) => {
|
|
45
|
-
app.use(router);
|
|
46
|
-
});
|
|
47
|
-
return createHandler({
|
|
48
|
-
eventName,
|
|
49
|
-
method: serverlessHttp(app),
|
|
50
|
-
shouldUseDatabase,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
module.exports = {
|
|
55
|
-
createApp,
|
|
56
|
-
createAppHandler,
|
|
57
|
-
};
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
const { createFriggBackend, Worker } = require('@friggframework/core');
|
|
2
|
-
const {
|
|
3
|
-
findNearestBackendPackageJson,
|
|
4
|
-
} = require('../frigg-cli/utils/backend-path');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const fs = require('fs-extra');
|
|
7
|
-
|
|
8
|
-
const backendPath = findNearestBackendPackageJson();
|
|
9
|
-
if (!backendPath) {
|
|
10
|
-
throw new Error('Could not find backend package.json');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const backendDir = path.dirname(backendPath);
|
|
14
|
-
const backendFilePath = path.join(backendDir, 'index.js');
|
|
15
|
-
if (!fs.existsSync(backendFilePath)) {
|
|
16
|
-
throw new Error('Could not find index.js');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const backendJsFile = require(backendFilePath);
|
|
20
|
-
const { Router } = require('express');
|
|
21
|
-
const appDefinition = backendJsFile.Definition;
|
|
22
|
-
|
|
23
|
-
const backend = createFriggBackend(appDefinition);
|
|
24
|
-
const loadRouterFromObject = (IntegrationClass, routerObject) => {
|
|
25
|
-
const router = Router();
|
|
26
|
-
const { path, method, event } = routerObject;
|
|
27
|
-
console.log(
|
|
28
|
-
`Registering ${method} ${path} for ${IntegrationClass.Definition.name}`
|
|
29
|
-
);
|
|
30
|
-
router[method.toLowerCase()](path, async (req, res, next) => {
|
|
31
|
-
try {
|
|
32
|
-
const integration = new IntegrationClass({});
|
|
33
|
-
await integration.loadModules();
|
|
34
|
-
await integration.registerEventHandlers();
|
|
35
|
-
const result = await integration.send(event, req.body);
|
|
36
|
-
res.json(result);
|
|
37
|
-
} catch (error) {
|
|
38
|
-
next(error);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
return router;
|
|
43
|
-
};
|
|
44
|
-
const createQueueWorker = (integrationClass) => {
|
|
45
|
-
class QueueWorker extends Worker {
|
|
46
|
-
constructor(params) {
|
|
47
|
-
super(params);
|
|
48
|
-
}
|
|
49
|
-
async _run(params, context) {
|
|
50
|
-
try {
|
|
51
|
-
let instance;
|
|
52
|
-
if (!params.integrationId) {
|
|
53
|
-
instance = new integrationClass({});
|
|
54
|
-
await instance.loadModules();
|
|
55
|
-
// await instance.loadUserActions();
|
|
56
|
-
await instance.registerEventHandlers();
|
|
57
|
-
console.log(
|
|
58
|
-
`${params.event} for ${integrationClass.Definition.name} integration with no integrationId`
|
|
59
|
-
);
|
|
60
|
-
} else {
|
|
61
|
-
instance =
|
|
62
|
-
await integrationClass.getInstanceFromIntegrationId({
|
|
63
|
-
integrationId: params.integrationId,
|
|
64
|
-
});
|
|
65
|
-
console.log(
|
|
66
|
-
`${params.event} for ${instance.integration.config.type} of integrationId: ${params.integrationId}`
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
const res = await instance.send(params.event, {
|
|
70
|
-
data: params.data,
|
|
71
|
-
context,
|
|
72
|
-
});
|
|
73
|
-
return res;
|
|
74
|
-
} catch (error) {
|
|
75
|
-
console.error(
|
|
76
|
-
`Error in ${params.event} for ${integrationClass.Definition.name}:`,
|
|
77
|
-
error
|
|
78
|
-
);
|
|
79
|
-
throw error;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return QueueWorker;
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
module.exports = {
|
|
87
|
-
...backend,
|
|
88
|
-
loadRouterFromObject,
|
|
89
|
-
createQueueWorker,
|
|
90
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const { createIntegrationRouter } = require('@friggframework/core');
|
|
2
|
-
const { createAppHandler } = require('./../app-handler-helpers');
|
|
3
|
-
const { requireLoggedInUser } = require('./middleware/requireLoggedInUser');
|
|
4
|
-
const {
|
|
5
|
-
moduleFactory,
|
|
6
|
-
integrationFactory,
|
|
7
|
-
IntegrationHelper,
|
|
8
|
-
} = require('./../backend-utils');
|
|
9
|
-
|
|
10
|
-
const router = createIntegrationRouter({
|
|
11
|
-
factory: { moduleFactory, integrationFactory, IntegrationHelper },
|
|
12
|
-
requireLoggedInUser,
|
|
13
|
-
getUserId: (req) => req.user.getUserId(),
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
router.route('/redirect/:appId').get((req, res) => {
|
|
17
|
-
res.redirect(
|
|
18
|
-
`${process.env.FRONTEND_URI}/redirect/${
|
|
19
|
-
req.params.appId
|
|
20
|
-
}?${new URLSearchParams(req.query)}`
|
|
21
|
-
);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
const handler = createAppHandler('HTTP Event: Auth', router);
|
|
25
|
-
|
|
26
|
-
module.exports = { handler, router };
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
const { createIntegrationRouter } = require('@friggframework/core');
|
|
2
|
-
const { createAppHandler } = require('./../app-handler-helpers');
|
|
3
|
-
const { requireLoggedInUser } = require('./middleware/requireLoggedInUser');
|
|
4
|
-
const {
|
|
5
|
-
moduleFactory,
|
|
6
|
-
integrationFactory,
|
|
7
|
-
IntegrationHelper,
|
|
8
|
-
loadRouterFromObject,
|
|
9
|
-
} = require('./../backend-utils');
|
|
10
|
-
const { Router } = require('express');
|
|
11
|
-
|
|
12
|
-
const handlers = {};
|
|
13
|
-
integrationFactory.integrationClasses.forEach((IntegrationClass) => {
|
|
14
|
-
const router = Router();
|
|
15
|
-
const basePath = `/api/${IntegrationClass.Definition.name}-integration`;
|
|
16
|
-
IntegrationClass.Definition.routes.forEach((routeDef) => {
|
|
17
|
-
if (typeof routeDef === 'function') {
|
|
18
|
-
router.use(basePath, routeDef(IntegrationClass));
|
|
19
|
-
} else if (typeof routeDef === 'object') {
|
|
20
|
-
router.use(
|
|
21
|
-
basePath,
|
|
22
|
-
loadRouterFromObject(IntegrationClass, routeDef)
|
|
23
|
-
);
|
|
24
|
-
} else if (routeDef instanceof express.Router) {
|
|
25
|
-
router.use(basePath, routeDef);
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
handlers[`${IntegrationClass.Definition.name}`] = {
|
|
30
|
-
handler: createAppHandler(
|
|
31
|
-
`HTTP Event: ${IntegrationClass.Definition.name}`,
|
|
32
|
-
router
|
|
33
|
-
),
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
module.exports = { handlers };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const catchAsyncError = require('express-async-handler');
|
|
2
|
-
const { User } = require('../../backend-utils');
|
|
3
|
-
|
|
4
|
-
module.exports = catchAsyncError(async (req, res, next) => {
|
|
5
|
-
const authorizationHeader = req.headers.authorization;
|
|
6
|
-
|
|
7
|
-
if (authorizationHeader) {
|
|
8
|
-
// Removes "Bearer " and trims
|
|
9
|
-
const token = authorizationHeader.split(' ')[1].trim();
|
|
10
|
-
// Load user for later middleware/routes to use
|
|
11
|
-
req.user = await User.newUser({ token });
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return next();
|
|
15
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
const Boom = require('@hapi/boom');
|
|
2
|
-
|
|
3
|
-
// CheckLoggedIn Middleware
|
|
4
|
-
const requireLoggedInUser = (req, res, next) => {
|
|
5
|
-
if (!req.user || !req.user.isLoggedIn()) {
|
|
6
|
-
throw Boom.unauthorized('Invalid Token');
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
next();
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
module.exports = { requireLoggedInUser };
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
const express = require('express');
|
|
2
|
-
const { createAppHandler } = require('../app-handler-helpers');
|
|
3
|
-
const { checkRequiredParams } = require('@friggframework/core');
|
|
4
|
-
const { User } = require('../backend-utils');
|
|
5
|
-
const catchAsyncError = require('express-async-handler');
|
|
6
|
-
|
|
7
|
-
const router = express();
|
|
8
|
-
|
|
9
|
-
// define the login endpoint
|
|
10
|
-
router.route('/user/login').post(
|
|
11
|
-
catchAsyncError(async (req, res) => {
|
|
12
|
-
const { username, password } = checkRequiredParams(req.body, [
|
|
13
|
-
'username',
|
|
14
|
-
'password',
|
|
15
|
-
]);
|
|
16
|
-
const user = await User.loginUser({ username, password });
|
|
17
|
-
const token = await user.createUserToken(120);
|
|
18
|
-
res.status(201);
|
|
19
|
-
res.json({ token });
|
|
20
|
-
})
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
router.route('/user/create').post(
|
|
24
|
-
catchAsyncError(async (req, res) => {
|
|
25
|
-
const { username, password } = checkRequiredParams(req.body, [
|
|
26
|
-
'username',
|
|
27
|
-
'password',
|
|
28
|
-
]);
|
|
29
|
-
const user = await User.createIndividualUser({
|
|
30
|
-
username,
|
|
31
|
-
password,
|
|
32
|
-
});
|
|
33
|
-
const token = await user.createUserToken(120);
|
|
34
|
-
res.status(201);
|
|
35
|
-
res.json({ token });
|
|
36
|
-
})
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
const handler = createAppHandler('HTTP Event: User', router);
|
|
40
|
-
|
|
41
|
-
module.exports = { handler, router };
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
const { createHandler } = require('@friggframework/core');
|
|
2
|
-
const { WebsocketConnection } = require('@friggframework/core');
|
|
3
|
-
|
|
4
|
-
const handleWebSocketConnection = async (event, context) => {
|
|
5
|
-
// Handle different WebSocket events
|
|
6
|
-
switch (event.requestContext.eventType) {
|
|
7
|
-
case 'CONNECT':
|
|
8
|
-
// Handle new connection
|
|
9
|
-
try {
|
|
10
|
-
const connectionId = event.requestContext.connectionId;
|
|
11
|
-
await WebsocketConnection.create({ connectionId });
|
|
12
|
-
console.log(`Stored new connection: ${connectionId}`);
|
|
13
|
-
return { statusCode: 200, body: 'Connected.' };
|
|
14
|
-
} catch (error) {
|
|
15
|
-
console.error('Error storing connection:', error);
|
|
16
|
-
return { statusCode: 500, body: 'Error connecting.' };
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
case 'DISCONNECT':
|
|
20
|
-
// Handle disconnection
|
|
21
|
-
try {
|
|
22
|
-
const connectionId = event.requestContext.connectionId;
|
|
23
|
-
await WebsocketConnection.deleteOne({ connectionId });
|
|
24
|
-
console.log(`Removed connection: ${connectionId}`);
|
|
25
|
-
return { statusCode: 200, body: 'Disconnected.' };
|
|
26
|
-
} catch (error) {
|
|
27
|
-
console.error('Error removing connection:', error);
|
|
28
|
-
return { statusCode: 500, body: 'Error disconnecting.' };
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
case 'MESSAGE':
|
|
32
|
-
// Handle incoming message
|
|
33
|
-
const message = JSON.parse(event.body);
|
|
34
|
-
console.log('Received message:', message);
|
|
35
|
-
|
|
36
|
-
// Process the message and send a response
|
|
37
|
-
const responseMessage = { message: 'Message received' };
|
|
38
|
-
return {
|
|
39
|
-
statusCode: 200,
|
|
40
|
-
body: JSON.stringify(responseMessage),
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
default:
|
|
44
|
-
return { statusCode: 400, body: 'Unhandled event type.' };
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const handler = createHandler({
|
|
49
|
-
eventName: 'WebSocket Event',
|
|
50
|
-
method: handleWebSocketConnection,
|
|
51
|
-
shouldUseDatabase: true, // Set to true as we're using the database
|
|
52
|
-
isUserFacingResponse: true, // This is a server-to-server response
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
module.exports = { handler };
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const { createHandler } = require('@friggframework/core');
|
|
2
|
-
const { integrationFactory, createQueueWorker } = require('./../backend-utils');
|
|
3
|
-
|
|
4
|
-
const handlers = {};
|
|
5
|
-
integrationFactory.integrationClasses.forEach((IntegrationClass) => {
|
|
6
|
-
const defaultQueueWorker = createQueueWorker(IntegrationClass);
|
|
7
|
-
|
|
8
|
-
handlers[`${IntegrationClass.Definition.name}`] = {
|
|
9
|
-
queueWorker: createHandler({
|
|
10
|
-
eventName: `Queue Worker for ${IntegrationClass.Definition.name}`,
|
|
11
|
-
isUserFacingResponse: false,
|
|
12
|
-
method: async (event, context) => {
|
|
13
|
-
const worker = new defaultQueueWorker();
|
|
14
|
-
await worker.run(event, context);
|
|
15
|
-
return {
|
|
16
|
-
message: 'Successfully processed the Generic Queue Worker',
|
|
17
|
-
input: event,
|
|
18
|
-
};
|
|
19
|
-
},
|
|
20
|
-
}),
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
module.exports = { handlers };
|