@modularizer/plat 0.1.0
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/README.md +574 -0
- package/bin/z2.js +5 -0
- package/dist/args/coerce.d.ts +54 -0
- package/dist/args/coerce.d.ts.map +1 -0
- package/dist/args/coerce.js +236 -0
- package/dist/args/coerce.js.map +1 -0
- package/dist/args/index.d.ts +2 -0
- package/dist/args/index.d.ts.map +1 -0
- package/dist/args/index.js +2 -0
- package/dist/args/index.js.map +1 -0
- package/dist/args/scalars.d.ts +87 -0
- package/dist/args/scalars.d.ts.map +1 -0
- package/dist/args/scalars.js +22 -0
- package/dist/args/scalars.js.map +1 -0
- package/dist/args/validate.d.ts +23 -0
- package/dist/args/validate.d.ts.map +1 -0
- package/dist/args/validate.js +185 -0
- package/dist/args/validate.js.map +1 -0
- package/dist/args/z2.d.ts +27 -0
- package/dist/args/z2.d.ts.map +1 -0
- package/dist/args/z2.js +24 -0
- package/dist/args/z2.js.map +1 -0
- package/dist/cli/commands/api-proxy.d.ts +9 -0
- package/dist/cli/commands/api-proxy.d.ts.map +1 -0
- package/dist/cli/commands/api-proxy.js +292 -0
- package/dist/cli/commands/api-proxy.js.map +1 -0
- package/dist/cli/commands/env.d.ts +32 -0
- package/dist/cli/commands/env.d.ts.map +1 -0
- package/dist/cli/commands/env.js +157 -0
- package/dist/cli/commands/env.js.map +1 -0
- package/dist/cli/commands/gen.d.ts +2 -0
- package/dist/cli/commands/gen.d.ts.map +1 -0
- package/dist/cli/commands/gen.js +88 -0
- package/dist/cli/commands/gen.js.map +1 -0
- package/dist/cli/commands/init-project.d.ts +9 -0
- package/dist/cli/commands/init-project.d.ts.map +1 -0
- package/dist/cli/commands/init-project.js +143 -0
- package/dist/cli/commands/init-project.js.map +1 -0
- package/dist/cli/commands/jwt-cmd.d.ts +10 -0
- package/dist/cli/commands/jwt-cmd.d.ts.map +1 -0
- package/dist/cli/commands/jwt-cmd.js +33 -0
- package/dist/cli/commands/jwt-cmd.js.map +1 -0
- package/dist/cli/commands/run.d.ts +5 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +31 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +2 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +43 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +5 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +119 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/jwt-helper.d.ts +32 -0
- package/dist/cli/jwt-helper.d.ts.map +1 -0
- package/dist/cli/jwt-helper.js +84 -0
- package/dist/cli/jwt-helper.js.map +1 -0
- package/dist/cli/proxy.d.ts +40 -0
- package/dist/cli/proxy.d.ts.map +1 -0
- package/dist/cli/proxy.js +171 -0
- package/dist/cli/proxy.js.map +1 -0
- package/dist/cli/runtime.d.ts +17 -0
- package/dist/cli/runtime.d.ts.map +1 -0
- package/dist/cli/runtime.js +286 -0
- package/dist/cli/runtime.js.map +1 -0
- package/dist/cli/spec-source.d.ts +13 -0
- package/dist/cli/spec-source.d.ts.map +1 -0
- package/dist/cli/spec-source.js +207 -0
- package/dist/cli/spec-source.js.map +1 -0
- package/dist/cli/z2.d.ts +7 -0
- package/dist/cli/z2.d.ts.map +1 -0
- package/dist/cli/z2.js +93 -0
- package/dist/cli/z2.js.map +1 -0
- package/dist/client/file-transport-plugin.d.ts +25 -0
- package/dist/client/file-transport-plugin.d.ts.map +1 -0
- package/dist/client/file-transport-plugin.js +80 -0
- package/dist/client/file-transport-plugin.js.map +1 -0
- package/dist/client/http-transport-plugin.d.ts +27 -0
- package/dist/client/http-transport-plugin.d.ts.map +1 -0
- package/dist/client/http-transport-plugin.js +48 -0
- package/dist/client/http-transport-plugin.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/openapi-client.d.ts +332 -0
- package/dist/client/openapi-client.d.ts.map +1 -0
- package/dist/client/openapi-client.js +879 -0
- package/dist/client/openapi-client.js.map +1 -0
- package/dist/client/proxy.d.ts +5 -0
- package/dist/client/proxy.d.ts.map +1 -0
- package/dist/client/proxy.js +353 -0
- package/dist/client/proxy.js.map +1 -0
- package/dist/client/request-builder.d.ts +4 -0
- package/dist/client/request-builder.d.ts.map +1 -0
- package/dist/client/request-builder.js +88 -0
- package/dist/client/request-builder.js.map +1 -0
- package/dist/client/rpc-transport-plugin.d.ts +17 -0
- package/dist/client/rpc-transport-plugin.d.ts.map +1 -0
- package/dist/client/rpc-transport-plugin.js +69 -0
- package/dist/client/rpc-transport-plugin.js.map +1 -0
- package/dist/client/tools.d.ts +69 -0
- package/dist/client/tools.d.ts.map +1 -0
- package/dist/client/tools.js +122 -0
- package/dist/client/tools.js.map +1 -0
- package/dist/client/transport-plugin.d.ts +62 -0
- package/dist/client/transport-plugin.d.ts.map +1 -0
- package/dist/client/transport-plugin.js +40 -0
- package/dist/client/transport-plugin.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +9 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +29 -0
- package/dist/logging.js.map +1 -0
- package/dist/rpc.d.ts +39 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -0
- package/dist/server/auth/index.d.ts +4 -0
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/auth/index.js +2 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/auth/jwt.d.ts +27 -0
- package/dist/server/auth/jwt.d.ts.map +1 -0
- package/dist/server/auth/jwt.js +95 -0
- package/dist/server/auth/jwt.js.map +1 -0
- package/dist/server/cache/index.d.ts +2 -0
- package/dist/server/cache/index.d.ts.map +1 -0
- package/dist/server/cache/index.js +2 -0
- package/dist/server/cache/index.js.map +1 -0
- package/dist/server/cache/utils.d.ts +30 -0
- package/dist/server/cache/utils.d.ts.map +1 -0
- package/dist/server/cache/utils.js +116 -0
- package/dist/server/cache/utils.js.map +1 -0
- package/dist/server/call-sessions.d.ts +50 -0
- package/dist/server/call-sessions.d.ts.map +1 -0
- package/dist/server/call-sessions.js +90 -0
- package/dist/server/call-sessions.js.map +1 -0
- package/dist/server/config/bucket.d.ts +9 -0
- package/dist/server/config/bucket.d.ts.map +1 -0
- package/dist/server/config/bucket.js +57 -0
- package/dist/server/config/bucket.js.map +1 -0
- package/dist/server/config/defaults.d.ts +3 -0
- package/dist/server/config/defaults.d.ts.map +1 -0
- package/dist/server/config/defaults.js +29 -0
- package/dist/server/config/defaults.js.map +1 -0
- package/dist/server/config/index.d.ts +5 -0
- package/dist/server/config/index.d.ts.map +1 -0
- package/dist/server/config/index.js +5 -0
- package/dist/server/config/index.js.map +1 -0
- package/dist/server/config/logger.d.ts +3 -0
- package/dist/server/config/logger.d.ts.map +1 -0
- package/dist/server/config/logger.js +2 -0
- package/dist/server/config/logger.js.map +1 -0
- package/dist/server/config/types.d.ts +198 -0
- package/dist/server/config/types.d.ts.map +1 -0
- package/dist/server/config/types.js +2 -0
- package/dist/server/config/types.js.map +1 -0
- package/dist/server/core.d.ts +42 -0
- package/dist/server/core.d.ts.map +1 -0
- package/dist/server/core.js +202 -0
- package/dist/server/core.js.map +1 -0
- package/dist/server/env.d.ts +39 -0
- package/dist/server/env.d.ts.map +1 -0
- package/dist/server/env.js +66 -0
- package/dist/server/env.js.map +1 -0
- package/dist/server/file-queue-protocol-plugin.d.ts +7 -0
- package/dist/server/file-queue-protocol-plugin.d.ts.map +1 -0
- package/dist/server/file-queue-protocol-plugin.js +150 -0
- package/dist/server/file-queue-protocol-plugin.js.map +1 -0
- package/dist/server/file-queue.d.ts +25 -0
- package/dist/server/file-queue.d.ts.map +1 -0
- package/dist/server/file-queue.js +2 -0
- package/dist/server/file-queue.js.map +1 -0
- package/dist/server/help.d.ts +19 -0
- package/dist/server/help.d.ts.map +1 -0
- package/dist/server/help.js +91 -0
- package/dist/server/help.js.map +1 -0
- package/dist/server/index.d.ts +29 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +29 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/operation-registry.d.ts +9 -0
- package/dist/server/operation-registry.d.ts.map +1 -0
- package/dist/server/operation-registry.js +16 -0
- package/dist/server/operation-registry.js.map +1 -0
- package/dist/server/param-aliases.d.ts +40 -0
- package/dist/server/param-aliases.d.ts.map +1 -0
- package/dist/server/param-aliases.js +112 -0
- package/dist/server/param-aliases.js.map +1 -0
- package/dist/server/protocol-plugin.d.ts +72 -0
- package/dist/server/protocol-plugin.d.ts.map +1 -0
- package/dist/server/protocol-plugin.js +2 -0
- package/dist/server/protocol-plugin.js.map +1 -0
- package/dist/server/rate-limit/index.d.ts +2 -0
- package/dist/server/rate-limit/index.d.ts.map +1 -0
- package/dist/server/rate-limit/index.js +2 -0
- package/dist/server/rate-limit/index.js.map +1 -0
- package/dist/server/rate-limit/utils.d.ts +27 -0
- package/dist/server/rate-limit/utils.d.ts.map +1 -0
- package/dist/server/rate-limit/utils.js +126 -0
- package/dist/server/rate-limit/utils.js.map +1 -0
- package/dist/server/routing.d.ts +39 -0
- package/dist/server/routing.d.ts.map +1 -0
- package/dist/server/routing.js +70 -0
- package/dist/server/routing.js.map +1 -0
- package/dist/server/rpc-protocol-plugin.d.ts +12 -0
- package/dist/server/rpc-protocol-plugin.d.ts.map +1 -0
- package/dist/server/rpc-protocol-plugin.js +134 -0
- package/dist/server/rpc-protocol-plugin.js.map +1 -0
- package/dist/server/server.d.ts +143 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1161 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/token-limit/index.d.ts +2 -0
- package/dist/server/token-limit/index.d.ts.map +1 -0
- package/dist/server/token-limit/index.js +2 -0
- package/dist/server/token-limit/index.js.map +1 -0
- package/dist/server/token-limit/utils.d.ts +44 -0
- package/dist/server/token-limit/utils.d.ts.map +1 -0
- package/dist/server/token-limit/utils.js +260 -0
- package/dist/server/token-limit/utils.js.map +1 -0
- package/dist/server/tools.d.ts +51 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +225 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server/transports.d.ts +25 -0
- package/dist/server/transports.d.ts.map +1 -0
- package/dist/server/transports.js +2 -0
- package/dist/server/transports.js.map +1 -0
- package/dist/spec/decorators.d.ts +41 -0
- package/dist/spec/decorators.d.ts.map +1 -0
- package/dist/spec/decorators.js +93 -0
- package/dist/spec/decorators.js.map +1 -0
- package/dist/spec/index.d.ts +3 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +3 -0
- package/dist/spec/index.js.map +1 -0
- package/dist/spec/metadata.d.ts +5 -0
- package/dist/spec/metadata.d.ts.map +1 -0
- package/dist/spec/metadata.js +37 -0
- package/dist/spec/metadata.js.map +1 -0
- package/dist/types/client.d.ts +81 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +14 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/endpoints.d.ts +76 -0
- package/dist/types/endpoints.d.ts.map +1 -0
- package/dist/types/endpoints.js +2 -0
- package/dist/types/endpoints.js.map +1 -0
- package/dist/types/errors.d.ts +86 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +153 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http.d.ts +80 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +61 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/openapi.d.ts +220 -0
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/types/openapi.js +11 -0
- package/dist/types/openapi.js.map +1 -0
- package/dist/types/opts.d.ts +46 -0
- package/dist/types/opts.d.ts.map +1 -0
- package/dist/types/opts.js +2 -0
- package/dist/types/opts.js.map +1 -0
- package/dist/types/plugins.d.ts +93 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/plugins.js +5 -0
- package/dist/types/plugins.js.map +1 -0
- package/dist/types/tools.d.ts +52 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +2 -0
- package/dist/types/tools.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize plat guidance in user's project
|
|
3
|
+
* Injects/upserts AGENTS.md and CLAUDE.md
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Inject or upsert guidance files into user's project
|
|
7
|
+
*/
|
|
8
|
+
export declare function initProject(cwd: string): void;
|
|
9
|
+
//# sourceMappingURL=init-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init-project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqGH;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAuC7C"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize plat guidance in user's project
|
|
3
|
+
* Injects/upserts AGENTS.md and CLAUDE.md
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
const AGENTS_TEMPLATE = `# AGENTS.md - Guide for AI Developers
|
|
8
|
+
|
|
9
|
+
**This file is for Claude and other AI agents working on this plat project.**
|
|
10
|
+
|
|
11
|
+
## Quick Reference
|
|
12
|
+
|
|
13
|
+
- **Never duplicate types** - Use Zod schemas, reference with \`typeof Schema\`
|
|
14
|
+
- **Always use generated client** - Never fetch() directly
|
|
15
|
+
- **Always use RouteContext** - Never req.user, use ctx.auth
|
|
16
|
+
- **Controllers are abstract** - Implementations extend and implement
|
|
17
|
+
- **Run gen after changes** - \`npm run gen\`
|
|
18
|
+
|
|
19
|
+
## Zero Tolerance Rules
|
|
20
|
+
|
|
21
|
+
❌ Don't import types between server/client - One schema, two places
|
|
22
|
+
❌ Don't make fetch calls - Use generated \`createClientProxy()\`
|
|
23
|
+
❌ Don't use req.X - Everything comes from ctx
|
|
24
|
+
❌ Don't add validation twice - Zod does it all
|
|
25
|
+
❌ Don't define types twice - Define in Zod once
|
|
26
|
+
|
|
27
|
+
## The Pattern
|
|
28
|
+
|
|
29
|
+
1. **api.ts**: Define abstract @Controller with Zod schemas
|
|
30
|
+
2. **controllers.ts**: Implement handlers, use ctx for everything
|
|
31
|
+
3. **npm run gen**: Generate client, OpenAPI, CLI
|
|
32
|
+
4. **Use everywhere**: Generated client is your API
|
|
33
|
+
|
|
34
|
+
## See Full Guide
|
|
35
|
+
|
|
36
|
+
For comprehensive guidance, read:
|
|
37
|
+
- \`node_modules/plat/AGENTS.md\` - Complete AI guide
|
|
38
|
+
- \`node_modules/plat/PATTERNS.md\` - Every pattern with examples
|
|
39
|
+
|
|
40
|
+
## Ask Before Deviating
|
|
41
|
+
|
|
42
|
+
If you're about to:
|
|
43
|
+
- Create a custom HTTP client
|
|
44
|
+
- Define types outside Zod
|
|
45
|
+
- Use fetch() directly
|
|
46
|
+
- Pass data through middleware
|
|
47
|
+
|
|
48
|
+
**STOP.** These are anti-patterns. Check AGENTS.md.
|
|
49
|
+
`;
|
|
50
|
+
const CLAUDE_TEMPLATE = `# CLAUDE.md - plat Framework Guidance
|
|
51
|
+
|
|
52
|
+
This project uses plat. When you work on APIs, follow these rules.
|
|
53
|
+
|
|
54
|
+
## Immediate Rules
|
|
55
|
+
|
|
56
|
+
1. **Schemas first** - Define in \`api.ts\` with Zod
|
|
57
|
+
2. **Abstract controllers** - Methods are contracts
|
|
58
|
+
3. **Run code gen** - \`npm run gen\` after API changes
|
|
59
|
+
4. **Use generated client** - Not fetch()
|
|
60
|
+
5. **Context not req** - \`ctx.auth\`, \`ctx.cache\`, \`ctx.rateLimit\`
|
|
61
|
+
|
|
62
|
+
## If You're About to Write Code
|
|
63
|
+
|
|
64
|
+
### Adding an endpoint?
|
|
65
|
+
1. Add abstract method to @Controller in api.ts
|
|
66
|
+
2. Implement in controller
|
|
67
|
+
3. Run \`npm run gen\`
|
|
68
|
+
4. Tests use generated client
|
|
69
|
+
|
|
70
|
+
### Using authentication?
|
|
71
|
+
- \`{ auth: 'jwt' }\` in route options
|
|
72
|
+
- Access via \`ctx.auth?.user\`
|
|
73
|
+
- NOT \`req.user\`
|
|
74
|
+
|
|
75
|
+
### Using cache?
|
|
76
|
+
- Add \`cache: { key: ':route', ttl: 300 }\`
|
|
77
|
+
- Check \`ctx.cache?.hit\` in handler
|
|
78
|
+
- Response cached automatically
|
|
79
|
+
|
|
80
|
+
### Making client calls?
|
|
81
|
+
- Only use \`createClientProxy(YourApi, { baseUrl, token })\`
|
|
82
|
+
- NOT fetch(), axios, or custom clients
|
|
83
|
+
- Generated client handles serialization, validation
|
|
84
|
+
|
|
85
|
+
## See These Files
|
|
86
|
+
|
|
87
|
+
- \`api.ts\` - All controllers and schemas (source of truth)
|
|
88
|
+
- \`controllers.ts\` - Handler implementations
|
|
89
|
+
- \`node_modules/plat/AGENTS.md\` - Full AI guide
|
|
90
|
+
- \`node_modules/plat/PATTERNS.md\` - Copy-paste patterns
|
|
91
|
+
|
|
92
|
+
## Emergency Check
|
|
93
|
+
|
|
94
|
+
Before commit, verify:
|
|
95
|
+
- [ ] No \`fetch()\` calls in app code
|
|
96
|
+
- [ ] No type definitions outside Zod schemas
|
|
97
|
+
- [ ] All data passing through function params or ctx
|
|
98
|
+
- [ ] Client uses generated proxy
|
|
99
|
+
- [ ] \`npm run gen\` has been run
|
|
100
|
+
`;
|
|
101
|
+
/**
|
|
102
|
+
* Inject or upsert guidance files into user's project
|
|
103
|
+
*/
|
|
104
|
+
export function initProject(cwd) {
|
|
105
|
+
try {
|
|
106
|
+
const agentsPath = path.join(cwd, 'AGENTS.md');
|
|
107
|
+
const claudePath = path.join(cwd, 'CLAUDE.md');
|
|
108
|
+
// Write AGENTS.md
|
|
109
|
+
if (fs.existsSync(agentsPath)) {
|
|
110
|
+
console.log('📄 AGENTS.md already exists (not overwriting)');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
fs.writeFileSync(agentsPath, AGENTS_TEMPLATE);
|
|
114
|
+
console.log('✅ Created AGENTS.md');
|
|
115
|
+
}
|
|
116
|
+
// Write CLAUDE.md
|
|
117
|
+
if (fs.existsSync(claudePath)) {
|
|
118
|
+
console.log('📄 CLAUDE.md already exists (not overwriting)');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
fs.writeFileSync(claudePath, CLAUDE_TEMPLATE);
|
|
122
|
+
console.log('✅ Created CLAUDE.md');
|
|
123
|
+
}
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log('🤖 AI Agent Guidance Installed');
|
|
126
|
+
console.log('');
|
|
127
|
+
console.log('These files help Claude and other AI understand plat:');
|
|
128
|
+
console.log(' - AGENTS.md - Complete AI developer guide');
|
|
129
|
+
console.log(' - CLAUDE.md - This project\'s plat patterns');
|
|
130
|
+
console.log('');
|
|
131
|
+
console.log('Claude will read these automatically in future sessions.');
|
|
132
|
+
console.log('');
|
|
133
|
+
// Also initialize .env
|
|
134
|
+
console.log('Setting up environment...');
|
|
135
|
+
const { envUpsert } = require('./env');
|
|
136
|
+
envUpsert(cwd);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error('❌ Error initializing project:', error.message);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=init-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../../../src/cli/commands/init-project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CvB,CAAA;AAED,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDvB,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAE9C,kBAAkB;QAClB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;QAC9D,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;YAC7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QACpC,CAAC;QAED,kBAAkB;QAClB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;QAC9D,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;YAC7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QACpC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEf,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACtC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT command for token generation
|
|
3
|
+
* Wrapper around jwt-helper functionality
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate JWT token from CLI arguments
|
|
7
|
+
* Usage: plat jwt generate --user-id=1 --role=admin
|
|
8
|
+
*/
|
|
9
|
+
export declare function jwtGenerate(cwd: string, args: string[]): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=jwt-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/jwt-cmd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT command for token generation
|
|
3
|
+
* Wrapper around jwt-helper functionality
|
|
4
|
+
*/
|
|
5
|
+
import dotenv from 'dotenv';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { generateJwtFromCliArgs, getAuthHeader } from '../jwt-helper';
|
|
8
|
+
/**
|
|
9
|
+
* Generate JWT token from CLI arguments
|
|
10
|
+
* Usage: plat jwt generate --user-id=1 --role=admin
|
|
11
|
+
*/
|
|
12
|
+
export async function jwtGenerate(cwd, args) {
|
|
13
|
+
try {
|
|
14
|
+
// Load .env from cwd
|
|
15
|
+
const envPath = path.join(cwd, '.env');
|
|
16
|
+
dotenv.config({ path: envPath });
|
|
17
|
+
// Generate token
|
|
18
|
+
const token = generateJwtFromCliArgs(args);
|
|
19
|
+
console.log('✅ JWT token generated successfully');
|
|
20
|
+
console.log('');
|
|
21
|
+
console.log('Token:');
|
|
22
|
+
console.log(token);
|
|
23
|
+
console.log('');
|
|
24
|
+
console.log('Usage in curl request:');
|
|
25
|
+
const baseUrl = process.env.API_BASE_URL || process.env.BASE_URL || 'http://localhost:3000';
|
|
26
|
+
console.log(` curl -H "Authorization: ${getAuthHeader(token)}" ${baseUrl}/api/orders`);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error('❌ Error:', error.message);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=jwt-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/jwt-cmd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAErE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAc;IAC3D,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAEhC,iBAAiB;QACjB,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAE1C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB,CAAA;QAC3F,OAAO,CAAC,GAAG,CACT,6BAA6B,aAAa,CAAC,KAAK,CAAC,KAAK,OAAO,aAAa,CAC3E,CAAA;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { runCli } from '../runtime';
|
|
2
|
+
import { getArgValue, getFirstPositionalArg, hasDirectorySpec, isUrl, loadSpecSource, looksLikeHost, stripFirstPositionalArg, stripOption } from '../spec-source';
|
|
3
|
+
/**
|
|
4
|
+
* plat run [--src <file-or-url>] <command> [--key=value ...]
|
|
5
|
+
*/
|
|
6
|
+
export async function runOpenApi(cwd, argv = []) {
|
|
7
|
+
const explicitSrc = getArgValue(argv, '--src');
|
|
8
|
+
const positionalSrc = explicitSrc ? undefined : await inferPositionalSource(argv, cwd);
|
|
9
|
+
const src = explicitSrc ?? positionalSrc;
|
|
10
|
+
const withoutSrcFlag = stripOption(argv, '--src');
|
|
11
|
+
const passthrough = positionalSrc ? stripFirstPositionalArg(withoutSrcFlag) : withoutSrcFlag;
|
|
12
|
+
const { spec, baseUrl } = await loadSpecSource(src, cwd);
|
|
13
|
+
await runCli(spec, passthrough, { baseUrl });
|
|
14
|
+
}
|
|
15
|
+
async function inferPositionalSource(argv, cwd) {
|
|
16
|
+
const candidate = getFirstPositionalArg(argv);
|
|
17
|
+
if (!candidate)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (isUrl(candidate))
|
|
20
|
+
return candidate;
|
|
21
|
+
if (/\.(json|ya?ml)$/i.test(candidate))
|
|
22
|
+
return candidate;
|
|
23
|
+
if (looksLikeHost(candidate))
|
|
24
|
+
return candidate;
|
|
25
|
+
if (candidate.includes('/') || candidate.includes('\\'))
|
|
26
|
+
return candidate;
|
|
27
|
+
if (await hasDirectorySpec(candidate, cwd))
|
|
28
|
+
return candidate;
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjK;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,OAAiB,EAAE;IAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACtF,MAAM,GAAG,GAAG,WAAW,IAAI,aAAa,CAAA;IACxC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACjD,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;IAC5F,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACxD,MAAM,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAc,EAAE,GAAW;IAC9D,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAA;IAChC,IAAI,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACtC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACxD,IAAI,aAAa,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACzE,IAAI,MAAM,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5D,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAWA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,IAAI,CA+BvE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = path.dirname(__filename);
|
|
6
|
+
function scriptDir() {
|
|
7
|
+
return path.resolve(__dirname, '../../..', 'scripts');
|
|
8
|
+
}
|
|
9
|
+
export function serveControllers(cwd, argv = []) {
|
|
10
|
+
const scriptPath = path.join(scriptDir(), 'serve-glob.ts');
|
|
11
|
+
const args = [];
|
|
12
|
+
let sawSrc = false;
|
|
13
|
+
for (let i = 0; i < argv.length; i++) {
|
|
14
|
+
const arg = argv[i];
|
|
15
|
+
if (!arg?.startsWith('--'))
|
|
16
|
+
continue;
|
|
17
|
+
if (['--src', '--port', '--host', '--cors', '--openapi'].includes(arg)) {
|
|
18
|
+
if (arg === '--src')
|
|
19
|
+
sawSrc = true;
|
|
20
|
+
args.push(arg);
|
|
21
|
+
if (argv[i + 1] && !argv[i + 1].startsWith('--')) {
|
|
22
|
+
args.push(argv[i + 1]);
|
|
23
|
+
i += 1;
|
|
24
|
+
}
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (['--src', '--port', '--host', '--cors', '--openapi'].some((flag) => arg.startsWith(`${flag}=`))) {
|
|
28
|
+
if (arg.startsWith('--src='))
|
|
29
|
+
sawSrc = true;
|
|
30
|
+
args.push(arg);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!sawSrc) {
|
|
34
|
+
const positional = argv.find((arg) => arg && !arg.startsWith('--'));
|
|
35
|
+
if (positional)
|
|
36
|
+
args.push('--src', positional);
|
|
37
|
+
}
|
|
38
|
+
execSync(`npx tsx "${scriptPath}" ${args.map((arg) => `"${arg}"`).join(' ')}`.trim(), {
|
|
39
|
+
cwd,
|
|
40
|
+
stdio: 'inherit',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1C,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAiB,EAAE;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC;YAAE,SAAQ;QACpC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvE,IAAI,GAAG,KAAK,OAAO;gBAAE,MAAM,GAAG,IAAI,CAAA;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACd,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAA;gBACvB,CAAC,IAAI,CAAC,CAAA;YACR,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;YACpG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAA;YAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACnE,IAAI,UAAU;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAChD,CAAC;IAED,QAAQ,CAAC,YAAY,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;QACpF,GAAG;QACH,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AA6FA;;GAEG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiDvC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import chokidar from 'chokidar';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const state = {
|
|
5
|
+
currentProcess: null,
|
|
6
|
+
lastChangeTime: 0,
|
|
7
|
+
isRunning: false,
|
|
8
|
+
pendingRun: false,
|
|
9
|
+
};
|
|
10
|
+
const DEBOUNCE_MS = 300;
|
|
11
|
+
/**
|
|
12
|
+
* Run the gen command
|
|
13
|
+
*/
|
|
14
|
+
function runGen(cwd) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
try {
|
|
17
|
+
console.log('🔄 Running npm run gen...');
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
execSync('npm run gen', {
|
|
20
|
+
cwd,
|
|
21
|
+
stdio: 'inherit',
|
|
22
|
+
});
|
|
23
|
+
const duration = Date.now() - startTime;
|
|
24
|
+
console.log(`✅ Gen completed in ${duration}ms`);
|
|
25
|
+
resolve();
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error('❌ Gen failed:', error.message);
|
|
29
|
+
reject(error);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Schedule a gen run with debouncing and restart logic
|
|
35
|
+
*/
|
|
36
|
+
function scheduleGen(cwd) {
|
|
37
|
+
state.pendingRun = true;
|
|
38
|
+
// Clear any existing debounce
|
|
39
|
+
if (state.currentProcess) {
|
|
40
|
+
clearTimeout(state.currentProcess);
|
|
41
|
+
}
|
|
42
|
+
// Set debounce timer
|
|
43
|
+
state.currentProcess = setTimeout(() => {
|
|
44
|
+
state.currentProcess = null;
|
|
45
|
+
// If we're already running, just mark pending
|
|
46
|
+
if (state.isRunning) {
|
|
47
|
+
console.log('📝 Change detected (queued for restart)');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Run gen
|
|
51
|
+
state.isRunning = true;
|
|
52
|
+
state.pendingRun = false;
|
|
53
|
+
runGen(cwd)
|
|
54
|
+
.then(() => {
|
|
55
|
+
state.isRunning = false;
|
|
56
|
+
// If there were changes while running, restart
|
|
57
|
+
if (state.pendingRun) {
|
|
58
|
+
state.pendingRun = false;
|
|
59
|
+
console.log('🔄 Restarting gen due to new changes...');
|
|
60
|
+
scheduleGen(cwd);
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
.catch((error) => {
|
|
64
|
+
state.isRunning = false;
|
|
65
|
+
console.error('Error during gen:', error);
|
|
66
|
+
// Continue watching even after error
|
|
67
|
+
if (state.pendingRun) {
|
|
68
|
+
state.pendingRun = false;
|
|
69
|
+
scheduleGen(cwd);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}, DEBOUNCE_MS);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Watch *.api.ts files and regenerate on changes
|
|
76
|
+
*/
|
|
77
|
+
export function watch(cwd) {
|
|
78
|
+
console.log('👁️ Watching for *.api.ts changes...');
|
|
79
|
+
console.log(`📁 Watching: ${cwd}`);
|
|
80
|
+
console.log('⌛ Press Ctrl+C to stop');
|
|
81
|
+
console.log('');
|
|
82
|
+
// Watch for .api.ts files
|
|
83
|
+
const watcher = chokidar.watch('**/*.api.ts', {
|
|
84
|
+
cwd,
|
|
85
|
+
ignored: /node_modules/,
|
|
86
|
+
persistent: true,
|
|
87
|
+
ignoreInitial: true,
|
|
88
|
+
awaitWriteFinish: {
|
|
89
|
+
stabilityThreshold: 200,
|
|
90
|
+
pollInterval: 100,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
watcher.on('change', (filePath) => {
|
|
94
|
+
const fullPath = path.join(cwd, filePath);
|
|
95
|
+
console.log(`📝 Changed: ${filePath}`);
|
|
96
|
+
scheduleGen(cwd);
|
|
97
|
+
});
|
|
98
|
+
watcher.on('add', (filePath) => {
|
|
99
|
+
console.log(`➕ Added: ${filePath}`);
|
|
100
|
+
scheduleGen(cwd);
|
|
101
|
+
});
|
|
102
|
+
watcher.on('unlink', (filePath) => {
|
|
103
|
+
console.log(`🗑️ Deleted: ${filePath}`);
|
|
104
|
+
scheduleGen(cwd);
|
|
105
|
+
});
|
|
106
|
+
watcher.on('error', (error) => {
|
|
107
|
+
console.error('❌ Watcher error:', error);
|
|
108
|
+
});
|
|
109
|
+
// Handle graceful shutdown
|
|
110
|
+
process.on('SIGINT', () => {
|
|
111
|
+
console.log('\n\n👋 Stopping watcher...');
|
|
112
|
+
watcher.close();
|
|
113
|
+
if (state.currentProcess) {
|
|
114
|
+
clearTimeout(state.currentProcess);
|
|
115
|
+
}
|
|
116
|
+
process.exit(0);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './runtime';
|
|
2
|
+
export * from './proxy';
|
|
3
|
+
export * from './jwt-helper';
|
|
4
|
+
export * from './commands/env';
|
|
5
|
+
export * from './commands/gen';
|
|
6
|
+
export * from './commands/api-proxy';
|
|
7
|
+
export * from './commands/jwt-cmd';
|
|
8
|
+
export * from './commands/init-project';
|
|
9
|
+
export * from './commands/watch';
|
|
10
|
+
export * from './commands/run';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './runtime';
|
|
2
|
+
export * from './proxy';
|
|
3
|
+
export * from './jwt-helper';
|
|
4
|
+
export * from './commands/env';
|
|
5
|
+
export * from './commands/gen';
|
|
6
|
+
export * from './commands/api-proxy';
|
|
7
|
+
export * from './commands/jwt-cmd';
|
|
8
|
+
export * from './commands/init-project';
|
|
9
|
+
export * from './commands/watch';
|
|
10
|
+
export * from './commands/run';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT Helper for CLI tool
|
|
3
|
+
* Enables CLI to generate and use JWT tokens for authentication
|
|
4
|
+
*/
|
|
5
|
+
export interface JwtPayload {
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate a JWT token from CLI arguments
|
|
10
|
+
* Usage: plat-jwt --user-id=123 --role=admin
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateJwtFromCliArgs(args: string[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* Create an auth header value for API requests
|
|
15
|
+
*/
|
|
16
|
+
export declare function getAuthHeader(token: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get JWT credentials from environment
|
|
19
|
+
* Returns null if JWT_SECRET is not set
|
|
20
|
+
*/
|
|
21
|
+
export declare function getJwtCredentials(): {
|
|
22
|
+
secret: string;
|
|
23
|
+
expiresIn: string;
|
|
24
|
+
} | null;
|
|
25
|
+
/**
|
|
26
|
+
* Parse and validate a JWT token (basic validation)
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseJwtToken(token: string): {
|
|
29
|
+
header: any;
|
|
30
|
+
payload: any;
|
|
31
|
+
} | null;
|
|
32
|
+
//# sourceMappingURL=jwt-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-helper.d.ts","sourceRoot":"","sources":["../../src/cli/jwt-helper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAiC7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,IAAI,CAUP;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,GAAG,IAAI,CAiBjF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT Helper for CLI tool
|
|
3
|
+
* Enables CLI to generate and use JWT tokens for authentication
|
|
4
|
+
*/
|
|
5
|
+
import dotenv from 'dotenv';
|
|
6
|
+
import { signToken } from '../server/auth/jwt';
|
|
7
|
+
// Load .env file
|
|
8
|
+
dotenv.config();
|
|
9
|
+
/**
|
|
10
|
+
* Generate a JWT token from CLI arguments
|
|
11
|
+
* Usage: plat-jwt --user-id=123 --role=admin
|
|
12
|
+
*/
|
|
13
|
+
export function generateJwtFromCliArgs(args) {
|
|
14
|
+
const secret = process.env.JWT_SECRET;
|
|
15
|
+
if (!secret) {
|
|
16
|
+
throw new Error('JWT_SECRET environment variable is not set. ' +
|
|
17
|
+
'Please set JWT_SECRET in your .env file or environment.');
|
|
18
|
+
}
|
|
19
|
+
// Parse arguments into payload
|
|
20
|
+
const payload = {};
|
|
21
|
+
for (const arg of args) {
|
|
22
|
+
if (arg.startsWith('--')) {
|
|
23
|
+
const parts = arg.slice(2).split('=');
|
|
24
|
+
const key = parts[0];
|
|
25
|
+
if (!key)
|
|
26
|
+
continue; // Skip if no key
|
|
27
|
+
const value = parts.slice(1).join('='); // In case value contains '='
|
|
28
|
+
if (!value) {
|
|
29
|
+
payload[key] = true;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Try to parse as JSON, otherwise treat as string
|
|
33
|
+
try {
|
|
34
|
+
payload[key] = JSON.parse(value);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
payload[key] = value;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const expiresIn = process.env.JWT_EXPIRES_IN || '24h';
|
|
43
|
+
return signToken(payload, { secret, expiresIn });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create an auth header value for API requests
|
|
47
|
+
*/
|
|
48
|
+
export function getAuthHeader(token) {
|
|
49
|
+
return `Bearer ${token}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get JWT credentials from environment
|
|
53
|
+
* Returns null if JWT_SECRET is not set
|
|
54
|
+
*/
|
|
55
|
+
export function getJwtCredentials() {
|
|
56
|
+
const secret = process.env.JWT_SECRET;
|
|
57
|
+
if (!secret) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
secret,
|
|
62
|
+
expiresIn: process.env.JWT_EXPIRES_IN || '24h',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse and validate a JWT token (basic validation)
|
|
67
|
+
*/
|
|
68
|
+
export function parseJwtToken(token) {
|
|
69
|
+
try {
|
|
70
|
+
const parts = token.split('.');
|
|
71
|
+
if (parts.length !== 3 || !parts[0] || !parts[1]) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const headerStr = Buffer.from(parts[0], 'base64').toString('utf-8');
|
|
75
|
+
const payloadStr = Buffer.from(parts[1], 'base64').toString('utf-8');
|
|
76
|
+
const header = JSON.parse(headerStr);
|
|
77
|
+
const payload = JSON.parse(payloadStr);
|
|
78
|
+
return { header, payload };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=jwt-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-helper.js","sourceRoot":"","sources":["../../src/cli/jwt-helper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,iBAAiB;AACjB,MAAM,CAAC,MAAM,EAAE,CAAA;AAMf;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,8CAA8C;YAC9C,yDAAyD,CAC1D,CAAA;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAe,EAAE,CAAA;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,IAAI,CAAC,GAAG;gBAAE,SAAQ,CAAC,iBAAiB;YAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,6BAA6B;YACpE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;YACrB,CAAC;iBAAM,CAAC;gBACN,kDAAkD;gBAClD,IAAI,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,KAAK,CAAA;IACrD,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,UAAU,KAAK,EAAE,CAAA;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAI/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,KAAK;KAC/C,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACnE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAEpE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAEtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|