routesync 1.0.16 → 1.0.18

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 CHANGED
@@ -8733,6 +8733,45 @@ ${fields.join(",\n")}
8733
8733
  }
8734
8734
  };
8735
8735
 
8736
+ // packages/core/src/utils.ts
8737
+ function camelCase(str) {
8738
+ return str.replace(/_([a-z0-9])/g, (_, p1) => p1.toUpperCase());
8739
+ }
8740
+
8741
+ // packages/core/src/client/HttpClient.ts
8742
+ var import_axios = __toESM(require("axios"));
8743
+
8744
+ // packages/core/src/auth/TokenManager.ts
8745
+ var _TokenManager = class _TokenManager {
8746
+ constructor() {
8747
+ this.token = null;
8748
+ }
8749
+ set(token) {
8750
+ this.token = token;
8751
+ if (typeof localStorage !== "undefined") {
8752
+ localStorage.setItem(_TokenManager.TOKEN_KEY, token);
8753
+ }
8754
+ }
8755
+ get() {
8756
+ if (this.token) return this.token;
8757
+ if (typeof localStorage !== "undefined") {
8758
+ return localStorage.getItem(_TokenManager.TOKEN_KEY);
8759
+ }
8760
+ return null;
8761
+ }
8762
+ clear() {
8763
+ this.token = null;
8764
+ if (typeof localStorage !== "undefined") {
8765
+ localStorage.removeItem(_TokenManager.TOKEN_KEY);
8766
+ }
8767
+ }
8768
+ exists() {
8769
+ return this.get() !== null;
8770
+ }
8771
+ };
8772
+ _TokenManager.TOKEN_KEY = "routesync_token";
8773
+ var TokenManager = _TokenManager;
8774
+
8736
8775
  // packages/cli/src/generators/TypeGenerator.ts
8737
8776
  var import_path3 = __toESM(require("path"));
8738
8777
  var import_fs_extra4 = __toESM(require_lib());
@@ -8800,10 +8839,19 @@ var TypeGenerator = class {
8800
8839
  }
8801
8840
  }
8802
8841
  if (hasSchemas) {
8842
+ const generatedSchemas = /* @__PURE__ */ new Map();
8803
8843
  for (const route of manifest.routes) {
8804
8844
  if (route.schema && route.schema.rules && Object.keys(route.schema.rules).length > 0) {
8805
- const actionName = toMethodName(route);
8806
- const schemaName = actionName + "Schema";
8845
+ let actionName = toMethodName(route);
8846
+ let schemaName = actionName + "Schema";
8847
+ if (generatedSchemas.has(schemaName)) {
8848
+ const count = generatedSchemas.get(schemaName) + 1;
8849
+ generatedSchemas.set(schemaName, count);
8850
+ actionName = actionName + String(count);
8851
+ schemaName = actionName + "Schema";
8852
+ } else {
8853
+ generatedSchemas.set(schemaName, 1);
8854
+ }
8807
8855
  lines.push(`export const ${schemaName} = z.object({`);
8808
8856
  for (const [field, rules] of Object.entries(route.schema.rules)) {
8809
8857
  const ruleStr = Array.isArray(rules) ? rules.join("|") : String(rules);
@@ -8827,7 +8875,9 @@ var TypeGenerator = class {
8827
8875
  if (ruleStr.includes("nullable")) {
8828
8876
  zodRule += ".nullable()";
8829
8877
  }
8830
- lines.push(` ${field}: ${zodRule},`);
8878
+ const camelField = camelCase(field);
8879
+ const safeField = camelField.match(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/) ? camelField : `"${camelField}"`;
8880
+ lines.push(` ${safeField}: ${zodRule},`);
8831
8881
  }
8832
8882
  lines.push(`})`);
8833
8883
  lines.push(`export type ${toTypeName(actionName + "Payload")} = z.infer<typeof ${schemaName}>`);
@@ -9082,11 +9132,11 @@ var ModelGenerator = class {
9082
9132
  tsType = this.mapCastToTs(castType, tsType);
9083
9133
  }
9084
9134
  const nullable = col.nullable ? " | null" : "";
9085
- lines.push(` ${col.name}${isOptional}: ${tsType}${nullable}`);
9135
+ lines.push(` ${camelCase(col.name)}${isOptional}: ${tsType}${nullable}`);
9086
9136
  }
9087
9137
  const appends = Array.isArray(model.appends) ? model.appends : [];
9088
9138
  for (const append of appends) {
9089
- lines.push(` ${append}: unknown // appended attribute`);
9139
+ lines.push(` ${camelCase(append)}: unknown // appended attribute`);
9090
9140
  }
9091
9141
  lines.push(`}`);
9092
9142
  lines.push(``);
package/dist/core.d.mts CHANGED
@@ -1,5 +1,10 @@
1
1
  import { AxiosRequestConfig, AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
2
2
 
3
+ declare function camelCase(str: string): string;
4
+ declare function snakeCase(str: string): string;
5
+ declare function camelCaseKeys(obj: any): any;
6
+ declare function snakeCaseKeys(obj: any): any;
7
+
3
8
  interface ServiceConfig {
4
9
  baseURL: string;
5
10
  token?: string;
@@ -228,4 +233,4 @@ interface ParsedModel {
228
233
  casts?: Record<string, string>;
229
234
  }
230
235
 
231
- export { type ApiDefinition, ApiError, type ApiResponse, type AuthConfig, AuthMiddleware, ErrorHandler, HttpClient, type HttpMethod, Interceptor, type PaginationMeta, type ParsedChannel, type ParsedColumn, type ParsedModel, type ParsedRoute, PathResolver, QueryBuilder, Request, type RequestOptions, Response, type RetryConfig, type RouteDefinition, type RouteManifest, type RouteMapper, type RouteParserSchema, type RouteSchema, type RouteSchemaMap, type RouteSchemaValue, type RouteTransform, type RouteTransformMap, type ServiceConfig, TokenManager };
236
+ export { type ApiDefinition, ApiError, type ApiResponse, type AuthConfig, AuthMiddleware, ErrorHandler, HttpClient, type HttpMethod, Interceptor, type PaginationMeta, type ParsedChannel, type ParsedColumn, type ParsedModel, type ParsedRoute, PathResolver, QueryBuilder, Request, type RequestOptions, Response, type RetryConfig, type RouteDefinition, type RouteManifest, type RouteMapper, type RouteParserSchema, type RouteSchema, type RouteSchemaMap, type RouteSchemaValue, type RouteTransform, type RouteTransformMap, type ServiceConfig, TokenManager, camelCase, camelCaseKeys, snakeCase, snakeCaseKeys };
package/dist/core.d.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  import { AxiosRequestConfig, AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
2
2
 
3
+ declare function camelCase(str: string): string;
4
+ declare function snakeCase(str: string): string;
5
+ declare function camelCaseKeys(obj: any): any;
6
+ declare function snakeCaseKeys(obj: any): any;
7
+
3
8
  interface ServiceConfig {
4
9
  baseURL: string;
5
10
  token?: string;
@@ -228,4 +233,4 @@ interface ParsedModel {
228
233
  casts?: Record<string, string>;
229
234
  }
230
235
 
231
- export { type ApiDefinition, ApiError, type ApiResponse, type AuthConfig, AuthMiddleware, ErrorHandler, HttpClient, type HttpMethod, Interceptor, type PaginationMeta, type ParsedChannel, type ParsedColumn, type ParsedModel, type ParsedRoute, PathResolver, QueryBuilder, Request, type RequestOptions, Response, type RetryConfig, type RouteDefinition, type RouteManifest, type RouteMapper, type RouteParserSchema, type RouteSchema, type RouteSchemaMap, type RouteSchemaValue, type RouteTransform, type RouteTransformMap, type ServiceConfig, TokenManager };
236
+ export { type ApiDefinition, ApiError, type ApiResponse, type AuthConfig, AuthMiddleware, ErrorHandler, HttpClient, type HttpMethod, Interceptor, type PaginationMeta, type ParsedChannel, type ParsedColumn, type ParsedModel, type ParsedRoute, PathResolver, QueryBuilder, Request, type RequestOptions, Response, type RetryConfig, type RouteDefinition, type RouteManifest, type RouteMapper, type RouteParserSchema, type RouteSchema, type RouteSchemaMap, type RouteSchemaValue, type RouteTransform, type RouteTransformMap, type ServiceConfig, TokenManager, camelCase, camelCaseKeys, snakeCase, snakeCaseKeys };
package/dist/core.js CHANGED
@@ -39,10 +39,50 @@ __export(src_exports, {
39
39
  QueryBuilder: () => QueryBuilder,
40
40
  Request: () => Request,
41
41
  Response: () => Response,
42
- TokenManager: () => TokenManager
42
+ TokenManager: () => TokenManager,
43
+ camelCase: () => camelCase,
44
+ camelCaseKeys: () => camelCaseKeys,
45
+ snakeCase: () => snakeCase,
46
+ snakeCaseKeys: () => snakeCaseKeys
43
47
  });
44
48
  module.exports = __toCommonJS(src_exports);
45
49
 
50
+ // packages/core/src/utils.ts
51
+ function camelCase(str) {
52
+ return str.replace(/_([a-z0-9])/g, (_, p1) => p1.toUpperCase());
53
+ }
54
+ function snakeCase(str) {
55
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
56
+ }
57
+ function camelCaseKeys(obj) {
58
+ if (Array.isArray(obj)) {
59
+ return obj.map((v) => camelCaseKeys(v));
60
+ } else if (obj !== null && obj.constructor === Object) {
61
+ return Object.keys(obj).reduce(
62
+ (result, key) => {
63
+ result[camelCase(key)] = camelCaseKeys(obj[key]);
64
+ return result;
65
+ },
66
+ {}
67
+ );
68
+ }
69
+ return obj;
70
+ }
71
+ function snakeCaseKeys(obj) {
72
+ if (Array.isArray(obj)) {
73
+ return obj.map((v) => snakeCaseKeys(v));
74
+ } else if (obj !== null && obj.constructor === Object) {
75
+ return Object.keys(obj).reduce(
76
+ (result, key) => {
77
+ result[snakeCase(key)] = snakeCaseKeys(obj[key]);
78
+ return result;
79
+ },
80
+ {}
81
+ );
82
+ }
83
+ return obj;
84
+ }
85
+
46
86
  // packages/core/src/client/HttpClient.ts
47
87
  var import_axios = __toESM(require("axios"));
48
88
  var HttpClient = class {
@@ -62,8 +102,24 @@ var HttpClient = class {
62
102
  this.setupInterceptors();
63
103
  }
64
104
  setupInterceptors() {
105
+ this.client.interceptors.request.use(
106
+ (config) => {
107
+ if (config.data && !(config.data instanceof FormData)) {
108
+ config.data = snakeCaseKeys(config.data);
109
+ }
110
+ if (config.params) {
111
+ config.params = snakeCaseKeys(config.params);
112
+ }
113
+ return config;
114
+ }
115
+ );
65
116
  this.client.interceptors.response.use(
66
- (response) => response,
117
+ (response) => {
118
+ if (response.data) {
119
+ response.data = camelCaseKeys(response.data);
120
+ }
121
+ return response;
122
+ },
67
123
  (error) => {
68
124
  const message = error.response?.data?.message ?? error.message ?? "Unknown error";
69
125
  return Promise.reject({
@@ -114,10 +170,14 @@ var HttpClient = class {
114
170
  return formData;
115
171
  }
116
172
  prepareRequest(body, config) {
117
- if (!body || !this.hasFiles(body)) {
118
- return { processedBody: body, processedConfig: config };
173
+ let finalBody = body;
174
+ if (finalBody && typeof finalBody === "object" && !(finalBody instanceof FormData)) {
175
+ finalBody = snakeCaseKeys(finalBody);
176
+ }
177
+ if (!finalBody || !this.hasFiles(finalBody)) {
178
+ return { processedBody: finalBody, processedConfig: config };
119
179
  }
120
- const formData = this.toFormData(body);
180
+ const formData = this.toFormData(finalBody);
121
181
  const newConfig = { ...config };
122
182
  if (!newConfig.headers) {
123
183
  newConfig.headers = {};
@@ -397,5 +457,9 @@ var ErrorHandler = class {
397
457
  QueryBuilder,
398
458
  Request,
399
459
  Response,
400
- TokenManager
460
+ TokenManager,
461
+ camelCase,
462
+ camelCaseKeys,
463
+ snakeCase,
464
+ snakeCaseKeys
401
465
  });
package/dist/core.mjs CHANGED
@@ -1,3 +1,39 @@
1
+ // packages/core/src/utils.ts
2
+ function camelCase(str) {
3
+ return str.replace(/_([a-z0-9])/g, (_, p1) => p1.toUpperCase());
4
+ }
5
+ function snakeCase(str) {
6
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
7
+ }
8
+ function camelCaseKeys(obj) {
9
+ if (Array.isArray(obj)) {
10
+ return obj.map((v) => camelCaseKeys(v));
11
+ } else if (obj !== null && obj.constructor === Object) {
12
+ return Object.keys(obj).reduce(
13
+ (result, key) => {
14
+ result[camelCase(key)] = camelCaseKeys(obj[key]);
15
+ return result;
16
+ },
17
+ {}
18
+ );
19
+ }
20
+ return obj;
21
+ }
22
+ function snakeCaseKeys(obj) {
23
+ if (Array.isArray(obj)) {
24
+ return obj.map((v) => snakeCaseKeys(v));
25
+ } else if (obj !== null && obj.constructor === Object) {
26
+ return Object.keys(obj).reduce(
27
+ (result, key) => {
28
+ result[snakeCase(key)] = snakeCaseKeys(obj[key]);
29
+ return result;
30
+ },
31
+ {}
32
+ );
33
+ }
34
+ return obj;
35
+ }
36
+
1
37
  // packages/core/src/client/HttpClient.ts
2
38
  import axios from "axios";
3
39
  var HttpClient = class {
@@ -17,8 +53,24 @@ var HttpClient = class {
17
53
  this.setupInterceptors();
18
54
  }
19
55
  setupInterceptors() {
56
+ this.client.interceptors.request.use(
57
+ (config) => {
58
+ if (config.data && !(config.data instanceof FormData)) {
59
+ config.data = snakeCaseKeys(config.data);
60
+ }
61
+ if (config.params) {
62
+ config.params = snakeCaseKeys(config.params);
63
+ }
64
+ return config;
65
+ }
66
+ );
20
67
  this.client.interceptors.response.use(
21
- (response) => response,
68
+ (response) => {
69
+ if (response.data) {
70
+ response.data = camelCaseKeys(response.data);
71
+ }
72
+ return response;
73
+ },
22
74
  (error) => {
23
75
  const message = error.response?.data?.message ?? error.message ?? "Unknown error";
24
76
  return Promise.reject({
@@ -69,10 +121,14 @@ var HttpClient = class {
69
121
  return formData;
70
122
  }
71
123
  prepareRequest(body, config) {
72
- if (!body || !this.hasFiles(body)) {
73
- return { processedBody: body, processedConfig: config };
124
+ let finalBody = body;
125
+ if (finalBody && typeof finalBody === "object" && !(finalBody instanceof FormData)) {
126
+ finalBody = snakeCaseKeys(finalBody);
127
+ }
128
+ if (!finalBody || !this.hasFiles(finalBody)) {
129
+ return { processedBody: finalBody, processedConfig: config };
74
130
  }
75
- const formData = this.toFormData(body);
131
+ const formData = this.toFormData(finalBody);
76
132
  const newConfig = { ...config };
77
133
  if (!newConfig.headers) {
78
134
  newConfig.headers = {};
@@ -351,5 +407,9 @@ export {
351
407
  QueryBuilder,
352
408
  Request,
353
409
  Response,
354
- TokenManager
410
+ TokenManager,
411
+ camelCase,
412
+ camelCaseKeys,
413
+ snakeCase,
414
+ snakeCaseKeys
355
415
  };
package/dist/sdk.js CHANGED
@@ -47,6 +47,42 @@ __export(src_exports, {
47
47
  });
48
48
  module.exports = __toCommonJS(src_exports);
49
49
 
50
+ // packages/core/src/utils.ts
51
+ function camelCase(str) {
52
+ return str.replace(/_([a-z0-9])/g, (_, p1) => p1.toUpperCase());
53
+ }
54
+ function snakeCase(str) {
55
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
56
+ }
57
+ function camelCaseKeys(obj) {
58
+ if (Array.isArray(obj)) {
59
+ return obj.map((v) => camelCaseKeys(v));
60
+ } else if (obj !== null && obj.constructor === Object) {
61
+ return Object.keys(obj).reduce(
62
+ (result, key) => {
63
+ result[camelCase(key)] = camelCaseKeys(obj[key]);
64
+ return result;
65
+ },
66
+ {}
67
+ );
68
+ }
69
+ return obj;
70
+ }
71
+ function snakeCaseKeys(obj) {
72
+ if (Array.isArray(obj)) {
73
+ return obj.map((v) => snakeCaseKeys(v));
74
+ } else if (obj !== null && obj.constructor === Object) {
75
+ return Object.keys(obj).reduce(
76
+ (result, key) => {
77
+ result[snakeCase(key)] = snakeCaseKeys(obj[key]);
78
+ return result;
79
+ },
80
+ {}
81
+ );
82
+ }
83
+ return obj;
84
+ }
85
+
50
86
  // packages/core/src/client/HttpClient.ts
51
87
  var import_axios = __toESM(require("axios"));
52
88
  var HttpClient = class {
@@ -66,8 +102,24 @@ var HttpClient = class {
66
102
  this.setupInterceptors();
67
103
  }
68
104
  setupInterceptors() {
105
+ this.client.interceptors.request.use(
106
+ (config) => {
107
+ if (config.data && !(config.data instanceof FormData)) {
108
+ config.data = snakeCaseKeys(config.data);
109
+ }
110
+ if (config.params) {
111
+ config.params = snakeCaseKeys(config.params);
112
+ }
113
+ return config;
114
+ }
115
+ );
69
116
  this.client.interceptors.response.use(
70
- (response) => response,
117
+ (response) => {
118
+ if (response.data) {
119
+ response.data = camelCaseKeys(response.data);
120
+ }
121
+ return response;
122
+ },
71
123
  (error) => {
72
124
  const message = error.response?.data?.message ?? error.message ?? "Unknown error";
73
125
  return Promise.reject({
@@ -118,10 +170,14 @@ var HttpClient = class {
118
170
  return formData;
119
171
  }
120
172
  prepareRequest(body, config) {
121
- if (!body || !this.hasFiles(body)) {
122
- return { processedBody: body, processedConfig: config };
173
+ let finalBody = body;
174
+ if (finalBody && typeof finalBody === "object" && !(finalBody instanceof FormData)) {
175
+ finalBody = snakeCaseKeys(finalBody);
176
+ }
177
+ if (!finalBody || !this.hasFiles(finalBody)) {
178
+ return { processedBody: finalBody, processedConfig: config };
123
179
  }
124
- const formData = this.toFormData(body);
180
+ const formData = this.toFormData(finalBody);
125
181
  const newConfig = { ...config };
126
182
  if (!newConfig.headers) {
127
183
  newConfig.headers = {};
package/dist/sdk.mjs CHANGED
@@ -5,6 +5,42 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
5
5
  throw Error('Dynamic require of "' + x + '" is not supported');
6
6
  });
7
7
 
8
+ // packages/core/src/utils.ts
9
+ function camelCase(str) {
10
+ return str.replace(/_([a-z0-9])/g, (_, p1) => p1.toUpperCase());
11
+ }
12
+ function snakeCase(str) {
13
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
14
+ }
15
+ function camelCaseKeys(obj) {
16
+ if (Array.isArray(obj)) {
17
+ return obj.map((v) => camelCaseKeys(v));
18
+ } else if (obj !== null && obj.constructor === Object) {
19
+ return Object.keys(obj).reduce(
20
+ (result, key) => {
21
+ result[camelCase(key)] = camelCaseKeys(obj[key]);
22
+ return result;
23
+ },
24
+ {}
25
+ );
26
+ }
27
+ return obj;
28
+ }
29
+ function snakeCaseKeys(obj) {
30
+ if (Array.isArray(obj)) {
31
+ return obj.map((v) => snakeCaseKeys(v));
32
+ } else if (obj !== null && obj.constructor === Object) {
33
+ return Object.keys(obj).reduce(
34
+ (result, key) => {
35
+ result[snakeCase(key)] = snakeCaseKeys(obj[key]);
36
+ return result;
37
+ },
38
+ {}
39
+ );
40
+ }
41
+ return obj;
42
+ }
43
+
8
44
  // packages/core/src/client/HttpClient.ts
9
45
  import axios from "axios";
10
46
  var HttpClient = class {
@@ -24,8 +60,24 @@ var HttpClient = class {
24
60
  this.setupInterceptors();
25
61
  }
26
62
  setupInterceptors() {
63
+ this.client.interceptors.request.use(
64
+ (config) => {
65
+ if (config.data && !(config.data instanceof FormData)) {
66
+ config.data = snakeCaseKeys(config.data);
67
+ }
68
+ if (config.params) {
69
+ config.params = snakeCaseKeys(config.params);
70
+ }
71
+ return config;
72
+ }
73
+ );
27
74
  this.client.interceptors.response.use(
28
- (response) => response,
75
+ (response) => {
76
+ if (response.data) {
77
+ response.data = camelCaseKeys(response.data);
78
+ }
79
+ return response;
80
+ },
29
81
  (error) => {
30
82
  const message = error.response?.data?.message ?? error.message ?? "Unknown error";
31
83
  return Promise.reject({
@@ -76,10 +128,14 @@ var HttpClient = class {
76
128
  return formData;
77
129
  }
78
130
  prepareRequest(body, config) {
79
- if (!body || !this.hasFiles(body)) {
80
- return { processedBody: body, processedConfig: config };
131
+ let finalBody = body;
132
+ if (finalBody && typeof finalBody === "object" && !(finalBody instanceof FormData)) {
133
+ finalBody = snakeCaseKeys(finalBody);
134
+ }
135
+ if (!finalBody || !this.hasFiles(finalBody)) {
136
+ return { processedBody: finalBody, processedConfig: config };
81
137
  }
82
- const formData = this.toFormData(body);
138
+ const formData = this.toFormData(finalBody);
83
139
  const newConfig = { ...config };
84
140
  if (!newConfig.headers) {
85
141
  newConfig.headers = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "routesync",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "Laravel routes to typed frontend SDKs.",
5
5
  "main": "./dist/sdk.js",
6
6
  "module": "./dist/sdk.mjs",