voltra 2.0.0 → 2.1.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 (84) hide show
  1. package/build/cjs/config/normalize.js +93 -0
  2. package/build/cjs/config/normalize.js.map +1 -1
  3. package/build/cjs/index.js +5 -2
  4. package/build/cjs/index.js.map +1 -1
  5. package/build/cjs/platforms/android/apply.js +11 -2
  6. package/build/cjs/platforms/android/apply.js.map +1 -1
  7. package/build/cjs/platforms/android/generated.js +152 -130
  8. package/build/cjs/platforms/android/generated.js.map +1 -1
  9. package/build/cjs/platforms/android/gradle.js +120 -0
  10. package/build/cjs/platforms/android/gradle.js.map +1 -0
  11. package/build/cjs/platforms/ios/generated.js +246 -142
  12. package/build/cjs/platforms/ios/generated.js.map +1 -1
  13. package/build/cjs/platforms/ios/xcodeTarget.js +68 -0
  14. package/build/cjs/platforms/ios/xcodeTarget.js.map +1 -1
  15. package/build/cjs/platforms/shared/widgetModule.js +151 -0
  16. package/build/cjs/platforms/shared/widgetModule.js.map +1 -0
  17. package/build/esm/config/normalize.js +93 -0
  18. package/build/esm/config/normalize.js.map +1 -1
  19. package/build/esm/index.js +1 -0
  20. package/build/esm/index.js.map +1 -1
  21. package/build/esm/platforms/android/apply.js +11 -2
  22. package/build/esm/platforms/android/apply.js.map +1 -1
  23. package/build/esm/platforms/android/generated.js +152 -97
  24. package/build/esm/platforms/android/generated.js.map +1 -1
  25. package/build/esm/platforms/android/gradle.js +112 -0
  26. package/build/esm/platforms/android/gradle.js.map +1 -0
  27. package/build/esm/platforms/ios/generated.js +246 -109
  28. package/build/esm/platforms/ios/generated.js.map +1 -1
  29. package/build/esm/platforms/ios/xcodeTarget.js +69 -1
  30. package/build/esm/platforms/ios/xcodeTarget.js.map +1 -1
  31. package/build/esm/platforms/shared/widgetModule.js +111 -0
  32. package/build/esm/platforms/shared/widgetModule.js.map +1 -0
  33. package/build/types/config/normalize.d.ts.map +1 -1
  34. package/build/types/config/types.d.ts +32 -0
  35. package/build/types/config/types.d.ts.map +1 -1
  36. package/build/types/index.d.ts +3 -1
  37. package/build/types/index.d.ts.map +1 -1
  38. package/build/types/platforms/android/apply.d.ts.map +1 -1
  39. package/build/types/platforms/android/generated.d.ts.map +1 -1
  40. package/build/types/platforms/android/gradle.d.ts +18 -0
  41. package/build/types/platforms/android/gradle.d.ts.map +1 -0
  42. package/build/types/platforms/ios/generated.d.ts.map +1 -1
  43. package/build/types/platforms/ios/xcodeTarget.d.ts.map +1 -1
  44. package/build/types/platforms/shared/widgetModule.d.ts +9 -0
  45. package/build/types/platforms/shared/widgetModule.d.ts.map +1 -0
  46. package/package.json +2 -1
  47. package/src/apply/index.ts +309 -0
  48. package/src/apply/preflight.ts +172 -0
  49. package/src/bin.ts +14 -0
  50. package/src/commands/apply.ts +114 -0
  51. package/src/config/defaults.ts +34 -0
  52. package/src/config/load.ts +100 -0
  53. package/src/config/normalize.ts +562 -0
  54. package/src/config/types.ts +317 -0
  55. package/src/cosmiconfig.d.ts +21 -0
  56. package/src/dependencies/platformPackages.ts +75 -0
  57. package/src/discovery/android.ts +233 -0
  58. package/src/discovery/ios.ts +579 -0
  59. package/src/fs/path.ts +25 -0
  60. package/src/fs/readWrite.ts +102 -0
  61. package/src/git/status.ts +205 -0
  62. package/src/index.ts +204 -0
  63. package/src/platforms/android/apply.ts +106 -0
  64. package/src/platforms/android/generated.ts +1284 -0
  65. package/src/platforms/android/gradle.ts +155 -0
  66. package/src/platforms/android/manifest.ts +379 -0
  67. package/src/platforms/ios/apply.ts +139 -0
  68. package/src/platforms/ios/deploymentTarget.ts +47 -0
  69. package/src/platforms/ios/entitlements.ts +146 -0
  70. package/src/platforms/ios/generated.ts +1233 -0
  71. package/src/platforms/ios/mainAppEntitlements.ts +11 -0
  72. package/src/platforms/ios/plist.ts +321 -0
  73. package/src/platforms/ios/podfile.ts +255 -0
  74. package/src/platforms/ios/targetName.ts +11 -0
  75. package/src/platforms/ios/xcode.ts +181 -0
  76. package/src/platforms/ios/xcodeTarget.ts +899 -0
  77. package/src/platforms/shared/widgetModule.ts +153 -0
  78. package/src/reporting/clack.ts +67 -0
  79. package/src/reporting/summary.ts +116 -0
  80. package/src/state/diff.ts +21 -0
  81. package/src/state/files.ts +52 -0
  82. package/src/state/load.ts +66 -0
  83. package/src/state/save.ts +31 -0
  84. package/src/xml2js.d.ts +23 -0
@@ -0,0 +1,181 @@
1
+ import fs from 'node:fs/promises'
2
+
3
+ import { PBXNativeTarget, XcodeProject } from '@bacons/xcode'
4
+
5
+ import { VoltraCliError } from '../../reporting/summary'
6
+
7
+ import type {
8
+ PBXCopyFilesBuildPhase,
9
+ PBXFrameworksBuildPhase,
10
+ PBXGroup,
11
+ PBXResourcesBuildPhase,
12
+ PBXSourcesBuildPhase,
13
+ XCBuildConfiguration,
14
+ } from '@bacons/xcode'
15
+ import type { IOSProjectDiscovery } from '../../discovery/ios'
16
+
17
+ const IOS_APP_PRODUCT_TYPE = 'com.apple.product-type.application'
18
+ const { build: buildXcodeProjectJson } = require('@bacons/xcode/json') as {
19
+ build(project: ReturnType<XcodeProject['toJSON']>): string
20
+ }
21
+
22
+ export interface IOSXcodeTargetBuildConfigurations {
23
+ all: XCBuildConfiguration[]
24
+ default: XCBuildConfiguration
25
+ }
26
+
27
+ export interface IOSXcodeTargetBuildPhases {
28
+ sources: PBXSourcesBuildPhase
29
+ resources: PBXResourcesBuildPhase
30
+ frameworks: PBXFrameworksBuildPhase
31
+ }
32
+
33
+ export interface IOSXcodeTargetContext {
34
+ target: PBXNativeTarget
35
+ buildConfigurations: IOSXcodeTargetBuildConfigurations
36
+ buildPhases: IOSXcodeTargetBuildPhases
37
+ getCopyFilesBuildPhaseFor(target: PBXNativeTarget): PBXCopyFilesBuildPhase
38
+ }
39
+
40
+ export interface IOSXcodeProjectContext {
41
+ project: XcodeProject
42
+ mainAppTarget: IOSXcodeTargetContext
43
+ mainGroup: PBXGroup
44
+ productsGroup: PBXGroup
45
+ frameworksGroup: PBXGroup
46
+ }
47
+
48
+ export class IOSXcodeProjectError extends VoltraCliError {
49
+ constructor(message: string) {
50
+ super(message, 'VOLTRA_IOS_XCODE_FAILED')
51
+ this.name = 'IOSXcodeProjectError'
52
+ }
53
+ }
54
+
55
+ export function openIOSXcodeProject(discovery: IOSProjectDiscovery): IOSXcodeProjectContext {
56
+ try {
57
+ const project = XcodeProject.open(discovery.pbxprojPath)
58
+ const mainGroup = project.rootObject.props.mainGroup
59
+
60
+ if (!mainGroup) {
61
+ throw new IOSXcodeProjectError(`Xcode project is missing a main group: ${discovery.pbxprojPath}`)
62
+ }
63
+
64
+ const mainAppTarget = resolveMainAppTarget(project, discovery)
65
+
66
+ return {
67
+ project,
68
+ mainAppTarget,
69
+ mainGroup,
70
+ productsGroup: getExistingProductGroup(project, discovery),
71
+ frameworksGroup: getExistingFrameworksGroup(project, discovery),
72
+ }
73
+ } catch (error: unknown) {
74
+ if (error instanceof IOSXcodeProjectError) {
75
+ throw error
76
+ }
77
+
78
+ throw new IOSXcodeProjectError(`Failed to open Xcode project ${discovery.pbxprojPath}: ${getErrorMessage(error)}`)
79
+ }
80
+ }
81
+
82
+ export function getApplicationTargets(project: XcodeProject): PBXNativeTarget[] {
83
+ return project.rootObject.props.targets.filter((target): target is PBXNativeTarget => {
84
+ return PBXNativeTarget.is(target) && target.props.productType === IOS_APP_PRODUCT_TYPE
85
+ })
86
+ }
87
+
88
+ export function getTargetBuildConfigurations(target: PBXNativeTarget): IOSXcodeTargetBuildConfigurations {
89
+ const configurationList = target.props.buildConfigurationList
90
+
91
+ if (!configurationList) {
92
+ throw new IOSXcodeProjectError(`Target '${target.props.name}' is missing a build configuration list.`)
93
+ }
94
+
95
+ const all = configurationList.props.buildConfigurations
96
+
97
+ if (all.length === 0) {
98
+ throw new IOSXcodeProjectError(`Target '${target.props.name}' does not define any build configurations.`)
99
+ }
100
+
101
+ return {
102
+ all,
103
+ default: configurationList.getDefaultConfiguration(),
104
+ }
105
+ }
106
+
107
+ export function getTargetBuildPhases(target: PBXNativeTarget): IOSXcodeTargetBuildPhases {
108
+ return {
109
+ sources: target.getSourcesBuildPhase(),
110
+ resources: target.getResourcesBuildPhase(),
111
+ frameworks: target.getFrameworksBuildPhase(),
112
+ }
113
+ }
114
+
115
+ export function ensureMainGroupChild(context: IOSXcodeProjectContext, name: string): PBXGroup {
116
+ return context.project.rootObject.ensureMainGroupChild(name)
117
+ }
118
+
119
+ export function ensureProductsGroup(context: IOSXcodeProjectContext): PBXGroup {
120
+ return context.project.rootObject.ensureProductGroup()
121
+ }
122
+
123
+ export function ensureFrameworksGroup(context: IOSXcodeProjectContext): PBXGroup {
124
+ return context.project.rootObject.getFrameworksGroup()
125
+ }
126
+
127
+ export function saveIOSXcodeProject(context: IOSXcodeProjectContext): Promise<void> {
128
+ const contents = buildXcodeProjectJson(context.project.toJSON())
129
+ return fs.writeFile(context.project.filePath, contents, 'utf8')
130
+ }
131
+
132
+ function resolveMainAppTarget(project: XcodeProject, discovery: IOSProjectDiscovery): IOSXcodeTargetContext {
133
+ const applicationTargets = getApplicationTargets(project)
134
+ const target = applicationTargets.find((candidate) => candidate.props.name === discovery.mainTargetName)
135
+
136
+ if (!target) {
137
+ throw new IOSXcodeProjectError(
138
+ `Xcode project does not contain the discovered main app target '${
139
+ discovery.mainTargetName
140
+ }'. Available application targets: ${applicationTargets
141
+ .map((candidate) => candidate.props.name)
142
+ .sort()
143
+ .join(', ')}`
144
+ )
145
+ }
146
+
147
+ return {
148
+ target,
149
+ buildConfigurations: getTargetBuildConfigurations(target),
150
+ buildPhases: getTargetBuildPhases(target),
151
+ getCopyFilesBuildPhaseFor(dependencyTarget: PBXNativeTarget): PBXCopyFilesBuildPhase {
152
+ return target.getCopyBuildPhaseForTarget(dependencyTarget)
153
+ },
154
+ }
155
+ }
156
+
157
+ function getExistingProductGroup(project: XcodeProject, discovery: IOSProjectDiscovery): PBXGroup {
158
+ const productGroup = project.rootObject.props.productRefGroup
159
+
160
+ if (!productGroup) {
161
+ throw new IOSXcodeProjectError(`Xcode project is missing the Products group: ${discovery.pbxprojPath}`)
162
+ }
163
+
164
+ return productGroup
165
+ }
166
+
167
+ function getExistingFrameworksGroup(project: XcodeProject, discovery: IOSProjectDiscovery): PBXGroup {
168
+ const frameworksGroup = project.rootObject.props.mainGroup
169
+ ?.getChildGroups()
170
+ .find((group) => group.getDisplayName() === 'Frameworks')
171
+
172
+ if (!frameworksGroup) {
173
+ throw new IOSXcodeProjectError(`Xcode project is missing the Frameworks group: ${discovery.pbxprojPath}`)
174
+ }
175
+
176
+ return frameworksGroup
177
+ }
178
+
179
+ function getErrorMessage(error: unknown): string {
180
+ return error instanceof Error ? error.message : String(error)
181
+ }