routesync 1.0.10 → 1.0.11
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/dist/cli.js +73 -4
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -8611,14 +8611,29 @@ function toMethodName(route) {
|
|
|
8611
8611
|
}
|
|
8612
8612
|
|
|
8613
8613
|
// packages/cli/src/generators/SDKGenerator.ts
|
|
8614
|
-
var SDKGenerator = class {
|
|
8615
|
-
static async generate(manifest, outputDir) {
|
|
8614
|
+
var SDKGenerator = class _SDKGenerator {
|
|
8615
|
+
static async generate(manifest, outputDir, options = {}) {
|
|
8616
8616
|
const grouped = buildGeneratedRoutes(manifest.routes);
|
|
8617
8617
|
const lines = [];
|
|
8618
|
+
let usesZod = false;
|
|
8619
|
+
const zodRoutes = /* @__PURE__ */ new Set();
|
|
8620
|
+
if (options.zod) {
|
|
8621
|
+
for (const [group, routes] of Object.entries(grouped)) {
|
|
8622
|
+
for (const route of routes) {
|
|
8623
|
+
if (route.original.schema?.rules) {
|
|
8624
|
+
usesZod = true;
|
|
8625
|
+
zodRoutes.add(`${group}.${route.actionName}`);
|
|
8626
|
+
}
|
|
8627
|
+
}
|
|
8628
|
+
}
|
|
8629
|
+
}
|
|
8618
8630
|
lines.push(`// Auto-generated by routesync. Do not edit manually.`);
|
|
8619
8631
|
lines.push(`// Generated at: ${manifest.generatedAt}`);
|
|
8620
8632
|
lines.push(``);
|
|
8621
8633
|
lines.push(`import { defineApi } from 'routesync'`);
|
|
8634
|
+
if (usesZod) {
|
|
8635
|
+
lines.push(`import { z } from 'zod'`);
|
|
8636
|
+
}
|
|
8622
8637
|
lines.push(``);
|
|
8623
8638
|
lines.push(`export const api = defineApi({`);
|
|
8624
8639
|
for (const [group, routes] of Object.entries(grouped)) {
|
|
@@ -8628,6 +8643,12 @@ var SDKGenerator = class {
|
|
|
8628
8643
|
lines.push(` method: '${route.method}',`);
|
|
8629
8644
|
lines.push(` path: '${route.runtimePath}',`);
|
|
8630
8645
|
if (route.auth) lines.push(` auth: true,`);
|
|
8646
|
+
if (options.zod && route.original.schema?.rules) {
|
|
8647
|
+
const zodSchema = _SDKGenerator.translateRulesToZod(route.original.schema.rules);
|
|
8648
|
+
lines.push(` schema: {`);
|
|
8649
|
+
lines.push(` body: ${zodSchema}`);
|
|
8650
|
+
lines.push(` },`);
|
|
8651
|
+
}
|
|
8631
8652
|
lines.push(` },`);
|
|
8632
8653
|
}
|
|
8633
8654
|
lines.push(` },`);
|
|
@@ -8637,6 +8658,54 @@ var SDKGenerator = class {
|
|
|
8637
8658
|
lines.push(`export default api`);
|
|
8638
8659
|
await import_fs_extra3.default.writeFile(import_path2.default.join(outputDir, "api.ts"), lines.join("\n"));
|
|
8639
8660
|
}
|
|
8661
|
+
static translateRulesToZod(rules) {
|
|
8662
|
+
const fields = [];
|
|
8663
|
+
for (const [field, rawRules] of Object.entries(rules)) {
|
|
8664
|
+
let ruleArray = [];
|
|
8665
|
+
if (typeof rawRules === "string") {
|
|
8666
|
+
ruleArray = rawRules.split("|");
|
|
8667
|
+
} else if (Array.isArray(rawRules)) {
|
|
8668
|
+
ruleArray = rawRules;
|
|
8669
|
+
}
|
|
8670
|
+
let isRequired = false;
|
|
8671
|
+
let isNullable = false;
|
|
8672
|
+
let isString = false;
|
|
8673
|
+
let isNumeric = false;
|
|
8674
|
+
let isArray = false;
|
|
8675
|
+
let isBoolean = false;
|
|
8676
|
+
let isEmail = false;
|
|
8677
|
+
let min = null;
|
|
8678
|
+
let max = null;
|
|
8679
|
+
for (const rule of ruleArray) {
|
|
8680
|
+
if (typeof rule !== "string") continue;
|
|
8681
|
+
const r = rule.toLowerCase();
|
|
8682
|
+
if (r === "required") isRequired = true;
|
|
8683
|
+
if (r === "nullable") isNullable = true;
|
|
8684
|
+
if (r === "string") isString = true;
|
|
8685
|
+
if (r === "numeric" || r === "integer" || r === "int") isNumeric = true;
|
|
8686
|
+
if (r === "array") isArray = true;
|
|
8687
|
+
if (r === "boolean" || r === "bool") isBoolean = true;
|
|
8688
|
+
if (r === "email") isEmail = true;
|
|
8689
|
+
if (r.startsWith("min:")) min = r.split(":")[1];
|
|
8690
|
+
if (r.startsWith("max:")) max = r.split(":")[1];
|
|
8691
|
+
}
|
|
8692
|
+
let zType = "z.any()";
|
|
8693
|
+
if (isString) zType = "z.string()";
|
|
8694
|
+
else if (isNumeric) zType = "z.number()";
|
|
8695
|
+
else if (isBoolean) zType = "z.boolean()";
|
|
8696
|
+
else if (isArray) zType = "z.array(z.any())";
|
|
8697
|
+
else if (isEmail) zType = "z.string()";
|
|
8698
|
+
if (isEmail && zType === "z.string()") zType += ".email()";
|
|
8699
|
+
if (min && !isNaN(Number(min))) zType += `.min(${min})`;
|
|
8700
|
+
if (max && !isNaN(Number(max))) zType += `.max(${max})`;
|
|
8701
|
+
if (!isRequired) zType += ".optional()";
|
|
8702
|
+
if (isNullable) zType += ".nullable()";
|
|
8703
|
+
fields.push(` "${field}": ${zType}`);
|
|
8704
|
+
}
|
|
8705
|
+
return `z.object({
|
|
8706
|
+
${fields.join(",\n")}
|
|
8707
|
+
})`;
|
|
8708
|
+
}
|
|
8640
8709
|
};
|
|
8641
8710
|
|
|
8642
8711
|
// packages/cli/src/generators/TypeGenerator.ts
|
|
@@ -9071,7 +9140,7 @@ var LaravelChannelParser = class {
|
|
|
9071
9140
|
|
|
9072
9141
|
// packages/cli/src/commands/sync.ts
|
|
9073
9142
|
var import_fs_extra13 = __toESM(require_lib());
|
|
9074
|
-
var syncCommand = new Command("sync").description("Scan routes and generate SDK in one step").option("-i, --input <path>", "Path to routes/api.php", "routes/api.php").option("-o, --output <path>", "Output directory", "src/api").option("-b, --baseURL <url>", "API base URL", "http://localhost/api").option("--no-hooks", "Skip generating React hooks").option("--next-actions", "Generate Next.js Server Actions").option("--msw", "Generate MSW Mock Handlers").option("--echo", "Generate Laravel Echo Hooks").option("--models", "Extract Database Schema via Eloquent Models").action(async (options) => {
|
|
9143
|
+
var syncCommand = new Command("sync").description("Scan routes and generate SDK in one step").option("-i, --input <path>", "Path to routes/api.php", "routes/api.php").option("-o, --output <path>", "Output directory", "src/api").option("-b, --baseURL <url>", "API base URL", "http://localhost/api").option("--no-hooks", "Skip generating React hooks").option("--next-actions", "Generate Next.js Server Actions").option("--msw", "Generate MSW Mock Handlers").option("--echo", "Generate Laravel Echo Hooks").option("--models", "Extract Database Schema via Eloquent Models").option("--zod", "Generate Zod Schemas for request validation").action(async (options) => {
|
|
9075
9144
|
console.log(source_default.bold.blue("\n routesync sync\n"));
|
|
9076
9145
|
const steps = [
|
|
9077
9146
|
{ text: "Scanning Laravel routes" },
|
|
@@ -9094,7 +9163,7 @@ var syncCommand = new Command("sync").description("Scan routes and generate SDK
|
|
|
9094
9163
|
await TypeGenerator.generate(manifest, options.output);
|
|
9095
9164
|
spinner.succeed(source_default.green(`\u2714 ${steps[1].text}`));
|
|
9096
9165
|
spinner.start(steps[2].text);
|
|
9097
|
-
await SDKGenerator.generate(manifest, options.output);
|
|
9166
|
+
await SDKGenerator.generate(manifest, options.output, options);
|
|
9098
9167
|
spinner.succeed(source_default.green(`\u2714 ${steps[2].text}`));
|
|
9099
9168
|
if (options.hooks !== false) {
|
|
9100
9169
|
spinner.start(steps[3].text);
|