shipd 0.1.3 → 0.1.4

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 (115) hide show
  1. package/base-package/app/globals.css +126 -0
  2. package/base-package/app/layout.tsx +53 -0
  3. package/base-package/app/page.tsx +15 -0
  4. package/base-package/base.config.json +57 -0
  5. package/base-package/components/ui/avatar.tsx +53 -0
  6. package/base-package/components/ui/badge.tsx +46 -0
  7. package/base-package/components/ui/button.tsx +59 -0
  8. package/base-package/components/ui/card.tsx +92 -0
  9. package/base-package/components/ui/chart.tsx +353 -0
  10. package/base-package/components/ui/checkbox.tsx +32 -0
  11. package/base-package/components/ui/dialog.tsx +135 -0
  12. package/base-package/components/ui/dropdown-menu.tsx +257 -0
  13. package/base-package/components/ui/form.tsx +167 -0
  14. package/base-package/components/ui/input.tsx +21 -0
  15. package/base-package/components/ui/label.tsx +24 -0
  16. package/base-package/components/ui/progress.tsx +31 -0
  17. package/base-package/components/ui/resizable.tsx +56 -0
  18. package/base-package/components/ui/select.tsx +185 -0
  19. package/base-package/components/ui/separator.tsx +28 -0
  20. package/base-package/components/ui/sheet.tsx +139 -0
  21. package/base-package/components/ui/skeleton.tsx +13 -0
  22. package/base-package/components/ui/sonner.tsx +25 -0
  23. package/base-package/components/ui/switch.tsx +31 -0
  24. package/base-package/components/ui/tabs.tsx +66 -0
  25. package/base-package/components/ui/textarea.tsx +18 -0
  26. package/base-package/components/ui/toggle-group.tsx +73 -0
  27. package/base-package/components/ui/toggle.tsx +47 -0
  28. package/base-package/components/ui/tooltip.tsx +61 -0
  29. package/base-package/components.json +21 -0
  30. package/base-package/eslint.config.mjs +16 -0
  31. package/base-package/lib/utils.ts +6 -0
  32. package/base-package/middleware.ts +12 -0
  33. package/base-package/next.config.ts +27 -0
  34. package/base-package/package.json +49 -0
  35. package/base-package/postcss.config.mjs +5 -0
  36. package/base-package/public/favicon.svg +4 -0
  37. package/base-package/tailwind.config.ts +89 -0
  38. package/base-package/tsconfig.json +27 -0
  39. package/dist/index.js +1858 -956
  40. package/features/ai-chat/README.md +258 -0
  41. package/features/ai-chat/app/api/chat/route.ts +16 -0
  42. package/features/ai-chat/app/dashboard/_components/chatbot.tsx +39 -0
  43. package/features/ai-chat/app/dashboard/chat/page.tsx +73 -0
  44. package/features/ai-chat/feature.config.json +22 -0
  45. package/features/analytics/README.md +308 -0
  46. package/features/analytics/feature.config.json +20 -0
  47. package/features/analytics/lib/posthog.ts +36 -0
  48. package/features/auth/README.md +336 -0
  49. package/features/auth/app/api/auth/[...all]/route.ts +4 -0
  50. package/features/auth/app/dashboard/layout.tsx +15 -0
  51. package/features/auth/app/dashboard/page.tsx +140 -0
  52. package/features/auth/app/sign-in/page.tsx +228 -0
  53. package/features/auth/app/sign-up/page.tsx +243 -0
  54. package/features/auth/auth-schema.ts +47 -0
  55. package/features/auth/components/auth/setup-instructions.tsx +123 -0
  56. package/features/auth/feature.config.json +33 -0
  57. package/features/auth/lib/auth-client.ts +8 -0
  58. package/features/auth/lib/auth.ts +295 -0
  59. package/features/auth/lib/email-stub.ts +55 -0
  60. package/features/auth/lib/email.ts +47 -0
  61. package/features/auth/middleware.patch.ts +43 -0
  62. package/features/database/README.md +256 -0
  63. package/features/database/db/drizzle.ts +48 -0
  64. package/features/database/db/schema.ts +21 -0
  65. package/features/database/drizzle.config.ts +13 -0
  66. package/features/database/feature.config.json +30 -0
  67. package/features/email/README.md +282 -0
  68. package/features/email/emails/components/layout.tsx +181 -0
  69. package/features/email/emails/password-reset.tsx +67 -0
  70. package/features/email/emails/payment-failed.tsx +167 -0
  71. package/features/email/emails/subscription-confirmation.tsx +129 -0
  72. package/features/email/emails/welcome.tsx +100 -0
  73. package/features/email/feature.config.json +22 -0
  74. package/features/email/lib/email.ts +118 -0
  75. package/features/file-upload/README.md +271 -0
  76. package/features/file-upload/app/api/upload-image/route.ts +64 -0
  77. package/features/file-upload/app/dashboard/upload/page.tsx +324 -0
  78. package/features/file-upload/feature.config.json +23 -0
  79. package/features/file-upload/lib/upload-image.ts +28 -0
  80. package/features/marketing-landing/README.md +266 -0
  81. package/features/marketing-landing/app/page.tsx +25 -0
  82. package/features/marketing-landing/components/homepage/cli-workflow-section.tsx +231 -0
  83. package/features/marketing-landing/components/homepage/features-section.tsx +152 -0
  84. package/features/marketing-landing/components/homepage/footer.tsx +53 -0
  85. package/features/marketing-landing/components/homepage/hero-section.tsx +112 -0
  86. package/features/marketing-landing/components/homepage/integrations.tsx +124 -0
  87. package/features/marketing-landing/components/homepage/navigation.tsx +116 -0
  88. package/features/marketing-landing/components/homepage/news-section.tsx +82 -0
  89. package/features/marketing-landing/components/homepage/pricing-section.tsx +98 -0
  90. package/features/marketing-landing/components/homepage/testimonials-section.tsx +34 -0
  91. package/features/marketing-landing/components/logos/BetterAuth.tsx +21 -0
  92. package/features/marketing-landing/components/logos/NeonPostgres.tsx +41 -0
  93. package/features/marketing-landing/components/logos/Nextjs.tsx +72 -0
  94. package/features/marketing-landing/components/logos/Polar.tsx +7 -0
  95. package/features/marketing-landing/components/logos/TailwindCSS.tsx +27 -0
  96. package/features/marketing-landing/components/logos/index.ts +6 -0
  97. package/features/marketing-landing/components/logos/shadcnui.tsx +8 -0
  98. package/features/marketing-landing/feature.config.json +23 -0
  99. package/features/payments/README.md +306 -0
  100. package/features/payments/app/api/subscription/route.ts +25 -0
  101. package/features/payments/app/dashboard/payment/_components/manage-subscription.tsx +22 -0
  102. package/features/payments/app/dashboard/payment/page.tsx +126 -0
  103. package/features/payments/app/success/page.tsx +123 -0
  104. package/features/payments/feature.config.json +31 -0
  105. package/features/payments/lib/polar-products.ts +49 -0
  106. package/features/payments/lib/subscription.ts +148 -0
  107. package/features/payments/payments-schema.ts +30 -0
  108. package/features/seo/README.md +244 -0
  109. package/features/seo/app/blog/[slug]/page.tsx +314 -0
  110. package/features/seo/app/blog/page.tsx +107 -0
  111. package/features/seo/app/robots.txt +13 -0
  112. package/features/seo/app/sitemap.ts +70 -0
  113. package/features/seo/feature.config.json +19 -0
  114. package/features/seo/lib/seo-utils.ts +163 -0
  115. package/package.json +3 -1
@@ -0,0 +1,70 @@
1
+ import { MetadataRoute } from 'next'
2
+
3
+ export default function sitemap(): MetadataRoute.Sitemap {
4
+ const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'
5
+
6
+ // Blog posts - update this array with your actual blog posts
7
+ // In production, you might fetch this from a CMS or markdown files
8
+ const blogPosts = [
9
+ {
10
+ slug: 'getting-started-with-saas',
11
+ date: '2024-12-15',
12
+ },
13
+ {
14
+ slug: 'optimizing-conversion-rates',
15
+ date: '2024-12-10',
16
+ },
17
+ {
18
+ slug: 'scaling-your-saas',
19
+ date: '2024-12-05',
20
+ },
21
+ ]
22
+
23
+ const blogRoutes = blogPosts.map((post) => ({
24
+ url: `${baseUrl}/blog/${post.slug}`,
25
+ lastModified: new Date(post.date),
26
+ changeFrequency: 'monthly' as const,
27
+ priority: 0.7,
28
+ }))
29
+
30
+ return [
31
+ {
32
+ url: baseUrl,
33
+ lastModified: new Date(),
34
+ changeFrequency: 'weekly',
35
+ priority: 1,
36
+ },
37
+ {
38
+ url: `${baseUrl}/blog`,
39
+ lastModified: new Date(),
40
+ changeFrequency: 'weekly',
41
+ priority: 0.9,
42
+ },
43
+ ...blogRoutes,
44
+ {
45
+ url: `${baseUrl}/pricing`,
46
+ lastModified: new Date(),
47
+ changeFrequency: 'monthly',
48
+ priority: 0.8,
49
+ },
50
+ {
51
+ url: `${baseUrl}/docs`,
52
+ lastModified: new Date(),
53
+ changeFrequency: 'weekly',
54
+ priority: 0.8,
55
+ },
56
+ {
57
+ url: `${baseUrl}/terms-of-service`,
58
+ lastModified: new Date(),
59
+ changeFrequency: 'yearly',
60
+ priority: 0.3,
61
+ },
62
+ {
63
+ url: `${baseUrl}/privacy-policy`,
64
+ lastModified: new Date(),
65
+ changeFrequency: 'yearly',
66
+ priority: 0.3,
67
+ },
68
+ ]
69
+ }
70
+
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "seo",
3
+ "version": "1.0.0",
4
+ "description": "Complete SEO module with sitemap, robots.txt, blog structure, and structured data",
5
+ "dependencies": {},
6
+ "devDependencies": {},
7
+ "envVars": [
8
+ "NEXT_PUBLIC_APP_URL"
9
+ ],
10
+ "files": [
11
+ "app/sitemap.ts",
12
+ "app/robots.txt",
13
+ "app/blog/**/*",
14
+ "lib/seo-utils.ts"
15
+ ],
16
+ "requires": [],
17
+ "conflicts": []
18
+ }
19
+
@@ -0,0 +1,163 @@
1
+ /**
2
+ * SEO Utilities
3
+ * Helper functions for structured data, meta tags, and SEO optimization
4
+ */
5
+
6
+ export interface StructuredData {
7
+ "@context": string;
8
+ "@type": string;
9
+ [key: string]: any;
10
+ }
11
+
12
+ /**
13
+ * Generate JSON-LD structured data for a WebApplication
14
+ */
15
+ export function generateWebAppStructuredData(
16
+ name: string,
17
+ description: string,
18
+ url: string
19
+ ): StructuredData {
20
+ return {
21
+ "@context": "https://schema.org",
22
+ "@type": "WebApplication",
23
+ name,
24
+ description,
25
+ url,
26
+ applicationCategory: "BusinessApplication",
27
+ offers: {
28
+ "@type": "Offer",
29
+ category: "SaaS",
30
+ },
31
+ creator: {
32
+ "@type": "Organization",
33
+ name,
34
+ url,
35
+ },
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Generate JSON-LD structured data for a BlogPosting
41
+ */
42
+ export function generateBlogPostStructuredData(
43
+ title: string,
44
+ description: string,
45
+ url: string,
46
+ datePublished: string,
47
+ dateModified?: string,
48
+ author?: string,
49
+ image?: string
50
+ ): StructuredData {
51
+ return {
52
+ "@context": "https://schema.org",
53
+ "@type": "BlogPosting",
54
+ headline: title,
55
+ description,
56
+ url,
57
+ datePublished,
58
+ dateModified: dateModified || datePublished,
59
+ author: author
60
+ ? {
61
+ "@type": "Person",
62
+ name: author,
63
+ }
64
+ : undefined,
65
+ image: image
66
+ ? {
67
+ "@type": "ImageObject",
68
+ url: image,
69
+ }
70
+ : undefined,
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Generate JSON-LD structured data for an Organization
76
+ */
77
+ export function generateOrganizationStructuredData(
78
+ name: string,
79
+ url: string,
80
+ logo?: string,
81
+ socialProfiles?: {
82
+ twitter?: string;
83
+ github?: string;
84
+ linkedin?: string;
85
+ }
86
+ ): StructuredData {
87
+ const data: StructuredData = {
88
+ "@context": "https://schema.org",
89
+ "@type": "Organization",
90
+ name,
91
+ url,
92
+ };
93
+
94
+ if (logo) {
95
+ data.logo = {
96
+ "@type": "ImageObject",
97
+ url: logo,
98
+ };
99
+ }
100
+
101
+ if (socialProfiles) {
102
+ data.sameAs = [];
103
+ if (socialProfiles.twitter) {
104
+ data.sameAs.push(socialProfiles.twitter);
105
+ }
106
+ if (socialProfiles.github) {
107
+ data.sameAs.push(socialProfiles.github);
108
+ }
109
+ if (socialProfiles.linkedin) {
110
+ data.sameAs.push(socialProfiles.linkedin);
111
+ }
112
+ }
113
+
114
+ return data;
115
+ }
116
+
117
+ /**
118
+ * Generate OpenGraph metadata object
119
+ */
120
+ export function generateOpenGraphMetadata(
121
+ title: string,
122
+ description: string,
123
+ url: string,
124
+ image?: string,
125
+ type: "website" | "article" = "website"
126
+ ) {
127
+ return {
128
+ title,
129
+ description,
130
+ url,
131
+ siteName: title,
132
+ images: image
133
+ ? [
134
+ {
135
+ url: image,
136
+ width: 1200,
137
+ height: 630,
138
+ alt: title,
139
+ },
140
+ ]
141
+ : [],
142
+ type,
143
+ };
144
+ }
145
+
146
+ /**
147
+ * Generate Twitter Card metadata
148
+ */
149
+ export function generateTwitterCardMetadata(
150
+ title: string,
151
+ description: string,
152
+ image?: string,
153
+ creator?: string
154
+ ) {
155
+ return {
156
+ card: "summary_large_image" as const,
157
+ title,
158
+ description,
159
+ images: image ? [image] : [],
160
+ creator: creator ? `@${creator}` : undefined,
161
+ };
162
+ }
163
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shipd",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Generate production-ready SaaS applications with authentication, billing, and more",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,6 +11,8 @@
11
11
  "dist",
12
12
  "template",
13
13
  "docs-template",
14
+ "features",
15
+ "base-package",
14
16
  "README.md",
15
17
  "LICENSE"
16
18
  ],