appflare 0.0.28 → 0.1.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/cli/commands/index.ts +140 -0
- package/cli/generate.ts +149 -0
- package/cli/index.ts +56 -447
- package/cli/load-config.ts +182 -0
- package/cli/schema-compiler.ts +657 -0
- package/cli/templates/auth/README.md +156 -0
- package/cli/templates/auth/config.ts +61 -0
- package/cli/templates/auth/route-config.ts +18 -0
- package/cli/templates/auth/route-handler.ts +18 -0
- package/cli/templates/auth/route-request-utils.ts +55 -0
- package/cli/templates/auth/route.ts +14 -0
- package/cli/templates/core/README.md +266 -0
- package/cli/templates/core/app-creation.ts +19 -0
- package/cli/templates/core/client/appflare.ts +37 -0
- package/cli/templates/core/client/index.ts +6 -0
- package/cli/templates/core/client/storage.ts +100 -0
- package/cli/templates/core/client/types.ts +54 -0
- package/cli/templates/core/client-modules/appflare.ts +112 -0
- package/cli/templates/core/client-modules/handlers/index.ts +740 -0
- package/cli/templates/core/client-modules/handlers.ts +1 -0
- package/cli/templates/core/client-modules/index.ts +7 -0
- package/cli/templates/core/client-modules/storage.ts +180 -0
- package/cli/templates/core/client-modules/types.ts +145 -0
- package/cli/templates/core/client.ts +39 -0
- package/cli/templates/core/drizzle.ts +15 -0
- package/cli/templates/core/export.ts +14 -0
- package/cli/templates/core/handlers-route.ts +23 -0
- package/cli/templates/core/handlers.ts +1 -0
- package/cli/templates/core/imports.ts +8 -0
- package/cli/templates/core/server.ts +38 -0
- package/cli/templates/core/types.ts +6 -0
- package/cli/templates/core/wrangler.ts +109 -0
- package/cli/templates/handlers/README.md +265 -0
- package/cli/templates/handlers/auth.ts +36 -0
- package/cli/templates/handlers/execution.ts +39 -0
- package/cli/templates/handlers/generators/context/context-creation.ts +80 -0
- package/cli/templates/handlers/generators/context/error-helpers.ts +11 -0
- package/cli/templates/handlers/generators/context/scheduler.ts +24 -0
- package/cli/templates/handlers/generators/context/storage-api.ts +112 -0
- package/cli/templates/handlers/generators/context/storage-helpers.ts +59 -0
- package/cli/templates/handlers/generators/context/types.ts +18 -0
- package/cli/templates/handlers/generators/context.ts +43 -0
- package/cli/templates/handlers/generators/execution.ts +15 -0
- package/cli/templates/handlers/generators/handlers.ts +13 -0
- package/cli/templates/handlers/index.ts +43 -0
- package/cli/templates/handlers/operations.ts +116 -0
- package/cli/templates/handlers/registration.ts +1114 -0
- package/cli/templates/handlers/types.ts +960 -0
- package/cli/templates/handlers/utils.ts +48 -0
- package/cli/types.ts +108 -0
- package/cli/utils/handler-discovery.ts +366 -0
- package/cli/utils/json-utils.ts +24 -0
- package/cli/utils/path-utils.ts +19 -0
- package/cli/utils/schema-discovery.ts +390 -0
- package/index.ts +27 -4
- package/package.json +23 -20
- package/react/index.ts +5 -3
- package/react/use-infinite-query.ts +190 -0
- package/react/use-mutation.ts +54 -0
- package/react/use-query.ts +158 -0
- package/schema.ts +262 -0
- package/tsconfig.json +2 -4
- package/cli/README.md +0 -108
- package/cli/core/build.ts +0 -187
- package/cli/core/config.ts +0 -92
- package/cli/core/discover-handlers.ts +0 -143
- package/cli/core/handlers.ts +0 -7
- package/cli/core/index.ts +0 -205
- package/cli/generators/generate-api-client/client.ts +0 -163
- package/cli/generators/generate-api-client/extract-configuration.ts +0 -121
- package/cli/generators/generate-api-client/index.ts +0 -973
- package/cli/generators/generate-api-client/types.ts +0 -164
- package/cli/generators/generate-api-client/utils.ts +0 -22
- package/cli/generators/generate-api-client.ts +0 -1
- package/cli/generators/generate-cloudflare-worker/helpers.ts +0 -24
- package/cli/generators/generate-cloudflare-worker/index.ts +0 -2
- package/cli/generators/generate-cloudflare-worker/worker.ts +0 -148
- package/cli/generators/generate-cloudflare-worker/wrangler.ts +0 -108
- package/cli/generators/generate-cloudflare-worker.ts +0 -4
- package/cli/generators/generate-cron-handlers/cron-handlers-block.ts +0 -2
- package/cli/generators/generate-cron-handlers/handler-entries.ts +0 -29
- package/cli/generators/generate-cron-handlers/index.ts +0 -61
- package/cli/generators/generate-cron-handlers/runtime-block.ts +0 -49
- package/cli/generators/generate-cron-handlers/type-helpers-block.ts +0 -60
- package/cli/generators/generate-db-handlers/index.ts +0 -33
- package/cli/generators/generate-db-handlers/prepare.ts +0 -24
- package/cli/generators/generate-db-handlers/templates.ts +0 -189
- package/cli/generators/generate-db-handlers.ts +0 -1
- package/cli/generators/generate-hono-server/auth.ts +0 -97
- package/cli/generators/generate-hono-server/imports.ts +0 -55
- package/cli/generators/generate-hono-server/index.ts +0 -52
- package/cli/generators/generate-hono-server/routes.ts +0 -115
- package/cli/generators/generate-hono-server/template.ts +0 -371
- package/cli/generators/generate-hono-server.ts +0 -1
- package/cli/generators/generate-scheduler-handlers/constants.ts +0 -8
- package/cli/generators/generate-scheduler-handlers/handler-entries.ts +0 -22
- package/cli/generators/generate-scheduler-handlers/index.ts +0 -51
- package/cli/generators/generate-scheduler-handlers/runtime-block.ts +0 -68
- package/cli/generators/generate-scheduler-handlers/scheduler-handlers-block.ts +0 -2
- package/cli/generators/generate-scheduler-handlers/type-helpers-block.ts +0 -68
- package/cli/generators/generate-scheduler-handlers.ts +0 -1
- package/cli/generators/generate-websocket-durable-object/auth.ts +0 -30
- package/cli/generators/generate-websocket-durable-object/imports.ts +0 -55
- package/cli/generators/generate-websocket-durable-object/index.ts +0 -41
- package/cli/generators/generate-websocket-durable-object/query-handlers.ts +0 -18
- package/cli/generators/generate-websocket-durable-object/template.ts +0 -714
- package/cli/generators/generate-websocket-durable-object.ts +0 -1
- package/cli/schema/schema-static-types.ts +0 -702
- package/cli/schema/schema.ts +0 -151
- package/cli/utils/tsc.ts +0 -54
- package/cli/utils/utils.ts +0 -190
- package/cli/utils/zod-utils.ts +0 -121
- package/lib/README.md +0 -50
- package/lib/db.ts +0 -19
- package/lib/location.ts +0 -110
- package/lib/values.ts +0 -27
- package/react/README.md +0 -67
- package/react/hooks/useMutation.ts +0 -89
- package/react/hooks/usePaginatedQuery.ts +0 -213
- package/react/hooks/useQuery.ts +0 -106
- package/react/shared/queryShared.ts +0 -174
- package/server/README.md +0 -218
- package/server/auth.ts +0 -107
- package/server/database/builders.ts +0 -83
- package/server/database/context.ts +0 -327
- package/server/database/populate.ts +0 -234
- package/server/database/query-builder.ts +0 -161
- package/server/database/query-utils.ts +0 -25
- package/server/db.ts +0 -2
- package/server/storage/auth.ts +0 -16
- package/server/storage/bucket.ts +0 -22
- package/server/storage/context.ts +0 -34
- package/server/storage/index.ts +0 -38
- package/server/storage/operations.ts +0 -149
- package/server/storage/route-handler.ts +0 -60
- package/server/storage/types.ts +0 -55
- package/server/storage/utils.ts +0 -47
- package/server/storage.ts +0 -6
- package/server/types/schema-refs.ts +0 -66
- package/server/types/types.ts +0 -633
- package/server/utils/id-utils.ts +0 -230
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { DiscoveredHandler } from "../../utils/utils";
|
|
2
|
-
import {
|
|
3
|
-
handlerTypePrefix,
|
|
4
|
-
normalizeTableName,
|
|
5
|
-
renderObjectKey,
|
|
6
|
-
} from "./utils";
|
|
7
|
-
|
|
8
|
-
type PathTree<T> = {
|
|
9
|
-
leaf?: { path: string; items: T[] };
|
|
10
|
-
children: Map<string, PathTree<T>>;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const buildPathTree = <T>(byPath: Map<string, T[]>): PathTree<T> => {
|
|
14
|
-
const root: PathTree<T> = { children: new Map() };
|
|
15
|
-
for (const [path, items] of Array.from(byPath.entries())) {
|
|
16
|
-
const segments = path.split("/").filter(Boolean);
|
|
17
|
-
let node = root;
|
|
18
|
-
for (const segment of segments) {
|
|
19
|
-
if (!node.children.has(segment)) {
|
|
20
|
-
node.children.set(segment, { children: new Map() });
|
|
21
|
-
}
|
|
22
|
-
node = node.children.get(segment)!;
|
|
23
|
-
}
|
|
24
|
-
node.leaf = { path, items };
|
|
25
|
-
}
|
|
26
|
-
return root;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const indent = (depth: number): string => "\t".repeat(depth);
|
|
30
|
-
|
|
31
|
-
const renderPathTreeLines = <T>(
|
|
32
|
-
node: PathTree<T>,
|
|
33
|
-
depth: number,
|
|
34
|
-
renderLeaf: (leaf: { path: string; items: T[] }, depth: number) => string[]
|
|
35
|
-
): string[] => {
|
|
36
|
-
const lines: string[] = [];
|
|
37
|
-
if (node.leaf) {
|
|
38
|
-
lines.push(...renderLeaf(node.leaf, depth));
|
|
39
|
-
}
|
|
40
|
-
const children = Array.from(node.children.entries()).sort((a, b) =>
|
|
41
|
-
a[0].localeCompare(b[0])
|
|
42
|
-
);
|
|
43
|
-
for (const [segment, child] of children) {
|
|
44
|
-
lines.push(`${indent(depth + 1)}${renderObjectKey(segment)}: {`);
|
|
45
|
-
lines.push(...renderPathTreeLines(child, depth + 1, renderLeaf));
|
|
46
|
-
lines.push(`${indent(depth + 1)}},`);
|
|
47
|
-
}
|
|
48
|
-
return lines;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
export function generateQueriesClientLines(
|
|
52
|
-
queriesByFile: Map<string, DiscoveredHandler[]>,
|
|
53
|
-
importAliasBySource: Map<string, string>
|
|
54
|
-
): string {
|
|
55
|
-
const tree = buildPathTree(queriesByFile);
|
|
56
|
-
const renderLeaf = (
|
|
57
|
-
leaf: { path: string; items: DiscoveredHandler[] },
|
|
58
|
-
depth: number
|
|
59
|
-
): string[] => {
|
|
60
|
-
const inner = leaf.items
|
|
61
|
-
.slice()
|
|
62
|
-
.sort((a, b) => a.name.localeCompare(b.name))
|
|
63
|
-
.map((h) => {
|
|
64
|
-
const pascal = handlerTypePrefix(h);
|
|
65
|
-
const route = `/queries/${leaf.path}/${h.name}`;
|
|
66
|
-
const importAlias = importAliasBySource.get(h.sourceFileAbs)!;
|
|
67
|
-
const handlerAccessor = `${importAlias}.${h.name}`;
|
|
68
|
-
const pad = indent(depth + 1);
|
|
69
|
-
return (
|
|
70
|
-
`${pad}${h.name}: withHandlerMetadata<${pascal}Definition>(\n` +
|
|
71
|
-
`${pad}\tasync (args: ${pascal}Args, init) => {\n` +
|
|
72
|
-
`${pad}\t\tconst url = buildQueryUrl(baseUrl, ${JSON.stringify(route)}, args);\n` +
|
|
73
|
-
`${pad}\t\tconst response = await request(url, {\n` +
|
|
74
|
-
`${pad}\t\t\t...(init ?? {}),\n` +
|
|
75
|
-
`${pad}\t\t\tmethod: "GET",\n` +
|
|
76
|
-
`${pad}\t\t});\n` +
|
|
77
|
-
`${pad}\t\treturn parseJson<${pascal}Result>(response);\n` +
|
|
78
|
-
`${pad}\t},\n` +
|
|
79
|
-
`${pad}\t{\n` +
|
|
80
|
-
`${pad}\t\tschema: createHandlerSchema(${handlerAccessor}.args),\n` +
|
|
81
|
-
`${pad}\t\twebsocket: createHandlerWebsocket<${pascal}Args, ${pascal}Result>(realtime, {\n` +
|
|
82
|
-
`${pad}\t\t\tdefaultTable: ${JSON.stringify(normalizeTableName(h.fileName))},\n` +
|
|
83
|
-
`${pad}\t\t\tdefaultHandler: { file: ${JSON.stringify(leaf.path)}, name: ${JSON.stringify(h.name)} },\n` +
|
|
84
|
-
`${pad}\t\t}),\n` +
|
|
85
|
-
`${pad}\t\tpath: ${JSON.stringify(route)},\n` +
|
|
86
|
-
`${pad}\t}\n` +
|
|
87
|
-
`${pad}),`
|
|
88
|
-
);
|
|
89
|
-
})
|
|
90
|
-
.join("\n");
|
|
91
|
-
|
|
92
|
-
return inner ? [inner] : [`${indent(depth + 1)}// (none)`];
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const lines: string[] = [];
|
|
96
|
-
const children = Array.from(tree.children.entries()).sort((a, b) =>
|
|
97
|
-
a[0].localeCompare(b[0])
|
|
98
|
-
);
|
|
99
|
-
for (const [segment, child] of children) {
|
|
100
|
-
lines.push(`${indent(1)}${renderObjectKey(segment)}: {`);
|
|
101
|
-
lines.push(...renderPathTreeLines(child, 1, renderLeaf));
|
|
102
|
-
lines.push(`${indent(1)}},`);
|
|
103
|
-
}
|
|
104
|
-
return lines.join("\n");
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export function generateMutationsClientLines(
|
|
108
|
-
mutationsByFile: Map<string, DiscoveredHandler[]>,
|
|
109
|
-
importAliasBySource: Map<string, string>
|
|
110
|
-
): string {
|
|
111
|
-
const tree = buildPathTree(mutationsByFile);
|
|
112
|
-
const renderLeaf = (
|
|
113
|
-
leaf: { path: string; items: DiscoveredHandler[] },
|
|
114
|
-
depth: number
|
|
115
|
-
): string[] => {
|
|
116
|
-
const inner = leaf.items
|
|
117
|
-
.slice()
|
|
118
|
-
.sort((a, b) => a.name.localeCompare(b.name))
|
|
119
|
-
.map((h) => {
|
|
120
|
-
const pascal = handlerTypePrefix(h);
|
|
121
|
-
const route = `/mutations/${leaf.path}/${h.name}`;
|
|
122
|
-
const importAlias = importAliasBySource.get(h.sourceFileAbs)!;
|
|
123
|
-
const handlerAccessor = `${importAlias}.${h.name}`;
|
|
124
|
-
const pad = indent(depth + 1);
|
|
125
|
-
return (
|
|
126
|
-
`${pad}${h.name}: withHandlerMetadata<${pascal}Definition>(\n` +
|
|
127
|
-
`${pad}\tasync (args: ${pascal}Args, init) => {\n` +
|
|
128
|
-
`${pad}\t\tconst url = buildUrl(baseUrl, ${JSON.stringify(route)});\n` +
|
|
129
|
-
`${pad}\t\tconst response = await request(url, {\n` +
|
|
130
|
-
`${pad}\t\t\t...(init ?? {}),\n` +
|
|
131
|
-
`${pad}\t\t\tmethod: "POST",\n` +
|
|
132
|
-
`${pad}\t\t\theaders: ensureJsonHeaders(init?.headers),\n` +
|
|
133
|
-
`${pad}\t\t\tbody: JSON.stringify(args),\n` +
|
|
134
|
-
`${pad}\t\t});\n` +
|
|
135
|
-
`${pad}\t\treturn parseJson<${pascal}Result>(response);\n` +
|
|
136
|
-
`${pad}\t},\n` +
|
|
137
|
-
`${pad}\t{\n` +
|
|
138
|
-
`${pad}\t\tschema: createHandlerSchema(${handlerAccessor}.args),\n` +
|
|
139
|
-
`${pad}\t\twebsocket: createHandlerWebsocket<${pascal}Args, ${pascal}Result>(realtime, {\n` +
|
|
140
|
-
`${pad}\t\t\tdefaultTable: ${JSON.stringify(normalizeTableName(h.fileName))},\n` +
|
|
141
|
-
`${pad}\t\t\tdefaultHandler: { file: ${JSON.stringify(leaf.path)}, name: ${JSON.stringify(h.name)} },\n` +
|
|
142
|
-
`${pad}\t\t}),\n` +
|
|
143
|
-
`${pad}\t\tpath: ${JSON.stringify(route)},\n` +
|
|
144
|
-
`${pad}\t}\n` +
|
|
145
|
-
`${pad}),`
|
|
146
|
-
);
|
|
147
|
-
})
|
|
148
|
-
.join("\n");
|
|
149
|
-
|
|
150
|
-
return inner ? [inner] : [`${indent(depth + 1)}// (none)`];
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
const lines: string[] = [];
|
|
154
|
-
const children = Array.from(tree.children.entries()).sort((a, b) =>
|
|
155
|
-
a[0].localeCompare(b[0])
|
|
156
|
-
);
|
|
157
|
-
for (const [segment, child] of children) {
|
|
158
|
-
lines.push(`${indent(1)}${renderObjectKey(segment)}: {`);
|
|
159
|
-
lines.push(...renderPathTreeLines(child, 1, renderLeaf));
|
|
160
|
-
lines.push(`${indent(1)}},`);
|
|
161
|
-
}
|
|
162
|
-
return lines.join("\n");
|
|
163
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
|
|
4
|
-
export function extractClientConfig(configPath: string): string | null {
|
|
5
|
-
if (!fs.existsSync(configPath)) {
|
|
6
|
-
return null;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const sourceCode = fs.readFileSync(configPath, "utf-8");
|
|
10
|
-
const sourceFile = ts.createSourceFile(
|
|
11
|
-
"appflare.config.ts",
|
|
12
|
-
sourceCode,
|
|
13
|
-
ts.ScriptTarget.Latest,
|
|
14
|
-
true,
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
let clientOptionsNode: ts.Expression | undefined;
|
|
18
|
-
|
|
19
|
-
// 1. Find the default export
|
|
20
|
-
// 2. Find the 'auth' property in the object literal
|
|
21
|
-
// 3. Find the 'clientOptions' property in the 'auth' object literal
|
|
22
|
-
|
|
23
|
-
function findClientOptions(node: ts.Node) {
|
|
24
|
-
if (ts.isExportAssignment(node)) {
|
|
25
|
-
const expr = node.expression;
|
|
26
|
-
if (ts.isObjectLiteralExpression(expr)) {
|
|
27
|
-
const authProp = expr.properties.find(
|
|
28
|
-
(p) =>
|
|
29
|
-
ts.isPropertyAssignment(p) &&
|
|
30
|
-
ts.isIdentifier(p.name) &&
|
|
31
|
-
p.name.text === "auth",
|
|
32
|
-
) as ts.PropertyAssignment | undefined;
|
|
33
|
-
|
|
34
|
-
if (authProp && ts.isObjectLiteralExpression(authProp.initializer)) {
|
|
35
|
-
const clientOptionsProp = authProp.initializer.properties.find(
|
|
36
|
-
(p) =>
|
|
37
|
-
ts.isPropertyAssignment(p) &&
|
|
38
|
-
ts.isIdentifier(p.name) &&
|
|
39
|
-
p.name.text === "clientOptions",
|
|
40
|
-
) as ts.PropertyAssignment | undefined;
|
|
41
|
-
|
|
42
|
-
if (clientOptionsProp) {
|
|
43
|
-
clientOptionsNode = clientOptionsProp.initializer;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
ts.forEachChild(node, findClientOptions);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
findClientOptions(sourceFile);
|
|
52
|
-
|
|
53
|
-
if (!clientOptionsNode) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const clientOptionsText = clientOptionsNode.getText(sourceFile);
|
|
58
|
-
|
|
59
|
-
// 4. Identify identifiers used in clientOptionsText to find necessary imports
|
|
60
|
-
const usedIdentifiers = new Set<string>();
|
|
61
|
-
|
|
62
|
-
function findIdentifiers(node: ts.Node) {
|
|
63
|
-
if (ts.isIdentifier(node)) {
|
|
64
|
-
usedIdentifiers.add(node.text);
|
|
65
|
-
}
|
|
66
|
-
ts.forEachChild(node, findIdentifiers);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
findIdentifiers(clientOptionsNode);
|
|
70
|
-
|
|
71
|
-
// 5. Scan top-level imports to find matching named imports
|
|
72
|
-
const importsToKeep: string[] = [];
|
|
73
|
-
|
|
74
|
-
for (const statement of sourceFile.statements) {
|
|
75
|
-
if (ts.isImportDeclaration(statement)) {
|
|
76
|
-
const importClause = statement.importClause;
|
|
77
|
-
if (!importClause) continue;
|
|
78
|
-
|
|
79
|
-
const moduleSpecifier = statement.moduleSpecifier.getText(sourceFile);
|
|
80
|
-
|
|
81
|
-
// Check for named imports
|
|
82
|
-
if (
|
|
83
|
-
importClause.namedBindings &&
|
|
84
|
-
ts.isNamedImports(importClause.namedBindings)
|
|
85
|
-
) {
|
|
86
|
-
const keepElements: string[] = [];
|
|
87
|
-
for (const element of importClause.namedBindings.elements) {
|
|
88
|
-
if (usedIdentifiers.has(element.name.text)) {
|
|
89
|
-
keepElements.push(element.getText(sourceFile));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (keepElements.length > 0) {
|
|
93
|
-
importsToKeep.push(
|
|
94
|
-
`import { ${keepElements.join(", ")} } from ${moduleSpecifier};`,
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Check for default import
|
|
100
|
-
if (importClause.name && usedIdentifiers.has(importClause.name.text)) {
|
|
101
|
-
importsToKeep.push(
|
|
102
|
-
`import ${importClause.name.text} from ${moduleSpecifier};`,
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Check for namespace import
|
|
107
|
-
if (
|
|
108
|
-
importClause.namedBindings &&
|
|
109
|
-
ts.isNamespaceImport(importClause.namedBindings)
|
|
110
|
-
) {
|
|
111
|
-
if (usedIdentifiers.has(importClause.namedBindings.name.text)) {
|
|
112
|
-
importsToKeep.push(
|
|
113
|
-
`import * as ${importClause.namedBindings.name.text} from ${moduleSpecifier};`,
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return `${importsToKeep.join("\n")}\n\nexport const clientOptions = ${clientOptionsText};`;
|
|
121
|
-
}
|