create-varity-app 2.0.0-beta.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/dist/create.js +141 -0
  4. package/dist/index.js +45 -0
  5. package/dist/utils.js +29 -0
  6. package/package.json +61 -0
  7. package/template/.env.example +17 -0
  8. package/template/KNOWN_ISSUES.md +69 -0
  9. package/template/LICENSE +21 -0
  10. package/template/README.md +241 -0
  11. package/template/gitignore +42 -0
  12. package/template/next-env.d.ts +6 -0
  13. package/template/next.config.js +21 -0
  14. package/template/package.json +39 -0
  15. package/template/postcss.config.js +6 -0
  16. package/template/public/logo.svg +4 -0
  17. package/template/public/robots.txt +4 -0
  18. package/template/public/sitemap.xml +4 -0
  19. package/template/src/app/dashboard/layout.tsx +298 -0
  20. package/template/src/app/dashboard/page.tsx +209 -0
  21. package/template/src/app/dashboard/projects/page.tsx +638 -0
  22. package/template/src/app/dashboard/settings/page.tsx +749 -0
  23. package/template/src/app/dashboard/tasks/page.tsx +301 -0
  24. package/template/src/app/dashboard/team/page.tsx +295 -0
  25. package/template/src/app/globals.css +177 -0
  26. package/template/src/app/icon.svg +4 -0
  27. package/template/src/app/layout.tsx +33 -0
  28. package/template/src/app/login/page.tsx +98 -0
  29. package/template/src/app/not-found.tsx +20 -0
  30. package/template/src/app/page.tsx +23 -0
  31. package/template/src/components/dashboard/DashboardStats.tsx +137 -0
  32. package/template/src/components/dashboard/RecentActivity.tsx +63 -0
  33. package/template/src/components/landing/CTA.tsx +42 -0
  34. package/template/src/components/landing/Features.tsx +116 -0
  35. package/template/src/components/landing/Hero.tsx +146 -0
  36. package/template/src/components/landing/HowItWorks.tsx +80 -0
  37. package/template/src/components/landing/Pricing.tsx +124 -0
  38. package/template/src/components/landing/Testimonials.tsx +78 -0
  39. package/template/src/components/providers.tsx +11 -0
  40. package/template/src/components/shared/Footer.tsx +71 -0
  41. package/template/src/components/shared/Navbar.tsx +87 -0
  42. package/template/src/lib/constants.ts +35 -0
  43. package/template/src/lib/database.ts +7 -0
  44. package/template/src/lib/hooks.ts +331 -0
  45. package/template/src/lib/utils.ts +68 -0
  46. package/template/src/lib/varity.ts +1 -0
  47. package/template/src/services/dashboardService.ts +589 -0
  48. package/template/src/types/index.ts +52 -0
  49. package/template/tailwind.config.js +27 -0
  50. package/template/tsconfig.json +23 -0
  51. package/template/varity.config.json +14 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Varity Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # create-varity-app
2
+
3
+ [![npm](https://img.shields.io/npm/v/create-varity-app)](https://www.npmjs.com/package/create-varity-app)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/varity-labs/varity-sdk/blob/main/LICENSE)
5
+
6
+ Create production-ready apps with auth, database, and payments built in.
7
+
8
+ ## Quick Start
9
+
10
+ ```bash
11
+ npx create-varity-app my-app
12
+ cd my-app
13
+ npm run dev
14
+ ```
15
+
16
+ Or with other package managers:
17
+
18
+ ```bash
19
+ pnpm create varity-app my-app
20
+ yarn create varity-app my-app
21
+ ```
22
+
23
+ ## What You Get
24
+
25
+ - **Next.js 15** app with TypeScript and Tailwind CSS
26
+ - **Authentication** — email, social login, and more (zero config)
27
+ - **Database** — ready-to-use collections with typed queries
28
+ - **Dashboard** — professional layout with sidebar navigation
29
+ - **Landing page** — hero, features, pricing, testimonials
30
+ - **Settings** — profile, preferences, security, billing sections
31
+ - **6 pages** — dashboard, projects, tasks, team, settings, login
32
+
33
+ ## Project Structure
34
+
35
+ ```
36
+ my-app/
37
+ ├── src/
38
+ │ └── app/
39
+ │ ├── (auth)/login/ # Login page
40
+ │ ├── (dashboard)/ # Protected dashboard pages
41
+ │ │ ├── dashboard/ # Overview with KPIs
42
+ │ │ ├── projects/ # Project management
43
+ │ │ ├── tasks/ # Task tracking
44
+ │ │ ├── team/ # Team members
45
+ │ │ └── settings/ # App settings (6 sections)
46
+ │ └── page.tsx # Landing page
47
+ ├── tailwind.config.ts
48
+ ├── next.config.js
49
+ └── package.json
50
+ ```
51
+
52
+ ## Deploy
53
+
54
+ When you're ready to go live:
55
+
56
+ ```bash
57
+ pip install varitykit
58
+ varitykit app deploy
59
+ ```
60
+
61
+ Your app will be live in under 60 seconds.
62
+
63
+ Or deploy from your AI editor with the [Varity MCP server](../../cli/varity-mcp/) (`@varity-labs/mcp`) — just ask "deploy this project".
64
+
65
+ ## Related Packages
66
+
67
+ - **[@varity-labs/sdk](../../core/varity-sdk/)** — Core SDK (database, credentials)
68
+ - **[@varity-labs/ui-kit](../../ui/varity-ui-kit/)** — React UI components
69
+ - **[@varity-labs/mcp](../../cli/varity-mcp/)** — MCP server for AI editors (Cursor, Claude Code, VS Code)
70
+
71
+ ## Learn More
72
+
73
+ - [Documentation](https://docs.varity.so)
74
+ - [GitHub](https://github.com/varity-labs/varity-sdk)
75
+ - [Discord](https://discord.gg/varity)
76
+
77
+ ---
78
+
79
+ **Part of the [Varity SDK](https://github.com/varity-labs/varity-sdk)** — Build, deploy, and monetize apps 70% cheaper than AWS.
80
+
81
+ [Documentation](https://docs.varity.so) · [GitHub](https://github.com/varity-labs/varity-sdk) · [Discord](https://discord.gg/varity)
82
+
83
+ ## License
84
+
85
+ MIT — [Varity Labs](https://varity.so)
package/dist/create.js ADDED
@@ -0,0 +1,141 @@
1
+ import path from "path";
2
+ import fs from "fs-extra";
3
+ import { fileURLToPath } from "url";
4
+ import { execSync } from "child_process";
5
+ import chalk from "chalk";
6
+ import ora from "ora";
7
+ import { getInstallCommand } from "./utils.js";
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ const VARITY_PACKAGE_VERSION = "^2.0.0-alpha.1";
11
+ const WORKSPACE_DEPS = {
12
+ "@varity-labs/sdk": VARITY_PACKAGE_VERSION,
13
+ "@varity-labs/types": VARITY_PACKAGE_VERSION,
14
+ "@varity-labs/ui-kit": VARITY_PACKAGE_VERSION,
15
+ };
16
+ const EXCLUDED_FILES = new Set([
17
+ ".env.local",
18
+ ".env.development.local",
19
+ ".env.production.local",
20
+ ]);
21
+ function getTemplateDir() {
22
+ return path.resolve(__dirname, "..", "template");
23
+ }
24
+ function rewritePackageJson(content, projectName) {
25
+ const pkg = { ...content };
26
+ pkg.name = projectName;
27
+ pkg.version = "0.1.0";
28
+ // Convert workspace:^ deps to real versions
29
+ for (const depKey of ["dependencies", "devDependencies"]) {
30
+ const deps = pkg[depKey];
31
+ if (!deps)
32
+ continue;
33
+ for (const [name, version] of Object.entries(deps)) {
34
+ if (typeof version === "string" &&
35
+ version.startsWith("workspace:")) {
36
+ deps[name] = WORKSPACE_DEPS[name] || VARITY_PACKAGE_VERSION;
37
+ }
38
+ }
39
+ }
40
+ // Remove monorepo-specific scripts
41
+ const scripts = pkg.scripts;
42
+ if (scripts) {
43
+ delete scripts.prepare; // husky install — not needed outside monorepo
44
+ }
45
+ return pkg;
46
+ }
47
+ export async function createApp(projectName, packageManager) {
48
+ const targetDir = path.resolve(process.cwd(), projectName);
49
+ const templateDir = getTemplateDir();
50
+ // Check template exists
51
+ if (!fs.existsSync(templateDir)) {
52
+ console.error(chalk.red("Error: Template not found. This is a bug — please report it at https://github.com/varity-labs/varity-sdk/issues"));
53
+ process.exit(1);
54
+ }
55
+ // Check target doesn't already exist
56
+ if (fs.existsSync(targetDir)) {
57
+ console.error(chalk.red(`Error: Directory ${chalk.bold(projectName)} already exists.`));
58
+ process.exit(1);
59
+ }
60
+ console.log();
61
+ console.log(` Creating ${chalk.bold(projectName)}...`);
62
+ console.log();
63
+ // Copy template
64
+ const copySpinner = ora(" Copying template").start();
65
+ try {
66
+ await fs.copy(templateDir, targetDir, {
67
+ filter: (src) => {
68
+ const basename = path.basename(src);
69
+ if (EXCLUDED_FILES.has(basename))
70
+ return false;
71
+ if (basename === "node_modules")
72
+ return false;
73
+ if (basename === ".next")
74
+ return false;
75
+ return true;
76
+ },
77
+ });
78
+ // Rename gitignore → .gitignore (npm strips .gitignore from tarballs)
79
+ const gitignoreSrc = path.join(targetDir, "gitignore");
80
+ const gitignoreDst = path.join(targetDir, ".gitignore");
81
+ if (fs.existsSync(gitignoreSrc) && !fs.existsSync(gitignoreDst)) {
82
+ await fs.rename(gitignoreSrc, gitignoreDst);
83
+ }
84
+ // Rewrite package.json
85
+ const pkgPath = path.join(targetDir, "package.json");
86
+ if (fs.existsSync(pkgPath)) {
87
+ const pkgContent = await fs.readJson(pkgPath);
88
+ const rewritten = rewritePackageJson(pkgContent, projectName);
89
+ await fs.writeJson(pkgPath, rewritten, { spaces: 2 });
90
+ }
91
+ copySpinner.succeed(" Template copied");
92
+ }
93
+ catch (err) {
94
+ copySpinner.fail(" Failed to copy template");
95
+ throw err;
96
+ }
97
+ // Install dependencies
98
+ const installCmd = getInstallCommand(packageManager);
99
+ const installSpinner = ora(` Installing dependencies (${packageManager})`).start();
100
+ try {
101
+ execSync(installCmd, {
102
+ cwd: targetDir,
103
+ stdio: "pipe",
104
+ env: { ...process.env, ADBLOCK: "1", DISABLE_OPENCOLLECTIVE: "1" },
105
+ });
106
+ installSpinner.succeed(" Dependencies installed");
107
+ }
108
+ catch {
109
+ installSpinner.warn(` Could not install dependencies. Run ${chalk.cyan(`cd ${projectName} && ${installCmd}`)} manually.`);
110
+ }
111
+ // Init git
112
+ try {
113
+ execSync("git init", { cwd: targetDir, stdio: "pipe" });
114
+ execSync("git add -A", { cwd: targetDir, stdio: "pipe" });
115
+ execSync('git commit -m "Initial commit from create-varity-app"', {
116
+ cwd: targetDir,
117
+ stdio: "pipe",
118
+ });
119
+ }
120
+ catch {
121
+ // git not available or init failed — not critical
122
+ }
123
+ // Success output
124
+ console.log();
125
+ console.log(chalk.green(" Success!") + ` Created ${chalk.bold(projectName)}`);
126
+ console.log();
127
+ console.log(" Next steps:");
128
+ console.log();
129
+ console.log(chalk.cyan(` cd ${projectName}`));
130
+ console.log(chalk.cyan(` ${packageManager === "npm" ? "npm run" : packageManager} dev`) + " Start development server");
131
+ console.log(chalk.cyan(` ${packageManager === "npm" ? "npm run" : packageManager} build`) + " Build for production");
132
+ console.log();
133
+ console.log(" Deploy when ready:");
134
+ console.log();
135
+ console.log(chalk.cyan(" pip install varitykit"));
136
+ console.log(chalk.cyan(" varitykit app deploy"));
137
+ console.log();
138
+ console.log(` Docs: ${chalk.underline("https://docs.varity.so")}`);
139
+ console.log(` Help: ${chalk.underline("https://discord.gg/varity")}`);
140
+ console.log();
141
+ }
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import chalk from "chalk";
4
+ import prompts from "prompts";
5
+ import { createApp } from "./create.js";
6
+ import { validateProjectName, detectPackageManager } from "./utils.js";
7
+ import fs from "fs";
8
+ const packageJson = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
9
+ const program = new Command();
10
+ program
11
+ .name("create-varity-app")
12
+ .description("Create a production-ready app with auth, database, and payments built in")
13
+ .version(packageJson.version)
14
+ .argument("[app-name]", "Name of the app to create")
15
+ .action(async (appName) => {
16
+ console.log();
17
+ console.log(chalk.bold(" create-varity-app"));
18
+ console.log();
19
+ let projectName = appName;
20
+ // Prompt for name if not provided
21
+ if (!projectName) {
22
+ const response = await prompts({
23
+ type: "text",
24
+ name: "name",
25
+ message: "What is your app named?",
26
+ initial: "my-app",
27
+ validate: (value) => {
28
+ const result = validateProjectName(value);
29
+ return result.valid ? true : result.error || "Invalid name";
30
+ },
31
+ }, { onCancel: () => process.exit(0) });
32
+ projectName = response.name;
33
+ if (!projectName)
34
+ process.exit(0);
35
+ }
36
+ // Validate the name
37
+ const validation = validateProjectName(projectName);
38
+ if (!validation.valid) {
39
+ console.error(chalk.red(` Invalid project name: ${validation.error}`));
40
+ process.exit(1);
41
+ }
42
+ const packageManager = detectPackageManager();
43
+ await createApp(projectName, packageManager);
44
+ });
45
+ program.parse();
package/dist/utils.js ADDED
@@ -0,0 +1,29 @@
1
+ import validatePkgName from "validate-npm-package-name";
2
+ export function validateProjectName(name) {
3
+ const validation = validatePkgName(name);
4
+ if (!validation.validForNewPackages) {
5
+ const errors = [
6
+ ...(validation.errors || []),
7
+ ...(validation.warnings || []),
8
+ ];
9
+ return { valid: false, error: errors.join(", ") };
10
+ }
11
+ if (name.length === 0) {
12
+ return { valid: false, error: "Project name cannot be empty" };
13
+ }
14
+ if (name.startsWith(".") || name.startsWith("_")) {
15
+ return { valid: false, error: "Project name cannot start with . or _" };
16
+ }
17
+ return { valid: true };
18
+ }
19
+ export function detectPackageManager() {
20
+ const agent = process.env.npm_config_user_agent || "";
21
+ if (agent.startsWith("pnpm"))
22
+ return "pnpm";
23
+ if (agent.startsWith("yarn"))
24
+ return "yarn";
25
+ return "npm";
26
+ }
27
+ export function getInstallCommand(pm) {
28
+ return pm === "yarn" ? "yarn" : `${pm} install`;
29
+ }
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "create-varity-app",
3
+ "version": "2.0.0-beta.1",
4
+ "description": "Create production-ready apps with auth, database, and payments built in",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/varity-labs/varity-sdk.git",
9
+ "directory": "packages/cli/create-varity-app"
10
+ },
11
+ "homepage": "https://docs.varity.so",
12
+ "bugs": {
13
+ "url": "https://github.com/varity-labs/varity-sdk/issues"
14
+ },
15
+ "keywords": [
16
+ "varity",
17
+ "create-app",
18
+ "saas",
19
+ "dashboard",
20
+ "nextjs",
21
+ "starter",
22
+ "template",
23
+ "react",
24
+ "deploy",
25
+ "auth",
26
+ "database",
27
+ "payments",
28
+ "developer-tools",
29
+ "fullstack"
30
+ ],
31
+ "bin": {
32
+ "create-varity-app": "./dist/index.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "template",
37
+ "README.md",
38
+ "LICENSE"
39
+ ],
40
+ "type": "module",
41
+ "scripts": {
42
+ "prebuild": "node scripts/copy-template.mjs",
43
+ "build": "tsc",
44
+ "clean": "rm -rf dist template"
45
+ },
46
+ "dependencies": {
47
+ "chalk": "^5.3.0",
48
+ "commander": "^12.1.0",
49
+ "fs-extra": "^11.2.0",
50
+ "ora": "^8.1.0",
51
+ "prompts": "^2.4.2",
52
+ "validate-npm-package-name": "^5.0.1"
53
+ },
54
+ "devDependencies": {
55
+ "@types/fs-extra": "^11.0.4",
56
+ "@types/node": "^20.0.0",
57
+ "@types/prompts": "^2.4.9",
58
+ "@types/validate-npm-package-name": "^4.0.2",
59
+ "typescript": "^5.5.0"
60
+ }
61
+ }
@@ -0,0 +1,17 @@
1
+ # Varity App Configuration
2
+ #
3
+ # ZERO CONFIG: Leave everything blank! Auth and database work immediately
4
+ # using shared development credentials. No setup required.
5
+ #
6
+ # For production: `varitykit app deploy` injects all credentials automatically.
7
+ # You never need to manually set these values.
8
+
9
+ # Auth (optional — dev credentials used automatically when blank)
10
+ NEXT_PUBLIC_PRIVY_APP_ID=
11
+ NEXT_PUBLIC_THIRDWEB_CLIENT_ID=
12
+
13
+ # Database (optional — dev database used automatically when blank)
14
+ NEXT_PUBLIC_VARITY_APP_TOKEN=
15
+
16
+ # App ID (generated by `varitykit app deploy`)
17
+ NEXT_PUBLIC_VARITY_APP_ID=
@@ -0,0 +1,69 @@
1
+ # Known Issues — SaaS Starter Template
2
+
3
+ > **Last Updated:** February 14, 2026
4
+ > **Template:** `saas-starter` (TaskFlow)
5
+ > **Status:** All features functional, builds with 0 errors (8 routes + _not-found)
6
+
7
+ ---
8
+
9
+ ## What Works
10
+
11
+ | Feature | Status | Notes |
12
+ |---------|--------|-------|
13
+ | Landing Page | Working | 6 sections, scroll animations, social proof, testimonials, dashboard mockup |
14
+ | Login | Working | Privy email/Google auth, zero-config with dev credentials, auto-redirect |
15
+ | Dashboard | Working | KPI cards, getting started checklist, recent activity feed |
16
+ | Projects CRUD | Working | Master-detail, nested tasks, CSV export, validation, optimistic updates |
17
+ | Tasks CRUD | Working | Status cycling (click to advance), filtering, CSV export, cross-references projects |
18
+ | Team CRUD | Working | Invite members, role management, email validation, role badges |
19
+ | Settings | Working | 4 tabs (General, Security, Billing, Account), backend persistence via DB Proxy, skeleton loading |
20
+ | Command Palette | Working | Cmd+K / Ctrl+K, searches pages and actions |
21
+ | Toast Notifications | Working | Success/error/info with progress bar, exit animation, max 3 stack |
22
+ | Protected Routes | Working | Automatic redirect for unauthenticated users |
23
+ | Color Themes | Working | 4 built-in presets (Blue, Purple, Green, Orange) via CSS variables |
24
+ | Static Export | Working | `output: 'export'` for IPFS deployment |
25
+ | Mobile Nav | Working | Hamburger menu with responsive sidebar |
26
+ | CSV Export | Working | One-click export for tasks and projects |
27
+ | SEO | Working | OpenGraph, Twitter cards, robots.txt, sitemap template |
28
+
29
+ ## Known Issues
30
+
31
+ ### 1. Navigation Flash (UI-Kit Limitation)
32
+ Brief "Initializing Dashboard" screen when navigating between dashboard pages. Caused by `PrivyReadyGate` in UI-Kit re-checking auth state on each route change. Resolves in <1 second. This is a UI-Kit issue, not template-side.
33
+
34
+ ### 2. DashboardLayout Mobile Support
35
+ The `DashboardLayout` from `@varity-labs/ui-kit` does not include mobile navigation. The template provides its own responsive sidebar in `src/app/dashboard/layout.tsx` as a workaround. UI-Kit mobile improvements are planned post-MVP.
36
+
37
+ ### 3. Billing Section is Mock
38
+ The Settings > Billing tab shows a mock UI (plan name, usage bars, payment method). Developers should wire their own billing provider (Stripe, etc.).
39
+
40
+ ### 4. Sessions Are Mock
41
+ The Settings > Security tab shows active sessions with a "Revoke" button. Session data is client-side mock — real session management is handled by Privy (the auth provider).
42
+
43
+ ### 5. Password & Profile Managed by Auth Provider
44
+ "Change password" and profile photo are managed by Privy (the auth provider). The Settings page shows informational dialogs explaining this.
45
+
46
+ ### 6. No Server-Side Rendering
47
+ All pages are statically exported (`output: 'export'`). No server-side rendering, API routes, or middleware. Data fetching happens client-side via the SDK.
48
+
49
+ ### 7. Team Email Invites
50
+ No SMTP integration — team members are added to the database only. No invitation email is sent. Developers should integrate their own email service.
51
+
52
+ ## Environment
53
+
54
+ ### Development (Zero Config)
55
+ ```bash
56
+ npm install
57
+ npm run dev
58
+ ```
59
+ No `.env` file, API keys, or accounts needed. Shared development credentials are built in.
60
+
61
+ ### Production
62
+ ```bash
63
+ varitykit app deploy
64
+ ```
65
+ The CLI provisions a private database, injects production credentials, and deploys automatically.
66
+
67
+ ## Reporting Issues
68
+
69
+ Please report issues at: https://github.com/varity-labs/varity-sdk/issues
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Varity Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.