typeferry 0.10.0 → 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.
- package/dist/application/build.d.ts +2 -2
- package/dist/application/build.js +8 -2
- package/dist/application/build.js.map +1 -1
- package/dist/application/cli-arguments.d.ts +6 -1
- package/dist/application/cli-arguments.js +9 -1
- package/dist/application/cli-arguments.js.map +1 -1
- package/dist/application/config.d.ts +38 -1
- package/dist/application/config.js +25 -0
- package/dist/application/config.js.map +1 -1
- package/dist/application/native-project.d.ts +16 -0
- package/dist/application/native-project.js +82 -0
- package/dist/application/native-project.js.map +1 -0
- package/dist/application/native.d.ts +2 -0
- package/dist/application/native.js +86 -0
- package/dist/application/native.js.map +1 -0
- package/dist/application/runtime.d.ts +13 -0
- package/dist/application/runtime.js +15 -0
- package/dist/application/runtime.js.map +1 -0
- package/dist/application/vite-config.d.ts +2 -2
- package/dist/application/vite-config.js +16 -2
- package/dist/application/vite-config.js.map +1 -1
- package/dist/auth/client/index.d.ts +4 -0
- package/dist/auth/client/index.js +2 -0
- package/dist/auth/client/index.js.map +1 -1
- package/dist/auth/client/native-http.d.ts +24 -0
- package/dist/auth/client/native-http.js +19 -0
- package/dist/auth/client/native-http.js.map +1 -0
- package/dist/auth/client/native-session.d.ts +34 -0
- package/dist/auth/client/native-session.js +65 -0
- package/dist/auth/client/native-session.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/server/native-handoff.d.ts +69 -0
- package/dist/auth/server/native-handoff.js +65 -0
- package/dist/auth/server/native-handoff.js.map +1 -0
- package/dist/cli/run.js +6 -1
- package/dist/cli/run.js.map +1 -1
- package/dist/client/backend-origin.d.ts +17 -0
- package/dist/client/backend-origin.js +25 -0
- package/dist/client/backend-origin.js.map +1 -0
- package/dist/client/client-http.js +8 -3
- package/dist/client/client-http.js.map +1 -1
- package/dist/client/client-socket.js +6 -1
- package/dist/client/client-socket.js.map +1 -1
- package/dist/client/client.d.ts +9 -0
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/ejson/clone.js +7 -1
- package/dist/ejson/clone.js.map +1 -1
- package/dist/native/index.d.ts +76 -0
- package/dist/native/index.js +5 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/share-file.d.ts +18 -0
- package/dist/native/share-file.js +41 -0
- package/dist/native/share-file.js.map +1 -0
- package/dist/native/templates/bridge-view-controller.d.ts +4 -0
- package/dist/native/templates/bridge-view-controller.js +86 -0
- package/dist/native/templates/bridge-view-controller.js.map +1 -0
- package/dist/native/templates/file-staging.d.ts +4 -0
- package/dist/native/templates/file-staging.js +77 -0
- package/dist/native/templates/file-staging.js.map +1 -0
- package/dist/native/templates/http-session.d.ts +4 -0
- package/dist/native/templates/http-session.js +117 -0
- package/dist/native/templates/http-session.js.map +1 -0
- package/dist/native/templates/index.d.ts +4 -0
- package/dist/native/templates/index.js +20 -0
- package/dist/native/templates/index.js.map +1 -0
- package/dist/native/templates/keychain.d.ts +4 -0
- package/dist/native/templates/keychain.js +48 -0
- package/dist/native/templates/keychain.js.map +1 -0
- package/dist/native/templates/media-permission-policy.d.ts +4 -0
- package/dist/native/templates/media-permission-policy.js +24 -0
- package/dist/native/templates/media-permission-policy.js.map +1 -0
- package/dist/native/templates/plugin.d.ts +4 -0
- package/dist/native/templates/plugin.js +314 -0
- package/dist/native/templates/plugin.js.map +1 -0
- package/dist/native/templates/wake-locks.d.ts +4 -0
- package/dist/native/templates/wake-locks.js +47 -0
- package/dist/native/templates/wake-locks.js.map +1 -0
- package/dist/native/wake-lock.d.ts +9 -0
- package/dist/native/wake-lock.js +17 -0
- package/dist/native/wake-lock.js.map +1 -0
- package/package.json +18 -2
|
@@ -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;
|
|
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":"
|
|
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?: (
|
|
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;
|
|
@@ -47,6 +75,12 @@ export interface TypeFerryConfig {
|
|
|
47
75
|
};
|
|
48
76
|
}
|
|
49
77
|
export interface ResolvedApplicationConfig {
|
|
78
|
+
readonly application?: ApplicationIdentity;
|
|
79
|
+
readonly client: {
|
|
80
|
+
readonly targets: {
|
|
81
|
+
readonly ios?: IosApplicationTarget;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
50
84
|
readonly root: string;
|
|
51
85
|
readonly paths: {
|
|
52
86
|
readonly client: string;
|
|
@@ -79,6 +113,9 @@ export interface ResolvedApplicationConfig {
|
|
|
79
113
|
readonly extensions: ApplicationToolingExtensions;
|
|
80
114
|
}
|
|
81
115
|
export declare const DEFAULT_APPLICATION_CONFIG: {
|
|
116
|
+
readonly client: {
|
|
117
|
+
readonly targets: {};
|
|
118
|
+
};
|
|
82
119
|
readonly paths: {
|
|
83
120
|
readonly client: "client";
|
|
84
121
|
readonly common: "common";
|
|
@@ -34,8 +34,27 @@ const extensionsSchema = z
|
|
|
34
34
|
afterBuild: z.function().optional(),
|
|
35
35
|
})
|
|
36
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();
|
|
37
47
|
const configSchema = z
|
|
38
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(),
|
|
39
58
|
extensions: extensionsSchema.optional(),
|
|
40
59
|
development: z
|
|
41
60
|
.object({
|
|
@@ -73,6 +92,7 @@ const configSchema = z
|
|
|
73
92
|
})
|
|
74
93
|
.strict();
|
|
75
94
|
export const DEFAULT_APPLICATION_CONFIG = {
|
|
95
|
+
client: { targets: {} },
|
|
76
96
|
paths: {
|
|
77
97
|
client: "client",
|
|
78
98
|
common: "common",
|
|
@@ -126,8 +146,13 @@ export function defineConfig(config) {
|
|
|
126
146
|
}
|
|
127
147
|
export function resolveApplicationConfig(root, input = {}) {
|
|
128
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
|
+
}
|
|
129
152
|
return {
|
|
130
153
|
root: path.resolve(root),
|
|
154
|
+
...(config.application ? { application: config.application } : {}),
|
|
155
|
+
client: { targets: config.client?.targets ?? {} },
|
|
131
156
|
paths: DEFAULT_APPLICATION_CONFIG.paths,
|
|
132
157
|
development: {
|
|
133
158
|
...DEFAULT_APPLICATION_CONFIG.development,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/application/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAOlC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
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,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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { InlineConfig } from "vite";
|
|
2
|
-
import type { ResolvedApplicationConfig } from "./config.js";
|
|
3
|
-
export declare function createViteConfig(config: ResolvedApplicationConfig, command: "develop" | "build"): InlineConfig;
|
|
2
|
+
import type { ApplicationTarget, ResolvedApplicationConfig } from "./config.js";
|
|
3
|
+
export declare function createViteConfig(config: ResolvedApplicationConfig, command: "develop" | "build", target?: ApplicationTarget): InlineConfig;
|
|
@@ -2,7 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import tailwindcss from "@tailwindcss/vite";
|
|
3
3
|
import react from "@vitejs/plugin-react";
|
|
4
4
|
import { createTypeFerryDevProxy } from "./proxy.js";
|
|
5
|
-
export function createViteConfig(config, command) {
|
|
5
|
+
export function createViteConfig(config, command, target = "web") {
|
|
6
6
|
const plugins = [react(), tailwindcss()];
|
|
7
7
|
if (command === "develop") {
|
|
8
8
|
plugins.unshift(createTypeFerryDevProxy(config.development.serverPort, config.development.proxyRoutes));
|
|
@@ -39,6 +39,20 @@ export function createViteConfig(config, command) {
|
|
|
39
39
|
},
|
|
40
40
|
},
|
|
41
41
|
};
|
|
42
|
-
|
|
42
|
+
if (target === 'ios') {
|
|
43
|
+
const ios = config.client.targets.ios;
|
|
44
|
+
if (!ios)
|
|
45
|
+
throw new Error('No iOS application target configured');
|
|
46
|
+
viteConfig.build = { ...viteConfig.build, outDir: '../dist/ios-web' };
|
|
47
|
+
viteConfig.define = { __TYPEFERRY_RUNTIME__: JSON.stringify({ target, backendOrigin: ios.backend.origin }) };
|
|
48
|
+
}
|
|
49
|
+
const extended = config.extensions.vite?.(viteConfig, { command, target }) ?? viteConfig;
|
|
50
|
+
if (target === 'ios' && extended.define?.__TYPEFERRY_RUNTIME__ !== viteConfig.define?.__TYPEFERRY_RUNTIME__) {
|
|
51
|
+
throw new Error('iOS public runtime metadata must be preserved by Vite extensions');
|
|
52
|
+
}
|
|
53
|
+
if (target === 'ios' && extended.build?.outDir !== '../dist/ios-web') {
|
|
54
|
+
throw new Error('iOS output must remain isolated in dist/ios-web');
|
|
55
|
+
}
|
|
56
|
+
return extended;
|
|
43
57
|
}
|
|
44
58
|
//# sourceMappingURL=vite-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-config.js","sourceRoot":"","sources":["../../src/application/vite-config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAIzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,UAAU,gBAAgB,CAC9B,MAAiC,EACjC,OAA4B;
|
|
1
|
+
{"version":3,"file":"vite-config.js","sourceRoot":"","sources":["../../src/application/vite-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
export { broadcastTokenRefresh, setupCrossTabSync } from './cross-tab-sync.js';
|
|
2
2
|
export { refreshAccessToken, setupTokenRefreshOnExpiry } from './token-refresh.js';
|
|
3
|
+
export { authenticateNativeSession } from './native-session.js';
|
|
4
|
+
export type { NativeAccessSession, NativeSessionOptions } from './native-session.js';
|
|
5
|
+
export { createNativeHttpFetch } from './native-http.js';
|
|
6
|
+
export type { NativeHttpBridge } from './native-http.js';
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { broadcastTokenRefresh, setupCrossTabSync } from './cross-tab-sync.js';
|
|
2
2
|
export { refreshAccessToken, setupTokenRefreshOnExpiry } from './token-refresh.js';
|
|
3
|
+
export { authenticateNativeSession } from './native-session.js';
|
|
4
|
+
export { createNativeHttpFetch } from './native-http.js';
|
|
3
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAE5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { HttpFetch } from '../../client/backend-origin.js';
|
|
2
|
+
/**
|
|
3
|
+
* Text-only native transport. Its implementation must pin the backend origin,
|
|
4
|
+
* persist cookies privately, reject off-origin redirects and hide Set-Cookie.
|
|
5
|
+
*/
|
|
6
|
+
export interface NativeHttpBridge {
|
|
7
|
+
request(options: {
|
|
8
|
+
url: string;
|
|
9
|
+
method: string;
|
|
10
|
+
headers: Record<string, string>;
|
|
11
|
+
body?: string;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
status: number;
|
|
14
|
+
statusText: string;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
body: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Adapts native private-cookie HTTP to ClientOptions.httpFetch. This boundary is
|
|
21
|
+
* for RPC and auth JSON, not binary uploads/downloads. Cancellation is checked
|
|
22
|
+
* before and after the native operation; it does not undo server-side effects.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createNativeHttpFetch(bridge: NativeHttpBridge): HttpFetch;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapts native private-cookie HTTP to ClientOptions.httpFetch. This boundary is
|
|
3
|
+
* for RPC and auth JSON, not binary uploads/downloads. Cancellation is checked
|
|
4
|
+
* before and after the native operation; it does not undo server-side effects.
|
|
5
|
+
*/
|
|
6
|
+
export function createNativeHttpFetch(bridge) {
|
|
7
|
+
return async (url, options = {}) => {
|
|
8
|
+
options.signal?.throwIfAborted();
|
|
9
|
+
if (options.body != null && typeof options.body !== 'string') {
|
|
10
|
+
throw new Error('Native HTTP adapter supports text request bodies only');
|
|
11
|
+
}
|
|
12
|
+
const headers = Object.fromEntries(new Headers(options.headers).entries());
|
|
13
|
+
const result = await bridge.request({ url, method: options.method ?? 'GET', headers, ...(typeof options.body === 'string' ? { body: options.body } : {}) });
|
|
14
|
+
options.signal?.throwIfAborted();
|
|
15
|
+
const body = [204, 205, 304].includes(result.status) ? null : result.body;
|
|
16
|
+
return new Response(body, { status: result.status, statusText: result.statusText, headers: result.headers });
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=native-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-http.js","sourceRoot":"","sources":["../../../src/auth/client/native-http.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;QACjC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QAEhC,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE3J,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QAEhC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QAEzE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9G,CAAC,CAAA;AACH,CAAC"}
|