@naiv/swan 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/SWAN-DSL.md +832 -0
- package/dist/SWANServer.d.ts +26 -0
- package/dist/SWANServer.d.ts.map +1 -0
- package/dist/SWANServer.js +158 -0
- package/dist/SWANServer.js.map +1 -0
- package/dist/agent-mode/agent-capability.d.ts +28 -0
- package/dist/agent-mode/agent-capability.d.ts.map +1 -0
- package/dist/agent-mode/agent-capability.js +82 -0
- package/dist/agent-mode/agent-capability.js.map +1 -0
- package/dist/agent-mode/plan-execution-and-next.d.ts +3 -0
- package/dist/agent-mode/plan-execution-and-next.d.ts.map +1 -0
- package/dist/agent-mode/plan-execution-and-next.js +33 -0
- package/dist/agent-mode/plan-execution-and-next.js.map +1 -0
- package/dist/agent-mode/plan-preparation.d.ts +11 -0
- package/dist/agent-mode/plan-preparation.d.ts.map +1 -0
- package/dist/agent-mode/plan-preparation.js +98 -0
- package/dist/agent-mode/plan-preparation.js.map +1 -0
- package/dist/command/cmd-chat.d.ts +2 -0
- package/dist/command/cmd-chat.d.ts.map +1 -0
- package/dist/command/cmd-chat.js +137 -0
- package/dist/command/cmd-chat.js.map +1 -0
- package/dist/command/cmd-run.d.ts +2 -0
- package/dist/command/cmd-run.d.ts.map +1 -0
- package/dist/command/cmd-run.js +42 -0
- package/dist/command/cmd-run.js.map +1 -0
- package/dist/exec.d.ts +3 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +78 -0
- package/dist/exec.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt.d.ts +7 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +90 -0
- package/dist/prompt.js.map +1 -0
- package/dist/sample-page.d.ts +3 -0
- package/dist/sample-page.d.ts.map +1 -0
- package/dist/sample-page.js +144 -0
- package/dist/sample-page.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd-chat.js","sourceRoot":"","sources":["../../command/cmd-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd-run.d.ts","sourceRoot":"","sources":["../../command/cmd-run.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,iBAkC9F"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cmdRun = cmdRun;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const SWANServer_1 = require("../SWANServer");
|
|
10
|
+
const swan_dsl_1 = require("@naiv/swan-dsl");
|
|
11
|
+
async function cmdRun(port, swan_cwd, apiurl, llm_model) {
|
|
12
|
+
const web_specs = path_1.default.resolve(swan_cwd, './web-specification.swan');
|
|
13
|
+
if (!fs_1.default.existsSync(web_specs)) {
|
|
14
|
+
throw new Error(`web-specification.swan is not found. Create new web specification with "swan --chat"`);
|
|
15
|
+
}
|
|
16
|
+
const working_directory = path_1.default.resolve(swan_cwd, './__swan');
|
|
17
|
+
if (!fs_1.default.existsSync(working_directory)) {
|
|
18
|
+
await fs_1.default.promises.mkdir(working_directory);
|
|
19
|
+
}
|
|
20
|
+
const program_nm_root = path_1.default.resolve(__dirname, '../../node_modules');
|
|
21
|
+
const working_directory_nm_symlink = path_1.default.resolve(swan_cwd, './__swan/node_modules');
|
|
22
|
+
if (fs_1.default.existsSync(working_directory_nm_symlink)) {
|
|
23
|
+
await fs_1.default.promises.rm(working_directory_nm_symlink);
|
|
24
|
+
}
|
|
25
|
+
await fs_1.default.promises.symlink(program_nm_root, working_directory_nm_symlink);
|
|
26
|
+
const source_implementation_path = path_1.default.resolve(swan_cwd, './__swan/original-implementation');
|
|
27
|
+
if (!fs_1.default.existsSync(source_implementation_path)) {
|
|
28
|
+
await fs_1.default.promises.mkdir(source_implementation_path);
|
|
29
|
+
}
|
|
30
|
+
const transpiled_implementation_path = path_1.default.resolve(swan_cwd, './__swan/__implementation__');
|
|
31
|
+
if (!fs_1.default.existsSync(transpiled_implementation_path)) {
|
|
32
|
+
await fs_1.default.promises.mkdir(transpiled_implementation_path);
|
|
33
|
+
}
|
|
34
|
+
const swan_content_string = await fs_1.default.promises.readFile(web_specs, 'utf-8');
|
|
35
|
+
const res = (0, swan_dsl_1.parse)(swan_content_string);
|
|
36
|
+
await (new SWANServer_1.SWANServer({ swanCwd: working_directory }).run({
|
|
37
|
+
swan_result: res,
|
|
38
|
+
swan_content_string,
|
|
39
|
+
port
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=cmd-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd-run.js","sourceRoot":"","sources":["../../command/cmd-run.ts"],"names":[],"mappings":";;;;;AAKA,wBAkCC;AAvCD,gDAAwB;AACxB,4CAAoB;AACpB,8CAA2C;AAC3C,6CAAuC;AAEhC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,QAAgB,EAAE,MAAc,EAAE,SAAkB;IAC7F,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;IACrE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,iBAAiB,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACtE,MAAM,4BAA4B,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IACrF,IAAI,YAAE,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;QAChD,MAAM,YAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,4BAA4B,CAAC,CAAC;IAEzE,MAAM,0BAA0B,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;IAC9F,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC/C,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,8BAA8B,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;IAC7F,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;QACnD,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,IAAA,gBAAK,EAAC,mBAAmB,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,uBAAU,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC;QACxD,WAAW,EAAE,GAAI;QACjB,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/exec.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../exec.ts"],"names":[],"mappings":""}
|
package/dist/exec.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const cmd_chat_1 = require("./command/cmd-chat");
|
|
8
|
+
const helpers_1 = require("yargs/helpers");
|
|
9
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
10
|
+
const cmd_run_1 = require("./command/cmd-run");
|
|
11
|
+
const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
12
|
+
.option("run", {
|
|
13
|
+
type: "string",
|
|
14
|
+
requiresArg: false,
|
|
15
|
+
coerce: val => val === "" ? '.' : val
|
|
16
|
+
})
|
|
17
|
+
.option("port", {
|
|
18
|
+
type: "number",
|
|
19
|
+
requiresArg: false,
|
|
20
|
+
})
|
|
21
|
+
.option("apiurl", {
|
|
22
|
+
type: "string",
|
|
23
|
+
requiresArg: false
|
|
24
|
+
})
|
|
25
|
+
.option("chat", {
|
|
26
|
+
type: "boolean",
|
|
27
|
+
requiresArg: false
|
|
28
|
+
})
|
|
29
|
+
.option("model", {
|
|
30
|
+
type: "string",
|
|
31
|
+
requiresArg: false
|
|
32
|
+
})
|
|
33
|
+
.parse();
|
|
34
|
+
const dir_path = argv.run || '';
|
|
35
|
+
const port = argv.port || 5349;
|
|
36
|
+
const api_url = argv.apiurl;
|
|
37
|
+
const chat_mode = argv.chat;
|
|
38
|
+
const llm_model = argv.model;
|
|
39
|
+
if ((dir_path && chat_mode) || (!dir_path && !chat_mode)) {
|
|
40
|
+
console.error([
|
|
41
|
+
'Wrong usage!',
|
|
42
|
+
'You must choose one mode --run or --chat',
|
|
43
|
+
'',
|
|
44
|
+
'Example:',
|
|
45
|
+
'# starts naiv specification mode',
|
|
46
|
+
'swan --chat',
|
|
47
|
+
'',
|
|
48
|
+
'# run current working directory',
|
|
49
|
+
'swan --run --apiurl "https://api.mywebsite.com"',
|
|
50
|
+
'',
|
|
51
|
+
'# run myfolder directory',
|
|
52
|
+
'swan --run myfolder --apiurl "https://api.mywebsite.com"',
|
|
53
|
+
'',
|
|
54
|
+
].join('\n'));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (dir_path) {
|
|
58
|
+
if (!api_url) {
|
|
59
|
+
console.error([
|
|
60
|
+
'Wrong usage!',
|
|
61
|
+
'swan --run must have --apiurl argument',
|
|
62
|
+
'',
|
|
63
|
+
'Example:',
|
|
64
|
+
'# run current working directory',
|
|
65
|
+
'swan --run --apiurl "https://api.mywebsite.com"',
|
|
66
|
+
'',
|
|
67
|
+
'# run myfolder directory',
|
|
68
|
+
'swan --run myfolder --apiurl "https://api.mywebsite.com"',
|
|
69
|
+
'',
|
|
70
|
+
].join('\n'));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
(0, cmd_run_1.cmdRun)(port, dir_path, api_url, llm_model);
|
|
74
|
+
}
|
|
75
|
+
else if (chat_mode) {
|
|
76
|
+
(0, cmd_chat_1.cmdChat)(llm_model).catch(console.error);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=exec.js.map
|
package/dist/exec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../exec.ts"],"names":[],"mappings":";;;;;;AACA,iDAA6C;AAC7C,2CAAwC;AACxC,kDAA0B;AAC1B,+CAA2C;AAE3C,MAAM,IAAI,GAAG,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE;IACb,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK;IAClB,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;CACtC,CAAC;KACD,MAAM,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK;CACnB,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE;IAChB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK;CACnB,CAAC;KACD,MAAM,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,KAAK;CACnB,CAAC;KACD,MAAM,CAAC,OAAO,EAAE;IACf,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK;CACnB,CAAC;KACD,KAAK,EAAsF,CAAC;AAE/F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;AAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;AAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;AAE7B,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IACzD,OAAO,CAAC,KAAK,CAAC;QACZ,cAAc;QACd,0CAA0C;QAC1C,EAAE;QACF,UAAU;QACV,kCAAkC;QAClC,aAAa;QACb,EAAE;QACF,iCAAiC;QACjC,iDAAiD;QACjD,EAAE;QACF,0BAA0B;QAC1B,0DAA0D;QAC1D,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,QAAQ,EAAE,CAAC;IACb,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC;YACZ,cAAc;YACd,wCAAwC;YACxC,EAAE;YACF,UAAU;YACV,iCAAiC;YACjC,iDAAiD;YACjD,EAAE;YACF,0BAA0B;YAC1B,0DAA0D;YAC1D,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAA,gBAAM,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;KAAM,IAAI,SAAS,EAAE,CAAC;IACrB,IAAA,kBAAO,EAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// async function main() {
|
|
4
|
+
// const swan_sample = `
|
|
5
|
+
// app MyApp {
|
|
6
|
+
// entry Home
|
|
7
|
+
// }
|
|
8
|
+
// page Home {
|
|
9
|
+
// header "Welcome"
|
|
10
|
+
// button "Log in" -> Login
|
|
11
|
+
// }
|
|
12
|
+
// component LoginForm {
|
|
13
|
+
// field email
|
|
14
|
+
// field password
|
|
15
|
+
// submit "Continue" -> auth
|
|
16
|
+
// on auth {
|
|
17
|
+
// success -> Dashboard
|
|
18
|
+
// error -> LoginError
|
|
19
|
+
// }
|
|
20
|
+
// }
|
|
21
|
+
// page Login {
|
|
22
|
+
// header "Login"
|
|
23
|
+
// use LoginForm
|
|
24
|
+
// }
|
|
25
|
+
// page LoginError {
|
|
26
|
+
// text "Invalid credentials"
|
|
27
|
+
// button "Retry" -> Login
|
|
28
|
+
// }
|
|
29
|
+
// page Dashboard {
|
|
30
|
+
// header "Dashboard"
|
|
31
|
+
// text "Hello!"
|
|
32
|
+
// button "Logout" -> Home
|
|
33
|
+
// }
|
|
34
|
+
// `;
|
|
35
|
+
// const res = parse(swan_sample);
|
|
36
|
+
// new SWANServer().run({
|
|
37
|
+
// swan_result: res
|
|
38
|
+
// });
|
|
39
|
+
// }
|
|
40
|
+
// main().then(console.log).catch(console.error);
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;AAGA,0BAA0B;AAC1B,0BAA0B;AAC1B,cAAc;AACd,eAAe;AACf,IAAI;AAEJ,cAAc;AACd,qBAAqB;AACrB,6BAA6B;AAC7B,IAAI;AAEJ,wBAAwB;AACxB,gBAAgB;AAChB,mBAAmB;AAEnB,8BAA8B;AAE9B,cAAc;AACd,2BAA2B;AAC3B,0BAA0B;AAC1B,MAAM;AACN,IAAI;AAEJ,eAAe;AACf,mBAAmB;AACnB,kBAAkB;AAClB,IAAI;AAEJ,oBAAoB;AACpB,+BAA+B;AAC/B,4BAA4B;AAC5B,IAAI;AAEJ,mBAAmB;AACnB,uBAAuB;AACvB,kBAAkB;AAClB,4BAA4B;AAC5B,IAAI;AACJ,KAAK;AACL,oCAAoC;AACpC,2BAA2B;AAC3B,uBAAuB;AACvB,QAAQ;AACR,IAAI;AAEJ,iDAAiD"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../prompt.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,iCAAiC,EAAE,MAAM,CAAA;IACzC,SAAS,EAAE,MAAM,CAAA;CAClB;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,UAiDnD"}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getImplPrompt = getImplPrompt;
|
|
4
|
+
function codefence(code) {
|
|
5
|
+
return `\`\`\`\n${code.trim()}\n\`\`\``;
|
|
6
|
+
}
|
|
7
|
+
function getImplPrompt(param) {
|
|
8
|
+
return `
|
|
9
|
+
This is a system blueprint that will related to the task
|
|
10
|
+
|
|
11
|
+
${codefence(param.blueprint)}
|
|
12
|
+
|
|
13
|
+
Look at page "${param.page_name}" and its specification on the blueprint.
|
|
14
|
+
|
|
15
|
+
Your task: implement page "${param.page_name}" on react code typescript.
|
|
16
|
+
|
|
17
|
+
Each page on the blueprint represent the page path itself, let say there are a "page Dashboard", then you can navigate to the page on the path "/Dashboard". Except the entry point app, use root path "/" instead of the page name.
|
|
18
|
+
|
|
19
|
+
This is an example of my expectation how you will implement the page:
|
|
20
|
+
|
|
21
|
+
${codefence(`
|
|
22
|
+
import React, { useState, useEffect } from 'react';
|
|
23
|
+
|
|
24
|
+
export default function ${param.page_name}Page = () => {
|
|
25
|
+
const [somestate, setSomeState] = useState<number>(0);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Some use effect
|
|
29
|
+
}, []);
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
// This is just example you should create your own html layout and class names
|
|
33
|
+
<div className="min-h-screen bg-slate-950 flex flex-col items-center justify-center p-6 font-sans">
|
|
34
|
+
// and the rest of the code
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
`)}
|
|
39
|
+
|
|
40
|
+
Do not import third party library, instead of other third party library use built-in alternative or just give mockup code/result.
|
|
41
|
+
|
|
42
|
+
IMPORTANT CODE STYLE:
|
|
43
|
+
- Use function declarations, not arrow functions, for all top-level functions and components.
|
|
44
|
+
- Use inline exports.
|
|
45
|
+
- Allowed:
|
|
46
|
+
- export function X() {}
|
|
47
|
+
- export default function X() {}
|
|
48
|
+
- Avoid:
|
|
49
|
+
- const X = () => {}
|
|
50
|
+
- export default X
|
|
51
|
+
- separated exports.
|
|
52
|
+
|
|
53
|
+
please return only typescript code with code fence block without any other strings but typescript code!
|
|
54
|
+
|
|
55
|
+
`.trim();
|
|
56
|
+
}
|
|
57
|
+
// console.log(getImplPrompt({
|
|
58
|
+
// page_name: "T_getProductList",
|
|
59
|
+
// types_relative_path: "__flazy/__types__/api/T_getProductList.ts",
|
|
60
|
+
// target_implementation_path: "__flazy/original-implementation/T_getProductList.ts",
|
|
61
|
+
// types_content: `
|
|
62
|
+
// import { Response } from "express";
|
|
63
|
+
// import { ClassConstructor, Transform, Type, plainToInstance } from "class-transformer";
|
|
64
|
+
// import { IsNotEmpty, IsNumber, IsObject, IsBoolean, IsOptional, IsISO8601, IsString, IsEnum, ValidateNested, IsArray, ValidationError, validateOrReject } from "class-validator";
|
|
65
|
+
// import { Product } from '../model/table/Product'
|
|
66
|
+
// class ReturnType_0 {
|
|
67
|
+
// @IsNotEmpty({ message: 'total cannot be empty' })
|
|
68
|
+
// @Transform((param?: any): number | null => (param?.value === null || param?.value === undefined || param?.value === '') ? null : parseFloat(param.value))
|
|
69
|
+
// @IsNumber({}, { message: 'total must be a number (decimal)' })
|
|
70
|
+
// total!: number
|
|
71
|
+
// @IsNotEmpty({ message: 'data cannot be empty' })
|
|
72
|
+
// @IsArray()
|
|
73
|
+
// @ValidateNested({ each: true })
|
|
74
|
+
// @Type(() => Product)
|
|
75
|
+
// data!: Product[]
|
|
76
|
+
// }
|
|
77
|
+
// export type T_getProductList = (request: {
|
|
78
|
+
// }, response: Response) => Promise<ReturnType_0>;
|
|
79
|
+
// export const method = 'get';
|
|
80
|
+
// export const url_path = '/product';
|
|
81
|
+
// export const alias = 'T_getProductList';
|
|
82
|
+
// export const is_streaming = false;
|
|
83
|
+
// `.trim(),
|
|
84
|
+
// description: "get list of products",
|
|
85
|
+
// model_files_list: [
|
|
86
|
+
// '__flazy/__types__/model/Product.ts',
|
|
87
|
+
// '__flazy/__types__/model/User.ts'
|
|
88
|
+
// ]
|
|
89
|
+
// }))
|
|
90
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../prompt.ts"],"names":[],"mappings":";;AASA,sCAiDC;AApDD,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,WAAW,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;AAC1C,CAAC;AACD,SAAgB,aAAa,CAAC,KAAsB;IAClD,OAAO;;;EAGP,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;;gBAEZ,KAAK,CAAC,SAAS;;6BAEF,KAAK,CAAC,SAAS;;;;;;EAM1C,SAAS,CAAC;;;0BAGc,KAAK,CAAC,SAAS;;;;;;;;;;;;;;CAcxC,CAAC;;;;;;;;;;;;;;;;;CAiBD,CAAC,IAAI,EAAE,CAAC;AACT,CAAC;AAED,8BAA8B;AAC9B,mCAAmC;AACnC,sEAAsE;AACtE,uFAAuF;AACvF,qBAAqB;AACrB,sCAAsC;AACtC,0FAA0F;AAC1F,oLAAoL;AACpL,mDAAmD;AAEnD,uBAAuB;AACvB,sDAAsD;AACtD,8JAA8J;AAC9J,mEAAmE;AACnE,mBAAmB;AACnB,qDAAqD;AACrD,eAAe;AACf,oCAAoC;AACpC,yBAAyB;AACzB,qBAAqB;AACrB,IAAI;AAEJ,6CAA6C;AAE7C,mDAAmD;AAEnD,+BAA+B;AAC/B,sCAAsC;AACtC,2CAA2C;AAC3C,qCAAqC;AACrC,YAAY;AACZ,yCAAyC;AACzC,wBAAwB;AACxB,4CAA4C;AAC5C,wCAAwC;AACxC,MAAM;AACN,MAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample-page.d.ts","sourceRoot":"","sources":["../sample-page.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,uBAAuB,GAAE,MAAgB,UAY1E;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA6HxD"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEntryPointCode = getEntryPointCode;
|
|
4
|
+
exports.getLoadingPage = getLoadingPage;
|
|
5
|
+
function getEntryPointCode(main_page_relative_path = './App') {
|
|
6
|
+
return `
|
|
7
|
+
import { createRoot } from 'react-dom/client';
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import App from '${main_page_relative_path}';
|
|
10
|
+
|
|
11
|
+
const doc = document.getElementById('root');
|
|
12
|
+
if (doc) {
|
|
13
|
+
const root = createRoot(doc);
|
|
14
|
+
root.render(<App />);
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
function getLoadingPage(page_name) {
|
|
19
|
+
return `
|
|
20
|
+
import React, { useState, useEffect, useRef } from 'react';
|
|
21
|
+
|
|
22
|
+
export function useLoginPageAutoReload() {
|
|
23
|
+
const reloadingRef = useRef(false);
|
|
24
|
+
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const url = "/__page_status__?name=${page_name}";
|
|
27
|
+
|
|
28
|
+
const checkPageStatus = async () => {
|
|
29
|
+
if (reloadingRef.current) return;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const res = await fetch(url, {
|
|
33
|
+
method: "GET",
|
|
34
|
+
cache: "no-store",
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (res.status === 200) {
|
|
38
|
+
reloadingRef.current = true;
|
|
39
|
+
window.location.reload();
|
|
40
|
+
}
|
|
41
|
+
} catch (err) {
|
|
42
|
+
console.error("Login status check failed:", err);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// run immediately
|
|
47
|
+
checkPageStatus();
|
|
48
|
+
|
|
49
|
+
const intervalId = setInterval(checkPageStatus, 5000);
|
|
50
|
+
|
|
51
|
+
return () => {
|
|
52
|
+
clearInterval(intervalId);
|
|
53
|
+
};
|
|
54
|
+
}, []);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const LoadingPage = () => {
|
|
58
|
+
const [progress, setProgress] = useState(0);
|
|
59
|
+
const [messageIndex, setMessageIndex] = useState(0);
|
|
60
|
+
useLoginPageAutoReload();
|
|
61
|
+
|
|
62
|
+
const messages = [
|
|
63
|
+
"Initializing project structure...",
|
|
64
|
+
"Optimizing asset delivery...",
|
|
65
|
+
"Configuring secure protocols...",
|
|
66
|
+
"Applying final design touches...",
|
|
67
|
+
"Almost there, hang tight!"
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
// Simulate progress loading
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const timer = setInterval(() => {
|
|
73
|
+
setProgress((prev) => (prev < 99 ? prev + 1 : 99));
|
|
74
|
+
}, 200);
|
|
75
|
+
|
|
76
|
+
const messageTimer = setInterval(() => {
|
|
77
|
+
setMessageIndex((prev) => prev < (messages.length - 1) ? (prev + 1) : (messages.length - 1));
|
|
78
|
+
}, 3000);
|
|
79
|
+
|
|
80
|
+
return () => {
|
|
81
|
+
clearInterval(timer);
|
|
82
|
+
clearInterval(messageTimer);
|
|
83
|
+
};
|
|
84
|
+
}, []);
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<div className="min-h-screen bg-slate-950 flex flex-col items-center justify-center p-6 font-sans">
|
|
88
|
+
<div className="w-full max-w-md space-y-8 text-center">
|
|
89
|
+
|
|
90
|
+
{/* Animated Icon / Logo */}
|
|
91
|
+
<div className="relative flex justify-center">
|
|
92
|
+
<div className="w-20 h-20 border-4 border-indigo-500/20 border-t-indigo-500 rounded-full animate-spin"></div>
|
|
93
|
+
<div className="absolute inset-0 flex items-center justify-center">
|
|
94
|
+
<div className="w-10 h-10 bg-indigo-500 rounded-lg animate-pulse shadow-[0_0_20px_rgba(99,102,241,0.6)]"></div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
{/* Text Content */}
|
|
99
|
+
<div className="space-y-3">
|
|
100
|
+
<h1 className="text-3xl font-bold text-white tracking-tight">
|
|
101
|
+
Building Page ${page_name}
|
|
102
|
+
</h1>
|
|
103
|
+
<p className="text-slate-400 text-lg h-6 transition-all duration-500 ease-in-out">
|
|
104
|
+
{messages[messageIndex]}
|
|
105
|
+
</p>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
{/* Progress Bar Container */}
|
|
109
|
+
<div className="space-y-2">
|
|
110
|
+
<div className="w-full bg-slate-800 rounded-full h-2 overflow-hidden border border-slate-700">
|
|
111
|
+
<div
|
|
112
|
+
className="bg-gradient-to-r from-indigo-500 to-purple-500 h-full transition-all duration-300 ease-out"
|
|
113
|
+
style={{ width: \`\${progress}%\` }}
|
|
114
|
+
></div>
|
|
115
|
+
</div>
|
|
116
|
+
<div className="flex justify-between text-xs font-mono text-slate-500 uppercase tracking-widest">
|
|
117
|
+
<span>Status: Processing</span>
|
|
118
|
+
<span>{progress}%</span>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
{/* Decorative elements */}
|
|
123
|
+
<div className="pt-8 grid grid-cols-3 gap-4 opacity-50">
|
|
124
|
+
{[1, 2, 3].map((i) => (
|
|
125
|
+
<div key={i} className="h-1 bg-slate-800 rounded-full overflow-hidden">
|
|
126
|
+
<div
|
|
127
|
+
className={\`h-full bg-slate-600 animate-[shimmer_2s_infinite]\`}
|
|
128
|
+
style={{ animationDelay: \`\${i * 0.2}s\` }}
|
|
129
|
+
></div>
|
|
130
|
+
</div>
|
|
131
|
+
))}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
{/* Background Glow */}
|
|
136
|
+
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full h-full md:w-[500px] md:h-[500px] bg-indigo-500/10 blur-[120px] rounded-full -z-10"></div>
|
|
137
|
+
</div>
|
|
138
|
+
);
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
export default LoadingPage;
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=sample-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample-page.js","sourceRoot":"","sources":["../sample-page.ts"],"names":[],"mappings":";;AAAA,8CAYC;AAED,wCA6HC;AA3ID,SAAgB,iBAAiB,CAAC,0BAAkC,OAAO;IACzE,OAAO;;;mBAGU,uBAAuB;;;;;;;CAOzC,CAAA;AACD,CAAC;AAED,SAAgB,cAAc,CAAC,SAAiB;IAC9C,OAAO;;;;;;;yCAOgC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA2EtB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCpC,CAAC;AACF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@naiv/swan",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "rm -rf dist && tsc && npm unlink -g && npm link",
|
|
10
|
+
"start": "node dist",
|
|
11
|
+
"dev": "npm run build && npm start",
|
|
12
|
+
"test": "rm -rf test/api && npm run build && swan -d test -o test"
|
|
13
|
+
},
|
|
14
|
+
"bin": {
|
|
15
|
+
"swan": "dist/exec.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"package.json",
|
|
20
|
+
"SWAN-DSL.md"
|
|
21
|
+
],
|
|
22
|
+
"description": "",
|
|
23
|
+
"keywords": [],
|
|
24
|
+
"author": "",
|
|
25
|
+
"license": "ISC",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/cors": "^2.8.19",
|
|
28
|
+
"@types/express": "^5.0.6",
|
|
29
|
+
"@types/moment": "^2.11.29",
|
|
30
|
+
"@types/node": "^25.3.0",
|
|
31
|
+
"@types/yargs": "^17.0.35",
|
|
32
|
+
"typescript": "^5.9.3"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@graf-research/llm-runner": "^0.0.21",
|
|
36
|
+
"@naiv/react-bundler": "^0.0.6",
|
|
37
|
+
"@naiv/swan-dsl": "^0.0.3",
|
|
38
|
+
"axios": "^1.13.5",
|
|
39
|
+
"cors": "^2.8.6",
|
|
40
|
+
"enquirer": "^2.4.1",
|
|
41
|
+
"express": "^5.2.1",
|
|
42
|
+
"glob": "^13.0.6",
|
|
43
|
+
"listr2": "^10.1.0",
|
|
44
|
+
"moment": "^2.30.1",
|
|
45
|
+
"react": "^19.2.4",
|
|
46
|
+
"react-dom": "^19.2.4",
|
|
47
|
+
"tailwindcss": "^4.2.0",
|
|
48
|
+
"yargs": "^18.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|