voltra 2.2.0 → 2.3.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 (138) hide show
  1. package/build/cjs/apply/index.js +6 -1
  2. package/build/cjs/apply/index.js.map +1 -1
  3. package/build/cjs/config/normalize.js +150 -31
  4. package/build/cjs/config/normalize.js.map +1 -1
  5. package/build/cjs/config/perConfiguration.js +29 -0
  6. package/build/cjs/config/perConfiguration.js.map +1 -0
  7. package/build/cjs/config/serverUpdate.js +119 -0
  8. package/build/cjs/config/serverUpdate.js.map +1 -0
  9. package/build/cjs/config/widgetKind.js +25 -0
  10. package/build/cjs/config/widgetKind.js.map +1 -0
  11. package/build/cjs/dependencies/platformPackages.js +9 -0
  12. package/build/cjs/dependencies/platformPackages.js.map +1 -1
  13. package/build/cjs/discovery/ios.js +50 -31
  14. package/build/cjs/discovery/ios.js.map +1 -1
  15. package/build/cjs/discovery/metro.js +52 -0
  16. package/build/cjs/discovery/metro.js.map +1 -0
  17. package/build/cjs/index.js +6 -2
  18. package/build/cjs/index.js.map +1 -1
  19. package/build/cjs/platforms/android/generated.js +98 -40
  20. package/build/cjs/platforms/android/generated.js.map +1 -1
  21. package/build/cjs/platforms/android/widgetSizing.js +89 -0
  22. package/build/cjs/platforms/android/widgetSizing.js.map +1 -0
  23. package/build/cjs/platforms/ios/apply.js +21 -11
  24. package/build/cjs/platforms/ios/apply.js.map +1 -1
  25. package/build/cjs/platforms/ios/buildConfigurationValues.js +73 -0
  26. package/build/cjs/platforms/ios/buildConfigurationValues.js.map +1 -0
  27. package/build/cjs/platforms/ios/entitlements.js +34 -19
  28. package/build/cjs/platforms/ios/entitlements.js.map +1 -1
  29. package/build/cjs/platforms/ios/generated.js +79 -32
  30. package/build/cjs/platforms/ios/generated.js.map +1 -1
  31. package/build/cjs/platforms/ios/plist.js +22 -4
  32. package/build/cjs/platforms/ios/plist.js.map +1 -1
  33. package/build/cjs/platforms/ios/targetName.js.map +1 -1
  34. package/build/cjs/platforms/ios/xcodeTarget.js +166 -23
  35. package/build/cjs/platforms/ios/xcodeTarget.js.map +1 -1
  36. package/build/cjs/platforms/shared/widgetModule.js +18 -145
  37. package/build/cjs/platforms/shared/widgetModule.js.map +1 -1
  38. package/build/esm/apply/index.js +6 -1
  39. package/build/esm/apply/index.js.map +1 -1
  40. package/build/esm/config/normalize.js +150 -31
  41. package/build/esm/config/normalize.js.map +1 -1
  42. package/build/esm/config/perConfiguration.js +25 -0
  43. package/build/esm/config/perConfiguration.js.map +1 -0
  44. package/build/esm/config/serverUpdate.js +112 -0
  45. package/build/esm/config/serverUpdate.js.map +1 -0
  46. package/build/esm/config/widgetKind.js +20 -0
  47. package/build/esm/config/widgetKind.js.map +1 -0
  48. package/build/esm/dependencies/platformPackages.js +8 -0
  49. package/build/esm/dependencies/platformPackages.js.map +1 -1
  50. package/build/esm/discovery/ios.js +50 -31
  51. package/build/esm/discovery/ios.js.map +1 -1
  52. package/build/esm/discovery/metro.js +46 -0
  53. package/build/esm/discovery/metro.js.map +1 -0
  54. package/build/esm/index.js +1 -0
  55. package/build/esm/index.js.map +1 -1
  56. package/build/esm/platforms/android/generated.js +100 -42
  57. package/build/esm/platforms/android/generated.js.map +1 -1
  58. package/build/esm/platforms/android/widgetSizing.js +85 -0
  59. package/build/esm/platforms/android/widgetSizing.js.map +1 -0
  60. package/build/esm/platforms/ios/apply.js +21 -11
  61. package/build/esm/platforms/ios/apply.js.map +1 -1
  62. package/build/esm/platforms/ios/buildConfigurationValues.js +68 -0
  63. package/build/esm/platforms/ios/buildConfigurationValues.js.map +1 -0
  64. package/build/esm/platforms/ios/entitlements.js +34 -19
  65. package/build/esm/platforms/ios/entitlements.js.map +1 -1
  66. package/build/esm/platforms/ios/generated.js +80 -33
  67. package/build/esm/platforms/ios/generated.js.map +1 -1
  68. package/build/esm/platforms/ios/plist.js +22 -4
  69. package/build/esm/platforms/ios/plist.js.map +1 -1
  70. package/build/esm/platforms/ios/targetName.js.map +1 -1
  71. package/build/esm/platforms/ios/xcodeTarget.js +166 -23
  72. package/build/esm/platforms/ios/xcodeTarget.js.map +1 -1
  73. package/build/esm/platforms/shared/widgetModule.js +16 -107
  74. package/build/esm/platforms/shared/widgetModule.js.map +1 -1
  75. package/build/types/apply/index.d.ts.map +1 -1
  76. package/build/types/config/normalize.d.ts.map +1 -1
  77. package/build/types/config/perConfiguration.d.ts +18 -0
  78. package/build/types/config/perConfiguration.d.ts.map +1 -0
  79. package/build/types/config/serverUpdate.d.ts +80 -0
  80. package/build/types/config/serverUpdate.d.ts.map +1 -0
  81. package/build/types/config/types.d.ts +91 -30
  82. package/build/types/config/types.d.ts.map +1 -1
  83. package/build/types/config/widgetKind.d.ts +11 -0
  84. package/build/types/config/widgetKind.d.ts.map +1 -0
  85. package/build/types/dependencies/platformPackages.d.ts +1 -0
  86. package/build/types/dependencies/platformPackages.d.ts.map +1 -1
  87. package/build/types/discovery/ios.d.ts +10 -0
  88. package/build/types/discovery/ios.d.ts.map +1 -1
  89. package/build/types/discovery/metro.d.ts +21 -0
  90. package/build/types/discovery/metro.d.ts.map +1 -0
  91. package/build/types/index.d.ts +3 -1
  92. package/build/types/index.d.ts.map +1 -1
  93. package/build/types/platforms/android/generated.d.ts.map +1 -1
  94. package/build/types/platforms/android/widgetSizing.d.ts +50 -0
  95. package/build/types/platforms/android/widgetSizing.d.ts.map +1 -0
  96. package/build/types/platforms/ios/apply.d.ts.map +1 -1
  97. package/build/types/platforms/ios/buildConfigurationValues.d.ts +33 -0
  98. package/build/types/platforms/ios/buildConfigurationValues.d.ts.map +1 -0
  99. package/build/types/platforms/ios/entitlements.d.ts +4 -4
  100. package/build/types/platforms/ios/entitlements.d.ts.map +1 -1
  101. package/build/types/platforms/ios/generated.d.ts +14 -2
  102. package/build/types/platforms/ios/generated.d.ts.map +1 -1
  103. package/build/types/platforms/ios/plist.d.ts +3 -3
  104. package/build/types/platforms/ios/plist.d.ts.map +1 -1
  105. package/build/types/platforms/ios/podfile.d.ts +2 -2
  106. package/build/types/platforms/ios/podfile.d.ts.map +1 -1
  107. package/build/types/platforms/ios/targetName.d.ts +2 -2
  108. package/build/types/platforms/ios/targetName.d.ts.map +1 -1
  109. package/build/types/platforms/ios/xcodeTarget.d.ts +4 -2
  110. package/build/types/platforms/ios/xcodeTarget.d.ts.map +1 -1
  111. package/build/types/platforms/shared/widgetModule.d.ts +12 -3
  112. package/build/types/platforms/shared/widgetModule.d.ts.map +1 -1
  113. package/package.json +5 -5
  114. package/src/apply/index.ts +6 -1
  115. package/src/config/normalize.node.test.ts +105 -0
  116. package/src/config/normalize.ts +217 -45
  117. package/src/config/perConfiguration.ts +49 -0
  118. package/src/config/serverUpdate.ts +160 -0
  119. package/src/config/types.ts +97 -30
  120. package/src/config/widgetKind.node.test.ts +27 -0
  121. package/src/config/widgetKind.ts +27 -0
  122. package/src/dependencies/platformPackages.ts +11 -0
  123. package/src/discovery/ios.ts +104 -60
  124. package/src/discovery/metro.node.test.ts +91 -0
  125. package/src/discovery/metro.ts +54 -0
  126. package/src/index.ts +8 -0
  127. package/src/platforms/android/generated.ts +144 -47
  128. package/src/platforms/android/widgetSizing.ts +112 -0
  129. package/src/platforms/ios/apply.ts +21 -11
  130. package/src/platforms/ios/buildConfigurationValues.ts +105 -0
  131. package/src/platforms/ios/entitlements.ts +55 -31
  132. package/src/platforms/ios/generated.node.test.ts +61 -0
  133. package/src/platforms/ios/generated.ts +137 -38
  134. package/src/platforms/ios/plist.ts +36 -7
  135. package/src/platforms/ios/podfile.ts +2 -2
  136. package/src/platforms/ios/targetName.ts +2 -2
  137. package/src/platforms/ios/xcodeTarget.ts +248 -43
  138. package/src/platforms/shared/widgetModule.ts +22 -140
@@ -1,153 +1,35 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import vm from 'node:vm'
4
- import { createRequire } from 'node:module'
1
+ import { createWidgetModuleLoader, type WidgetModuleLoader } from '@use-voltra/compiler'
5
2
 
6
- import * as babel from '@babel/core'
7
-
8
- const MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '']
3
+ import type { VoltraPlatform } from '../../config/types'
9
4
 
10
5
  export interface WidgetModuleBuildInfo {
11
6
  isDev: false
12
7
  metroUrl: null
13
8
  appVersion: 'unknown'
14
- voltraVersion: '1.4.1'
15
- }
16
-
17
- export const DYNAMIC_WIDGET_BUILD_INFO: WidgetModuleBuildInfo = {
18
- isDev: false,
19
- metroUrl: null,
20
- appVersion: 'unknown',
21
- voltraVersion: '1.4.1',
9
+ voltraVersion: string
22
10
  }
23
11
 
24
- export function evaluateWidgetModuleExports(
25
- projectRoot: string,
26
- filePath: string,
27
- createError: (message: string) => Error
28
- ): unknown {
29
- const projectRequire = createProjectRequire(projectRoot)
30
- const moduleCache = new Map<string, unknown>()
31
-
32
- const customRequire = (moduleSpecifier: string, currentDir: string): unknown => {
33
- if (!isLocalModule(moduleSpecifier)) {
34
- return projectRequire(moduleSpecifier)
35
- }
36
-
37
- const resolvedModulePath = resolveModulePath(moduleSpecifier, currentDir)
38
-
39
- if (!resolvedModulePath) {
40
- throw createError(`Cannot resolve module '${moduleSpecifier}' from '${currentDir}'`)
41
- }
42
-
43
- const cachedModule = moduleCache.get(resolvedModulePath)
44
- if (cachedModule !== undefined) {
45
- return cachedModule
46
- }
47
-
48
- const transpiledCode = transpileWidgetModule(projectRoot, resolvedModulePath, projectRequire, createError)
49
- const moduleDir = path.dirname(resolvedModulePath)
50
- const moduleRecord = { exports: {} as Record<string, unknown> }
51
- moduleCache.set(resolvedModulePath, moduleRecord.exports)
52
-
53
- const context = vm.createContext({
54
- __dirname: moduleDir,
55
- __filename: resolvedModulePath,
56
- console,
57
- exports: moduleRecord.exports,
58
- module: moduleRecord,
59
- process,
60
- require: (specifier: string) => customRequire(specifier, moduleDir),
61
- })
62
-
63
- const script = new vm.Script(transpiledCode, { filename: resolvedModulePath })
64
- script.runInContext(context)
65
-
66
- moduleCache.set(resolvedModulePath, moduleRecord.exports)
67
- return moduleRecord.exports
12
+ export function createDynamicWidgetBuildInfo(voltraVersion: string): WidgetModuleBuildInfo {
13
+ return {
14
+ isDev: false,
15
+ metroUrl: null,
16
+ appVersion: 'unknown',
17
+ voltraVersion,
68
18
  }
69
-
70
- return customRequire(filePath, path.dirname(filePath))
71
19
  }
72
20
 
73
- function transpileWidgetModule(
21
+ /**
22
+ * Loader used by the apply pipeline to evaluate widget source at build time.
23
+ *
24
+ * The evaluation rules — which imports are allowed and what they resolve to — live in
25
+ * `@use-voltra/compiler` so that `voltra apply`, the Expo config plugins, and the Metro
26
+ * widget bundler all apply the same contract.
27
+ */
28
+ export function createGeneratedWidgetModuleLoader(
74
29
  projectRoot: string,
75
- filePath: string,
76
- projectRequire: NodeRequire,
77
- createError: (message: string) => Error
78
- ): string {
79
- const source = fs.readFileSync(filePath, 'utf8')
80
- const projectBabelConfigPath = resolveProjectBabelConfig(projectRoot)
81
- const result = babel.transformSync(source, {
82
- babelrc: false,
83
- configFile: projectBabelConfigPath,
84
- cwd: projectRoot,
85
- filename: filePath,
86
- presets: projectBabelConfigPath ? undefined : [resolveFallbackBabelPreset(projectRequire, createError)],
87
- })
88
-
89
- if (!result?.code) {
90
- throw createError(`Babel transpilation failed for ${filePath}`)
91
- }
92
-
93
- return result.code
94
- }
95
-
96
- function resolveProjectBabelConfig(projectRoot: string): string | undefined {
97
- const candidates = ['babel.config.js', 'babel.config.cjs', 'babel.config.mjs']
98
-
99
- for (const candidate of candidates) {
100
- const candidatePath = path.join(projectRoot, candidate)
101
- if (fs.existsSync(candidatePath)) {
102
- return candidatePath
103
- }
104
- }
105
-
106
- return undefined
107
- }
108
-
109
- function resolveFallbackBabelPreset(projectRequire: NodeRequire, createError: (message: string) => Error): string {
110
- try {
111
- return projectRequire.resolve('@react-native/babel-preset')
112
- } catch {
113
- try {
114
- return projectRequire.resolve('babel-preset-expo')
115
- } catch {
116
- throw createError(
117
- 'Could not resolve a Babel preset for widget evaluation. Add a project babel.config.js or install @react-native/babel-preset.'
118
- )
119
- }
120
- }
121
- }
122
-
123
- function createProjectRequire(projectRoot: string): NodeRequire {
124
- return createRequire(path.join(projectRoot, 'package.json'))
125
- }
126
-
127
- function isLocalModule(moduleSpecifier: string): boolean {
128
- return moduleSpecifier.startsWith('.') || moduleSpecifier.startsWith('/')
129
- }
130
-
131
- function resolveModulePath(moduleSpecifier: string, fromDir: string): string | null {
132
- const basePath = path.resolve(fromDir, moduleSpecifier)
133
-
134
- for (const extension of MODULE_EXTENSIONS) {
135
- const candidate = `${basePath}${extension}`
136
- if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {
137
- return candidate
138
- }
139
- }
140
-
141
- if (!fs.existsSync(basePath) || !fs.statSync(basePath).isDirectory()) {
142
- return null
143
- }
144
-
145
- for (const extension of MODULE_EXTENSIONS) {
146
- const indexCandidate = path.join(basePath, `index${extension}`)
147
- if (fs.existsSync(indexCandidate) && fs.statSync(indexCandidate).isFile()) {
148
- return indexCandidate
149
- }
150
- }
151
-
152
- return null
30
+ platform: VoltraPlatform,
31
+ createError: (message: string) => Error,
32
+ onWarning?: (message: string) => void
33
+ ): WidgetModuleLoader {
34
+ return createWidgetModuleLoader({ projectRoot, platform, createError, onWarning })
153
35
  }