vibefast-cli 0.4.0 → 0.5.1

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 (89) hide show
  1. package/FEATURE-DEPENDENCY-SPEC.md +338 -0
  2. package/dist/__tests__/integration.test.d.ts +2 -0
  3. package/dist/__tests__/integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/integration.test.js +219 -0
  5. package/dist/__tests__/integration.test.js.map +1 -0
  6. package/dist/__tests__/recipes.test.d.ts +2 -0
  7. package/dist/__tests__/recipes.test.d.ts.map +1 -0
  8. package/dist/__tests__/recipes.test.js +143 -0
  9. package/dist/__tests__/recipes.test.js.map +1 -0
  10. package/dist/commands/__tests__/init.test.d.ts +2 -0
  11. package/dist/commands/__tests__/init.test.d.ts.map +1 -0
  12. package/dist/commands/__tests__/init.test.js +95 -0
  13. package/dist/commands/__tests__/init.test.js.map +1 -0
  14. package/dist/commands/__tests__/platform.test.d.ts +2 -0
  15. package/dist/commands/__tests__/platform.test.d.ts.map +1 -0
  16. package/dist/commands/__tests__/platform.test.js +123 -0
  17. package/dist/commands/__tests__/platform.test.js.map +1 -0
  18. package/dist/commands/add.d.ts.map +1 -1
  19. package/dist/commands/add.js +4 -5
  20. package/dist/commands/add.js.map +1 -1
  21. package/dist/commands/init.d.ts.map +1 -1
  22. package/dist/commands/init.js +12 -12
  23. package/dist/commands/init.js.map +1 -1
  24. package/dist/commands/platform.d.ts +3 -0
  25. package/dist/commands/platform.d.ts.map +1 -0
  26. package/dist/commands/platform.js +245 -0
  27. package/dist/commands/platform.js.map +1 -0
  28. package/dist/core/journal.d.ts.map +1 -1
  29. package/dist/core/journal.js +36 -19
  30. package/dist/core/journal.js.map +1 -1
  31. package/dist/core/recipes.d.ts.map +1 -1
  32. package/dist/core/recipes.js +8 -39
  33. package/dist/core/recipes.js.map +1 -1
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -1
  36. package/package.json +1 -1
  37. package/recipes/ios-widget/recipe.json +78 -0
  38. package/recipes/ios-widget/targets/widget/AppIntent.swift +46 -0
  39. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
  40. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
  41. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
  42. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
  43. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
  44. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
  45. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
  46. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
  47. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
  48. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
  49. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
  50. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
  51. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
  52. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
  53. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +122 -0
  54. package/recipes/ios-widget/targets/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
  55. package/recipes/ios-widget/targets/widget/CalorieTrackerWidget.swift +424 -0
  56. package/recipes/ios-widget/targets/widget/HabitTrackerWidget.swift +305 -0
  57. package/recipes/ios-widget/targets/widget/Info.plist +11 -0
  58. package/recipes/ios-widget/targets/widget/WidgetLiveActivity.swift +75 -0
  59. package/recipes/ios-widget/targets/widget/expo-target.config.js +10 -0
  60. package/recipes/ios-widget/targets/widget/generated.entitlements +5 -0
  61. package/recipes/ios-widget/targets/widget/index.swift +18 -0
  62. package/recipes/ios-widget/targets/widget/widgets.swift +96 -0
  63. package/recipes/ios-widget@latest.zip +0 -0
  64. package/recipes/payments/apps/native/src/app/(root)/(protected)/paywall/index.tsx +74 -0
  65. package/recipes/payments/apps/native/src/app/(root)/(protected)/paywall/local.tsx +25 -0
  66. package/recipes/payments/apps/native/src/app/(root)/(protected)/paywall/remote.tsx +23 -0
  67. package/recipes/payments/apps/native/src/features/payments/README.md +200 -0
  68. package/recipes/payments/apps/native/src/features/payments/app/local-paywall.tsx +194 -0
  69. package/recipes/payments/apps/native/src/features/payments/app/remote-paywall.tsx +79 -0
  70. package/recipes/payments/apps/native/src/features/payments/components/payment-initializer.tsx +95 -0
  71. package/recipes/payments/apps/native/src/features/payments/components/paywall-error-state.tsx +60 -0
  72. package/recipes/payments/apps/native/src/features/payments/components/paywall-local-mode.tsx +116 -0
  73. package/recipes/payments/apps/native/src/features/payments/components/paywall-product-card.tsx +133 -0
  74. package/recipes/payments/apps/native/src/features/payments/components/paywall-remote-mode.tsx +146 -0
  75. package/recipes/payments/apps/native/src/features/payments/hooks/use-entitlement.ts +63 -0
  76. package/recipes/payments/apps/native/src/features/payments/index.ts +8 -0
  77. package/recipes/payments/apps/native/src/features/payments/services/revenuecat-adapter.ts +407 -0
  78. package/recipes/payments/recipe.json +58 -0
  79. package/recipes/payments@latest.zip +0 -0
  80. package/src/__tests__/integration.test.ts +249 -0
  81. package/src/__tests__/recipes.test.ts +168 -0
  82. package/src/commands/__tests__/init.test.ts +112 -0
  83. package/src/commands/__tests__/platform.test.ts +141 -0
  84. package/src/commands/add.ts +4 -5
  85. package/src/commands/init.ts +14 -15
  86. package/src/commands/platform.ts +309 -0
  87. package/src/core/journal.ts +42 -25
  88. package/src/core/recipes.ts +8 -40
  89. package/src/index.ts +2 -0
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "ios-widget",
3
+ "version": "1.0.0",
4
+ "description": "iOS Home Screen widgets with Live Activities",
5
+ "category": "feature",
6
+ "icon": "📱",
7
+ "complexity": "medium",
8
+ "platforms": ["native"],
9
+ "files": [
10
+ {
11
+ "source": "targets/widget/AppIntent.swift",
12
+ "destination": "apps/native/targets/widget/AppIntent.swift"
13
+ },
14
+ {
15
+ "source": "targets/widget/CalorieTrackerWidget.swift",
16
+ "destination": "apps/native/targets/widget/CalorieTrackerWidget.swift"
17
+ },
18
+ {
19
+ "source": "targets/widget/expo-target.config.js",
20
+ "destination": "apps/native/targets/widget/expo-target.config.js"
21
+ },
22
+ {
23
+ "source": "targets/widget/generated.entitlements",
24
+ "destination": "apps/native/targets/widget/generated.entitlements"
25
+ },
26
+ {
27
+ "source": "targets/widget/HabitTrackerWidget.swift",
28
+ "destination": "apps/native/targets/widget/HabitTrackerWidget.swift"
29
+ },
30
+ {
31
+ "source": "targets/widget/index.swift",
32
+ "destination": "apps/native/targets/widget/index.swift"
33
+ },
34
+ {
35
+ "source": "targets/widget/Info.plist",
36
+ "destination": "apps/native/targets/widget/Info.plist"
37
+ },
38
+ {
39
+ "source": "targets/widget/WidgetLiveActivity.swift",
40
+ "destination": "apps/native/targets/widget/WidgetLiveActivity.swift"
41
+ },
42
+ {
43
+ "source": "targets/widget/widgets.swift",
44
+ "destination": "apps/native/targets/widget/widgets.swift"
45
+ },
46
+ {
47
+ "source": "targets/widget/Assets.xcassets",
48
+ "destination": "apps/native/targets/widget/Assets.xcassets",
49
+ "type": "directory"
50
+ }
51
+ ],
52
+ "dependencies": {
53
+ "npm": ["@bacons/apple-targets"],
54
+ "expo": []
55
+ },
56
+ "manualSteps": [
57
+ {
58
+ "title": "Configure Widget Plugin",
59
+ "description": "Add the @bacons/apple-targets plugin to your app.config.ts",
60
+ "file": "apps/native/app.config.ts",
61
+ "content": "[\n '@bacons/apple-targets',\n {\n targets: [\n {\n name: 'VibeFastWidget',\n type: 'widget',\n bundleIdentifier: `${Env.BUNDLE_ID}.widget`,\n entitlements: {\n 'com.apple.security.application-groups': [\n 'group.com.vibefast.vibefast',\n ],\n },\n },\n ],\n },\n]"
62
+ },
63
+ {
64
+ "title": "Configure App Groups",
65
+ "description": "Ensure your main app has App Groups entitlements in app.config.ts",
66
+ "file": "apps/native/app.config.ts",
67
+ "content": "ios: {\n entitlements: {\n 'com.apple.security.application-groups': ['group.com.vibefast.shared'],\n },\n}"
68
+ }
69
+ ],
70
+ "postInstall": {
71
+ "instructions": [
72
+ "Widget target files have been added",
73
+ "Run 'npx expo prebuild --clean' to regenerate native projects",
74
+ "Build and run on iOS to see the widgets",
75
+ "Long-press on home screen > Add Widget > Select your app"
76
+ ]
77
+ }
78
+ }
@@ -0,0 +1,46 @@
1
+ import WidgetKit
2
+ import AppIntents
3
+
4
+ @available(iOSApplicationExtension 17.0, *)
5
+ struct CalorieWidgetConfigurationIntent: WidgetConfigurationIntent {
6
+ static var title: LocalizedStringResource { "Widget Configuration" }
7
+ static var description: IntentDescription { "Configure how your nutrition data is displayed in the widget." }
8
+
9
+ @available(iOSApplicationExtension 17.0, *)
10
+ @Parameter(title: "Display Mode", default: .fullMacros)
11
+ var displayMode: DisplayMode
12
+
13
+ @available(iOSApplicationExtension 17.0, *)
14
+ @Parameter(title: "Show Progress Ring", default: true)
15
+ var showProgressRing: Bool
16
+ }
17
+
18
+ // Simple App Intent for the basic widget
19
+ @available(iOSApplicationExtension 17.0, *)
20
+ struct ConfigurationAppIntent: WidgetConfigurationIntent {
21
+ static var title: LocalizedStringResource { "Configuration" }
22
+ static var description: IntentDescription { "Configure the widget display." }
23
+
24
+ @available(iOSApplicationExtension 17.0, *)
25
+ @Parameter(title: "Favorite Emoji", default: "😀")
26
+ var favoriteEmoji: String
27
+ }
28
+
29
+ @available(iOSApplicationExtension 17.0, *)
30
+ enum DisplayMode: String, AppEnum {
31
+ case caloriesOnly = "calories_only"
32
+ case fullMacros = "full_macros"
33
+ case progressEmphasis = "progress_emphasis"
34
+
35
+ static var typeDisplayRepresentation: TypeDisplayRepresentation {
36
+ TypeDisplayRepresentation(name: "Display Mode")
37
+ }
38
+
39
+ static var caseDisplayRepresentations: [DisplayMode: DisplayRepresentation] {
40
+ [
41
+ .caloriesOnly: DisplayRepresentation(title: "Calories Only", subtitle: "Show only calorie information"),
42
+ .fullMacros: DisplayRepresentation(title: "Full Macros", subtitle: "Show calories and macronutrients"),
43
+ .progressEmphasis: DisplayRepresentation(title: "Progress Focus", subtitle: "Emphasize progress and goals")
44
+ ]
45
+ }
46
+ }
@@ -0,0 +1,122 @@
1
+ {
2
+ "images": [
3
+ {
4
+ "idiom": "iphone",
5
+ "size": "20x20",
6
+ "scale": "2x",
7
+ "filename": "App-Icon-20x20@2x.png"
8
+ },
9
+ {
10
+ "idiom": "iphone",
11
+ "size": "20x20",
12
+ "scale": "3x",
13
+ "filename": "App-Icon-20x20@3x.png"
14
+ },
15
+ {
16
+ "idiom": "iphone",
17
+ "size": "29x29",
18
+ "scale": "1x",
19
+ "filename": "App-Icon-29x29@1x.png"
20
+ },
21
+ {
22
+ "idiom": "iphone",
23
+ "size": "29x29",
24
+ "scale": "2x",
25
+ "filename": "App-Icon-29x29@2x.png"
26
+ },
27
+ {
28
+ "idiom": "iphone",
29
+ "size": "29x29",
30
+ "scale": "3x",
31
+ "filename": "App-Icon-29x29@3x.png"
32
+ },
33
+ {
34
+ "idiom": "iphone",
35
+ "size": "40x40",
36
+ "scale": "2x",
37
+ "filename": "App-Icon-40x40@2x.png"
38
+ },
39
+ {
40
+ "idiom": "iphone",
41
+ "size": "40x40",
42
+ "scale": "3x",
43
+ "filename": "App-Icon-40x40@3x.png"
44
+ },
45
+ {
46
+ "idiom": "iphone",
47
+ "size": "60x60",
48
+ "scale": "2x",
49
+ "filename": "App-Icon-60x60@2x.png"
50
+ },
51
+ {
52
+ "idiom": "iphone",
53
+ "size": "60x60",
54
+ "scale": "3x",
55
+ "filename": "App-Icon-60x60@3x.png"
56
+ },
57
+ {
58
+ "idiom": "ipad",
59
+ "size": "20x20",
60
+ "scale": "1x",
61
+ "filename": "App-Icon-20x20@1x.png"
62
+ },
63
+ {
64
+ "idiom": "ipad",
65
+ "size": "20x20",
66
+ "scale": "2x",
67
+ "filename": "App-Icon-20x20@2x.png"
68
+ },
69
+ {
70
+ "idiom": "ipad",
71
+ "size": "29x29",
72
+ "scale": "1x",
73
+ "filename": "App-Icon-29x29@1x.png"
74
+ },
75
+ {
76
+ "idiom": "ipad",
77
+ "size": "29x29",
78
+ "scale": "2x",
79
+ "filename": "App-Icon-29x29@2x.png"
80
+ },
81
+ {
82
+ "idiom": "ipad",
83
+ "size": "40x40",
84
+ "scale": "1x",
85
+ "filename": "App-Icon-40x40@1x.png"
86
+ },
87
+ {
88
+ "idiom": "ipad",
89
+ "size": "40x40",
90
+ "scale": "2x",
91
+ "filename": "App-Icon-40x40@2x.png"
92
+ },
93
+ {
94
+ "idiom": "ipad",
95
+ "size": "76x76",
96
+ "scale": "1x",
97
+ "filename": "App-Icon-76x76@1x.png"
98
+ },
99
+ {
100
+ "idiom": "ipad",
101
+ "size": "76x76",
102
+ "scale": "2x",
103
+ "filename": "App-Icon-76x76@2x.png"
104
+ },
105
+ {
106
+ "idiom": "ipad",
107
+ "size": "83.5x83.5",
108
+ "scale": "2x",
109
+ "filename": "App-Icon-83.5x83.5@2x.png"
110
+ },
111
+ {
112
+ "idiom": "ios-marketing",
113
+ "size": "1024x1024",
114
+ "scale": "1x",
115
+ "filename": "ItunesArtwork@2x.png"
116
+ }
117
+ ],
118
+ "info": {
119
+ "version": 1,
120
+ "author": "expo"
121
+ }
122
+ }