typeferry 0.9.1 → 0.11.0

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/README.md +9 -0
  2. package/dist/application/build.d.ts +2 -2
  3. package/dist/application/build.js +8 -2
  4. package/dist/application/build.js.map +1 -1
  5. package/dist/application/cli-arguments.d.ts +6 -1
  6. package/dist/application/cli-arguments.js +9 -1
  7. package/dist/application/cli-arguments.js.map +1 -1
  8. package/dist/application/config.d.ts +47 -1
  9. package/dist/application/config.js +88 -2
  10. package/dist/application/config.js.map +1 -1
  11. package/dist/application/native-project.d.ts +16 -0
  12. package/dist/application/native-project.js +82 -0
  13. package/dist/application/native-project.js.map +1 -0
  14. package/dist/application/native.d.ts +2 -0
  15. package/dist/application/native.js +86 -0
  16. package/dist/application/native.js.map +1 -0
  17. package/dist/application/runtime.d.ts +13 -0
  18. package/dist/application/runtime.js +15 -0
  19. package/dist/application/runtime.js.map +1 -0
  20. package/dist/application/server-build.js +1 -0
  21. package/dist/application/server-build.js.map +1 -1
  22. package/dist/application/vite-config.d.ts +2 -2
  23. package/dist/application/vite-config.js +16 -2
  24. package/dist/application/vite-config.js.map +1 -1
  25. package/dist/auth/client/index.d.ts +4 -0
  26. package/dist/auth/client/index.js +2 -0
  27. package/dist/auth/client/index.js.map +1 -1
  28. package/dist/auth/client/native-http.d.ts +24 -0
  29. package/dist/auth/client/native-http.js +19 -0
  30. package/dist/auth/client/native-http.js.map +1 -0
  31. package/dist/auth/client/native-session.d.ts +34 -0
  32. package/dist/auth/client/native-session.js +65 -0
  33. package/dist/auth/client/native-session.js.map +1 -0
  34. package/dist/auth/index.d.ts +6 -0
  35. package/dist/auth/index.js +3 -0
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/auth/server/native-handoff.d.ts +69 -0
  38. package/dist/auth/server/native-handoff.js +65 -0
  39. package/dist/auth/server/native-handoff.js.map +1 -0
  40. package/dist/cli/run.js +6 -1
  41. package/dist/cli/run.js.map +1 -1
  42. package/dist/client/backend-origin.d.ts +17 -0
  43. package/dist/client/backend-origin.js +25 -0
  44. package/dist/client/backend-origin.js.map +1 -0
  45. package/dist/client/client-http.js +8 -3
  46. package/dist/client/client-http.js.map +1 -1
  47. package/dist/client/client-socket.js +6 -1
  48. package/dist/client/client-socket.js.map +1 -1
  49. package/dist/client/client.d.ts +9 -0
  50. package/dist/client/client.js.map +1 -1
  51. package/dist/client/index.d.ts +1 -0
  52. package/dist/client/index.js +1 -0
  53. package/dist/client/index.js.map +1 -1
  54. package/dist/ejson/clone.js +7 -1
  55. package/dist/ejson/clone.js.map +1 -1
  56. package/dist/native/index.d.ts +76 -0
  57. package/dist/native/index.js +5 -0
  58. package/dist/native/index.js.map +1 -0
  59. package/dist/native/share-file.d.ts +18 -0
  60. package/dist/native/share-file.js +41 -0
  61. package/dist/native/share-file.js.map +1 -0
  62. package/dist/native/templates/bridge-view-controller.d.ts +4 -0
  63. package/dist/native/templates/bridge-view-controller.js +86 -0
  64. package/dist/native/templates/bridge-view-controller.js.map +1 -0
  65. package/dist/native/templates/file-staging.d.ts +4 -0
  66. package/dist/native/templates/file-staging.js +77 -0
  67. package/dist/native/templates/file-staging.js.map +1 -0
  68. package/dist/native/templates/http-session.d.ts +4 -0
  69. package/dist/native/templates/http-session.js +117 -0
  70. package/dist/native/templates/http-session.js.map +1 -0
  71. package/dist/native/templates/index.d.ts +4 -0
  72. package/dist/native/templates/index.js +20 -0
  73. package/dist/native/templates/index.js.map +1 -0
  74. package/dist/native/templates/keychain.d.ts +4 -0
  75. package/dist/native/templates/keychain.js +48 -0
  76. package/dist/native/templates/keychain.js.map +1 -0
  77. package/dist/native/templates/media-permission-policy.d.ts +4 -0
  78. package/dist/native/templates/media-permission-policy.js +24 -0
  79. package/dist/native/templates/media-permission-policy.js.map +1 -0
  80. package/dist/native/templates/plugin.d.ts +4 -0
  81. package/dist/native/templates/plugin.js +314 -0
  82. package/dist/native/templates/plugin.js.map +1 -0
  83. package/dist/native/templates/wake-locks.d.ts +4 -0
  84. package/dist/native/templates/wake-locks.js +47 -0
  85. package/dist/native/templates/wake-locks.js.map +1 -0
  86. package/dist/native/wake-lock.d.ts +9 -0
  87. package/dist/native/wake-lock.js +17 -0
  88. package/dist/native/wake-lock.js.map +1 -0
  89. package/package.json +18 -2
package/README.md CHANGED
@@ -73,9 +73,18 @@ export default defineConfig({
73
73
  clientPort: 8000,
74
74
  serverPort: 8002,
75
75
  },
76
+ build: {
77
+ server: {
78
+ external: ['sharp'],
79
+ },
80
+ },
76
81
  })
77
82
  ```
78
83
 
84
+ Server dependencies are bundled by default. Configured externals must be direct
85
+ application `dependencies`, and the application must ship them in its
86
+ production runtime installation.
87
+
79
88
  See the full
80
89
  [application framework guide](https://github.com/leonardoventurini/typeferry/blob/main/docs/typescript/application-framework.md)
81
90
  for command behavior, test discovery, every configuration field, migration,
@@ -1,2 +1,2 @@
1
- import type { ResolvedApplicationConfig } from './config.js';
2
- export declare function runBuild(config: ResolvedApplicationConfig): Promise<void>;
1
+ import type { ApplicationTarget, ResolvedApplicationConfig } from './config.js';
2
+ export declare function runBuild(config: ResolvedApplicationConfig, target?: ApplicationTarget): Promise<void>;
@@ -4,7 +4,13 @@ import { build as buildServer } from 'esbuild';
4
4
  import { build as buildClient } from 'vite';
5
5
  import { createServerBuildOptions } from './server-build.js';
6
6
  import { createViteConfig } from './vite-config.js';
7
- export async function runBuild(config) {
7
+ export async function runBuild(config, target = 'web') {
8
+ if (target === 'ios') {
9
+ await buildClient(createViteConfig(config, 'build', target));
10
+ await access(path.join(config.root, config.paths.output, 'ios-web', 'index.html'));
11
+ await config.extensions.afterBuild?.({ target });
12
+ return;
13
+ }
8
14
  await Promise.all([
9
15
  access(path.join(config.root, config.paths.client, 'index.html')),
10
16
  access(path.join(config.root, config.paths.server, 'index.ts')),
@@ -17,6 +23,6 @@ export async function runBuild(config) {
17
23
  buildClient(createViteConfig(config, 'build')),
18
24
  buildServer(createServerBuildOptions(config)),
19
25
  ]);
20
- await config.extensions.afterBuild?.();
26
+ await config.extensions.afterBuild?.({ target });
21
27
  }
22
28
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/application/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,MAAM,CAAA;AAG3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiC;IAEjC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAChE,CAAC,CAAA;IAEF,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACpD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,WAAW,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;KAC9C,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAA;AACxC,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/application/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,MAAM,CAAA;AAG3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiC,EACjC,SAA4B,KAAK;IAEjC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5D,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;QAClF,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAChD,OAAM;IACR,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAChE,CAAC,CAAA;IAEF,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACpD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,WAAW,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;KAC9C,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AAClD,CAAC"}
@@ -1,6 +1,11 @@
1
1
  export type TestProjectName = 'unit' | 'integration' | 'browser';
2
2
  export type CliArguments = {
3
3
  readonly command: 'build';
4
+ readonly target?: 'ios';
5
+ } | {
6
+ readonly command: 'native';
7
+ readonly action: 'sync' | 'add' | 'open';
8
+ readonly target: 'ios';
4
9
  } | {
5
10
  readonly command: 'develop';
6
11
  readonly serverArguments: readonly string[];
@@ -10,5 +15,5 @@ export type CliArguments = {
10
15
  readonly testArguments: readonly string[];
11
16
  readonly watch: boolean;
12
17
  };
13
- export declare const CLI_USAGE = "Usage: typeferry <develop [-- server-args...]|build|test [unit|integration|browser] [--watch] [-- vitest-args...]>";
18
+ export declare const CLI_USAGE = "Usage: typeferry <develop [-- server-args...]|build [--target ios]|native <add|sync|open> ios|test [unit|integration|browser] [--watch] [-- vitest-args...]>";
14
19
  export declare function parseCliArguments(arguments_: readonly string[]): CliArguments;
@@ -3,10 +3,18 @@ const TEST_PROJECTS = new Set([
3
3
  'integration',
4
4
  'browser',
5
5
  ]);
6
- export const CLI_USAGE = 'Usage: typeferry <develop [-- server-args...]|build|test [unit|integration|browser] [--watch] [-- vitest-args...]>';
6
+ export const CLI_USAGE = 'Usage: typeferry <develop [-- server-args...]|build [--target ios]|native <add|sync|open> ios|test [unit|integration|browser] [--watch] [-- vitest-args...]>';
7
7
  export function parseCliArguments(arguments_) {
8
8
  const [command, ...rest] = arguments_;
9
+ if (command === 'native') {
10
+ const [action, target] = rest;
11
+ if (rest.length !== 2 || target !== 'ios' || !['add', 'sync', 'open'].includes(action ?? ''))
12
+ throw new Error(CLI_USAGE);
13
+ return { command, action: action, target };
14
+ }
9
15
  if (command === 'build') {
16
+ if (rest.length === 2 && rest[0] === '--target' && rest[1] === 'ios')
17
+ return { command, target: 'ios' };
10
18
  if (rest.length > 0)
11
19
  throw new Error(`Unexpected build arguments. ${CLI_USAGE}`);
12
20
  return { command };
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/application/cli-arguments.ts"],"names":[],"mappings":"AAYA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAkB;IAC7C,MAAM;IACN,aAAa;IACb,SAAS;CACV,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GACpB,oHAAoH,CAAA;AAEtH,MAAM,UAAU,iBAAiB,CAAC,UAA6B;IAC7D,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAA;IAErC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAA;QAChF,OAAO,EAAE,OAAO,EAAE,CAAA;IACpB,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAA;QAC9D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACpD,CAAC;IAED,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAEvD,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA6B;IACvD,IAAI,OAAoC,CAAA;IACxC,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,MAAM,kBAAkB,GACtB,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;IAC1E,MAAM,aAAa,GACjB,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;IAEnE,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,GAAG,IAAI,CAAA;YACZ,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAA2B,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,KAAK,SAAS,EAAE,CAAC,CAAA;QACpE,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,OAAO,GAAG,QAA2B,CAAA;IACvC,CAAC;IAED,OAAO,OAAO,KAAK,SAAS;QAC1B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE;QAC3C,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/application/cli-arguments.ts"],"names":[],"mappings":"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"}
@@ -14,15 +14,43 @@ export interface ResolvedDevelopmentProxyRoute {
14
14
  readonly preserveHostHeader: boolean;
15
15
  readonly rewriteLocalhostCookies: boolean;
16
16
  }
17
+ export type ApplicationTarget = 'web' | 'ios';
18
+ export interface IosApplicationTarget {
19
+ readonly runtime: 'capacitor';
20
+ readonly backend: {
21
+ readonly origin: string;
22
+ };
23
+ readonly permissions?: {
24
+ readonly camera?: {
25
+ readonly purpose: string;
26
+ };
27
+ readonly microphone?: {
28
+ readonly purpose: string;
29
+ };
30
+ };
31
+ }
32
+ export interface ApplicationIdentity {
33
+ readonly id: string;
34
+ readonly name: string;
35
+ }
17
36
  export interface ApplicationToolingExtensions {
18
37
  readonly vite?: (config: InlineConfig, context: {
19
38
  readonly command: "develop" | "build";
39
+ readonly target: ApplicationTarget;
20
40
  }) => InlineConfig;
21
41
  readonly serverBuild?: (options: BuildOptions) => BuildOptions;
22
42
  readonly test?: (config: VitestConfig) => VitestConfig;
23
- readonly afterBuild?: () => void | Promise<void>;
43
+ readonly afterBuild?: (context: {
44
+ readonly target: ApplicationTarget;
45
+ }) => void | Promise<void>;
24
46
  }
25
47
  export interface TypeFerryConfig {
48
+ readonly application?: ApplicationIdentity;
49
+ readonly client?: {
50
+ readonly targets?: {
51
+ readonly ios?: IosApplicationTarget;
52
+ };
53
+ };
26
54
  readonly extensions?: ApplicationToolingExtensions;
27
55
  readonly development?: {
28
56
  readonly clientPort?: number;
@@ -33,6 +61,9 @@ export interface TypeFerryConfig {
33
61
  readonly build?: {
34
62
  readonly target?: string;
35
63
  readonly sourceMaps?: boolean;
64
+ readonly server?: {
65
+ readonly external?: readonly string[];
66
+ };
36
67
  };
37
68
  readonly test?: {
38
69
  readonly integration?: {
@@ -44,6 +75,12 @@ export interface TypeFerryConfig {
44
75
  };
45
76
  }
46
77
  export interface ResolvedApplicationConfig {
78
+ readonly application?: ApplicationIdentity;
79
+ readonly client: {
80
+ readonly targets: {
81
+ readonly ios?: IosApplicationTarget;
82
+ };
83
+ };
47
84
  readonly root: string;
48
85
  readonly paths: {
49
86
  readonly client: string;
@@ -61,6 +98,9 @@ export interface ResolvedApplicationConfig {
61
98
  readonly build: {
62
99
  readonly target: string;
63
100
  readonly sourceMaps: boolean;
101
+ readonly server: {
102
+ readonly external: readonly string[];
103
+ };
64
104
  };
65
105
  readonly test: {
66
106
  readonly integration: {
@@ -73,6 +113,9 @@ export interface ResolvedApplicationConfig {
73
113
  readonly extensions: ApplicationToolingExtensions;
74
114
  }
75
115
  export declare const DEFAULT_APPLICATION_CONFIG: {
116
+ readonly client: {
117
+ readonly targets: {};
118
+ };
76
119
  readonly paths: {
77
120
  readonly client: "client";
78
121
  readonly common: "common";
@@ -105,6 +148,9 @@ export declare const DEFAULT_APPLICATION_CONFIG: {
105
148
  readonly build: {
106
149
  readonly target: "es2023";
107
150
  readonly sourceMaps: true;
151
+ readonly server: {
152
+ readonly external: readonly string[];
153
+ };
108
154
  };
109
155
  readonly test: {
110
156
  readonly integration: {
@@ -1,9 +1,21 @@
1
- import { access } from "node:fs/promises";
1
+ import { access, readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { createJiti } from "jiti";
4
4
  import { z } from "zod";
5
5
  const browserNameSchema = z.enum(["chromium", "firefox", "webkit"]);
6
6
  const positivePortSchema = z.number().int().min(1).max(65_535);
7
+ const packageManifestSchema = z.object({
8
+ dependencies: z.record(z.string(), z.string()).optional(),
9
+ devDependencies: z.record(z.string(), z.string()).optional(),
10
+ });
11
+ const serverExternalSchema = z
12
+ .array(z
13
+ .string()
14
+ .min(1)
15
+ .refine(isPackageSpecifier, "Expected an npm package specifier"))
16
+ .refine((values) => new Set(values).size === values.length, {
17
+ message: "Server external package specifiers must not contain duplicates",
18
+ });
7
19
  const proxyPathPrefixSchema = z.string().regex(/^\/(?!$)[^?#]*[^/]$/u, {
8
20
  error: "pathPrefix must be a non-root path without a query, fragment, or trailing slash",
9
21
  });
@@ -22,8 +34,27 @@ const extensionsSchema = z
22
34
  afterBuild: z.function().optional(),
23
35
  })
24
36
  .strict();
37
+ const httpsOriginSchema = z.string().refine(value => {
38
+ try {
39
+ const url = new URL(value);
40
+ return url.protocol === 'https:' && url.origin === value && !url.username && !url.password;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }, 'Expected an HTTPS origin without credentials, path, query or fragment');
46
+ const permissionSchema = z.object({ purpose: z.string().trim().min(1) }).strict();
25
47
  const configSchema = z
26
48
  .object({
49
+ application: z.object({
50
+ id: z.string().regex(/^[a-zA-Z][a-zA-Z0-9-]*(\.[a-zA-Z][a-zA-Z0-9-]*)+$/u),
51
+ name: z.string().trim().min(1),
52
+ }).strict().optional(),
53
+ client: z.object({ targets: z.object({ ios: z.object({
54
+ runtime: z.literal('capacitor'),
55
+ backend: z.object({ origin: httpsOriginSchema }).strict(),
56
+ permissions: z.object({ camera: permissionSchema.optional(), microphone: permissionSchema.optional() }).strict().optional(),
57
+ }).strict().optional() }).strict().optional() }).strict().optional(),
27
58
  extensions: extensionsSchema.optional(),
28
59
  development: z
29
60
  .object({
@@ -38,6 +69,10 @@ const configSchema = z
38
69
  .object({
39
70
  target: z.string().min(1).optional(),
40
71
  sourceMaps: z.boolean().optional(),
72
+ server: z
73
+ .object({ external: serverExternalSchema.optional() })
74
+ .strict()
75
+ .optional(),
41
76
  })
42
77
  .strict()
43
78
  .optional(),
@@ -57,6 +92,7 @@ const configSchema = z
57
92
  })
58
93
  .strict();
59
94
  export const DEFAULT_APPLICATION_CONFIG = {
95
+ client: { targets: {} },
60
96
  paths: {
61
97
  client: "client",
62
98
  common: "common",
@@ -94,6 +130,9 @@ export const DEFAULT_APPLICATION_CONFIG = {
94
130
  build: {
95
131
  target: "es2023",
96
132
  sourceMaps: true,
133
+ server: {
134
+ external: [],
135
+ },
97
136
  },
98
137
  test: {
99
138
  integration: { timeout: 30_000 },
@@ -107,8 +146,13 @@ export function defineConfig(config) {
107
146
  }
108
147
  export function resolveApplicationConfig(root, input = {}) {
109
148
  const config = configSchema.parse(input);
149
+ if (config.client?.targets?.ios && !config.application) {
150
+ throw new Error('An iOS target requires application id and name');
151
+ }
110
152
  return {
111
153
  root: path.resolve(root),
154
+ ...(config.application ? { application: config.application } : {}),
155
+ client: { targets: config.client?.targets ?? {} },
112
156
  paths: DEFAULT_APPLICATION_CONFIG.paths,
113
157
  development: {
114
158
  ...DEFAULT_APPLICATION_CONFIG.development,
@@ -125,6 +169,10 @@ export function resolveApplicationConfig(root, input = {}) {
125
169
  build: {
126
170
  ...DEFAULT_APPLICATION_CONFIG.build,
127
171
  ...config.build,
172
+ server: {
173
+ ...DEFAULT_APPLICATION_CONFIG.build.server,
174
+ ...config.build?.server,
175
+ },
128
176
  },
129
177
  test: {
130
178
  integration: {
@@ -153,7 +201,45 @@ export async function loadApplicationConfig(root) {
153
201
  });
154
202
  const loaded = await jiti.import(configPath, { default: true });
155
203
  const parsed = configSchema.parse(loaded);
156
- return resolveApplicationConfig(root, withEnvironmentFile(parsed));
204
+ const resolved = resolveApplicationConfig(root, withEnvironmentFile(parsed));
205
+ await validateServerExternalDependencies(resolved);
206
+ return resolved;
207
+ }
208
+ async function validateServerExternalDependencies(config) {
209
+ if (config.build.server.external.length === 0)
210
+ return;
211
+ const manifestPath = path.join(config.root, "package.json");
212
+ const manifest = packageManifestSchema.parse(JSON.parse(await readFile(manifestPath, "utf8")));
213
+ for (const external of config.build.server.external) {
214
+ const packageName = packageNameFromSpecifier(external);
215
+ if (manifest.dependencies?.[packageName] !== undefined)
216
+ continue;
217
+ if (manifest.devDependencies?.[packageName] !== undefined) {
218
+ throw new Error(`Server external "${external}" must be declared in dependencies, not devDependencies`);
219
+ }
220
+ throw new Error(`Server external "${external}" must be declared in package.json dependencies`);
221
+ }
222
+ }
223
+ function isPackageSpecifier(value) {
224
+ if (value.includes("*") || value.includes("\\") || value.includes(":")) {
225
+ return false;
226
+ }
227
+ const segments = value.split("/");
228
+ if (value.startsWith("@")) {
229
+ return (segments.length >= 2 &&
230
+ isPackageNameSegment(segments[0]?.slice(1) ?? "") &&
231
+ segments.every((segment, index) => index === 0 ? true : isPackageNameSegment(segment)));
232
+ }
233
+ return segments.every(isPackageNameSegment);
234
+ }
235
+ function isPackageNameSegment(value) {
236
+ return /^[a-z0-9][a-z0-9._~-]*$/u.test(value);
237
+ }
238
+ function packageNameFromSpecifier(specifier) {
239
+ const segments = specifier.split("/");
240
+ return specifier.startsWith("@")
241
+ ? `${segments[0]}/${segments[1]}`
242
+ : (segments[0] ?? specifier);
157
243
  }
158
244
  function withEnvironmentFile(config) {
159
245
  if (config.development?.serverEnvironmentFile !== undefined ||
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/application/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/application/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Updates generated files only when their last generated contents are intact.
3
+ * User edits are never overwritten by synchronization.
4
+ */
5
+ export declare function writeGeneratedFile(root: string, relativePath: string, contents: string): Promise<void>;
6
+ /**
7
+ * Registers a generated Swift file in Capacitor's conventional App target.
8
+ * Existing IDs and custom project settings remain untouched.
9
+ */
10
+ export declare function registerNativeSource(project: string): string;
11
+ export declare function fileExists(file: string): Promise<boolean>;
12
+ /**
13
+ * Capacitor's scene lifecycle constructs its controller directly; storyboard
14
+ * registration alone does not install the native bridge in modern projects.
15
+ */
16
+ export declare function registerNativeScene(source: string): string;
@@ -0,0 +1,82 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ /**
5
+ * Updates generated files only when their last generated contents are intact.
6
+ * User edits are never overwritten by synchronization.
7
+ */
8
+ export async function writeGeneratedFile(root, relativePath, contents) {
9
+ const destination = path.join(root, relativePath);
10
+ const ledger = path.join(root, '.typeferry', 'generated', `${createHash('sha256').update(relativePath).digest('hex')}.sha256`);
11
+ let existing;
12
+ try {
13
+ existing = await readFile(destination, 'utf8');
14
+ }
15
+ catch (error) {
16
+ if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))
17
+ throw error;
18
+ }
19
+ if (existing === contents) {
20
+ await mkdir(path.dirname(ledger), { recursive: true });
21
+ await writeFile(ledger, hash(contents));
22
+ return;
23
+ }
24
+ if (existing !== undefined) {
25
+ let previousHash;
26
+ try {
27
+ previousHash = await readFile(ledger, 'utf8');
28
+ }
29
+ catch { /* Unowned files cannot be replaced. */ }
30
+ if (previousHash !== hash(existing))
31
+ throw new Error(`Refusing to overwrite edited or app-owned file: ${relativePath}`);
32
+ }
33
+ await mkdir(path.dirname(destination), { recursive: true });
34
+ await mkdir(path.dirname(ledger), { recursive: true });
35
+ await writeFile(destination, contents);
36
+ await writeFile(ledger, hash(contents));
37
+ }
38
+ function hash(value) { return createHash('sha256').update(value).digest('hex'); }
39
+ /**
40
+ * Registers a generated Swift file in Capacitor's conventional App target.
41
+ * Existing IDs and custom project settings remain untouched.
42
+ */
43
+ export function registerNativeSource(project) {
44
+ if (project.includes('/* TypeFerryNative.swift in Sources */'))
45
+ return project;
46
+ const reference = 'F3A000000000000000000001';
47
+ const build = 'F3A000000000000000000002';
48
+ if (project.includes(reference) || project.includes(build))
49
+ throw new Error('Native project identifier collision');
50
+ const anchors = ['/* Begin PBXBuildFile section */', '/* Begin PBXFileReference section */', /\t+\w+ \/\* AppDelegate.swift \*\/,/u, /\t+\w+ \/\* AppDelegate.swift in Sources \*\/,/u];
51
+ for (const anchor of anchors) {
52
+ if (typeof anchor === 'string' ? !project.includes(anchor) : !anchor.test(project))
53
+ throw new Error('Unsupported Xcode project structure; expected AppDelegate.swift in App target');
54
+ }
55
+ return project
56
+ .replace(anchors[0], `${anchors[0]}\n\t\t${build} /* TypeFerryNative.swift in Sources */ = {isa = PBXBuildFile; fileRef = ${reference} /* TypeFerryNative.swift */; };`)
57
+ .replace(anchors[1], `${anchors[1]}\n\t\t${reference} /* TypeFerryNative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeFerryNative.swift; sourceTree = "<group>"; };`)
58
+ .replace(anchors[2], match => `${match}\n\t\t\t\t${reference} /* TypeFerryNative.swift */,`)
59
+ .replace(anchors[3], match => `${match}\n\t\t\t\t${build} /* TypeFerryNative.swift in Sources */,`);
60
+ }
61
+ export async function fileExists(file) {
62
+ try {
63
+ await access(file);
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ /**
71
+ * Capacitor's scene lifecycle constructs its controller directly; storyboard
72
+ * registration alone does not install the native bridge in modern projects.
73
+ */
74
+ export function registerNativeScene(source) {
75
+ if (/rootViewController\s*=\s*TypeFerryBridgeViewController\(\)/u.test(source))
76
+ return source;
77
+ const stockController = /rootViewController\s*=\s*CAPBridgeViewController\(\)/u;
78
+ if (!stockController.test(source))
79
+ throw new Error('Custom scene controller detected; integrate TypeFerry native registration explicitly');
80
+ return source.replace(stockController, 'rootViewController = TypeFerryBridgeViewController()');
81
+ }
82
+ //# sourceMappingURL=native-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-project.js","sourceRoot":"","sources":["../../src/application/native-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ResolvedApplicationConfig } from './config.js';
2
+ export declare function runNative(config: ResolvedApplicationConfig, action: 'add' | 'sync' | 'open'): Promise<void>;
@@ -0,0 +1,86 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { createRequire } from 'node:module';
3
+ import { readFile, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { fileExists, registerNativeScene, registerNativeSource, writeGeneratedFile } from './native-project.js';
7
+ const execute = promisify(execFile);
8
+ export async function runNative(config, action) {
9
+ const ios = config.client.targets.ios;
10
+ const identity = config.application;
11
+ if (!ios || !identity)
12
+ throw new Error('Configure application identity and client.targets.ios first');
13
+ const require = createRequire(path.join(config.root, 'package.json'));
14
+ let cli;
15
+ try {
16
+ cli = require.resolve('@capacitor/cli/bin/capacitor');
17
+ require.resolve('@capacitor/ios/package.json');
18
+ }
19
+ catch {
20
+ throw new Error('Install @capacitor/core, @capacitor/ios and @capacitor/cli in the application before using native commands');
21
+ }
22
+ for (const extension of ['ts', 'js']) {
23
+ if (await fileExists(path.join(config.root, `capacitor.config.${extension}`)))
24
+ throw new Error('Existing Capacitor configuration must be reconciled before TypeFerry can own native configuration');
25
+ }
26
+ await writeGeneratedFile(config.root, 'capacitor.config.json', `${JSON.stringify({
27
+ appId: identity.id,
28
+ appName: identity.name,
29
+ loggingBehavior: 'none',
30
+ webDir: 'dist/ios-web',
31
+ ios: { path: 'ios' },
32
+ plugins: { TypeFerryNative: { backendOrigin: ios.backend.origin, callbackScheme: identity.id } },
33
+ }, null, 2)}\n`);
34
+ const { stdout, stderr } = await execute(process.execPath, [cli, action, 'ios'], { cwd: config.root, maxBuffer: 8 * 1024 * 1024 });
35
+ if (stdout)
36
+ process.stdout.write(stdout);
37
+ if (stderr)
38
+ process.stderr.write(stderr);
39
+ if (action === 'open')
40
+ return;
41
+ await configureNativeProject(config);
42
+ }
43
+ async function configureNativeProject(config) {
44
+ const { IOS_NATIVE_TEMPLATES } = await import('../native/templates/index.js');
45
+ await writeGeneratedFile(config.root, 'ios/App/App/TypeFerryNative.swift', Object.values(IOS_NATIVE_TEMPLATES).join('\n'));
46
+ const projectPath = path.join(config.root, 'ios/App/App.xcodeproj/project.pbxproj');
47
+ const project = await readFile(projectPath, 'utf8');
48
+ const registered = registerNativeSource(project);
49
+ if (registered !== project)
50
+ await writeFile(projectPath, registered);
51
+ const scenePath = path.join(config.root, 'ios/App/App/SceneDelegate.swift');
52
+ if (await fileExists(scenePath)) {
53
+ const scene = await readFile(scenePath, 'utf8');
54
+ const updated = registerNativeScene(scene);
55
+ if (updated !== scene)
56
+ await writeFile(scenePath, updated);
57
+ }
58
+ const storyboardPath = path.join(config.root, 'ios/App/App/Base.lproj/Main.storyboard');
59
+ const storyboard = await readFile(storyboardPath, 'utf8');
60
+ if (storyboard.includes('customClass="CAPBridgeViewController"')) {
61
+ await writeFile(storyboardPath, storyboard.replace('customClass="CAPBridgeViewController" customModule="Capacitor"', 'customClass="TypeFerryBridgeViewController" customModule="App" customModuleProvider="target"'));
62
+ }
63
+ else if (!storyboard.includes('customClass="TypeFerryBridgeViewController"')) {
64
+ throw new Error('Custom bridge controller detected; integrate TypeFerry native registration explicitly');
65
+ }
66
+ const plist = path.join(config.root, 'ios/App/App/Info.plist');
67
+ const permissions = config.client.targets.ios?.permissions;
68
+ for (const [key, purpose] of [
69
+ ['NSCameraUsageDescription', permissions?.camera?.purpose],
70
+ ['NSMicrophoneUsageDescription', permissions?.microphone?.purpose],
71
+ ]) {
72
+ if (purpose)
73
+ await execute('/usr/bin/plutil', ['-replace', key, '-string', purpose, plist]);
74
+ }
75
+ const callbackScheme = config.application?.id;
76
+ if (callbackScheme) {
77
+ const existing = await execute('/usr/bin/plutil', ['-extract', 'CFBundleURLTypes', 'json', '-o', '-', plist]).catch(() => null);
78
+ const value = existing ? JSON.parse(existing.stdout) : [];
79
+ if (!Array.isArray(value))
80
+ throw new Error('Invalid CFBundleURLTypes in app Info.plist');
81
+ const includesScheme = value.some((entry) => typeof entry === 'object' && entry !== null && 'CFBundleURLSchemes' in entry && Array.isArray(entry.CFBundleURLSchemes) && entry.CFBundleURLSchemes.includes(callbackScheme));
82
+ if (!includesScheme)
83
+ await execute('/usr/bin/plutil', ['-replace', 'CFBundleURLTypes', '-json', JSON.stringify([...value, { CFBundleURLName: 'TypeFerry authentication', CFBundleURLSchemes: [callbackScheme] }]), plist]);
84
+ }
85
+ }
86
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/application/native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public, non-secret build metadata. Browser builds retain same-origin behavior;
3
+ * native builds embed only the explicitly configured backend origin.
4
+ */
5
+ export interface ApplicationRuntime {
6
+ readonly target: 'web' | 'ios';
7
+ readonly backendOrigin?: string;
8
+ }
9
+ export declare function getApplicationRuntime(): ApplicationRuntime;
10
+ /**
11
+ * Resolves backend-owned paths without rewriting external provider URLs.
12
+ */
13
+ export declare function resolveBackendUrl(path: string): string;
@@ -0,0 +1,15 @@
1
+ export function getApplicationRuntime() {
2
+ return typeof __TYPEFERRY_RUNTIME__ === 'undefined'
3
+ ? { target: 'web' }
4
+ : __TYPEFERRY_RUNTIME__;
5
+ }
6
+ /**
7
+ * Resolves backend-owned paths without rewriting external provider URLs.
8
+ */
9
+ export function resolveBackendUrl(path) {
10
+ const { backendOrigin } = getApplicationRuntime();
11
+ if (!backendOrigin || !path.startsWith('/') || path.startsWith('//'))
12
+ return path;
13
+ return new URL(path, backendOrigin).href;
14
+ }
15
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/application/runtime.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,qBAAqB,KAAK,WAAW;QACjD,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QACnB,CAAC,CAAC,qBAAqB,CAAA;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,EAAE,aAAa,EAAE,GAAG,qBAAqB,EAAE,CAAA;IACjD,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACjF,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,IAAI,CAAA;AAC1C,CAAC"}
@@ -2,6 +2,7 @@ import path from 'node:path';
2
2
  export function createServerBuildOptions(config) {
3
3
  const buildOptions = {
4
4
  bundle: true,
5
+ external: [...config.build.server.external],
5
6
  entryPoints: [
6
7
  path.join(config.root, config.paths.server, 'index.ts'),
7
8
  ],