chore: publish create app cli (#44)

* chore: move folder to match package name

* chore: update dependencies
This commit is contained in:
Daniel Rochetti 2024-01-18 11:06:28 -08:00 committed by GitHub
parent b76c371480
commit 0f8efecf65
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 1846 additions and 647 deletions

View File

@ -1,3 +1,5 @@
{ {
"singleQuote": true "singleQuote": true,
"trailingComma": "es5",
"plugins": ["prettier-plugin-organize-imports"]
} }

View File

@ -17,23 +17,23 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our Examples of behavior that contributes to a positive environment for our
community include: community include:
* Demonstrating empathy and kindness toward other people - Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences - Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback - Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes, - Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall - Focusing on what is best not just for us as individuals, but for the overall
community community
Examples of unacceptable behavior include: Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of - The use of sexualized language or imagery, and sexual attention or advances of
any kind any kind
* Trolling, insulting or derogatory comments, and personal or political attacks - Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment - Public or private harassment
* Publishing others' private information, such as a physical or email address, - Publishing others' private information, such as a physical or email address,
without their explicit permission without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a - Other conduct which could reasonably be considered inappropriate in a
professional setting professional setting
## Enforcement Responsibilities ## Enforcement Responsibilities

View File

@ -4,13 +4,13 @@
"include": [], "include": [],
"references": [ "references": [
{ {
"path": "./tsconfig.app.json" "path": "./tsconfig.app.json",
}, },
{ {
"path": "./tsconfig.spec.json" "path": "./tsconfig.spec.json",
} },
], ],
"compilerOptions": { "compilerOptions": {
"esModuleInterop": true "esModuleInterop": true,
} },
} }

View File

@ -3,9 +3,21 @@
@tailwind utilities; @tailwind utilities;
html { html {
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, font-family:
Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, ui-sans-serif,
Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; system-ui,
-apple-system,
BlinkMacSystemFont,
Segoe UI,
Roboto,
Helvetica Neue,
Arial,
Noto Sans,
sans-serif,
Apple Color Emoji,
Segoe UI Emoji,
Segoe UI Symbol,
Noto Color Emoji;
line-height: 1.5; line-height: 1.5;
tab-size: 4; tab-size: 4;
scroll-behavior: smooth; scroll-behavior: smooth;
@ -39,8 +51,15 @@ a {
text-decoration: inherit; text-decoration: inherit;
} }
pre { pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, font-family:
Liberation Mono, Courier New, monospace; ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
Liberation Mono,
Courier New,
monospace;
} }
svg { svg {
display: block; display: block;
@ -52,14 +71,24 @@ pre {
background-color: rgba(55, 65, 81, 1); background-color: rgba(55, 65, 81, 1);
border-radius: 0.25rem; border-radius: 0.25rem;
color: rgba(229, 231, 235, 1); color: rgba(229, 231, 235, 1);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, font-family:
Liberation Mono, Courier New, monospace; ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
Liberation Mono,
Courier New,
monospace;
overflow: scroll; overflow: scroll;
padding: 0.5rem 0.75rem; padding: 0.5rem 0.75rem;
} }
.shadow { .shadow {
box-shadow: 0 0 #0000, 0 0 #0000, 0 10px 15px -3px rgba(0, 0, 0, 0.1), box-shadow:
0 0 #0000,
0 0 #0000,
0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05); 0 4px 6px -2px rgba(0, 0, 0, 0.05);
} }
.wrapper { .wrapper {
@ -164,8 +193,17 @@ pre {
display: flex; display: flex;
margin-top: 1rem; margin-top: 1rem;
padding: 1rem; padding: 1rem;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -174,8 +212,17 @@ pre {
.list-item-link svg:first-child { .list-item-link svg:first-child {
margin-right: 1rem; margin-right: 1rem;
height: 1.5rem; height: 1.5rem;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -184,8 +231,17 @@ pre {
.list-item-link > span { .list-item-link > span {
flex-grow: 1; flex-grow: 1;
font-weight: 400; font-weight: 400;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -197,8 +253,17 @@ pre {
font-size: 0.75rem; font-size: 0.75rem;
font-weight: 300; font-weight: 300;
line-height: 1rem; line-height: 1rem;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -227,16 +292,34 @@ pre {
.button-pill { .button-pill {
padding: 1.5rem 2rem; padding: 1.5rem 2rem;
transition-duration: 300ms; transition-duration: 300ms;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
align-items: center; align-items: center;
display: flex; display: flex;
} }
.button-pill svg { .button-pill svg {
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -358,8 +441,17 @@ summary {
font-weight: 400; font-weight: 400;
padding: 0.5rem; padding: 0.5rem;
cursor: pointer; cursor: pointer;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;

View File

@ -13,10 +13,10 @@
"incremental": true, "incremental": true,
"plugins": [ "plugins": [
{ {
"name": "next" "name": "next",
} },
], ],
"types": ["jest", "node"] "types": ["jest", "node"],
}, },
"include": [ "include": [
"**/*.ts", "**/*.ts",
@ -25,12 +25,12 @@
"**/*.jsx", "**/*.jsx",
"../../apps/demo-nextjs-app-router/.next/types/**/*.ts", "../../apps/demo-nextjs-app-router/.next/types/**/*.ts",
"../../dist/apps/demo-nextjs-app-router/.next/types/**/*.ts", "../../dist/apps/demo-nextjs-app-router/.next/types/**/*.ts",
"next-env.d.ts" "next-env.d.ts",
], ],
"exclude": [ "exclude": [
"node_modules", "node_modules",
"jest.config.ts", "jest.config.ts",
"src/**/*.spec.ts", "src/**/*.spec.ts",
"src/**/*.test.ts" "src/**/*.test.ts",
] ],
} }

View File

@ -3,9 +3,21 @@
@tailwind utilities; @tailwind utilities;
html { html {
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, font-family:
Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, ui-sans-serif,
Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; system-ui,
-apple-system,
BlinkMacSystemFont,
Segoe UI,
Roboto,
Helvetica Neue,
Arial,
Noto Sans,
sans-serif,
Apple Color Emoji,
Segoe UI Emoji,
Segoe UI Symbol,
Noto Color Emoji;
line-height: 1.5; line-height: 1.5;
tab-size: 4; tab-size: 4;
scroll-behavior: smooth; scroll-behavior: smooth;
@ -39,8 +51,15 @@ a {
text-decoration: inherit; text-decoration: inherit;
} }
pre { pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, font-family:
Liberation Mono, Courier New, monospace; ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
Liberation Mono,
Courier New,
monospace;
} }
svg { svg {
display: block; display: block;
@ -52,14 +71,24 @@ pre {
background-color: rgba(55, 65, 81, 1); background-color: rgba(55, 65, 81, 1);
border-radius: 0.25rem; border-radius: 0.25rem;
color: rgba(229, 231, 235, 1); color: rgba(229, 231, 235, 1);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, font-family:
Liberation Mono, Courier New, monospace; ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
Liberation Mono,
Courier New,
monospace;
overflow: scroll; overflow: scroll;
padding: 0.5rem 0.75rem; padding: 0.5rem 0.75rem;
} }
.shadow { .shadow {
box-shadow: 0 0 #0000, 0 0 #0000, 0 10px 15px -3px rgba(0, 0, 0, 0.1), box-shadow:
0 0 #0000,
0 0 #0000,
0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05); 0 4px 6px -2px rgba(0, 0, 0, 0.05);
} }
.wrapper { .wrapper {
@ -164,8 +193,17 @@ pre {
display: flex; display: flex;
margin-top: 1rem; margin-top: 1rem;
padding: 1rem; padding: 1rem;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -174,8 +212,17 @@ pre {
.list-item-link svg:first-child { .list-item-link svg:first-child {
margin-right: 1rem; margin-right: 1rem;
height: 1.5rem; height: 1.5rem;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -184,8 +231,17 @@ pre {
.list-item-link > span { .list-item-link > span {
flex-grow: 1; flex-grow: 1;
font-weight: 400; font-weight: 400;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -197,8 +253,17 @@ pre {
font-size: 0.75rem; font-size: 0.75rem;
font-weight: 300; font-weight: 300;
line-height: 1rem; line-height: 1rem;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -227,16 +292,34 @@ pre {
.button-pill { .button-pill {
padding: 1.5rem 2rem; padding: 1.5rem 2rem;
transition-duration: 300ms; transition-duration: 300ms;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
align-items: center; align-items: center;
display: flex; display: flex;
} }
.button-pill svg { .button-pill svg {
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
@ -358,8 +441,17 @@ summary {
font-weight: 400; font-weight: 400;
padding: 0.5rem; padding: 0.5rem;
cursor: pointer; cursor: pointer;
transition-property: background-color, border-color, color, fill, stroke, transition-property:
opacity, box-shadow, transform, filter, backdrop-filter, background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter; -webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;

View File

@ -11,8 +11,8 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"incremental": true, "incremental": true,
"types": ["jest", "node"] "types": ["jest", "node"],
}, },
"include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "next-env.d.ts"], "include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "next-env.d.ts"],
"exclude": ["node_modules", "jest.config.ts"] "exclude": ["node_modules", "jest.config.ts"],
} }

View File

@ -1,7 +0,0 @@
## Fal.ai App Generator
Generate a new full stack app configured with Fal.ai proxy and models.
```sh
npx @fal-ai/create
```

View File

@ -1,21 +0,0 @@
{
"name": "@fal-ai/create",
"version": "0.0.1",
"description": "The fal serverless app generator.",
"main": "index.js",
"keywords": [
"fal",
"next",
"nextjs",
"express"
],
"repository": {
"type": "git",
"url": "https://github.com/fal-ai/serverless-js.git",
"directory": "libs/cli"
},
"type": "module",
"author": "",
"license": "MIT",
"dependencies": {}
}

View File

@ -5,7 +5,7 @@
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/fal-ai/serverless-js.git", "url": "https://github.com/fal-ai/fal-js.git",
"directory": "libs/client" "directory": "libs/client"
}, },
"keywords": [ "keywords": [

View File

@ -1,14 +1,14 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { encode, decode } from '@msgpack/msgpack'; import { decode, encode } from '@msgpack/msgpack';
import { import {
ContextFunction, ContextFunction,
InterpretOnChangeFunction,
Service,
createMachine, createMachine,
guard, guard,
immediate, immediate,
interpret, interpret,
InterpretOnChangeFunction,
reduce, reduce,
Service,
state, state,
transition, transition,
} from 'robot3'; } from 'robot3';

View File

@ -18,20 +18,22 @@ export type Metrics = {
}; };
export type QueueStatus = export type QueueStatus =
{ | {
status: 'IN_PROGRESS'; status: 'IN_PROGRESS';
response_url: string; response_url: string;
logs: null | RequestLog[]; logs: null | RequestLog[];
} | { }
status: 'COMPLETED'; | {
response_url: string; status: 'COMPLETED';
logs: null | RequestLog[]; response_url: string;
metrics: Metrics; logs: null | RequestLog[];
} | { metrics: Metrics;
status: 'IN_QUEUE'; }
queue_position: number; | {
response_url: string; status: 'IN_QUEUE';
}; queue_position: number;
response_url: string;
};
export function isQueueStatus(obj: any): obj is QueueStatus { export function isQueueStatus(obj: any): obj is QueueStatus {
return obj && obj.status && obj.response_url; return obj && obj.status && obj.response_url;
@ -52,22 +54,22 @@ export type ValidationErrorInfo = {
*/ */
export type WebHookResponse<Payload = any> = export type WebHookResponse<Payload = any> =
| { | {
/** Indicates a successful response. */ /** Indicates a successful response. */
status: 'OK'; status: 'OK';
/** The payload of the response, structure determined by the Payload type. */ /** The payload of the response, structure determined by the Payload type. */
payload: Payload; payload: Payload;
/** Error is never present in a successful response. */ /** Error is never present in a successful response. */
error: never; error: never;
/** The unique identifier for the request. */ /** The unique identifier for the request. */
request_id: string; request_id: string;
} }
| { | {
/** Indicates an unsuccessful response. */ /** Indicates an unsuccessful response. */
status: 'ERROR'; status: 'ERROR';
/** The payload of the response, structure determined by the Payload type. */ /** The payload of the response, structure determined by the Payload type. */
payload: Payload; payload: Payload;
/** Description of the error that occurred. */ /** Description of the error that occurred. */
error: string; error: string;
/** The unique identifier for the request. */ /** The unique identifier for the request. */
request_id: string; request_id: string;
}; };

View File

@ -48,12 +48,15 @@ export function throttle<T extends (...args: any[]) => any>(
clearTimeout(lastFunc); clearTimeout(lastFunc);
} }
lastFunc = setTimeout(() => { lastFunc = setTimeout(
if (Date.now() - lastRan >= limit) { () => {
func(...args); if (Date.now() - lastRan >= limit) {
lastRan = Date.now(); func(...args);
} lastRan = Date.now();
}, limit - (Date.now() - lastRan)); }
},
limit - (Date.now() - lastRan)
);
} }
}; };
} }

View File

@ -4,10 +4,10 @@
"include": [], "include": [],
"references": [ "references": [
{ {
"path": "./tsconfig.lib.json" "path": "./tsconfig.lib.json",
}, },
{ {
"path": "./tsconfig.spec.json" "path": "./tsconfig.spec.json",
} },
] ],
} }

View File

@ -0,0 +1,7 @@
## The fal.ai App Generator
Generate a new full stack app configured with [fal.ai](https://fal.ai) proxy and models.
```sh
npx @fal-ai/create-app
```

View File

@ -1,11 +1,11 @@
/* eslint-disable */ /* eslint-disable */
export default { export default {
displayName: 'cli', displayName: 'create-app',
preset: '../../jest.preset.js', preset: '../../jest.preset.js',
testEnvironment: 'node', testEnvironment: 'node',
transform: { transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }], '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
}, },
moduleFileExtensions: ['ts', 'js', 'html'], moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/libs/cli', coverageDirectory: '../../coverage/libs/create-app',
}; };

View File

@ -0,0 +1,27 @@
{
"name": "@fal-ai/create-app",
"version": "0.1.0",
"description": "The fal app generator.",
"type": "module",
"license": "MIT",
"main": "src/index.js",
"keywords": [
"fal",
"next",
"nextjs",
"express"
],
"repository": {
"type": "git",
"url": "https://github.com/fal-ai/fal-js.git",
"directory": "libs/create-app"
},
"dependencies": {
"@inquirer/prompts": "^3.3.0",
"@inquirer/select": "^1.3.1",
"chalk": "^5.3.0",
"execa": "^8.0.1",
"open": "^10.0.3",
"ora": "^8.0.1"
}
}

View File

@ -1,32 +1,32 @@
{ {
"name": "cli", "name": "create-app",
"$schema": "../../node_modules/nx/schemas/project-schema.json", "$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/cli/src", "sourceRoot": "libs/create-app/src",
"projectType": "library", "projectType": "library",
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"], "outputs": ["{options.outputPath}"],
"options": { "options": {
"outputPath": "dist/libs/cli", "outputPath": "dist/libs/create-app",
"tsConfig": "libs/cli/tsconfig.lib.json", "tsConfig": "libs/create-app/tsconfig.lib.json",
"packageJson": "libs/cli/package.json", "packageJson": "libs/create-app/package.json",
"main": "libs/cli/src/index.ts", "main": "libs/create-app/src/index.ts",
"assets": ["LICENSE", "CODE_OF_CONDUCT.md", "libs/cli/README.md"] "assets": ["LICENSE", "CODE_OF_CONDUCT.md", "libs/create-app/README.md"]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": ["{options.outputFile}"], "outputs": ["{options.outputFile}"],
"options": { "options": {
"lintFilePatterns": ["libs/cli/**/*.ts"] "lintFilePatterns": ["libs/create-app/**/*.ts"]
} }
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": { "options": {
"jestConfig": "libs/cli/jest.config.ts", "jestConfig": "libs/create-app/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true
}, },
"configurations": { "configurations": {

View File

@ -1,15 +1,15 @@
#!/usr/bin/env node #!/usr/bin/env node
import chalk from 'chalk';
import path from 'path';
import fs from 'fs';
import childProcess from 'child_process';
import ora from 'ora';
import select from '@inquirer/select';
import { input } from '@inquirer/prompts'; import { input } from '@inquirer/prompts';
import select from '@inquirer/select';
import chalk from 'chalk';
import childProcess from 'child_process';
import { Command } from 'commander'; import { Command } from 'commander';
import { execa, execaCommand } from 'execa'; import { execa, execaCommand } from 'execa';
import fs from 'fs';
import open from 'open'; import open from 'open';
import ora from 'ora';
import path from 'path';
const program = new Command(); const program = new Command();
const log = console.log; const log = console.log;
@ -25,8 +25,8 @@ async function main() {
const kebabRegez = /^([a-z]+)(-[a-z0-9]+)*$/; const kebabRegez = /^([a-z]+)(-[a-z0-9]+)*$/;
program program
.name('Fal.ai App Generator') .name('The fal.ai App Generator')
.description('Generate full stack AI apps integrated with Fal.ai.'); .description('Generate full stack AI apps integrated with fal.ai');
program.parse(process.argv); program.parse(process.argv);
@ -47,7 +47,7 @@ async function main() {
} }
const hasFalEnv = await select({ const hasFalEnv = await select({
message: 'Do you have a Fal.ai API key?', message: 'Do you have a fal.ai API key?',
choices: [ choices: [
{ {
name: 'Yes', name: 'Yes',
@ -66,10 +66,10 @@ async function main() {
const fal_api_key = await input({ message: 'Fal AI API Key' }); const fal_api_key = await input({ message: 'Fal AI API Key' });
let envs = ` const envs = `
# environment, either PRODUCTION or DEVELOPMENT # environment, either PRODUCTION or DEVELOPMENT
ENVIRONMENT="PRODUCTION" ENVIRONMENT="PRODUCTION"
# FAL AI API Key # FAL AI API Key
FAL_KEY="${fal_api_key}" FAL_KEY="${fal_api_key}"
`; `;

View File

@ -4,10 +4,10 @@
"include": [], "include": [],
"references": [ "references": [
{ {
"path": "./tsconfig.lib.json" "path": "./tsconfig.lib.json",
}, },
{ {
"path": "./tsconfig.spec.json" "path": "./tsconfig.spec.json",
} },
] ],
} }

View File

@ -11,10 +11,7 @@
"outDir": "dist", "outDir": "dist",
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"*": [ "*": ["node_modules/*", "src/types/*"]
"node_modules/*",
"src/types/*"
]
} }
}, },
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],

View File

@ -4,7 +4,7 @@
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/fal-ai/serverless-js.git", "url": "https://github.com/fal-ai/fal-js.git",
"directory": "libs/proxy" "directory": "libs/proxy"
}, },
"keywords": [ "keywords": [

View File

@ -4,10 +4,10 @@
"include": [], "include": [],
"references": [ "references": [
{ {
"path": "./tsconfig.lib.json" "path": "./tsconfig.lib.json",
}, },
{ {
"path": "./tsconfig.spec.json" "path": "./tsconfig.spec.json",
} },
] ],
} }

View File

@ -1,5 +1,6 @@
{ {
"$schema": "./node_modules/nx/schemas/nx-schema.json", "$schema": "./node_modules/nx/schemas/nx-schema.json",
"extends": "nx/presets/npm.json",
"tasksRunnerOptions": { "tasksRunnerOptions": {
"default": { "default": {
"runner": "nx-cloud", "runner": "nx-cloud",
@ -50,5 +51,5 @@
} }
} }
}, },
"defaultProject": "demo-nextjs-page-router" "defaultProject": "demo-nextjs-app-router"
} }

1933
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
{ {
"name": "@fal-ai/serverless", "name": "@fal-ai/fal-js",
"version": "0.0.0", "version": "0.0.0",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
@ -46,6 +46,8 @@
"http-proxy-middleware": "^2.0.6", "http-proxy-middleware": "^2.0.6",
"js-base64": "^3.7.5", "js-base64": "^3.7.5",
"next": "^14.0.3", "next": "^14.0.3",
"open": "^10.0.3",
"ora": "^8.0.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"regenerator-runtime": "0.13.7", "regenerator-runtime": "0.13.7",
@ -108,7 +110,8 @@
"nx-cloud": "16.4.0", "nx-cloud": "16.4.0",
"organize-imports-cli": "^0.10.0", "organize-imports-cli": "^0.10.0",
"postcss": "8.4.21", "postcss": "8.4.21",
"prettier": "^2.6.2", "prettier": "^3.2.4",
"prettier-plugin-organize-imports": "^3.2.4",
"secretlint": "^7.0.7", "secretlint": "^7.0.7",
"tailwindcss": "3.2.7", "tailwindcss": "3.2.7",
"ts-jest": "29.1.1", "ts-jest": "29.1.1",

View File

@ -15,7 +15,7 @@
"skipDefaultLibCheck": true, "skipDefaultLibCheck": true,
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@fal-ai/cli": ["libs/cli/src/index.ts"], "@fal-ai/create-app": ["libs/create-app/src/index.ts"],
"@fal-ai/serverless-client": ["libs/client/src/index.ts"], "@fal-ai/serverless-client": ["libs/client/src/index.ts"],
"@fal-ai/serverless-proxy": ["libs/proxy/src/index.ts"], "@fal-ai/serverless-proxy": ["libs/proxy/src/index.ts"],
"@fal-ai/serverless-proxy/express": ["libs/proxy/src/express.ts"], "@fal-ai/serverless-proxy/express": ["libs/proxy/src/express.ts"],