@sonicjs-cms/core 2.8.1 → 2.8.2

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.
Files changed (78) hide show
  1. package/dist/{app-CYEm1ytG.d.cts → app-DnQ26Lho.d.cts} +3 -0
  2. package/dist/{app-CYEm1ytG.d.ts → app-DnQ26Lho.d.ts} +3 -0
  3. package/dist/{chunk-S6K2H2TS.cjs → chunk-3G7XX4UI.cjs} +9 -9
  4. package/dist/{chunk-S6K2H2TS.cjs.map → chunk-3G7XX4UI.cjs.map} +1 -1
  5. package/dist/{chunk-JVRRG36J.cjs → chunk-3U5YHS4G.cjs} +2660 -2557
  6. package/dist/chunk-3U5YHS4G.cjs.map +1 -0
  7. package/dist/{chunk-FZRZYQYU.js → chunk-4Z5BQZT6.js} +2501 -2398
  8. package/dist/chunk-4Z5BQZT6.js.map +1 -0
  9. package/dist/{chunk-H7AMQWVI.js → chunk-74XCYEI7.js} +3 -3
  10. package/dist/{chunk-H7AMQWVI.js.map → chunk-74XCYEI7.js.map} +1 -1
  11. package/dist/chunk-FUUVSYVQ.js +541 -0
  12. package/dist/chunk-FUUVSYVQ.js.map +1 -0
  13. package/dist/{chunk-7Q2XPM2U.js → chunk-I6REMSMF.js} +21 -2
  14. package/dist/chunk-I6REMSMF.js.map +1 -0
  15. package/dist/{chunk-VCH6HXVP.js → chunk-JJS7JZCH.js} +58 -4
  16. package/dist/chunk-JJS7JZCH.js.map +1 -0
  17. package/dist/{chunk-WDQZYCQO.cjs → chunk-JSHIGVIF.cjs} +32 -39
  18. package/dist/chunk-JSHIGVIF.cjs.map +1 -0
  19. package/dist/{chunk-SHCYIZAN.cjs → chunk-LTKV7AE5.cjs} +58 -4
  20. package/dist/chunk-LTKV7AE5.cjs.map +1 -0
  21. package/dist/chunk-MNWKYY5E.cjs +44 -0
  22. package/dist/chunk-MNWKYY5E.cjs.map +1 -0
  23. package/dist/chunk-TQABQWOP.js +39 -0
  24. package/dist/chunk-TQABQWOP.js.map +1 -0
  25. package/dist/{chunk-SKLRRFJJ.cjs → chunk-VGSZWZP3.cjs} +21 -2
  26. package/dist/chunk-VGSZWZP3.cjs.map +1 -0
  27. package/dist/{chunk-KAT3OKHE.js → chunk-WI5ESQKT.js} +33 -37
  28. package/dist/chunk-WI5ESQKT.js.map +1 -0
  29. package/dist/chunk-ZWKCL46S.cjs +568 -0
  30. package/dist/chunk-ZWKCL46S.cjs.map +1 -0
  31. package/dist/{filter-bar.template-By4jeiw_.d.cts → filter-bar.template-Daw8ZDoq.d.cts} +1 -0
  32. package/dist/{filter-bar.template-By4jeiw_.d.ts → filter-bar.template-Daw8ZDoq.d.ts} +1 -0
  33. package/dist/index.cjs +112 -111
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +3 -3
  36. package/dist/index.d.ts +3 -3
  37. package/dist/index.js +16 -15
  38. package/dist/index.js.map +1 -1
  39. package/dist/middleware.cjs +43 -23
  40. package/dist/middleware.d.cts +86 -6
  41. package/dist/middleware.d.ts +86 -6
  42. package/dist/middleware.js +2 -2
  43. package/dist/migrations-F3G6CTRS.cjs +13 -0
  44. package/dist/{migrations-76NR5BVF.cjs.map → migrations-F3G6CTRS.cjs.map} +1 -1
  45. package/dist/migrations-LLNEST75.js +4 -0
  46. package/dist/{migrations-2NTJ44OR.js.map → migrations-LLNEST75.js.map} +1 -1
  47. package/dist/routes.cjs +29 -28
  48. package/dist/routes.d.cts +1 -1
  49. package/dist/routes.d.ts +1 -1
  50. package/dist/routes.js +6 -5
  51. package/dist/services.cjs +2 -2
  52. package/dist/services.js +1 -1
  53. package/dist/templates.cjs +20 -19
  54. package/dist/templates.d.cts +1 -1
  55. package/dist/templates.d.ts +1 -1
  56. package/dist/templates.js +3 -2
  57. package/dist/utils.cjs +24 -23
  58. package/dist/utils.d.cts +1 -1
  59. package/dist/utils.d.ts +1 -1
  60. package/dist/utils.js +2 -1
  61. package/dist/{version-vktVAxhe.d.cts → version-C_CXrN_T.d.cts} +5 -0
  62. package/dist/{version-vktVAxhe.d.ts → version-C_CXrN_T.d.ts} +5 -0
  63. package/migrations/032_user_profiles.sql +36 -0
  64. package/package.json +2 -2
  65. package/dist/chunk-7Q2XPM2U.js.map +0 -1
  66. package/dist/chunk-FZRZYQYU.js.map +0 -1
  67. package/dist/chunk-GIWIJNBH.cjs +0 -243
  68. package/dist/chunk-GIWIJNBH.cjs.map +0 -1
  69. package/dist/chunk-JVRRG36J.cjs.map +0 -1
  70. package/dist/chunk-KAT3OKHE.js.map +0 -1
  71. package/dist/chunk-QWTS6NSP.js +0 -221
  72. package/dist/chunk-QWTS6NSP.js.map +0 -1
  73. package/dist/chunk-SHCYIZAN.cjs.map +0 -1
  74. package/dist/chunk-SKLRRFJJ.cjs.map +0 -1
  75. package/dist/chunk-VCH6HXVP.js.map +0 -1
  76. package/dist/chunk-WDQZYCQO.cjs.map +0 -1
  77. package/dist/migrations-2NTJ44OR.js +0 -4
  78. package/dist/migrations-76NR5BVF.cjs +0 -13
@@ -1,78 +1,79 @@
1
1
  'use strict';
2
2
 
3
- var chunkS6K2H2TS_cjs = require('./chunk-S6K2H2TS.cjs');
4
- var chunkSHCYIZAN_cjs = require('./chunk-SHCYIZAN.cjs');
3
+ var chunk3G7XX4UI_cjs = require('./chunk-3G7XX4UI.cjs');
4
+ var chunkLTKV7AE5_cjs = require('./chunk-LTKV7AE5.cjs');
5
+ require('./chunk-MNWKYY5E.cjs');
5
6
  require('./chunk-IGJUBJBW.cjs');
6
7
 
7
8
 
8
9
 
9
10
  Object.defineProperty(exports, "renderFilterBar", {
10
11
  enumerable: true,
11
- get: function () { return chunkS6K2H2TS_cjs.renderFilterBar; }
12
+ get: function () { return chunk3G7XX4UI_cjs.renderFilterBar; }
12
13
  });
13
14
  Object.defineProperty(exports, "renderFormsDocsPage", {
14
15
  enumerable: true,
15
- get: function () { return chunkS6K2H2TS_cjs.renderFormsDocsPage; }
16
+ get: function () { return chunk3G7XX4UI_cjs.renderFormsDocsPage; }
16
17
  });
17
18
  Object.defineProperty(exports, "renderFormsExamplesPage", {
18
19
  enumerable: true,
19
- get: function () { return chunkS6K2H2TS_cjs.renderFormsExamplesPage; }
20
+ get: function () { return chunk3G7XX4UI_cjs.renderFormsExamplesPage; }
20
21
  });
21
22
  Object.defineProperty(exports, "getConfirmationDialogScript", {
22
23
  enumerable: true,
23
- get: function () { return chunkSHCYIZAN_cjs.getConfirmationDialogScript; }
24
+ get: function () { return chunkLTKV7AE5_cjs.getConfirmationDialogScript; }
24
25
  });
25
26
  Object.defineProperty(exports, "renderAdminLayout", {
26
27
  enumerable: true,
27
- get: function () { return chunkSHCYIZAN_cjs.renderAdminLayout; }
28
+ get: function () { return chunkLTKV7AE5_cjs.renderAdminLayout; }
28
29
  });
29
30
  Object.defineProperty(exports, "renderAdminLayoutCatalyst", {
30
31
  enumerable: true,
31
- get: function () { return chunkSHCYIZAN_cjs.renderAdminLayoutCatalyst; }
32
+ get: function () { return chunkLTKV7AE5_cjs.renderAdminLayoutCatalyst; }
32
33
  });
33
34
  Object.defineProperty(exports, "renderAlert", {
34
35
  enumerable: true,
35
- get: function () { return chunkSHCYIZAN_cjs.renderAlert; }
36
+ get: function () { return chunkLTKV7AE5_cjs.renderAlert; }
36
37
  });
37
38
  Object.defineProperty(exports, "renderCheckboxPage", {
38
39
  enumerable: true,
39
- get: function () { return chunkSHCYIZAN_cjs.renderCheckboxPage; }
40
+ get: function () { return chunkLTKV7AE5_cjs.renderCheckboxPage; }
40
41
  });
41
42
  Object.defineProperty(exports, "renderCodeExamplesList", {
42
43
  enumerable: true,
43
- get: function () { return chunkSHCYIZAN_cjs.renderCodeExamplesList; }
44
+ get: function () { return chunkLTKV7AE5_cjs.renderCodeExamplesList; }
44
45
  });
45
46
  Object.defineProperty(exports, "renderConfirmationDialog", {
46
47
  enumerable: true,
47
- get: function () { return chunkSHCYIZAN_cjs.renderConfirmationDialog; }
48
+ get: function () { return chunkLTKV7AE5_cjs.renderConfirmationDialog; }
48
49
  });
49
50
  Object.defineProperty(exports, "renderDesignPage", {
50
51
  enumerable: true,
51
- get: function () { return chunkSHCYIZAN_cjs.renderDesignPage; }
52
+ get: function () { return chunkLTKV7AE5_cjs.renderDesignPage; }
52
53
  });
53
54
  Object.defineProperty(exports, "renderForm", {
54
55
  enumerable: true,
55
- get: function () { return chunkSHCYIZAN_cjs.renderForm; }
56
+ get: function () { return chunkLTKV7AE5_cjs.renderForm; }
56
57
  });
57
58
  Object.defineProperty(exports, "renderFormField", {
58
59
  enumerable: true,
59
- get: function () { return chunkSHCYIZAN_cjs.renderFormField; }
60
+ get: function () { return chunkLTKV7AE5_cjs.renderFormField; }
60
61
  });
61
62
  Object.defineProperty(exports, "renderLogo", {
62
63
  enumerable: true,
63
- get: function () { return chunkSHCYIZAN_cjs.renderLogo; }
64
+ get: function () { return chunkLTKV7AE5_cjs.renderLogo; }
64
65
  });
65
66
  Object.defineProperty(exports, "renderPagination", {
66
67
  enumerable: true,
67
- get: function () { return chunkSHCYIZAN_cjs.renderPagination; }
68
+ get: function () { return chunkLTKV7AE5_cjs.renderPagination; }
68
69
  });
69
70
  Object.defineProperty(exports, "renderTable", {
70
71
  enumerable: true,
71
- get: function () { return chunkSHCYIZAN_cjs.renderTable; }
72
+ get: function () { return chunkLTKV7AE5_cjs.renderTable; }
72
73
  });
73
74
  Object.defineProperty(exports, "renderTestimonialsList", {
74
75
  enumerable: true,
75
- get: function () { return chunkSHCYIZAN_cjs.renderTestimonialsList; }
76
+ get: function () { return chunkLTKV7AE5_cjs.renderTestimonialsList; }
76
77
  });
77
78
  //# sourceMappingURL=templates.cjs.map
78
79
  //# sourceMappingURL=templates.cjs.map
@@ -1,4 +1,4 @@
1
- export { A as AlertData, C as ConfirmationDialogOptions, k as Filter, j as FilterBarData, l as FilterOption, h as FormData, F as FormField, P as PaginationData, T as TableColumn, i as TableData, g as getConfirmationDialogScript, d as renderAlert, e as renderConfirmationDialog, f as renderFilterBar, r as renderForm, a as renderFormField, c as renderPagination, b as renderTable } from './filter-bar.template-By4jeiw_.cjs';
1
+ export { A as AlertData, C as ConfirmationDialogOptions, k as Filter, j as FilterBarData, l as FilterOption, h as FormData, F as FormField, P as PaginationData, T as TableColumn, i as TableData, g as getConfirmationDialogScript, d as renderAlert, e as renderConfirmationDialog, f as renderFilterBar, r as renderForm, a as renderFormField, c as renderPagination, b as renderTable } from './filter-bar.template-Daw8ZDoq.cjs';
2
2
  import { HtmlEscapedString } from 'hono/utils/html';
3
3
 
4
4
  interface AdminLayoutData {
@@ -1,4 +1,4 @@
1
- export { A as AlertData, C as ConfirmationDialogOptions, k as Filter, j as FilterBarData, l as FilterOption, h as FormData, F as FormField, P as PaginationData, T as TableColumn, i as TableData, g as getConfirmationDialogScript, d as renderAlert, e as renderConfirmationDialog, f as renderFilterBar, r as renderForm, a as renderFormField, c as renderPagination, b as renderTable } from './filter-bar.template-By4jeiw_.js';
1
+ export { A as AlertData, C as ConfirmationDialogOptions, k as Filter, j as FilterBarData, l as FilterOption, h as FormData, F as FormField, P as PaginationData, T as TableColumn, i as TableData, g as getConfirmationDialogScript, d as renderAlert, e as renderConfirmationDialog, f as renderFilterBar, r as renderForm, a as renderFormField, c as renderPagination, b as renderTable } from './filter-bar.template-Daw8ZDoq.js';
2
2
  import { HtmlEscapedString } from 'hono/utils/html';
3
3
 
4
4
  interface AdminLayoutData {
package/dist/templates.js CHANGED
@@ -1,5 +1,6 @@
1
- export { renderFilterBar, renderFormsDocsPage, renderFormsExamplesPage } from './chunk-H7AMQWVI.js';
2
- export { getConfirmationDialogScript, renderAdminLayout, renderAdminLayoutCatalyst, renderAlert, renderCheckboxPage, renderCodeExamplesList, renderConfirmationDialog, renderDesignPage, renderForm, renderFormField, renderLogo, renderPagination, renderTable, renderTestimonialsList } from './chunk-VCH6HXVP.js';
1
+ export { renderFilterBar, renderFormsDocsPage, renderFormsExamplesPage } from './chunk-74XCYEI7.js';
2
+ export { getConfirmationDialogScript, renderAdminLayout, renderAdminLayoutCatalyst, renderAlert, renderCheckboxPage, renderCodeExamplesList, renderConfirmationDialog, renderDesignPage, renderForm, renderFormField, renderLogo, renderPagination, renderTable, renderTestimonialsList } from './chunk-JJS7JZCH.js';
3
+ import './chunk-TQABQWOP.js';
3
4
  import './chunk-V4OQ3NZ2.js';
4
5
  //# sourceMappingURL=templates.js.map
5
6
  //# sourceMappingURL=templates.js.map
package/dist/utils.cjs CHANGED
@@ -1,63 +1,52 @@
1
1
  'use strict';
2
2
 
3
- var chunkWDQZYCQO_cjs = require('./chunk-WDQZYCQO.cjs');
3
+ var chunkJSHIGVIF_cjs = require('./chunk-JSHIGVIF.cjs');
4
4
  var chunkP3XDZL6Q_cjs = require('./chunk-P3XDZL6Q.cjs');
5
5
  var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs');
6
+ var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs');
6
7
  require('./chunk-IGJUBJBW.cjs');
7
8
 
8
9
 
9
10
 
10
11
  Object.defineProperty(exports, "QueryFilterBuilder", {
11
12
  enumerable: true,
12
- get: function () { return chunkWDQZYCQO_cjs.QueryFilterBuilder; }
13
+ get: function () { return chunkJSHIGVIF_cjs.QueryFilterBuilder; }
13
14
  });
14
15
  Object.defineProperty(exports, "SONICJS_VERSION", {
15
16
  enumerable: true,
16
- get: function () { return chunkWDQZYCQO_cjs.SONICJS_VERSION; }
17
+ get: function () { return chunkJSHIGVIF_cjs.SONICJS_VERSION; }
17
18
  });
18
19
  Object.defineProperty(exports, "TemplateRenderer", {
19
20
  enumerable: true,
20
- get: function () { return chunkWDQZYCQO_cjs.TemplateRenderer; }
21
+ get: function () { return chunkJSHIGVIF_cjs.TemplateRenderer; }
21
22
  });
22
23
  Object.defineProperty(exports, "buildQuery", {
23
24
  enumerable: true,
24
- get: function () { return chunkWDQZYCQO_cjs.buildQuery; }
25
- });
26
- Object.defineProperty(exports, "escapeHtml", {
27
- enumerable: true,
28
- get: function () { return chunkWDQZYCQO_cjs.escapeHtml; }
25
+ get: function () { return chunkJSHIGVIF_cjs.buildQuery; }
29
26
  });
30
27
  Object.defineProperty(exports, "generateSlug", {
31
28
  enumerable: true,
32
- get: function () { return chunkWDQZYCQO_cjs.generateSlug; }
29
+ get: function () { return chunkJSHIGVIF_cjs.generateSlug; }
33
30
  });
34
31
  Object.defineProperty(exports, "getBlocksFieldConfig", {
35
32
  enumerable: true,
36
- get: function () { return chunkWDQZYCQO_cjs.getBlocksFieldConfig; }
33
+ get: function () { return chunkJSHIGVIF_cjs.getBlocksFieldConfig; }
37
34
  });
38
35
  Object.defineProperty(exports, "getCoreVersion", {
39
36
  enumerable: true,
40
- get: function () { return chunkWDQZYCQO_cjs.getCoreVersion; }
37
+ get: function () { return chunkJSHIGVIF_cjs.getCoreVersion; }
41
38
  });
42
39
  Object.defineProperty(exports, "parseBlocksValue", {
43
40
  enumerable: true,
44
- get: function () { return chunkWDQZYCQO_cjs.parseBlocksValue; }
41
+ get: function () { return chunkJSHIGVIF_cjs.parseBlocksValue; }
45
42
  });
46
43
  Object.defineProperty(exports, "renderTemplate", {
47
44
  enumerable: true,
48
- get: function () { return chunkWDQZYCQO_cjs.renderTemplate; }
49
- });
50
- Object.defineProperty(exports, "sanitizeInput", {
51
- enumerable: true,
52
- get: function () { return chunkWDQZYCQO_cjs.sanitizeInput; }
53
- });
54
- Object.defineProperty(exports, "sanitizeObject", {
55
- enumerable: true,
56
- get: function () { return chunkWDQZYCQO_cjs.sanitizeObject; }
45
+ get: function () { return chunkJSHIGVIF_cjs.renderTemplate; }
57
46
  });
58
47
  Object.defineProperty(exports, "templateRenderer", {
59
48
  enumerable: true,
60
- get: function () { return chunkWDQZYCQO_cjs.templateRenderer; }
49
+ get: function () { return chunkJSHIGVIF_cjs.templateRenderer; }
61
50
  });
62
51
  Object.defineProperty(exports, "generateInstallationId", {
63
52
  enumerable: true,
@@ -95,5 +84,17 @@ Object.defineProperty(exports, "metricsTracker", {
95
84
  enumerable: true,
96
85
  get: function () { return chunkRCQ2HIQD_cjs.metricsTracker; }
97
86
  });
87
+ Object.defineProperty(exports, "escapeHtml", {
88
+ enumerable: true,
89
+ get: function () { return chunkMNWKYY5E_cjs.escapeHtml; }
90
+ });
91
+ Object.defineProperty(exports, "sanitizeInput", {
92
+ enumerable: true,
93
+ get: function () { return chunkMNWKYY5E_cjs.sanitizeInput; }
94
+ });
95
+ Object.defineProperty(exports, "sanitizeObject", {
96
+ enumerable: true,
97
+ get: function () { return chunkMNWKYY5E_cjs.sanitizeObject; }
98
+ });
98
99
  //# sourceMappingURL=utils.cjs.map
99
100
  //# sourceMappingURL=utils.cjs.map
package/dist/utils.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- export { c as FilterCondition, d as FilterGroup, F as FilterOperator, f as QueryFilter, Q as QueryFilterBuilder, h as QueryResult, S as SONICJS_VERSION, T as TemplateRenderer, b as buildQuery, e as escapeHtml, g as getCoreVersion, m as metricsTracker, r as renderTemplate, s as sanitizeInput, a as sanitizeObject, t as templateRenderer } from './version-vktVAxhe.cjs';
1
+ export { c as FilterCondition, d as FilterGroup, F as FilterOperator, f as QueryFilter, Q as QueryFilterBuilder, h as QueryResult, S as SONICJS_VERSION, T as TemplateRenderer, b as buildQuery, e as escapeHtml, g as getCoreVersion, m as metricsTracker, r as renderTemplate, s as sanitizeInput, a as sanitizeObject, t as templateRenderer } from './version-C_CXrN_T.cjs';
2
2
  import { b as TelemetryConfig } from './telemetry-UiD1i9GS.cjs';
3
3
  import { b as BlockDefinitions } from './collection-config-BF95LgQb.cjs';
4
4
 
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { c as FilterCondition, d as FilterGroup, F as FilterOperator, f as QueryFilter, Q as QueryFilterBuilder, h as QueryResult, S as SONICJS_VERSION, T as TemplateRenderer, b as buildQuery, e as escapeHtml, g as getCoreVersion, m as metricsTracker, r as renderTemplate, s as sanitizeInput, a as sanitizeObject, t as templateRenderer } from './version-vktVAxhe.js';
1
+ export { c as FilterCondition, d as FilterGroup, F as FilterOperator, f as QueryFilter, Q as QueryFilterBuilder, h as QueryResult, S as SONICJS_VERSION, T as TemplateRenderer, b as buildQuery, e as escapeHtml, g as getCoreVersion, m as metricsTracker, r as renderTemplate, s as sanitizeInput, a as sanitizeObject, t as templateRenderer } from './version-C_CXrN_T.js';
2
2
  import { b as TelemetryConfig } from './telemetry-UiD1i9GS.js';
3
3
  import { b as BlockDefinitions } from './collection-config-BF95LgQb.js';
4
4
 
package/dist/utils.js CHANGED
@@ -1,6 +1,7 @@
1
- export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, escapeHtml, generateSlug, getBlocksFieldConfig, getCoreVersion, parseBlocksValue, renderTemplate, sanitizeInput, sanitizeObject, templateRenderer } from './chunk-KAT3OKHE.js';
1
+ export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, parseBlocksValue, renderTemplate, templateRenderer } from './chunk-WI5ESQKT.js';
2
2
  export { generateInstallationId, generateProjectId, getDefaultTelemetryConfig, getTelemetryConfig, isTelemetryEnabled, sanitizeErrorMessage, sanitizeRoute, shouldSkipEvent } from './chunk-X7ZAEI5S.js';
3
3
  export { metricsTracker } from './chunk-FICTAGD4.js';
4
+ export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js';
4
5
  import './chunk-V4OQ3NZ2.js';
5
6
  //# sourceMappingURL=utils.js.map
6
7
  //# sourceMappingURL=utils.js.map
@@ -141,6 +141,11 @@ declare class QueryFilterBuilder {
141
141
  * Sanitize field names to prevent SQL injection
142
142
  */
143
143
  private sanitizeFieldName;
144
+ /**
145
+ * Sanitize sort order to prevent SQL injection
146
+ * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value
147
+ */
148
+ private sanitizeSortOrder;
144
149
  /**
145
150
  * Parse filter from query string
146
151
  */
@@ -141,6 +141,11 @@ declare class QueryFilterBuilder {
141
141
  * Sanitize field names to prevent SQL injection
142
142
  */
143
143
  private sanitizeFieldName;
144
+ /**
145
+ * Sanitize sort order to prevent SQL injection
146
+ * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value
147
+ */
148
+ private sanitizeSortOrder;
144
149
  /**
145
150
  * Parse filter from query string
146
151
  */
@@ -0,0 +1,36 @@
1
+ -- User Profiles Table (Core Migration)
2
+ -- Stores extended user profile data separate from auth concerns
3
+ -- Required by admin-users.ts for user edit page profile management
4
+ --
5
+ -- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)
6
+ -- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,
7
+ -- but no corresponding core migration was added. This migration corrects that gap.
8
+ --
9
+ -- IF NOT EXISTS guards ensure idempotency for databases that already have the table
10
+ -- from the app-level migration.
11
+
12
+ CREATE TABLE IF NOT EXISTS user_profiles (
13
+ id TEXT PRIMARY KEY,
14
+ user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
15
+
16
+ display_name TEXT,
17
+ bio TEXT,
18
+ company TEXT,
19
+ job_title TEXT,
20
+ website TEXT,
21
+ location TEXT,
22
+ date_of_birth INTEGER,
23
+
24
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
25
+ updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
26
+ );
27
+
28
+ -- Index for fast user lookups
29
+ CREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);
30
+
31
+ -- Trigger to auto-update updated_at timestamp
32
+ CREATE TRIGGER IF NOT EXISTS user_profiles_updated_at
33
+ AFTER UPDATE ON user_profiles
34
+ BEGIN
35
+ UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;
36
+ END;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonicjs-cms/core",
3
- "version": "2.8.1",
3
+ "version": "2.8.2",
4
4
  "description": "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -116,7 +116,7 @@
116
116
  "drizzle-orm": "^0.44.7",
117
117
  "eslint": "^9.39.2",
118
118
  "glob": "^10.5.0",
119
- "hono": "^4.11.7",
119
+ "hono": "^4.12.7",
120
120
  "tsup": "^8.5.0",
121
121
  "typescript": "^5.9.3",
122
122
  "vitest": "^4.0.5",