Skip to content

Commit 587b147

Browse files
authored
Merge pull request #1893 from polywrap/kris/polywrap-embed
Add `embed` option to `polywrap codegen`
2 parents 98bc2dc + 0926a92 commit 587b147

12 files changed

Lines changed: 99 additions & 22 deletions

File tree

packages/cli/lang/en.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@
8282
"commands_codegen_description": "Generate Code For Polywrap Projects",
8383
"commands_codegen_error_domain": "domain",
8484
"commands_codegen_error_optionMissingArgument": "{option} option missing {argument} argument",
85+
"commands_codegen_error_embedAppOnly": "The --embed option is currently only available for app projects",
8586
"commands_codegen_options_codegen": "Output directory for the generated code (default: {default})",
86-
"commands_codegen_options_e": "ENS address to lookup external schemas (default: 0x0000...2e1e)",
87-
"commands_codegen_options_e_address": "address",
87+
"commands_codegen_options_e": "Locally embed Wasm wraps",
8888
"commands_codegen_options_h": "Show usage information",
8989
"commands_codegen_options_s": "Path to a custom generation script (JavaScript | TypeScript)",
9090
"commands_codegen_options_i": "IPFS node to load external schemas (default: ipfs.io & localhost)",

packages/cli/lang/es.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@
8282
"commands_codegen_description": "Generate Code For Polywrap Projects",
8383
"commands_codegen_error_domain": "domain",
8484
"commands_codegen_error_optionMissingArgument": "{option} option missing {argument} argument",
85+
"commands_codegen_error_embedAppOnly": "The --embed option is currently only available for app projects",
8586
"commands_codegen_options_codegen": "Output directory for the generated code (default: {default})",
86-
"commands_codegen_options_e": "ENS address to lookup external schemas (default: 0x0000...2e1e)",
87-
"commands_codegen_options_e_address": "address",
87+
"commands_codegen_options_e": "Locally embed Wasm wraps",
8888
"commands_codegen_options_h": "Show usage information",
8989
"commands_codegen_options_s": "Path to a custom generation script (JavaScript | TypeScript)",
9090
"commands_codegen_options_i": "IPFS node to load external schemas (default: ipfs.io & localhost)",

packages/cli/src/__tests__/e2e/p2/codegen.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Options:
1919
-b, --bindgen <URI> Uri for custom bindgen wrap (must
2020
implement wrap-abi-bindgen interface; see
2121
https://github.com/polywrap/wrap-abi-bindgen)
22+
-e, --embed Locally embed Wasm wraps
2223
-s, --script <path> Path to a custom generation script
2324
(JavaScript | TypeScript)
2425
-c, --client-config <config-path> Add custom configuration to the

packages/cli/src/commands/build.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,12 @@ async function run(options: Required<BuildCommandOptions>) {
242242
project,
243243
client,
244244
});
245+
const abi = await schemaComposer.getComposedAbis();
245246

246247
if (canRunCodegen && !noCodegen) {
247248
const codeGenerator = new CodeGenerator({
248249
project,
249-
schemaComposer,
250+
abi,
250251
codegenDirAbs: codegenDir || undefined,
251252
bindgenUri,
252253
});
@@ -261,7 +262,7 @@ async function run(options: Required<BuildCommandOptions>) {
261262
const compiler = new Compiler({
262263
project: project as PolywrapProject,
263264
outputDir,
264-
schemaComposer,
265+
abi,
265266
buildStrategy,
266267
});
267268

packages/cli/src/commands/codegen.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import {
1414
defaultPolywrapManifestFiles,
1515
parseLogFileOption,
1616
parseWrapperEnvsOption,
17+
WasmEmbed,
18+
getWasmEmbeds,
1719
} from "../lib";
1820
import { ScriptCodegenerator } from "../lib/codegen/ScriptCodeGenerator";
1921
import { DEFAULT_CODEGEN_DIR } from "../lib/defaults";
@@ -29,6 +31,7 @@ export interface CodegenCommandOptions extends BaseCommandOptions {
2931
manifestFile: string;
3032
codegenDir: string | false;
3133
bindgen: string | false;
34+
embed: boolean | false;
3235
script: string | false;
3336
clientConfig: string | false;
3437
wrapperEnvs: string | false;
@@ -54,6 +57,7 @@ export const codegen: Command = {
5457
})}`
5558
)
5659
.option(`-b, --bindgen <URI>`, `${intlMsg.commands_codegen_options_b()}`)
60+
.option(`-e, --embed`, `${intlMsg.commands_codegen_options_e()}`)
5761
.option(
5862
`-s, --script <${pathStr}>`,
5963
`${intlMsg.commands_codegen_options_s()}`
@@ -81,6 +85,7 @@ export const codegen: Command = {
8185
),
8286
codegenDir: parseDirOptionNoDefault(options.codegenDir),
8387
bindgen: options.bindgen || false,
88+
embed: options.embed || false,
8489
script: parseCodegenScriptOption(options.script),
8590
clientConfig: options.clientConfig || false,
8691
wrapperEnvs: options.wrapperEnvs || false,
@@ -100,6 +105,7 @@ async function run(options: Required<CodegenCommandOptions>) {
100105
wrapperEnvs,
101106
codegenDir,
102107
bindgen,
108+
embed,
103109
script,
104110
verbose,
105111
quiet,
@@ -133,21 +139,34 @@ async function run(options: Required<CodegenCommandOptions>) {
133139
project,
134140
client,
135141
});
142+
const abi = await schemaComposer.getComposedAbis();
143+
144+
const projectLang = await project.getManifestLanguage();
145+
if (embed && !projectLang.startsWith("app")) {
146+
logger.error(intlMsg.commands_codegen_error_embedAppOnly());
147+
process.exit(1);
148+
}
149+
150+
const embeds: WasmEmbed[] | undefined =
151+
embed && abi.importedModuleTypes
152+
? await getWasmEmbeds(abi.importedModuleTypes, client, logger)
153+
: undefined;
136154

137155
const codeGenerator = script
138156
? new ScriptCodegenerator({
139157
codegenDirAbs: codegenDir || undefined,
140158
script,
141-
schemaComposer,
159+
abi,
142160
project,
143161
omitHeader: false,
144162
mustacheView: undefined,
145163
})
146164
: new CodeGenerator({
147165
codegenDirAbs: codegenDir || undefined,
148-
schemaComposer,
166+
abi,
149167
project,
150168
bindgenUri,
169+
embeds,
151170
});
152171

153172
const execute = async (): Promise<boolean> => {

packages/cli/src/lib/Compiler.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
PolywrapProject,
99
PluginProject,
1010
resetDir,
11-
SchemaComposer,
1211
logActivity,
1312
loadDocsManifest,
1413
} from "./";
@@ -21,12 +20,13 @@ import fs from "fs";
2120
import fse from "fs-extra";
2221
import path from "path";
2322
import { DocsManifest } from "@polywrap/polywrap-manifest-types-js";
23+
import { Abi } from "@polywrap/schema-parse";
2424

2525
export interface CompilerConfig {
2626
outputDir: string;
2727
project: PolywrapProject | PluginProject;
2828
buildStrategy?: BuildStrategy;
29-
schemaComposer: SchemaComposer;
29+
abi: Abi;
3030
}
3131

3232
export class Compiler {
@@ -111,13 +111,12 @@ export class Compiler {
111111
}
112112

113113
private async _outputWrapManifest(): Promise<unknown> {
114-
const { outputDir, project, schemaComposer } = this._config;
114+
const { outputDir, project, abi } = this._config;
115115
const manifestPath = `${outputDir}/wrap.info`;
116116
const run = async () => {
117117
const manifest = await project.getManifest();
118118

119119
const type = manifest.project.type.split("/")[0];
120-
const abi = await schemaComposer.getComposedAbis();
121120
await generateWrapFile(
122121
abi,
123122
manifest.project.name,

packages/cli/src/lib/codegen/CodeGenerator.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,21 @@ import {
1515
Project,
1616
} from "../project";
1717
import { resetDir } from "../system";
18-
import { SchemaComposer } from "../SchemaComposer";
1918
import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides";
19+
import { WasmEmbed } from "./WasmEmbed";
2020

2121
import path from "path";
2222
import { BindLanguage } from "@polywrap/schema-bind";
2323
import { writeDirectorySync } from "@polywrap/os-js";
2424
import { Uri } from "@polywrap/core-js";
25+
import { Abi } from "@polywrap/schema-parse";
2526

2627
export interface CodeGeneratorConfig {
2728
project: Project<AnyProjectManifest>;
28-
schemaComposer: SchemaComposer;
29+
abi: Abi;
2930
codegenDirAbs?: string;
3031
bindgenUri?: Uri;
32+
embeds?: WasmEmbed[];
3133
}
3234

3335
export class CodeGenerator {
@@ -88,13 +90,19 @@ export class CodeGenerator {
8890
)
8991
: undefined;
9092

91-
const bindConfig = overrides
93+
let bindConfig = overrides
9294
? await overrides.getSchemaBindConfig(this._config.project)
9395
: {};
9496

95-
const abi = await this._config.schemaComposer.getComposedAbis();
97+
if (this._config.embeds) {
98+
bindConfig = {
99+
...bindConfig,
100+
embeds: this._config.embeds,
101+
};
102+
}
103+
96104
const binding = await this._config.project.generateSchemaBindings(
97-
abi,
105+
this._config.abi,
98106
codegenDir,
99107
this._config.bindgenUri?.toString(),
100108
bindConfig

packages/cli/src/lib/codegen/ScriptCodeGenerator.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { intlMsg } from "../intl";
22
import { AnyProjectManifest, Project } from "../project";
33
import { isTypescriptFile, importTypescriptModule, resetDir } from "../system";
4-
import { SchemaComposer } from "../SchemaComposer";
54
import { CodeGenerator } from "./CodeGenerator";
65

76
import { writeDirectorySync } from "@polywrap/os-js";
@@ -14,6 +13,7 @@ import { readFileSync } from "fs-extra";
1413
import Mustache from "mustache";
1514
import path from "path";
1615
import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js";
16+
import { Abi } from "@polywrap/schema-parse";
1717

1818
export class ScriptCodegenerator extends CodeGenerator {
1919
private readonly _script: string;
@@ -23,7 +23,7 @@ export class ScriptCodegenerator extends CodeGenerator {
2323

2424
constructor(config: {
2525
project: Project<AnyProjectManifest>;
26-
schemaComposer: SchemaComposer;
26+
abi: Abi;
2727
codegenDirAbs?: string;
2828
script: string;
2929
mustacheView: Record<string, unknown> | undefined;
@@ -32,7 +32,7 @@ export class ScriptCodegenerator extends CodeGenerator {
3232
}) {
3333
super({
3434
project: config.project,
35-
schemaComposer: config.schemaComposer,
35+
abi: config.abi,
3636
codegenDirAbs: config.codegenDirAbs,
3737
});
3838

@@ -72,7 +72,7 @@ export class ScriptCodegenerator extends CodeGenerator {
7272
version: latestWrapManifestVersion,
7373
name: await this._config.project.getName(),
7474
type: bindLanguageToWrapInfoType(bindLanguage),
75-
abi: await this._config.schemaComposer.getComposedAbis(),
75+
abi: this._config.abi,
7676
},
7777
config: this._mustacheView,
7878
outputDirAbs,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { Logger } from "../logging";
2+
3+
import { ImportedModuleDefinition } from "@polywrap/wrap-manifest-types-js";
4+
import { PolywrapClient } from "@polywrap/client-js";
5+
6+
export interface WasmEmbed {
7+
uri: string;
8+
namespace: string;
9+
wrapInfo: Array<number>;
10+
wrapWasm: Array<number>;
11+
}
12+
13+
export async function getWasmEmbeds(
14+
importedModules: ImportedModuleDefinition[],
15+
client: PolywrapClient,
16+
logger: Logger
17+
): Promise<WasmEmbed[]> {
18+
const embeds: WasmEmbed[] = [];
19+
20+
for (const importedModule of importedModules ?? []) {
21+
if (importedModule.isInterface) {
22+
continue;
23+
}
24+
const uri = importedModule.uri;
25+
26+
const manifest = await client.getFile(uri, { path: "wrap.info" });
27+
if (!manifest.ok) {
28+
logger.error(JSON.stringify(manifest.error, null, 2));
29+
process.exit(1);
30+
}
31+
32+
const module = await client.getFile(uri, { path: "wrap.wasm" });
33+
if (!module.ok) {
34+
// The error is ignored because getFile is expected to fail for plugins and interfaces
35+
continue;
36+
}
37+
38+
embeds.push({
39+
uri,
40+
namespace: importedModule.namespace,
41+
wrapInfo: Array.from(manifest.value as Uint8Array),
42+
wrapWasm: Array.from(module.value as Uint8Array),
43+
});
44+
}
45+
46+
return embeds;
47+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from "./CodeGenerator";
22
export * from "./CodegenOverrides";
33
export * from "./ScriptCodeGenerator";
4+
export * from "./WasmEmbed";

0 commit comments

Comments
 (0)