@sonicjs-cms/core 2.0.0-alpha.1 → 2.0.0-alpha.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.
Files changed (98) hide show
  1. package/dist/chunk-3MNMOLSA.js +133 -0
  2. package/dist/chunk-3MNMOLSA.js.map +1 -0
  3. package/dist/{chunk-BRC3F4CG.cjs → chunk-6BHDKYLU.cjs} +8 -2
  4. package/dist/{chunk-KRJMGD4E.js.map → chunk-6BHDKYLU.cjs.map} +1 -1
  5. package/dist/{chunk-CXZDAR6S.js → chunk-7N3HK7ZK.js} +3 -3
  6. package/dist/{chunk-CXZDAR6S.js.map → chunk-7N3HK7ZK.js.map} +1 -1
  7. package/dist/chunk-AGOE25LF.cjs +137 -0
  8. package/dist/chunk-AGOE25LF.cjs.map +1 -0
  9. package/dist/{chunk-NRSL6BQI.js → chunk-BITQ4MFX.js} +3 -3
  10. package/dist/{chunk-NRSL6BQI.js.map → chunk-BITQ4MFX.js.map} +1 -1
  11. package/dist/{chunk-24PWAFUT.cjs → chunk-BUKT6HP5.cjs} +13 -13
  12. package/dist/{chunk-24PWAFUT.cjs.map → chunk-BUKT6HP5.cjs.map} +1 -1
  13. package/dist/chunk-DG4INX36.cjs +14246 -0
  14. package/dist/chunk-DG4INX36.cjs.map +1 -0
  15. package/dist/chunk-FDUDHGI6.js +14233 -0
  16. package/dist/chunk-FDUDHGI6.js.map +1 -0
  17. package/dist/{chunk-L3NXO7Y4.cjs → chunk-FVMV5DKA.cjs} +49 -49
  18. package/dist/{chunk-L3NXO7Y4.cjs.map → chunk-FVMV5DKA.cjs.map} +1 -1
  19. package/dist/{chunk-KRJMGD4E.js → chunk-FZYF43TN.js} +8 -2
  20. package/dist/chunk-FZYF43TN.js.map +1 -0
  21. package/dist/chunk-G4JGVZAF.js +1337 -0
  22. package/dist/chunk-G4JGVZAF.js.map +1 -0
  23. package/dist/{chunk-EMMSS5I5.cjs → chunk-IGJUBJBW.cjs} +8 -2
  24. package/dist/{chunk-ALTMI5Y2.cjs.map → chunk-IGJUBJBW.cjs.map} +1 -1
  25. package/dist/chunk-LEGKJ5DI.cjs +1344 -0
  26. package/dist/chunk-LEGKJ5DI.cjs.map +1 -0
  27. package/dist/{chunk-WJ7QYVR2.cjs → chunk-RNR4HA23.cjs} +4 -4
  28. package/dist/{chunk-WJ7QYVR2.cjs.map → chunk-RNR4HA23.cjs.map} +1 -1
  29. package/dist/{chunk-G3PMV62Z.js → chunk-V4OQ3NZ2.js} +7 -3
  30. package/dist/{chunk-G3PMV62Z.js.map → chunk-V4OQ3NZ2.js.map} +1 -1
  31. package/dist/{chunk-PTQZ5FEI.js → chunk-WESS2U3K.js} +3 -3
  32. package/dist/{chunk-PTQZ5FEI.js.map → chunk-WESS2U3K.js.map} +1 -1
  33. package/dist/index.cjs +147 -101
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.ts +5 -135
  36. package/dist/index.js +24 -9
  37. package/dist/index.js.map +1 -1
  38. package/dist/middleware.cjs +23 -23
  39. package/dist/middleware.d.ts +2 -206
  40. package/dist/middleware.js +3 -3
  41. package/dist/plugins.cjs +8 -8
  42. package/dist/plugins.d.ts +2 -330
  43. package/dist/plugins.js +2 -2
  44. package/dist/routes.cjs +52 -3
  45. package/dist/routes.d.ts +2 -17
  46. package/dist/routes.js +7 -2
  47. package/dist/services.cjs +31 -19
  48. package/dist/services.d.ts +2 -5
  49. package/dist/services.js +3 -3
  50. package/dist/templates.cjs +23 -10
  51. package/dist/templates.d.ts +2 -140
  52. package/dist/templates.js +3 -2
  53. package/dist/types.cjs +1 -1
  54. package/dist/types.d.ts +2 -41
  55. package/dist/types.js +1 -1
  56. package/dist/utils.cjs +1 -1
  57. package/dist/utils.d.ts +2 -184
  58. package/dist/utils.js +1 -1
  59. package/migrations/001_initial_schema.sql +198 -0
  60. package/migrations/002_faq_plugin.sql +86 -0
  61. package/migrations/003_stage5_enhancements.sql +121 -0
  62. package/migrations/004_stage6_user_management.sql +183 -0
  63. package/migrations/005_stage7_workflow_automation.sql +294 -0
  64. package/migrations/006_plugin_system.sql +155 -0
  65. package/migrations/007_demo_login_plugin.sql +23 -0
  66. package/migrations/008_fix_slug_validation.sql +22 -0
  67. package/migrations/009_system_logging.sql +57 -0
  68. package/migrations/011_config_managed_collections.sql +14 -0
  69. package/migrations/012_testimonials_plugin.sql +80 -0
  70. package/migrations/013_code_examples_plugin.sql +177 -0
  71. package/migrations/014_fix_plugin_registry.sql +88 -0
  72. package/migrations/015_add_remaining_plugins.sql +89 -0
  73. package/migrations/016_remove_duplicate_cache_plugin.sql +17 -0
  74. package/migrations/017_auth_configurable_fields.sql +49 -0
  75. package/package.json +2 -2
  76. package/dist/chunk-4URGXJP7.js +0 -3
  77. package/dist/chunk-4URGXJP7.js.map +0 -1
  78. package/dist/chunk-ALTMI5Y2.cjs +0 -4
  79. package/dist/chunk-BOLQHE4J.cjs +0 -11
  80. package/dist/chunk-BOLQHE4J.cjs.map +0 -1
  81. package/dist/chunk-BRC3F4CG.cjs.map +0 -1
  82. package/dist/chunk-EMMSS5I5.cjs.map +0 -1
  83. package/dist/chunk-HD7R6T6I.js +0 -9
  84. package/dist/chunk-HD7R6T6I.js.map +0 -1
  85. package/dist/collection-config-FLlGtsh9.d.cts +0 -107
  86. package/dist/collection-config-FLlGtsh9.d.ts +0 -107
  87. package/dist/index-BlsY5XNH.d.ts +0 -8333
  88. package/dist/index-D45jaIlr.d.cts +0 -8333
  89. package/dist/index.d.cts +0 -136
  90. package/dist/middleware.d.cts +0 -206
  91. package/dist/plugin-UzmDImQc.d.cts +0 -357
  92. package/dist/plugin-UzmDImQc.d.ts +0 -357
  93. package/dist/plugins.d.cts +0 -330
  94. package/dist/routes.d.cts +0 -17
  95. package/dist/services.d.cts +0 -5
  96. package/dist/templates.d.cts +0 -140
  97. package/dist/types.d.cts +0 -41
  98. package/dist/utils.d.cts +0 -184
@@ -0,0 +1,177 @@
1
+ -- Code Examples Plugin Migration
2
+ -- Creates code_examples table for the code examples plugin
3
+ -- This demonstrates a code-based collection for storing and managing code snippets
4
+
5
+ CREATE TABLE IF NOT EXISTS code_examples (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ title TEXT NOT NULL,
8
+ description TEXT,
9
+ code TEXT NOT NULL,
10
+ language TEXT NOT NULL,
11
+ category TEXT,
12
+ tags TEXT,
13
+ isPublished INTEGER NOT NULL DEFAULT 1,
14
+ sortOrder INTEGER NOT NULL DEFAULT 0,
15
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
16
+ updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
17
+ );
18
+
19
+ -- Create indexes for better performance
20
+ CREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);
21
+ CREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);
22
+ CREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);
23
+ CREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);
24
+
25
+ -- Create trigger to update updated_at timestamp
26
+ CREATE TRIGGER IF NOT EXISTS code_examples_updated_at
27
+ AFTER UPDATE ON code_examples
28
+ BEGIN
29
+ UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;
30
+ END;
31
+
32
+ -- Insert plugin record
33
+ INSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES
34
+ ('code-examples',
35
+ 'Code Examples',
36
+ 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',
37
+ '1.0.0',
38
+ 'active',
39
+ 'content',
40
+ '{"defaultPublished": true, "supportedLanguages": ["javascript", "typescript", "python", "go", "rust", "java", "php", "ruby", "sql"]}');
41
+
42
+ -- Insert sample code examples
43
+ INSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES
44
+ ('React useState Hook',
45
+ 'Basic example of using the useState hook in React for managing component state.',
46
+ 'import { useState } from ''react'';
47
+
48
+ function Counter() {
49
+ const [count, setCount] = useState(0);
50
+
51
+ return (
52
+ <div>
53
+ <p>Count: {count}</p>
54
+ <button onClick={() => setCount(count + 1)}>
55
+ Increment
56
+ </button>
57
+ </div>
58
+ );
59
+ }
60
+
61
+ export default Counter;',
62
+ 'javascript',
63
+ 'frontend',
64
+ 'react,hooks,state',
65
+ 1,
66
+ 1),
67
+
68
+ ('TypeScript Interface Example',
69
+ 'Defining a TypeScript interface for type-safe objects.',
70
+ 'interface User {
71
+ id: string;
72
+ email: string;
73
+ name: string;
74
+ role: ''admin'' | ''editor'' | ''viewer'';
75
+ createdAt: Date;
76
+ }
77
+
78
+ function greetUser(user: User): string {
79
+ return `Hello, ${user.name}!`;
80
+ }
81
+
82
+ const user: User = {
83
+ id: ''123'',
84
+ email: ''user@example.com'',
85
+ name: ''John Doe'',
86
+ role: ''admin'',
87
+ createdAt: new Date()
88
+ };
89
+
90
+ console.log(greetUser(user));',
91
+ 'typescript',
92
+ 'backend',
93
+ 'typescript,types,interface',
94
+ 1,
95
+ 2),
96
+
97
+ ('Python List Comprehension',
98
+ 'Elegant way to create lists in Python using list comprehensions.',
99
+ '# Basic list comprehension
100
+ squares = [x**2 for x in range(10)]
101
+ print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
102
+
103
+ # With condition
104
+ even_squares = [x**2 for x in range(10) if x % 2 == 0]
105
+ print(even_squares) # [0, 4, 16, 36, 64]
106
+
107
+ # Nested list comprehension
108
+ matrix = [[i+j for j in range(3)] for i in range(3)]
109
+ print(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',
110
+ 'python',
111
+ 'general',
112
+ 'python,lists,comprehension',
113
+ 1,
114
+ 3),
115
+
116
+ ('SQL Join Example',
117
+ 'Common SQL JOIN patterns for combining data from multiple tables.',
118
+ '-- INNER JOIN: Returns only matching rows
119
+ SELECT users.name, orders.total
120
+ FROM users
121
+ INNER JOIN orders ON users.id = orders.user_id;
122
+
123
+ -- LEFT JOIN: Returns all users, even without orders
124
+ SELECT users.name, orders.total
125
+ FROM users
126
+ LEFT JOIN orders ON users.id = orders.user_id;
127
+
128
+ -- Multiple JOINs
129
+ SELECT
130
+ users.name,
131
+ orders.order_date,
132
+ products.name AS product_name
133
+ FROM users
134
+ INNER JOIN orders ON users.id = orders.user_id
135
+ INNER JOIN order_items ON orders.id = order_items.order_id
136
+ INNER JOIN products ON order_items.product_id = products.id;',
137
+ 'sql',
138
+ 'database',
139
+ 'sql,joins,queries',
140
+ 1,
141
+ 4),
142
+
143
+ ('Go Error Handling',
144
+ 'Idiomatic error handling pattern in Go.',
145
+ 'package main
146
+
147
+ import (
148
+ "errors"
149
+ "fmt"
150
+ )
151
+
152
+ func divide(a, b float64) (float64, error) {
153
+ if b == 0 {
154
+ return 0, errors.New("division by zero")
155
+ }
156
+ return a / b, nil
157
+ }
158
+
159
+ func main() {
160
+ result, err := divide(10, 2)
161
+ if err != nil {
162
+ fmt.Println("Error:", err)
163
+ return
164
+ }
165
+ fmt.Printf("Result: %.2f\n", result)
166
+
167
+ // This will error
168
+ _, err = divide(10, 0)
169
+ if err != nil {
170
+ fmt.Println("Error:", err)
171
+ }
172
+ }',
173
+ 'go',
174
+ 'backend',
175
+ 'go,error-handling,functions',
176
+ 1,
177
+ 5);
@@ -0,0 +1,88 @@
1
+ -- Fix Plugin Registry
2
+ -- Migration: 014_fix_plugin_registry
3
+ -- Description: Add missing plugins and fix plugin name mismatches
4
+
5
+ -- Note: Cannot easily update plugin names as they may be referenced elsewhere
6
+ -- Instead we'll add the missing plugins with correct names
7
+
8
+ -- Insert missing plugins
9
+
10
+ -- Core Analytics Plugin
11
+ INSERT OR IGNORE INTO plugins (
12
+ id, name, display_name, description, version, author, category, icon,
13
+ status, is_core, permissions, installed_at, last_updated
14
+ ) VALUES (
15
+ 'core-analytics',
16
+ 'core-analytics',
17
+ 'Analytics & Tracking',
18
+ 'Core analytics tracking and reporting plugin with page views and event tracking',
19
+ '1.0.0',
20
+ 'SonicJS Team',
21
+ 'analytics',
22
+ '📊',
23
+ 'active',
24
+ TRUE,
25
+ '["view:analytics", "manage:tracking"]',
26
+ unixepoch(),
27
+ unixepoch()
28
+ );
29
+
30
+ -- FAQ Plugin
31
+ INSERT OR IGNORE INTO plugins (
32
+ id, name, display_name, description, version, author, category, icon,
33
+ status, is_core, permissions, installed_at, last_updated
34
+ ) VALUES (
35
+ 'faq-plugin',
36
+ 'faq-plugin',
37
+ 'FAQ Management',
38
+ 'Frequently Asked Questions management plugin with categories, search, and custom styling',
39
+ '1.0.0',
40
+ 'SonicJS',
41
+ 'content',
42
+ '❓',
43
+ 'active',
44
+ FALSE,
45
+ '["manage:faqs"]',
46
+ unixepoch(),
47
+ unixepoch()
48
+ );
49
+
50
+ -- Seed Data Plugin
51
+ INSERT OR IGNORE INTO plugins (
52
+ id, name, display_name, description, version, author, category, icon,
53
+ status, is_core, permissions, installed_at, last_updated
54
+ ) VALUES (
55
+ 'seed-data',
56
+ 'seed-data',
57
+ 'Seed Data Generator',
58
+ 'Generate realistic example users and content for testing and development',
59
+ '1.0.0',
60
+ 'SonicJS Team',
61
+ 'development',
62
+ '🌱',
63
+ 'inactive',
64
+ FALSE,
65
+ '["admin"]',
66
+ unixepoch(),
67
+ unixepoch()
68
+ );
69
+
70
+ -- Database Tools Plugin
71
+ INSERT OR IGNORE INTO plugins (
72
+ id, name, display_name, description, version, author, category, icon,
73
+ status, is_core, permissions, installed_at, last_updated
74
+ ) VALUES (
75
+ 'database-tools',
76
+ 'database-tools',
77
+ 'Database Tools',
78
+ 'Database management tools including truncate, backup, and validation',
79
+ '1.0.0',
80
+ 'SonicJS Team',
81
+ 'system',
82
+ '🗄️',
83
+ 'active',
84
+ FALSE,
85
+ '["manage:database", "admin"]',
86
+ unixepoch(),
87
+ unixepoch()
88
+ );
@@ -0,0 +1,89 @@
1
+ -- Add Remaining Plugins
2
+ -- Migration: 015_add_remaining_plugins
3
+ -- Description: Add all remaining core plugins that were missing from the registry
4
+
5
+ -- Testimonials Plugin (with correct name)
6
+ INSERT OR IGNORE INTO plugins (
7
+ id, name, display_name, description, version, author, category, icon,
8
+ status, is_core, permissions, dependencies, settings, installed_at, last_updated
9
+ ) VALUES (
10
+ 'testimonials-plugin',
11
+ 'testimonials-plugin',
12
+ 'Customer Testimonials',
13
+ 'Manage customer testimonials and reviews with rating support',
14
+ '1.0.0',
15
+ 'SonicJS',
16
+ 'content',
17
+ '⭐',
18
+ 'active',
19
+ FALSE,
20
+ '["manage:testimonials"]',
21
+ '[]',
22
+ '{"defaultPublished": true, "requireRating": false}',
23
+ unixepoch(),
24
+ unixepoch()
25
+ );
26
+
27
+ -- Code Examples Plugin (with correct name)
28
+ INSERT OR IGNORE INTO plugins (
29
+ id, name, display_name, description, version, author, category, icon,
30
+ status, is_core, permissions, dependencies, settings, installed_at, last_updated
31
+ ) VALUES (
32
+ 'code-examples-plugin',
33
+ 'code-examples-plugin',
34
+ 'Code Examples',
35
+ 'Manage code snippets and examples with syntax highlighting support',
36
+ '1.0.0',
37
+ 'SonicJS',
38
+ 'content',
39
+ '💻',
40
+ 'active',
41
+ FALSE,
42
+ '["manage:code-examples"]',
43
+ '[]',
44
+ '{"defaultPublished": true, "supportedLanguages": ["javascript", "typescript", "python", "go", "rust", "java", "php", "ruby", "sql"]}',
45
+ unixepoch(),
46
+ unixepoch()
47
+ );
48
+
49
+ -- Workflow Plugin (with correct name)
50
+ INSERT OR IGNORE INTO plugins (
51
+ id, name, display_name, description, version, author, category, icon,
52
+ status, is_core, permissions, dependencies, installed_at, last_updated
53
+ ) VALUES (
54
+ 'workflow-plugin',
55
+ 'workflow-plugin',
56
+ 'Workflow Engine',
57
+ 'Content workflow management with approval chains, scheduling, and automation',
58
+ '1.0.0',
59
+ 'SonicJS Team',
60
+ 'content',
61
+ '🔄',
62
+ 'active',
63
+ TRUE,
64
+ '["manage:workflows", "approve:content"]',
65
+ '[]',
66
+ unixepoch(),
67
+ unixepoch()
68
+ );
69
+
70
+ -- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)
71
+ INSERT OR IGNORE INTO plugins (
72
+ id, name, display_name, description, version, author, category, icon,
73
+ status, is_core, permissions, dependencies, installed_at, last_updated
74
+ ) VALUES (
75
+ 'demo-login-plugin',
76
+ 'demo-login-plugin',
77
+ 'Demo Login Prefill',
78
+ 'Prefills login form with demo credentials for easy site demonstration',
79
+ '1.0.0',
80
+ 'SonicJS',
81
+ 'demo',
82
+ '🎯',
83
+ 'active',
84
+ FALSE,
85
+ '[]',
86
+ '[]',
87
+ unixepoch(),
88
+ unixepoch()
89
+ );
@@ -0,0 +1,17 @@
1
+ -- Migration: Remove duplicate cache plugin entry
2
+ -- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'
3
+ -- This fixes the issue where Cache System appears twice in the plugins list
4
+ -- Created: 2025-10-14
5
+
6
+ -- Remove the old 'cache' plugin entry if it exists
7
+ -- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts
8
+ DELETE FROM plugins WHERE id = 'cache' AND name = 'cache';
9
+
10
+ -- Clean up any related entries in plugin activity log
11
+ DELETE FROM plugin_activity_log WHERE plugin_id = 'cache';
12
+
13
+ -- Clean up any related entries in plugin hooks
14
+ DELETE FROM plugin_hooks WHERE plugin_id = 'cache';
15
+
16
+ -- Clean up any related entries in plugin routes
17
+ DELETE FROM plugin_routes WHERE plugin_id = 'cache';
@@ -0,0 +1,49 @@
1
+ -- Migration: Make authentication fields configurable
2
+ -- This migration updates the core-auth plugin to support configurable required fields
3
+
4
+ -- The settings will be stored in the plugins table as JSON
5
+ -- Default settings for core-auth plugin include:
6
+ -- {
7
+ -- "requiredFields": {
8
+ -- "email": { "required": true, "minLength": 5 },
9
+ -- "password": { "required": true, "minLength": 8 },
10
+ -- "username": { "required": true, "minLength": 3 },
11
+ -- "firstName": { "required": true, "minLength": 1 },
12
+ -- "lastName": { "required": true, "minLength": 1 }
13
+ -- },
14
+ -- "validation": {
15
+ -- "emailFormat": true,
16
+ -- "allowDuplicateUsernames": false
17
+ -- }
18
+ -- }
19
+
20
+ -- Update core-auth plugin settings with configurable field requirements
21
+ UPDATE plugins
22
+ SET settings = json_object(
23
+ 'requiredFields', json_object(
24
+ 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),
25
+ 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),
26
+ 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),
27
+ 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),
28
+ 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')
29
+ ),
30
+ 'validation', json_object(
31
+ 'emailFormat', 1,
32
+ 'allowDuplicateUsernames', 0,
33
+ 'passwordRequirements', json_object(
34
+ 'requireUppercase', 0,
35
+ 'requireLowercase', 0,
36
+ 'requireNumbers', 0,
37
+ 'requireSpecialChars', 0
38
+ )
39
+ ),
40
+ 'registration', json_object(
41
+ 'enabled', 1,
42
+ 'requireEmailVerification', 0,
43
+ 'defaultRole', 'viewer'
44
+ )
45
+ )
46
+ WHERE id = 'core-auth';
47
+
48
+ -- If core-auth plugin doesn't exist, this migration will be handled by bootstrap
49
+ -- No need to insert here as plugin bootstrap handles initial plugin creation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonicjs-cms/core",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.0-alpha.11",
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",
@@ -115,7 +115,7 @@
115
115
  "@cloudflare/workers-types": "^4.20250620.0",
116
116
  "@types/node": "^20.19.1",
117
117
  "drizzle-orm": "^0.44.2",
118
- "hono": "^4.7.3",
118
+ "hono": "^4.10.1",
119
119
  "tsup": "^8.0.0",
120
120
  "typescript": "^5.8.3",
121
121
  "vitest": "^2.1.8",
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=chunk-4URGXJP7.js.map
3
- //# sourceMappingURL=chunk-4URGXJP7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-4URGXJP7.js"}
@@ -1,4 +0,0 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=chunk-ALTMI5Y2.cjs.map
4
- //# sourceMappingURL=chunk-ALTMI5Y2.cjs.map
@@ -1,11 +0,0 @@
1
- 'use strict';
2
-
3
- // src/routes/index.ts
4
- var ROUTES_INFO = {
5
- message: "Routes are application-specific - implement in your application",
6
- reference: "https://github.com/sonicjs/sonicjs"
7
- };
8
-
9
- exports.ROUTES_INFO = ROUTES_INFO;
10
- //# sourceMappingURL=chunk-BOLQHE4J.cjs.map
11
- //# sourceMappingURL=chunk-BOLQHE4J.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/index.ts"],"names":[],"mappings":";;;AAYO,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,iEAAA;AAAA,EACT,SAAA,EAAW;AACb","file":"chunk-BOLQHE4J.cjs","sourcesContent":["/**\n * Routes Module Exports\n *\n * Note: HTTP routes are application-specific and should be implemented\n * in the consuming application rather than in the core package.\n *\n * The core package provides the building blocks (middleware, services, types)\n * but each application should define its own routes based on its specific needs.\n *\n * For reference implementations, see the main SonicJS repository.\n */\n\nexport const ROUTES_INFO = {\n message: 'Routes are application-specific - implement in your application',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/templates/form.template.ts","../src/templates/table.template.ts","../src/templates/pagination.template.ts","../src/templates/alert.template.ts","../src/templates/confirmation-dialog.template.ts","../src/templates/filter-bar.template.ts"],"names":[],"mappings":"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","file":"chunk-BRC3F4CG.cjs","sourcesContent":["export interface FormField {\n name: string\n label: string\n type: 'text' | 'email' | 'textarea' | 'select' | 'checkbox' | 'rich_text' | 'number' | 'date' | 'multi_select' | 'file'\n value?: any\n placeholder?: string\n required?: boolean\n readonly?: boolean\n helpText?: string\n options?: Array<{ value: string; label: string; selected?: boolean }>\n rows?: number\n className?: string\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface FormData {\n id?: string\n action?: string\n method?: string\n hxPost?: string\n hxPut?: string\n hxTarget?: string\n fields: FormField[]\n submitButtons: Array<{\n label: string\n type?: 'submit' | 'button'\n value?: string\n name?: string\n className?: string\n onclick?: string\n }>\n title?: string\n description?: string\n className?: string\n}\n\nexport function renderForm(data: FormData): string {\n return `\n <form \n ${data.id ? `id=\"${data.id}\"` : ''}\n ${data.hxPost ? `hx-post=\"${data.hxPost}\"` : data.hxPut ? `hx-put=\"${data.hxPut}\"` : data.action ? `action=\"${data.action}\"` : ''}\n ${data.hxTarget ? `hx-target=\"${data.hxTarget}\"` : ''}\n method=\"${data.method || 'POST'}\"\n class=\"${data.className || 'space-y-6'}\"\n ${data.fields.some(f => f.type === 'file') ? 'enctype=\"multipart/form-data\"' : ''}\n >\n ${data.title ? `\n <div class=\"mb-6\">\n <h2 class=\"text-lg font-medium text-gray-1\">${data.title}</h2>\n ${data.description ? `<p class=\"mt-1 text-sm text-gray-4\">${data.description}</p>` : ''}\n </div>\n ` : ''}\n \n <div id=\"form-messages\"></div>\n \n ${data.fields.map(field => renderFormField(field)).join('')}\n \n <div class=\"flex justify-between items-center pt-6 border-t border-gray-7\">\n <div class=\"flex space-x-4\">\n ${data.submitButtons.map(button => `\n <button \n type=\"${button.type || 'submit'}\"\n ${button.name ? `name=\"${button.name}\"` : ''}\n ${button.value ? `value=\"${button.value}\"` : ''}\n ${button.onclick ? `onclick=\"${button.onclick}\"` : ''}\n class=\"btn ${button.className || 'btn-primary'}\"\n >\n ${button.label}\n </button>\n `).join('')}\n </div>\n </div>\n </form>\n `\n}\n\nexport function renderFormField(field: FormField): string {\n const fieldId = `field-${field.name}`\n const required = field.required ? 'required' : ''\n const readonly = field.readonly ? 'readonly' : ''\n const placeholder = field.placeholder ? `placeholder=\"${field.placeholder}\"` : ''\n\n let fieldHTML = ''\n\n switch (field.type) {\n case 'text':\n case 'email':\n case 'number':\n case 'date':\n fieldHTML = `\n <input\n type=\"${field.type === 'date' ? 'datetime-local' : field.type}\"\n id=\"${fieldId}\"\n name=\"${field.name}\"\n value=\"${field.value || ''}\"\n class=\"form-input ${field.className || ''}\"\n ${placeholder}\n ${required}\n ${readonly}\n ${field.validation?.min !== undefined ? `min=\"${field.validation.min}\"` : ''}\n ${field.validation?.max !== undefined ? `max=\"${field.validation.max}\"` : ''}\n ${field.validation?.pattern ? `pattern=\"${field.validation.pattern}\"` : ''}\n >\n `\n break\n \n case 'textarea':\n fieldHTML = `\n <textarea \n id=\"${fieldId}\"\n name=\"${field.name}\" \n class=\"form-textarea ${field.className || ''}\" \n rows=\"${field.rows || 4}\"\n ${placeholder}\n ${required}\n >${field.value || ''}</textarea>\n `\n break\n \n case 'rich_text':\n const uniqueId = `${field.name}-${Date.now()}`\n fieldHTML = `\n <div class=\"markdown-field\">\n <textarea id=\"${uniqueId}\" name=\"${field.name}\" class=\"form-textarea\" rows=\"8\">${field.value || ''}</textarea>\n <script>\n if (typeof EasyMDE !== 'undefined') {\n new EasyMDE({\n element: document.getElementById('${uniqueId}'),\n minHeight: '300px',\n spellChecker: false,\n status: ['autosave', 'lines', 'words', 'cursor'],\n autosave: {\n enabled: true,\n uniqueId: '${uniqueId}',\n delay: 1000\n },\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n }\n </script>\n </div>\n `\n break\n \n case 'select':\n fieldHTML = `\n <select \n id=\"${fieldId}\"\n name=\"${field.name}\" \n class=\"form-input ${field.className || ''}\" \n ${required}\n >\n ${field.options ? field.options.map(option => `\n <option value=\"${option.value}\" ${option.selected || field.value === option.value ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('') : ''}\n </select>\n `\n break\n \n case 'multi_select':\n fieldHTML = `\n <select \n id=\"${fieldId}\"\n name=\"${field.name}\" \n class=\"form-input ${field.className || ''}\" \n multiple \n ${required}\n >\n ${field.options ? field.options.map(option => `\n <option value=\"${option.value}\" ${option.selected ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('') : ''}\n </select>\n `\n break\n \n case 'checkbox':\n fieldHTML = `\n <input\n type=\"checkbox\"\n id=\"${fieldId}\"\n name=\"${field.name}\"\n value=\"1\"\n class=\"size-4 rounded border border-white/15 bg-white/5 checked:border-transparent checked:bg-white disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-white/20 focus:ring-offset-2 ${field.className || ''}\"\n ${field.value ? 'checked' : ''}\n ${required}\n >\n <label for=\"${fieldId}\" class=\"ml-2 text-sm text-white\">${field.label}</label>\n `\n break\n \n default:\n fieldHTML = `\n <input \n type=\"text\" \n id=\"${fieldId}\"\n name=\"${field.name}\" \n value=\"${field.value || ''}\"\n class=\"form-input ${field.className || ''}\" \n ${placeholder} \n ${required}\n >\n `\n break\n }\n \n // For checkbox, we handle the label differently\n if (field.type === 'checkbox') {\n return `\n <div class=\"form-group\">\n <div class=\"flex items-center\">\n ${fieldHTML}\n </div>\n ${field.helpText ? `<p class=\"text-sm text-zinc-500 dark:text-zinc-400 mt-1 ml-6\">${field.helpText}</p>` : ''}\n </div>\n `\n }\n\n return `\n <div class=\"form-group\">\n <label for=\"${fieldId}\" class=\"form-label\">\n ${field.label}${field.required ? ' *' : ''}\n </label>\n ${fieldHTML}\n ${field.helpText ? `<p class=\"text-sm text-zinc-500 dark:text-zinc-400 mt-1\">${field.helpText}</p>` : ''}\n </div>\n `\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData<T = any> {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable<T = any>(data: TableData<T>): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n <div class=\"rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 p-8 text-center\">\n <div class=\"text-zinc-500 dark:text-zinc-400\">\n <svg class=\"mx-auto h-12 w-12 text-zinc-400 dark:text-zinc-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n <p class=\"mt-2 text-sm text-zinc-500 dark:text-zinc-400\">${data.emptyMessage || 'No data available'}</p>\n </div>\n </div>\n `\n }\n\n return `\n <div class=\"${data.className || ''}\" id=\"${tableId}\">\n ${data.title ? `\n <div class=\"px-4 sm:px-0 mb-4\">\n <h3 class=\"text-base font-semibold text-zinc-950 dark:text-white\">${data.title}</h3>\n </div>\n ` : ''}\n <div class=\"overflow-x-auto\">\n <table class=\"min-w-full sortable-table\">\n <thead>\n <tr>\n ${data.selectable ? `\n <th class=\"px-4 py-3.5 text-center sm:pl-0\">\n <div class=\"flex items-center justify-center\">\n <div class=\"group grid size-4 grid-cols-1\">\n <input type=\"checkbox\" id=\"select-all-${tableId}\" class=\"col-start-1 row-start-1 appearance-none rounded border border-white/10 bg-white/5 checked:border-cyan-500 checked:bg-cyan-500 indeterminate:border-cyan-500 indeterminate:bg-cyan-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cyan-500 disabled:border-white/5 disabled:bg-white/10 disabled:checked:bg-white/10 forced-colors:appearance-auto row-checkbox\" />\n <svg viewBox=\"0 0 14 14\" fill=\"none\" class=\"pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-[:disabled]:stroke-white/25\">\n <path d=\"M3 8L6 11L11 3.5\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"opacity-0 group-has-[:checked]:opacity-100\" />\n <path d=\"M3 7H11\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"opacity-0 group-has-[:indeterminate]:opacity-100\" />\n </svg>\n </div>\n </div>\n </th>\n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n <th class=\"px-4 py-3.5 text-left text-sm font-semibold text-zinc-950 dark:text-white ${isFirst ? 'sm:pl-0' : ''} ${isLast ? 'sm:pr-0' : ''} ${column.className || ''}\">\n ${column.sortable ? `\n <button\n class=\"flex items-center gap-x-2 hover:text-zinc-700 dark:hover:text-zinc-300 transition-colors sort-btn text-left\"\n data-column=\"${column.key}\"\n data-sort-type=\"${column.sortType || 'string'}\"\n data-sort-direction=\"none\"\n onclick=\"sortTable('${tableId}', '${column.key}', '${column.sortType || 'string'}')\"\n >\n <span>${column.label}</span>\n <div class=\"sort-icons flex flex-col\">\n <svg class=\"w-3 h-3 sort-up opacity-30\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z\" clip-rule=\"evenodd\" />\n </svg>\n <svg class=\"w-3 h-3 sort-down opacity-30 -mt-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n </button>\n ` : column.label}\n </th>\n `}).join('')}\n </tr>\n </thead>\n <tbody>\n ${data.rows.map((row) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n <tr class=\"group border-t border-zinc-950/5 dark:border-white/5 hover:bg-gradient-to-r hover:from-cyan-50/50 hover:via-blue-50/30 hover:to-purple-50/50 dark:hover:from-cyan-900/20 dark:hover:via-blue-900/10 dark:hover:to-purple-900/20 hover:shadow-sm hover:shadow-cyan-500/5 dark:hover:shadow-cyan-400/5 transition-all duration-300 ${clickableClass}\" ${clickHandler}>\n ${data.selectable ? `\n <td class=\"px-4 py-4 sm:pl-0\" onclick=\"event.stopPropagation()\">\n <div class=\"flex items-center justify-center\">\n <div class=\"group grid size-4 grid-cols-1\">\n <input type=\"checkbox\" value=\"${(row as any).id || ''}\" class=\"col-start-1 row-start-1 appearance-none rounded border border-white/10 bg-white/5 checked:border-cyan-500 checked:bg-cyan-500 indeterminate:border-cyan-500 indeterminate:bg-cyan-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cyan-500 disabled:border-white/5 disabled:bg-white/10 disabled:checked:bg-white/10 forced-colors:appearance-auto row-checkbox\" />\n <svg viewBox=\"0 0 14 14\" fill=\"none\" class=\"pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-[:disabled]:stroke-white/25\">\n <path d=\"M3 8L6 11L11 3.5\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"opacity-0 group-has-[:checked]:opacity-100\" />\n <path d=\"M3 7H11\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"opacity-0 group-has-[:indeterminate]:opacity-100\" />\n </svg>\n </div>\n </div>\n </td>\n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n <td class=\"px-4 py-4 text-sm text-zinc-500 dark:text-zinc-400 ${isFirst ? 'sm:pl-0 font-medium text-zinc-950 dark:text-white' : ''} ${isLast ? 'sm:pr-0' : ''} ${column.className || ''}\" ${stopPropagation}>\n ${displayValue || ''}\n </td>\n `\n }).join('')}\n </tr>\n `\n }).join('')}\n </tbody>\n </table>\n </div>\n\n <script>\n // Table sorting functionality\n window.sortTable = function(tableId, column, sortType) {\n const tableContainer = document.getElementById(tableId);\n const table = tableContainer.querySelector('.sortable-table');\n const tbody = table.querySelector('tbody');\n const rows = Array.from(tbody.querySelectorAll('tr'));\n const headerBtn = table.querySelector(\\`[data-column=\"\\${column}\"]\\`);\n\n // Get current sort direction\n let direction = headerBtn.getAttribute('data-sort-direction');\n\n // Reset all sort indicators\n table.querySelectorAll('.sort-btn').forEach(btn => {\n btn.setAttribute('data-sort-direction', 'none');\n btn.querySelectorAll('.sort-up, .sort-down').forEach(icon => {\n icon.classList.add('opacity-30');\n icon.classList.remove('opacity-100', 'text-zinc-950', 'dark:text-white');\n });\n });\n\n // Determine new direction\n if (direction === 'none' || direction === 'desc') {\n direction = 'asc';\n } else {\n direction = 'desc';\n }\n\n // Update current header\n headerBtn.setAttribute('data-sort-direction', direction);\n const upIcon = headerBtn.querySelector('.sort-up');\n const downIcon = headerBtn.querySelector('.sort-down');\n\n if (direction === 'asc') {\n upIcon.classList.remove('opacity-30');\n upIcon.classList.add('opacity-100', 'text-zinc-950', 'dark:text-white');\n downIcon.classList.add('opacity-30');\n downIcon.classList.remove('opacity-100', 'text-zinc-950', 'dark:text-white');\n } else {\n downIcon.classList.remove('opacity-30');\n downIcon.classList.add('opacity-100', 'text-zinc-950', 'dark:text-white');\n upIcon.classList.add('opacity-30');\n upIcon.classList.remove('opacity-100', 'text-zinc-950', 'dark:text-white');\n }\n\n // Find column index (accounting for potential select column)\n const headers = Array.from(table.querySelectorAll('th'));\n const selectableOffset = table.querySelector('input[id^=\"select-all\"]') ? 1 : 0;\n const columnIndex = headers.findIndex(th => th.querySelector(\\`[data-column=\"\\${column}\"]\\`)) - selectableOffset;\n\n // Sort rows\n rows.sort((a, b) => {\n const aCell = a.children[columnIndex + selectableOffset];\n const bCell = b.children[columnIndex + selectableOffset];\n\n if (!aCell || !bCell) return 0;\n\n let aValue = aCell.textContent.trim();\n let bValue = bCell.textContent.trim();\n\n // Handle different sort types\n switch (sortType) {\n case 'number':\n aValue = parseFloat(aValue.replace(/[^0-9.-]/g, '')) || 0;\n bValue = parseFloat(bValue.replace(/[^0-9.-]/g, '')) || 0;\n break;\n case 'date':\n aValue = new Date(aValue).getTime() || 0;\n bValue = new Date(bValue).getTime() || 0;\n break;\n case 'boolean':\n aValue = aValue.toLowerCase() === 'true' || aValue.toLowerCase() === 'published' || aValue.toLowerCase() === 'active';\n bValue = bValue.toLowerCase() === 'true' || bValue.toLowerCase() === 'published' || bValue.toLowerCase() === 'active';\n break;\n default: // string\n aValue = aValue.toLowerCase();\n bValue = bValue.toLowerCase();\n }\n\n if (aValue < bValue) return direction === 'asc' ? -1 : 1;\n if (aValue > bValue) return direction === 'asc' ? 1 : -1;\n return 0;\n });\n\n // Re-append sorted rows\n rows.forEach(row => tbody.appendChild(row));\n };\n\n // Select all functionality\n document.addEventListener('DOMContentLoaded', function() {\n document.querySelectorAll('[id^=\"select-all\"]').forEach(selectAll => {\n selectAll.addEventListener('change', function() {\n const tableId = this.id.replace('select-all-', '');\n const table = document.getElementById(tableId);\n if (table) {\n const checkboxes = table.querySelectorAll('.row-checkbox');\n checkboxes.forEach(checkbox => {\n checkbox.checked = this.checked;\n });\n }\n });\n });\n });\n </script>\n </div>\n `\n}","export interface PaginationData {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n queryParams?: Record<string, string>\n showPageNumbers?: boolean\n maxPageNumbers?: number\n showPageSizeSelector?: boolean\n pageSizeOptions?: number[]\n}\n\nexport function renderPagination(data: PaginationData): string {\n // Show pagination if there are multiple pages OR if page size selector is enabled\n const shouldShowPagination = data.totalPages > 1 || (data.showPageSizeSelector !== false && data.totalItems > 0)\n\n if (!shouldShowPagination) {\n return ''\n }\n\n const buildUrl = (page: number, limit?: number): string => {\n const params = new URLSearchParams(data.queryParams || {})\n params.set('page', page.toString())\n if (limit) {\n params.set('limit', limit.toString())\n } else if (data.itemsPerPage !== 20) {\n params.set('limit', data.itemsPerPage.toString())\n }\n return `${data.baseUrl}?${params.toString()}`\n }\n\n const buildPageSizeUrl = (limit: number): string => {\n const params = new URLSearchParams(data.queryParams || {})\n params.set('page', '1') // Reset to page 1 when changing page size\n params.set('limit', limit.toString())\n return `${data.baseUrl}?${params.toString()}`\n }\n\n const generatePageNumbers = (): number[] => {\n const maxNumbers = data.maxPageNumbers || 5\n const half = Math.floor(maxNumbers / 2)\n let start = Math.max(1, data.currentPage - half)\n let end = Math.min(data.totalPages, start + maxNumbers - 1)\n\n // Adjust start if we're near the end\n if (end - start + 1 < maxNumbers) {\n start = Math.max(1, end - maxNumbers + 1)\n }\n\n const pages: number[] = []\n for (let i = start; i <= end; i++) {\n pages.push(i)\n }\n return pages\n }\n\n return `\n <div class=\"rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 px-4 py-3 flex items-center justify-between mt-4\">\n ${data.totalPages > 1 ? `\n <!-- Mobile Pagination -->\n <div class=\"flex-1 flex justify-between sm:hidden\">\n ${data.currentPage > 1 ? `\n <a href=\"${buildUrl(data.currentPage - 1)}\" class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n Previous\n </a>\n ` : `\n <span class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-400 dark:text-zinc-600 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 opacity-50 cursor-not-allowed\">Previous</span>\n `}\n\n ${data.currentPage < data.totalPages ? `\n <a href=\"${buildUrl(data.currentPage + 1)}\" class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n Next\n </a>\n ` : `\n <span class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-400 dark:text-zinc-600 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 opacity-50 cursor-not-allowed\">Next</span>\n `}\n </div>\n ` : ''}\n\n <!-- Desktop Pagination -->\n <div class=\"hidden sm:flex-1 sm:flex sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-4\">\n <p class=\"text-sm text-zinc-500 dark:text-zinc-400\">\n Showing <span class=\"font-medium text-zinc-950 dark:text-white\">${data.startItem}</span> to\n <span class=\"font-medium text-zinc-950 dark:text-white\">${data.endItem}</span> of\n <span class=\"font-medium text-zinc-950 dark:text-white\">${data.totalItems}</span> results\n </p>\n ${data.showPageSizeSelector !== false ? `\n <div class=\"flex items-center gap-2\">\n <label for=\"page-size\" class=\"text-sm text-zinc-500 dark:text-zinc-400\">Per page:</label>\n <div class=\"grid grid-cols-1\">\n <select\n id=\"page-size\"\n onchange=\"window.location.href = this.value\"\n class=\"col-start-1 row-start-1 w-full appearance-none rounded-md bg-white/5 dark:bg-white/5 py-1.5 pl-3 pr-8 text-sm text-zinc-950 dark:text-white outline outline-1 -outline-offset-1 outline-zinc-500/30 dark:outline-zinc-400/30 *:bg-white dark:*:bg-zinc-800 focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-zinc-500 dark:focus-visible:outline-zinc-400\"\n >\n ${(data.pageSizeOptions || [10, 20, 50, 100]).map(size => `\n <option value=\"${buildPageSizeUrl(size)}\" ${size === data.itemsPerPage ? 'selected' : ''}>\n ${size}\n </option>\n `).join('')}\n </select>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" class=\"pointer-events-none col-start-1 row-start-1 mr-2 size-4 self-center justify-self-end text-zinc-600 dark:text-zinc-400\">\n <path d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\" clip-rule=\"evenodd\" fill-rule=\"evenodd\" />\n </svg>\n </div>\n </div>\n ` : ''}\n </div>\n\n ${data.totalPages > 1 ? `\n <div class=\"flex items-center gap-x-1\">\n <!-- Previous Button -->\n ${data.currentPage > 1 ? `\n <a href=\"${buildUrl(data.currentPage - 1)}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n Previous\n </a>\n ` : ''}\n\n <!-- Page Numbers -->\n ${data.showPageNumbers !== false ? `\n <!-- First page if not in range -->\n ${(() => {\n const pageNumbers = generatePageNumbers()\n const firstPage = pageNumbers.length > 0 ? pageNumbers[0] : null\n return firstPage && firstPage > 1 ? `\n <a href=\"${buildUrl(1)}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n 1\n </a>\n ${firstPage > 2 ? `\n <span class=\"px-2 text-sm text-zinc-500 dark:text-zinc-400\">...</span>\n ` : ''}\n ` : ''\n })()}\n\n <!-- Page number buttons -->\n ${generatePageNumbers().map(pageNum => `\n ${pageNum === data.currentPage ? `\n <span class=\"rounded-lg bg-zinc-950 dark:bg-white px-3 py-2 text-sm font-semibold text-white dark:text-zinc-950\">\n ${pageNum}\n </span>\n ` : `\n <a href=\"${buildUrl(pageNum)}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n ${pageNum}\n </a>\n `}\n `).join('')}\n\n <!-- Last page if not in range -->\n ${(() => {\n const pageNumbers = generatePageNumbers()\n const lastPageNum = pageNumbers.length > 0 ? pageNumbers.slice(-1)[0] : null\n return lastPageNum && lastPageNum < data.totalPages ? `\n ${lastPageNum < data.totalPages - 1 ? `\n <span class=\"px-2 text-sm text-zinc-500 dark:text-zinc-400\">...</span>\n ` : ''}\n <a href=\"${buildUrl(data.totalPages)}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n ${data.totalPages}\n </a>\n ` : ''\n })()}\n ` : ''}\n\n <!-- Next Button -->\n ${data.currentPage < data.totalPages ? `\n <a href=\"${buildUrl(data.currentPage + 1)}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\">\n Next\n </a>\n ` : ''}\n </div>\n ` : ''}\n </div>\n </div>\n `\n}","export type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: `<path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" />`,\n error: `<path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clip-rule=\"evenodd\" />`,\n warning: `<path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />`,\n info: `<path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />`\n }\n\n return `\n <div class=\"rounded-lg p-4 ${typeClasses[data.type]} ${data.className || ''}\" ${data.dismissible ? 'id=\"dismissible-alert\"' : ''}>\n <div class=\"flex\">\n ${data.icon !== false ? `\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 ${iconClasses[data.type]}\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n ${icons[data.type]}\n </svg>\n </div>\n ` : ''}\n <div class=\"${data.icon !== false ? 'ml-3' : ''}\">\n ${data.title ? `\n <h3 class=\"text-sm font-semibold ${textClasses[data.type]}\">\n ${data.title}\n </h3>\n ` : ''}\n <div class=\"${data.title ? 'mt-1 text-sm' : 'text-sm'} ${messageTextClasses[data.type]}\">\n <p>${data.message}</p>\n </div>\n </div>\n ${data.dismissible ? `\n <div class=\"ml-auto pl-3\">\n <div class=\"-mx-1.5 -my-1.5\">\n <button\n type=\"button\"\n class=\"inline-flex rounded-md p-1.5 ${iconClasses[data.type]} hover:bg-opacity-20 focus:outline-none focus:ring-2 focus:ring-offset-2\"\n onclick=\"document.getElementById('dismissible-alert').remove()\"\n >\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n ` : ''}\n </div>\n </div>\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n <el-dialog>\n <dialog\n id=\"${id}\"\n aria-labelledby=\"${id}-title\"\n class=\"fixed inset-0 m-0 size-auto max-h-none max-w-none overflow-y-auto bg-transparent p-0 backdrop:bg-transparent\"\n >\n <el-dialog-backdrop class=\"fixed inset-0 bg-gray-900/50 transition-opacity data-[closed]:opacity-0 data-[enter]:duration-300 data-[leave]:duration-200 data-[enter]:ease-out data-[leave]:ease-in\"></el-dialog-backdrop>\n\n <div tabindex=\"0\" class=\"flex min-h-full items-end justify-center p-4 text-center focus:outline focus:outline-0 sm:items-center sm:p-0\">\n <el-dialog-panel class=\"relative transform overflow-hidden rounded-lg bg-gray-800 px-4 pb-4 pt-5 text-left shadow-xl outline outline-1 -outline-offset-1 outline-white/10 transition-all data-[closed]:translate-y-4 data-[closed]:opacity-0 data-[enter]:duration-300 data-[leave]:duration-200 data-[enter]:ease-out data-[leave]:ease-in sm:my-8 sm:w-full sm:max-w-lg sm:p-6 data-[closed]:sm:translate-y-0 data-[closed]:sm:scale-95\">\n <div class=\"sm:flex sm:items-start\">\n <div class=\"mx-auto flex size-12 shrink-0 items-center justify-center rounded-full ${iconColorClasses[iconColor]} sm:mx-0 sm:size-10\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" data-slot=\"icon\" aria-hidden=\"true\" class=\"size-6\">\n <path d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"mt-3 text-center sm:ml-4 sm:mt-0 sm:text-left\">\n <h3 id=\"${id}-title\" class=\"text-base font-semibold text-white\">${title}</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-400\">${message}</p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 sm:mt-4 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onclick=\"${onConfirm}; document.getElementById('${id}').close()\"\n command=\"close\"\n commandfor=\"${id}\"\n class=\"confirm-button inline-flex w-full justify-center rounded-md ${confirmClass} px-3 py-2 text-sm font-semibold text-white sm:ml-3 sm:w-auto\"\n >\n ${confirmText}\n </button>\n <button\n type=\"button\"\n command=\"close\"\n commandfor=\"${id}\"\n class=\"mt-3 inline-flex w-full justify-center rounded-md bg-white/10 px-3 py-2 text-sm font-semibold text-white ring-1 ring-inset ring-white/5 hover:bg-white/20 sm:mt-0 sm:w-auto\"\n >\n ${cancelText}\n </button>\n </div>\n </el-dialog-panel>\n </div>\n </dialog>\n </el-dialog>\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n <script src=\"https://cdn.jsdelivr.net/npm/@tailwindplus/elements@1\" type=\"module\"></script>\n <script>\n function showConfirmDialog(dialogId) {\n const dialog = document.getElementById(dialogId);\n if (dialog) {\n dialog.showModal();\n }\n }\n </script>\n `\n}\n","export interface FilterOption {\n value: string\n label: string\n selected?: boolean\n color?: string\n}\n\nexport interface Filter {\n name: string\n label: string\n options: FilterOption[]\n}\n\nexport interface FilterBarData {\n filters: Filter[]\n actions?: Array<{\n label: string\n className?: string\n onclick?: string\n hxGet?: string\n hxTarget?: string\n }>\n bulkActions?: Array<{\n label: string\n value: string\n icon?: string\n className?: string\n }>\n}\n\nexport function renderFilterBar(data: FilterBarData): string {\n return `\n <div class=\"rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 p-6 mb-6\">\n <form id=\"filter-form\" class=\"flex flex-wrap gap-4 items-center\">\n ${data.filters.map(filter => `\n <div class=\"flex items-center space-x-2\">\n <label class=\"text-sm font-medium text-zinc-500 dark:text-zinc-400\">${filter.label}:</label>\n <select\n name=\"${filter.name}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 focus:ring-2 focus:ring-blue-600 dark:focus:ring-blue-500 focus:outline-none transition-colors\"\n onchange=\"updateFilters()\"\n >\n ${filter.options.map(option => `\n <option value=\"${option.value}\" ${option.selected ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('')}\n </select>\n </div>\n `).join('')}\n\n ${data.actions && data.actions.length > 0 ? `\n <div class=\"flex items-center space-x-2 ml-auto\">\n ${data.actions.map(action => `\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\"\n ${action.onclick ? `onclick=\"${action.onclick}\"` : ''}\n ${action.hxGet ? `hx-get=\"${action.hxGet}\"` : ''}\n ${action.hxTarget ? `hx-target=\"${action.hxTarget}\"` : ''}\n >\n ${action.label}\n </button>\n `).join('')}\n </div>\n ` : ''}\n </form>\n\n <script>\n function updateFilters() {\n const form = document.getElementById('filter-form');\n const formData = new FormData(form);\n const params = new URLSearchParams(window.location.search);\n\n // Update params with form values\n for (const [key, value] of formData.entries()) {\n if (value) {\n params.set(key, value);\n } else {\n params.delete(key);\n }\n }\n\n // Reset to page 1 when filters change\n params.set('page', '1');\n\n // Update URL and reload\n window.location.href = window.location.pathname + '?' + params.toString();\n }\n </script>\n </div>\n `\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-EMMSS5I5.cjs"}
@@ -1,9 +0,0 @@
1
- // src/routes/index.ts
2
- var ROUTES_INFO = {
3
- message: "Routes are application-specific - implement in your application",
4
- reference: "https://github.com/sonicjs/sonicjs"
5
- };
6
-
7
- export { ROUTES_INFO };
8
- //# sourceMappingURL=chunk-HD7R6T6I.js.map
9
- //# sourceMappingURL=chunk-HD7R6T6I.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/index.ts"],"names":[],"mappings":";AAYO,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,iEAAA;AAAA,EACT,SAAA,EAAW;AACb","file":"chunk-HD7R6T6I.js","sourcesContent":["/**\n * Routes Module Exports\n *\n * Note: HTTP routes are application-specific and should be implemented\n * in the consuming application rather than in the core package.\n *\n * The core package provides the building blocks (middleware, services, types)\n * but each application should define its own routes based on its specific needs.\n *\n * For reference implementations, see the main SonicJS repository.\n */\n\nexport const ROUTES_INFO = {\n message: 'Routes are application-specific - implement in your application',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]}