balda-js 0.0.1
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/.github/workflows/publish.yml +38 -0
- package/.husky/pre-commit +19 -0
- package/.nvmrc +1 -0
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/deno.lock +2454 -0
- package/docs/README.md +135 -0
- package/docs/blog/authors.yml +6 -0
- package/docs/blog/tags.yml +4 -0
- package/docs/cli.md +109 -0
- package/docs/docs/core-concepts/controllers.md +393 -0
- package/docs/docs/core-concepts/middleware.md +302 -0
- package/docs/docs/core-concepts/request-response.md +486 -0
- package/docs/docs/core-concepts/routing.md +388 -0
- package/docs/docs/core-concepts/server.md +332 -0
- package/docs/docs/cron/overview.md +70 -0
- package/docs/docs/examples/rest-api.md +595 -0
- package/docs/docs/getting-started/configuration.md +168 -0
- package/docs/docs/getting-started/installation.md +125 -0
- package/docs/docs/getting-started/quick-start.md +273 -0
- package/docs/docs/intro.md +46 -0
- package/docs/docs/plugins/cookie.md +424 -0
- package/docs/docs/plugins/cors.md +295 -0
- package/docs/docs/plugins/file.md +382 -0
- package/docs/docs/plugins/helmet.md +388 -0
- package/docs/docs/plugins/json.md +338 -0
- package/docs/docs/plugins/log.md +592 -0
- package/docs/docs/plugins/overview.md +390 -0
- package/docs/docs/plugins/rate-limiter.md +347 -0
- package/docs/docs/plugins/static.md +352 -0
- package/docs/docs/plugins/swagger.md +411 -0
- package/docs/docs/plugins/urlencoded.md +76 -0
- package/docs/docs/testing/examples.md +384 -0
- package/docs/docs/testing/mock-server.md +311 -0
- package/docs/docs/testing/overview.md +76 -0
- package/docs/docusaurus.config.ts +144 -0
- package/docs/intro.md +78 -0
- package/docs/package.json +46 -0
- package/docs/sidebars.ts +72 -0
- package/docs/static/.nojekyll +0 -0
- package/docs/static/img/docusaurus-social-card.jpg +0 -0
- package/docs/static/img/docusaurus.png +0 -0
- package/docs/static/img/favicon.ico +0 -0
- package/docs/static/img/logo.svg +1 -0
- package/docs/static/img/undraw_docusaurus_mountain.svg +37 -0
- package/docs/static/img/undraw_docusaurus_react.svg +170 -0
- package/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- package/docs/tsconfig.json +8 -0
- package/package.json +91 -0
- package/speed_test.sh +3 -0
- package/test/benchmark/index.ts +17 -0
- package/test/cli/cli.ts +7 -0
- package/test/commands/test.ts +42 -0
- package/test/controllers/file_upload.ts +29 -0
- package/test/controllers/urlencoded.ts +13 -0
- package/test/controllers/users.ts +111 -0
- package/test/cron/index.ts +6 -0
- package/test/cron/test_cron.ts +8 -0
- package/test/cron/test_cron_imported.ts +8 -0
- package/test/native_env.ts +16 -0
- package/test/resources/test.txt +1 -0
- package/test/server/index.ts +3 -0
- package/test/server/instance.ts +63 -0
- package/test/suite/upload.test.ts +23 -0
- package/test/suite/urlencoded.test.ts +23 -0
- package/test/suite/users.test.ts +76 -0
- package/todo.md +9 -0
- package/tsconfig.json +24 -0
- package/vitest.config.ts +17 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
# Testing Overview
|
2
|
+
|
3
|
+
Balda.js provides comprehensive testing capabilities with support for multiple JavaScript runtimes and a powerful MockServer for testing HTTP endpoints without starting a real server.
|
4
|
+
|
5
|
+
## Multi-Runtime Support
|
6
|
+
|
7
|
+
Balda.js supports testing across multiple JavaScript runtimes:
|
8
|
+
|
9
|
+
- **Node.js** - Primary runtime with full feature support
|
10
|
+
- **Bun** - Fast alternative runtime with native TypeScript support
|
11
|
+
- **Deno** - Modern runtime with built-in security features
|
12
|
+
|
13
|
+
## Test Structure
|
14
|
+
|
15
|
+
```
|
16
|
+
test/
|
17
|
+
├── suite/ # Test suites for different features
|
18
|
+
│ ├── users.test.ts
|
19
|
+
│ ├── upload.test.ts
|
20
|
+
│ └── urlencoded.test.ts
|
21
|
+
├── controllers/ # Controller implementations for testing
|
22
|
+
│ ├── users.ts
|
23
|
+
│ ├── file_upload.ts
|
24
|
+
│ └── urlencoded.ts
|
25
|
+
├── server/ # Test server configuration
|
26
|
+
│ ├── instance.ts
|
27
|
+
│ └── index.ts
|
28
|
+
└── benchmark/ # Performance testing
|
29
|
+
└── index.ts
|
30
|
+
```
|
31
|
+
|
32
|
+
## Running Tests
|
33
|
+
|
34
|
+
### Node.js
|
35
|
+
```bash
|
36
|
+
# Run all tests
|
37
|
+
yarn test
|
38
|
+
|
39
|
+
# Run tests in watch mode
|
40
|
+
yarn test:watch
|
41
|
+
|
42
|
+
# Run tests with coverage
|
43
|
+
yarn test:coverage
|
44
|
+
```
|
45
|
+
|
46
|
+
### Bun
|
47
|
+
```bash
|
48
|
+
# Run tests with Bun
|
49
|
+
yarn test:bun
|
50
|
+
```
|
51
|
+
|
52
|
+
### Deno
|
53
|
+
```bash
|
54
|
+
# Run tests with Deno
|
55
|
+
yarn test:deno
|
56
|
+
```
|
57
|
+
|
58
|
+
## Test Scripts
|
59
|
+
|
60
|
+
The project includes several test-related scripts:
|
61
|
+
|
62
|
+
- `test` - Run tests with Vitest
|
63
|
+
- `test:watch` - Run tests in watch mode
|
64
|
+
- `test:coverage` - Run tests with coverage reporting
|
65
|
+
- `test:bun` - Run tests with Bun
|
66
|
+
- `test:deno` - Run tests with Deno
|
67
|
+
- `benchmark` - Run performance benchmarks
|
68
|
+
|
69
|
+
## Pre-commit Testing
|
70
|
+
|
71
|
+
Tests are automatically run on pre-commit hooks across all supported runtimes to ensure compatibility and prevent regressions.
|
72
|
+
|
73
|
+
## Next Steps
|
74
|
+
|
75
|
+
- [MockServer Guide](./mock-server.md) - Learn how to use MockServer for testing
|
76
|
+
- [Testing Examples](./examples.md) - Practical testing examples and patterns
|
@@ -0,0 +1,144 @@
|
|
1
|
+
import type * as Preset from "@docusaurus/preset-classic";
|
2
|
+
import type { Config } from "@docusaurus/types";
|
3
|
+
import { themes as prismThemes } from "prism-react-renderer";
|
4
|
+
|
5
|
+
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
|
6
|
+
|
7
|
+
const config: Config = {
|
8
|
+
title: "Balda.js",
|
9
|
+
tagline:
|
10
|
+
"Simple cross-runtime, fastapi-inspired Node.js backend framework for Node.js, Bun, and Deno",
|
11
|
+
favicon: "img/favicon.ico",
|
12
|
+
|
13
|
+
// Future flags, see https://docusaurus.io/docs/api/docusaurus-config#future
|
14
|
+
future: {
|
15
|
+
v4: true, // Improve compatibility with the upcoming Docusaurus v4
|
16
|
+
},
|
17
|
+
|
18
|
+
// Set the production url of your site here
|
19
|
+
url: "https://frasan00.github.io",
|
20
|
+
// Set the /<baseUrl>/ pathname under which your site is served
|
21
|
+
// For GitHub pages deployment, it is often '/<projectName>/'
|
22
|
+
baseUrl: "/balda-js/",
|
23
|
+
|
24
|
+
// GitHub pages deployment config.
|
25
|
+
// If you aren't using GitHub pages, you don't need these.
|
26
|
+
organizationName: "Frasan00", // Usually your GitHub org/user name.
|
27
|
+
projectName: "balda-js", // Usually your repo name.
|
28
|
+
|
29
|
+
onBrokenLinks: "throw",
|
30
|
+
onBrokenMarkdownLinks: "warn",
|
31
|
+
|
32
|
+
// Even if you don't use internationalization, you can use this field to set
|
33
|
+
// useful metadata like html lang. For example, if your site is Chinese, you
|
34
|
+
// may want to replace "en" with "zh-Hans".
|
35
|
+
i18n: {
|
36
|
+
defaultLocale: "en",
|
37
|
+
locales: ["en"],
|
38
|
+
},
|
39
|
+
|
40
|
+
presets: [
|
41
|
+
[
|
42
|
+
"classic",
|
43
|
+
{
|
44
|
+
docs: {
|
45
|
+
sidebarPath: "./sidebars.ts",
|
46
|
+
// Please change this to your repo.
|
47
|
+
// Remove this to remove the "edit this page" links.
|
48
|
+
editUrl: "https://github.com/Frasan00/balda-js/tree/main/docs/",
|
49
|
+
},
|
50
|
+
blog: {
|
51
|
+
showReadingTime: true,
|
52
|
+
feedOptions: {
|
53
|
+
type: ["rss", "atom"],
|
54
|
+
xslt: true,
|
55
|
+
},
|
56
|
+
// Please change this to your repo.
|
57
|
+
// Remove this to remove the "edit this page" links.
|
58
|
+
editUrl: "https://github.com/Frasan00/balda-js/tree/main/docs/blog",
|
59
|
+
// Useful options to enforce blogging best practices
|
60
|
+
onInlineTags: "warn",
|
61
|
+
onInlineAuthors: "warn",
|
62
|
+
onUntruncatedBlogPosts: "warn",
|
63
|
+
},
|
64
|
+
theme: {
|
65
|
+
customCss: "./src/css/custom.css",
|
66
|
+
},
|
67
|
+
} satisfies Preset.Options,
|
68
|
+
],
|
69
|
+
],
|
70
|
+
|
71
|
+
themeConfig: {
|
72
|
+
// Replace with your project's social card
|
73
|
+
image: "img/balda-social-card.jpg",
|
74
|
+
navbar: {
|
75
|
+
title: "Balda.js",
|
76
|
+
items: [
|
77
|
+
{
|
78
|
+
type: "docSidebar",
|
79
|
+
sidebarId: "docs",
|
80
|
+
position: "left",
|
81
|
+
label: "Documentation",
|
82
|
+
},
|
83
|
+
// { to: "/blog", label: "Blog", position: "left" },
|
84
|
+
{
|
85
|
+
type: "html",
|
86
|
+
position: "right",
|
87
|
+
value: '<span class="badge badge--secondary">Beta</span>',
|
88
|
+
},
|
89
|
+
{
|
90
|
+
href: "https://github.com/Frasan00/balda-js",
|
91
|
+
label: "GitHub",
|
92
|
+
position: "right",
|
93
|
+
},
|
94
|
+
],
|
95
|
+
},
|
96
|
+
footer: {
|
97
|
+
style: "dark",
|
98
|
+
links: [
|
99
|
+
{
|
100
|
+
title: "Documentation",
|
101
|
+
items: [
|
102
|
+
{
|
103
|
+
label: "Getting Started",
|
104
|
+
to: "/docs/getting-started/installation",
|
105
|
+
},
|
106
|
+
{
|
107
|
+
label: "Core Concepts",
|
108
|
+
to: "/docs/core-concepts/server",
|
109
|
+
},
|
110
|
+
{
|
111
|
+
label: "Plugins",
|
112
|
+
to: "/docs/plugins/overview",
|
113
|
+
},
|
114
|
+
],
|
115
|
+
},
|
116
|
+
{
|
117
|
+
title: "Community",
|
118
|
+
items: [
|
119
|
+
{
|
120
|
+
label: "GitHub",
|
121
|
+
href: "https://github.com/Frasan00/balda-js",
|
122
|
+
},
|
123
|
+
{
|
124
|
+
label: "Issues",
|
125
|
+
href: "https://github.com/Frasan00/balda-js/issues",
|
126
|
+
},
|
127
|
+
{
|
128
|
+
label: "Discussions",
|
129
|
+
href: "https://github.com/Frasan00/balda-js/discussions",
|
130
|
+
},
|
131
|
+
],
|
132
|
+
},
|
133
|
+
],
|
134
|
+
copyright: `Copyright © ${new Date().getFullYear()} Balda.js. Built with Docusaurus.`,
|
135
|
+
},
|
136
|
+
prism: {
|
137
|
+
theme: prismThemes.github,
|
138
|
+
darkTheme: prismThemes.dracula,
|
139
|
+
additionalLanguages: ["typescript", "bash", "json"],
|
140
|
+
},
|
141
|
+
} satisfies Preset.ThemeConfig,
|
142
|
+
};
|
143
|
+
|
144
|
+
export default config;
|
package/docs/intro.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 1
|
3
|
+
---
|
4
|
+
|
5
|
+
# Welcome to Balda.js
|
6
|
+
|
7
|
+
Balda.js is a modern, lightweight backend framework designed for Node.js, Bun, and Deno. It provides a simple and intuitive API for building fast, scalable web applications with TypeScript support.
|
8
|
+
|
9
|
+
## Key Features
|
10
|
+
|
11
|
+
- **Multi-Runtime Support**: Run on Node.js, Bun, or Deno with the same codebase
|
12
|
+
- **Decorator-Based API**: Clean and intuitive decorators for defining routes and controllers
|
13
|
+
- **Built-in Plugins**: Comprehensive set of plugins for common web development needs
|
14
|
+
- **TypeScript First**: Full TypeScript support with excellent type inference
|
15
|
+
- **CLI Tools**: Built-in command-line interface for scaffolding and development
|
16
|
+
- **Cron Jobs**: Easy scheduling of background tasks
|
17
|
+
- **Validation & Serialization**: Built-in request validation and response serialization
|
18
|
+
- **Testing Support**: Mock server for easy testing
|
19
|
+
|
20
|
+
## Quick Example
|
21
|
+
|
22
|
+
```typescript
|
23
|
+
import { Server, controller, get, post } from 'balda-js';
|
24
|
+
|
25
|
+
const server = new Server({
|
26
|
+
port: 3000,
|
27
|
+
plugins: {
|
28
|
+
cors: { origin: '*' },
|
29
|
+
json: { sizeLimit: '1mb' }
|
30
|
+
}
|
31
|
+
});
|
32
|
+
|
33
|
+
@controller('/users')
|
34
|
+
export class UsersController {
|
35
|
+
@get('/')
|
36
|
+
async getUsers(req, res) {
|
37
|
+
res.json([{ id: 1, name: 'John' }]);
|
38
|
+
}
|
39
|
+
|
40
|
+
@post('/')
|
41
|
+
async createUser(req, res) {
|
42
|
+
const user = req.body;
|
43
|
+
res.created(user);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
server.listen();
|
48
|
+
```
|
49
|
+
|
50
|
+
## Why Balda.js?
|
51
|
+
|
52
|
+
- **Simple**: Minimal boilerplate, maximum productivity
|
53
|
+
- **Fast**: Built for performance with modern JavaScript engines
|
54
|
+
- **Flexible**: Plugin architecture allows you to use only what you need
|
55
|
+
- **Modern**: Leverages the latest JavaScript features and best practices
|
56
|
+
- **Cross-Platform**: Write once, run anywhere with Node.js, Bun, or Deno
|
57
|
+
|
58
|
+
## Getting Started
|
59
|
+
|
60
|
+
Ready to build your first Balda.js application? Check out our [Quick Start Guide](./getting-started/quick-start) to get up and running in minutes.
|
61
|
+
|
62
|
+
## Runtime Support
|
63
|
+
|
64
|
+
Balda.js supports multiple JavaScript runtimes:
|
65
|
+
|
66
|
+
- **Node.js**: Full support with all features
|
67
|
+
- **Bun**: Optimized for Bun's performance benefits
|
68
|
+
- **Deno**: Native Deno support with security features
|
69
|
+
|
70
|
+
## Community
|
71
|
+
|
72
|
+
- [GitHub Repository](https://github.com/Frasan00/balda-js)
|
73
|
+
- [Issues & Bug Reports](https://github.com/Frasan00/balda-js/issues)
|
74
|
+
- [Discussions](https://github.com/Frasan00/balda-js/discussions)
|
75
|
+
|
76
|
+
## License
|
77
|
+
|
78
|
+
Balda.js is licensed under the MIT License.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
{
|
2
|
+
"name": "docs",
|
3
|
+
"version": "0.0.0",
|
4
|
+
"scripts": {
|
5
|
+
"docusaurus": "docusaurus",
|
6
|
+
"start": "docusaurus start",
|
7
|
+
"build": "docusaurus build",
|
8
|
+
"swizzle": "docusaurus swizzle",
|
9
|
+
"deploy": "docusaurus deploy",
|
10
|
+
"clear": "docusaurus clear",
|
11
|
+
"serve": "docusaurus serve",
|
12
|
+
"write-translations": "docusaurus write-translations",
|
13
|
+
"write-heading-ids": "docusaurus write-heading-ids",
|
14
|
+
"typecheck": "tsc"
|
15
|
+
},
|
16
|
+
"dependencies": {
|
17
|
+
"@docusaurus/core": "3.8.1",
|
18
|
+
"@docusaurus/preset-classic": "3.8.1",
|
19
|
+
"@mdx-js/react": "^3.0.0",
|
20
|
+
"clsx": "^2.0.0",
|
21
|
+
"prism-react-renderer": "^2.3.0",
|
22
|
+
"react": "^19.0.0",
|
23
|
+
"react-dom": "^19.0.0"
|
24
|
+
},
|
25
|
+
"devDependencies": {
|
26
|
+
"@docusaurus/module-type-aliases": "3.8.1",
|
27
|
+
"@docusaurus/tsconfig": "3.8.1",
|
28
|
+
"@docusaurus/types": "3.8.1",
|
29
|
+
"typescript": "~5.6.2"
|
30
|
+
},
|
31
|
+
"browserslist": {
|
32
|
+
"production": [
|
33
|
+
">0.5%",
|
34
|
+
"not dead",
|
35
|
+
"not op_mini all"
|
36
|
+
],
|
37
|
+
"development": [
|
38
|
+
"last 3 chrome version",
|
39
|
+
"last 3 firefox version",
|
40
|
+
"last 5 safari version"
|
41
|
+
]
|
42
|
+
},
|
43
|
+
"engines": {
|
44
|
+
"node": ">=18.0"
|
45
|
+
}
|
46
|
+
}
|
package/docs/sidebars.ts
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
import type { SidebarsConfig } from '@docusaurus/plugin-content-docs';
|
2
|
+
|
3
|
+
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Creating a sidebar enables you to:
|
7
|
+
- create an ordered group of docs
|
8
|
+
- render a sidebar for each doc of that group
|
9
|
+
- provide next/previous navigation
|
10
|
+
|
11
|
+
The sidebars can be generated from the filesystem, or explicitly defined here.
|
12
|
+
|
13
|
+
Create as many sidebars as you want.
|
14
|
+
*/
|
15
|
+
const sidebars: SidebarsConfig = {
|
16
|
+
docs: [
|
17
|
+
'intro',
|
18
|
+
{
|
19
|
+
type: 'category',
|
20
|
+
label: 'Getting Started',
|
21
|
+
items: [
|
22
|
+
'getting-started/installation',
|
23
|
+
'getting-started/quick-start',
|
24
|
+
'getting-started/configuration',
|
25
|
+
],
|
26
|
+
},
|
27
|
+
{
|
28
|
+
type: 'category',
|
29
|
+
label: 'Core Concepts',
|
30
|
+
items: [
|
31
|
+
'core-concepts/server',
|
32
|
+
'core-concepts/controllers',
|
33
|
+
'core-concepts/routing',
|
34
|
+
'core-concepts/middleware',
|
35
|
+
'core-concepts/request-response',
|
36
|
+
],
|
37
|
+
},
|
38
|
+
{
|
39
|
+
type: 'category',
|
40
|
+
label: 'Plugins',
|
41
|
+
items: [
|
42
|
+
'plugins/overview',
|
43
|
+
'plugins/swagger',
|
44
|
+
],
|
45
|
+
},
|
46
|
+
{
|
47
|
+
type: 'category',
|
48
|
+
label: 'Examples',
|
49
|
+
items: [
|
50
|
+
'examples/rest-api',
|
51
|
+
],
|
52
|
+
},
|
53
|
+
{
|
54
|
+
type: 'category',
|
55
|
+
label: 'Testing',
|
56
|
+
items: [
|
57
|
+
'testing/overview',
|
58
|
+
'testing/mock-server',
|
59
|
+
'testing/examples',
|
60
|
+
],
|
61
|
+
},
|
62
|
+
{
|
63
|
+
type: 'category',
|
64
|
+
label: 'Cron',
|
65
|
+
items: [
|
66
|
+
'cron/overview',
|
67
|
+
],
|
68
|
+
},
|
69
|
+
],
|
70
|
+
};
|
71
|
+
|
72
|
+
export default sidebars;
|
File without changes
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#FFF" d="M99 52h84v34H99z"/><path d="M23 163c-7.398 0-13.843-4.027-17.303-10A19.886 19.886 0 0 0 3 163c0 11.046 8.954 20 20 20h20v-20H23z" fill="#3ECC5F"/><path d="M112.98 57.376L183 53V43c0-11.046-8.954-20-20-20H73l-2.5-4.33c-1.112-1.925-3.889-1.925-5 0L63 23l-2.5-4.33c-1.111-1.925-3.889-1.925-5 0L53 23l-2.5-4.33c-1.111-1.925-3.889-1.925-5 0L43 23c-.022 0-.042.003-.065.003l-4.142-4.141c-1.57-1.571-4.252-.853-4.828 1.294l-1.369 5.104-5.192-1.392c-2.148-.575-4.111 1.389-3.535 3.536l1.39 5.193-5.102 1.367c-2.148.576-2.867 3.259-1.296 4.83l4.142 4.142c0 .021-.003.042-.003.064l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 53l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 63l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 73l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 83l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 93l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 103l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 113l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 123l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 133l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 143l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 153l-4.33 2.5c-1.925 1.111-1.925 3.889 0 5L23 163c0 11.046 8.954 20 20 20h120c11.046 0 20-8.954 20-20V83l-70.02-4.376A10.645 10.645 0 0 1 103 68c0-5.621 4.37-10.273 9.98-10.624" fill="#3ECC5F"/><path fill="#3ECC5F" d="M143 183h30v-40h-30z"/><path d="M193 158c-.219 0-.428.037-.639.064-.038-.15-.074-.301-.116-.451A5 5 0 0 0 190.32 148a4.96 4.96 0 0 0-3.016 1.036 26.531 26.531 0 0 0-.335-.336 4.955 4.955 0 0 0 1.011-2.987 5 5 0 0 0-9.599-1.959c-.148-.042-.297-.077-.445-.115.027-.211.064-.42.064-.639a5 5 0 0 0-5-5 5 5 0 0 0-5 5c0 .219.037.428.064.639-.148.038-.297.073-.445.115a4.998 4.998 0 0 0-9.599 1.959c0 1.125.384 2.151 1.011 2.987-3.717 3.632-6.031 8.693-6.031 14.3 0 11.046 8.954 20 20 20 9.339 0 17.16-6.41 19.361-15.064.211.027.42.064.639.064a5 5 0 0 0 5-5 5 5 0 0 0-5-5" fill="#44D860"/><path fill="#3ECC5F" d="M153 123h30v-20h-30z"/><path d="M193 115.5a2.5 2.5 0 1 0 0-5c-.109 0-.214.019-.319.032-.02-.075-.037-.15-.058-.225a2.501 2.501 0 0 0-.963-4.807c-.569 0-1.088.197-1.508.518a6.653 6.653 0 0 0-.168-.168c.314-.417.506-.931.506-1.494a2.5 2.5 0 0 0-4.8-.979A9.987 9.987 0 0 0 183 103c-5.522 0-10 4.478-10 10s4.478 10 10 10c.934 0 1.833-.138 2.69-.377a2.5 2.5 0 0 0 4.8-.979c0-.563-.192-1.077-.506-1.494.057-.055.113-.111.168-.168.42.321.939.518 1.508.518a2.5 2.5 0 0 0 .963-4.807c.021-.074.038-.15.058-.225.105.013.21.032.319.032" fill="#44D860"/><path d="M63 55.5a2.5 2.5 0 0 1-2.5-2.5c0-4.136-3.364-7.5-7.5-7.5s-7.5 3.364-7.5 7.5a2.5 2.5 0 1 1-5 0c0-6.893 5.607-12.5 12.5-12.5S65.5 46.107 65.5 53a2.5 2.5 0 0 1-2.5 2.5" fill="#000"/><path d="M103 183h60c11.046 0 20-8.954 20-20V93h-60c-11.046 0-20 8.954-20 20v70z" fill="#FFFF50"/><path d="M168.02 124h-50.04a1 1 0 1 1 0-2h50.04a1 1 0 1 1 0 2m0 20h-50.04a1 1 0 1 1 0-2h50.04a1 1 0 1 1 0 2m0 20h-50.04a1 1 0 1 1 0-2h50.04a1 1 0 1 1 0 2m0-49.814h-50.04a1 1 0 1 1 0-2h50.04a1 1 0 1 1 0 2m0 19.814h-50.04a1 1 0 1 1 0-2h50.04a1 1 0 1 1 0 2m0 20h-50.04a1 1 0 1 1 0-2h50.04a1 1 0 1 1 0 2M183 61.611c-.012 0-.022-.006-.034-.005-3.09.105-4.552 3.196-5.842 5.923-1.346 2.85-2.387 4.703-4.093 4.647-1.889-.068-2.969-2.202-4.113-4.46-1.314-2.594-2.814-5.536-5.963-5.426-3.046.104-4.513 2.794-5.807 5.167-1.377 2.528-2.314 4.065-4.121 3.994-1.927-.07-2.951-1.805-4.136-3.813-1.321-2.236-2.848-4.75-5.936-4.664-2.994.103-4.465 2.385-5.763 4.4-1.373 2.13-2.335 3.428-4.165 3.351-1.973-.07-2.992-1.51-4.171-3.177-1.324-1.873-2.816-3.993-5.895-3.89-2.928.1-4.399 1.97-5.696 3.618-1.232 1.564-2.194 2.802-4.229 2.724a1 1 0 0 0-.072 2c3.017.101 4.545-1.8 5.872-3.487 1.177-1.496 2.193-2.787 4.193-2.855 1.926-.082 2.829 1.115 4.195 3.045 1.297 1.834 2.769 3.914 5.731 4.021 3.103.104 4.596-2.215 5.918-4.267 1.182-1.834 2.202-3.417 4.15-3.484 1.793-.067 2.769 1.35 4.145 3.681 1.297 2.197 2.766 4.686 5.787 4.796 3.125.108 4.634-2.62 5.949-5.035 1.139-2.088 2.214-4.06 4.119-4.126 1.793-.042 2.728 1.595 4.111 4.33 1.292 2.553 2.757 5.445 5.825 5.556l.169.003c3.064 0 4.518-3.075 5.805-5.794 1.139-2.41 2.217-4.68 4.067-4.773v-2z" fill="#000"/><path fill="#3ECC5F" d="M83 183h40v-40H83z"/><path d="M143 158c-.219 0-.428.037-.639.064-.038-.15-.074-.301-.116-.451A5 5 0 0 0 140.32 148a4.96 4.96 0 0 0-3.016 1.036 26.531 26.531 0 0 0-.335-.336 4.955 4.955 0 0 0 1.011-2.987 5 5 0 0 0-9.599-1.959c-.148-.042-.297-.077-.445-.115.027-.211.064-.42.064-.639a5 5 0 0 0-5-5 5 5 0 0 0-5 5c0 .219.037.428.064.639-.148.038-.297.073-.445.115a4.998 4.998 0 0 0-9.599 1.959c0 1.125.384 2.151 1.011 2.987-3.717 3.632-6.031 8.693-6.031 14.3 0 11.046 8.954 20 20 20 9.339 0 17.16-6.41 19.361-15.064.211.027.42.064.639.064a5 5 0 0 0 5-5 5 5 0 0 0-5-5" fill="#44D860"/><path fill="#3ECC5F" d="M83 123h40v-20H83z"/><path d="M133 115.5a2.5 2.5 0 1 0 0-5c-.109 0-.214.019-.319.032-.02-.075-.037-.15-.058-.225a2.501 2.501 0 0 0-.963-4.807c-.569 0-1.088.197-1.508.518a6.653 6.653 0 0 0-.168-.168c.314-.417.506-.931.506-1.494a2.5 2.5 0 0 0-4.8-.979A9.987 9.987 0 0 0 123 103c-5.522 0-10 4.478-10 10s4.478 10 10 10c.934 0 1.833-.138 2.69-.377a2.5 2.5 0 0 0 4.8-.979c0-.563-.192-1.077-.506-1.494.057-.055.113-.111.168-.168.42.321.939.518 1.508.518a2.5 2.5 0 0 0 .963-4.807c.021-.074.038-.15.058-.225.105.013.21.032.319.032" fill="#44D860"/><path d="M143 41.75c-.16 0-.33-.02-.49-.05a2.52 2.52 0 0 1-.47-.14c-.15-.06-.29-.14-.431-.23-.13-.09-.259-.2-.38-.31-.109-.12-.219-.24-.309-.38s-.17-.28-.231-.43a2.619 2.619 0 0 1-.189-.96c0-.16.02-.33.05-.49.03-.16.08-.31.139-.47.061-.15.141-.29.231-.43.09-.13.2-.26.309-.38.121-.11.25-.22.38-.31.141-.09.281-.17.431-.23.149-.06.31-.11.47-.14.32-.07.65-.07.98 0 .159.03.32.08.47.14.149.06.29.14.43.23.13.09.259.2.38.31.11.12.22.25.31.38.09.14.17.28.23.43.06.16.11.31.14.47.029.16.05.33.05.49 0 .66-.271 1.31-.73 1.77-.121.11-.25.22-.38.31-.14.09-.281.17-.43.23a2.565 2.565 0 0 1-.96.19m20-1.25c-.66 0-1.3-.27-1.771-.73a3.802 3.802 0 0 1-.309-.38c-.09-.14-.17-.28-.231-.43a2.619 2.619 0 0 1-.189-.96c0-.66.27-1.3.729-1.77.121-.11.25-.22.38-.31.141-.09.281-.17.431-.23.149-.06.31-.11.47-.14.32-.07.66-.07.98 0 .159.03.32.08.47.14.149.06.29.14.43.23.13.09.259.2.38.31.459.47.73 1.11.73 1.77 0 .16-.021.33-.05.49-.03.16-.08.32-.14.47-.07.15-.14.29-.23.43-.09.13-.2.26-.31.38-.121.11-.25.22-.38.31-.14.09-.281.17-.43.23a2.565 2.565 0 0 1-.96.19" fill="#000"/></g></svg>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300" viewBox="0 0 400 300">
|
2
|
+
<defs>
|
3
|
+
<linearGradient id="mountain-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
4
|
+
<stop offset="0%" style="stop-color:#667eea;stop-opacity:1" />
|
5
|
+
<stop offset="100%" style="stop-color:#764ba2;stop-opacity:1" />
|
6
|
+
</linearGradient>
|
7
|
+
<linearGradient id="sky-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
8
|
+
<stop offset="0%" style="stop-color:#a8edea;stop-opacity:1" />
|
9
|
+
<stop offset="100%" style="stop-color:#fed6e3;stop-opacity:1" />
|
10
|
+
</linearGradient>
|
11
|
+
</defs>
|
12
|
+
|
13
|
+
<!-- Sky background -->
|
14
|
+
<rect width="400" height="300" fill="url(#sky-gradient)"/>
|
15
|
+
|
16
|
+
<!-- Mountains -->
|
17
|
+
<path d="M0,300 L0,200 L50,150 L100,180 L150,120 L200,160 L250,100 L300,140 L350,80 L400,120 L400,300 Z"
|
18
|
+
fill="url(#mountain-gradient)" opacity="0.8"/>
|
19
|
+
|
20
|
+
<!-- Second mountain range -->
|
21
|
+
<path d="M0,300 L0,220 L30,190 L60,210 L90,170 L120,200 L150,160 L180,190 L210,150 L240,180 L270,140 L300,170 L330,130 L360,160 L390,120 L400,140 L400,300 Z"
|
22
|
+
fill="url(#mountain-gradient)" opacity="0.6"/>
|
23
|
+
|
24
|
+
<!-- Sun -->
|
25
|
+
<circle cx="320" cy="80" r="25" fill="#ffd700" opacity="0.8"/>
|
26
|
+
|
27
|
+
<!-- Clouds -->
|
28
|
+
<ellipse cx="100" cy="60" rx="30" ry="15" fill="white" opacity="0.7"/>
|
29
|
+
<ellipse cx="130" cy="60" rx="25" ry="12" fill="white" opacity="0.7"/>
|
30
|
+
<ellipse cx="160" cy="60" rx="20" ry="10" fill="white" opacity="0.7"/>
|
31
|
+
|
32
|
+
<ellipse cx="250" cy="40" rx="20" ry="10" fill="white" opacity="0.6"/>
|
33
|
+
<ellipse cx="270" cy="40" rx="15" ry="8" fill="white" opacity="0.6"/>
|
34
|
+
|
35
|
+
<!-- Ground -->
|
36
|
+
<rect x="0" y="280" width="400" height="20" fill="#8B4513" opacity="0.3"/>
|
37
|
+
</svg>
|