@swiftbrowser/cli 0.1.0 → 0.2.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/README.md +330 -64
- package/dist/assetSymbols.d.ts +25 -0
- package/dist/assetSymbols.js +218 -0
- package/dist/assetSymbols.js.map +1 -0
- package/dist/build.d.ts +17 -2
- package/dist/build.js +40 -13
- package/dist/build.js.map +1 -1
- package/dist/buildSettings.d.ts +15 -0
- package/dist/buildSettings.js +74 -0
- package/dist/buildSettings.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +60 -11
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.js +6 -5
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/check.js +2 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/dev.d.ts +5 -2
- package/dist/commands/dev.js +19 -13
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts +18 -0
- package/dist/commands/init.js +57 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kit.d.ts +3 -0
- package/dist/commands/kit.js +21 -0
- package/dist/commands/kit.js.map +1 -0
- package/dist/commands/shared.d.ts +25 -4
- package/dist/commands/shared.js +104 -10
- package/dist/commands/shared.js.map +1 -1
- package/dist/compat.d.ts +44 -6
- package/dist/compat.js +64 -36
- package/dist/compat.js.map +1 -1
- package/dist/config.d.ts +48 -10
- package/dist/config.js +64 -8
- package/dist/config.js.map +1 -1
- package/dist/coreml.d.ts +194 -0
- package/dist/coreml.js +626 -0
- package/dist/coreml.js.map +1 -0
- package/dist/icu.d.ts +17 -4
- package/dist/icu.js +32 -18
- package/dist/icu.js.map +1 -1
- package/dist/kit.d.ts +133 -0
- package/dist/kit.js +403 -0
- package/dist/kit.js.map +1 -0
- package/dist/objc.d.ts +31 -0
- package/dist/objc.js +319 -0
- package/dist/objc.js.map +1 -0
- package/dist/packagePatches.d.ts +24 -0
- package/dist/packagePatches.js +107 -0
- package/dist/packagePatches.js.map +1 -0
- package/dist/packages.d.ts +59 -0
- package/dist/packages.js +149 -0
- package/dist/packages.js.map +1 -0
- package/dist/project.d.ts +45 -4
- package/dist/project.js +91 -18
- package/dist/project.js.map +1 -1
- package/dist/protobuf.d.ts +62 -0
- package/dist/protobuf.js +233 -0
- package/dist/protobuf.js.map +1 -0
- package/dist/stage.d.ts +155 -27
- package/dist/stage.js +483 -79
- package/dist/stage.js.map +1 -1
- package/dist/strings.d.ts +44 -0
- package/dist/strings.js +386 -0
- package/dist/strings.js.map +1 -0
- package/dist/template.d.ts +29 -0
- package/dist/template.js +438 -0
- package/dist/template.js.map +1 -0
- package/dist/threadStacks.d.ts +14 -0
- package/dist/threadStacks.js +78 -0
- package/dist/threadStacks.js.map +1 -0
- package/dist/toolchain.d.ts +7 -1
- package/dist/toolchain.js +8 -2
- package/dist/toolchain.js.map +1 -1
- package/dist/urlSchemes.d.ts +11 -0
- package/dist/urlSchemes.js +58 -0
- package/dist/urlSchemes.js.map +1 -0
- package/dist/vendor.d.ts +109 -0
- package/dist/vendor.js +440 -0
- package/dist/vendor.js.map +1 -0
- package/dist/wasm.d.ts +28 -0
- package/dist/wasm.js +84 -0
- package/dist/wasm.js.map +1 -0
- package/package.json +7 -6
package/dist/cli.js
CHANGED
|
@@ -1,42 +1,67 @@
|
|
|
1
1
|
// `swiftbrowser <command> [path] [options]`: argument parsing and dispatch.
|
|
2
2
|
import { parseArgs } from 'node:util';
|
|
3
|
-
import {
|
|
3
|
+
import { isHTTPURL } from './config.js';
|
|
4
|
+
import { CliError, bold, dim, error, info, warn } from './log.js';
|
|
4
5
|
export const VERSION = '0.1.0';
|
|
5
6
|
const HELP = `${bold('swiftbrowser')} ${VERSION}: run an iOS SwiftUI app in the browser.
|
|
6
7
|
|
|
7
8
|
${bold('Usage')}
|
|
9
|
+
swiftbrowser init [<dir>] [--name <Name>] a new SwiftUI app: an Xcode project that runs in the browser too
|
|
8
10
|
swiftbrowser doctor [--install] check (and install) Swift, the wasm SDK and wasm-opt
|
|
9
11
|
swiftbrowser check <path> [options] import report and a native compile against the shim
|
|
10
12
|
swiftbrowser dev <path> [options] run the app with rebuild on save
|
|
11
13
|
swiftbrowser build <path> [-o <dir>] optimized module and a static site
|
|
14
|
+
swiftbrowser kit compile SwiftBrowser for WebAssembly ahead of builds
|
|
12
15
|
|
|
13
16
|
${bold('<path>')} is an .xcodeproj, a folder holding one, or a folder of Swift sources
|
|
14
17
|
(optionally with a swiftbrowser.json).
|
|
15
18
|
|
|
16
19
|
${bold('Options')}
|
|
20
|
+
--name <Name> the new app's name (init; default: from the directory)
|
|
21
|
+
--bundle-id <id> the new app's bundle identifier (init; default com.example.<Name>)
|
|
17
22
|
--target <name> the Xcode app target to build (when there are several)
|
|
18
23
|
--config <file> a swiftbrowser.json other than the project's
|
|
19
|
-
--
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
--port <n>, --host dev server port (default 5173) and LAN exposure (dev)
|
|
24
|
+
--port <n> dev server port (default 5173)
|
|
25
|
+
--host [<address>] expose the dev server on the network (all interfaces,
|
|
26
|
+
or one address: --host 192.168.1.20, --host=myhost)
|
|
23
27
|
--open open the browser (dev)
|
|
24
28
|
-o, --out <dir> output directory (build; default <project>/dist)
|
|
25
29
|
--no-optimize skip wasm-opt (build)
|
|
30
|
+
--cors-proxy <url> retry cross-origin reads the browser refuses through a
|
|
31
|
+
CORS proxy (packages/cors-proxy; dev, build)
|
|
32
|
+
--block-host <host> fail the app's requests to a host and its subdomains,
|
|
33
|
+
as if offline (repeatable; dev, build)
|
|
26
34
|
--verbose stream the compiler output
|
|
27
35
|
-h, --help, --version
|
|
28
36
|
`;
|
|
37
|
+
/** What can follow a bare `--host` as its value; anything else (a path) is the positional. */
|
|
38
|
+
const HOST_VALUE = /^(?:localhost|\d{1,3}(?:\.\d{1,3}){3}|[0-9a-f]*:[0-9a-f:.]*|[\w-]+(?:\.[\w-]+)*\.local)$/i;
|
|
39
|
+
/**
|
|
40
|
+
* `--host` may stand alone (every interface), which parseArgs cannot express
|
|
41
|
+
* for an option that also takes a value: a bare `--host` becomes `--host=`
|
|
42
|
+
* unless an address follows it.
|
|
43
|
+
*/
|
|
44
|
+
export function normalizeHostFlag(argv) {
|
|
45
|
+
return argv.map((arg, i) => {
|
|
46
|
+
if (arg !== '--host')
|
|
47
|
+
return arg;
|
|
48
|
+
const next = argv[i + 1];
|
|
49
|
+
return next !== undefined && HOST_VALUE.test(next) ? arg : '--host=';
|
|
50
|
+
});
|
|
51
|
+
}
|
|
29
52
|
export async function main(argv) {
|
|
30
53
|
let parsed;
|
|
31
54
|
try {
|
|
32
55
|
parsed = parseArgs({
|
|
33
|
-
args: argv,
|
|
56
|
+
args: normalizeHostFlag(argv),
|
|
34
57
|
allowPositionals: true,
|
|
35
58
|
options: {
|
|
36
59
|
help: { type: 'boolean', short: 'h' },
|
|
37
60
|
version: { type: 'boolean' },
|
|
38
61
|
install: { type: 'boolean' },
|
|
39
62
|
target: { type: 'string' },
|
|
63
|
+
name: { type: 'string' },
|
|
64
|
+
'bundle-id': { type: 'string' },
|
|
40
65
|
config: { type: 'string' },
|
|
41
66
|
foundation: { type: 'string' },
|
|
42
67
|
port: { type: 'string' },
|
|
@@ -45,6 +70,8 @@ export async function main(argv) {
|
|
|
45
70
|
out: { type: 'string', short: 'o' },
|
|
46
71
|
optimize: { type: 'boolean', default: true },
|
|
47
72
|
'no-optimize': { type: 'boolean' },
|
|
73
|
+
'cors-proxy': { type: 'string' },
|
|
74
|
+
'block-host': { type: 'string', multiple: true },
|
|
48
75
|
verbose: { type: 'boolean' },
|
|
49
76
|
},
|
|
50
77
|
});
|
|
@@ -64,16 +91,25 @@ export async function main(argv) {
|
|
|
64
91
|
console.log(HELP);
|
|
65
92
|
return command ? 0 : 2;
|
|
66
93
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
94
|
+
if (values.foundation !== undefined) {
|
|
95
|
+
// Phase 14: one Foundation. The flag stays accepted so old scripts keep working.
|
|
96
|
+
info(warn('--foundation is ignored; the real Foundation is always used (lean mode was removed)'));
|
|
97
|
+
}
|
|
98
|
+
const corsProxy = values['cors-proxy'];
|
|
99
|
+
if (corsProxy !== undefined && !isHTTPURL(corsProxy)) {
|
|
100
|
+
error('--cors-proxy must be an http(s) URL');
|
|
101
|
+
return 2;
|
|
102
|
+
}
|
|
103
|
+
const blockHosts = values['block-host'] ?? [];
|
|
104
|
+
if (!blockHosts.every((host) => /^[A-Za-z0-9.-]+$/.test(host))) {
|
|
105
|
+
error('--block-host takes a host name (nom.telemetrydeck.com)');
|
|
70
106
|
return 2;
|
|
71
107
|
}
|
|
72
|
-
const foundation = foundationArg;
|
|
73
108
|
const appOptions = {
|
|
74
109
|
...(values.target ? { target: values.target } : {}),
|
|
75
110
|
...(values.config ? { config: values.config } : {}),
|
|
76
|
-
...(
|
|
111
|
+
...(corsProxy ? { corsProxy } : {}),
|
|
112
|
+
...(blockHosts.length > 0 ? { blockHosts } : {}),
|
|
77
113
|
};
|
|
78
114
|
const needsPath = () => {
|
|
79
115
|
if (!input)
|
|
@@ -82,11 +118,24 @@ export async function main(argv) {
|
|
|
82
118
|
};
|
|
83
119
|
try {
|
|
84
120
|
switch (command) {
|
|
121
|
+
case 'init': {
|
|
122
|
+
const { init } = await import('./commands/init.js');
|
|
123
|
+
init(input, {
|
|
124
|
+
...(values.name !== undefined ? { name: values.name } : {}),
|
|
125
|
+
...(values['bundle-id'] !== undefined ? { bundleId: values['bundle-id'] } : {}),
|
|
126
|
+
});
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
85
129
|
case 'doctor': {
|
|
86
130
|
const { doctor } = await import('./commands/doctor.js');
|
|
87
131
|
const result = await doctor({ ...(values.install ? { install: true } : {}) });
|
|
88
132
|
return result.toolchain && result.wasmSdk ? 0 : 1;
|
|
89
133
|
}
|
|
134
|
+
case 'kit': {
|
|
135
|
+
const { kit } = await import('./commands/kit.js');
|
|
136
|
+
await kit({ ...(values.verbose ? { verbose: true } : {}) });
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
90
139
|
case 'check': {
|
|
91
140
|
const { check } = await import('./commands/check.js');
|
|
92
141
|
await check(needsPath(), { ...appOptions, ...(values.verbose ? { verbose: true } : {}) });
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAElE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,OAAO;;EAE7C,IAAI,CAAC,OAAO,CAAC;;;;;;;;EAQb,IAAI,CAAC,QAAQ,CAAC;;;EAGd,IAAI,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;CAiBhB,CAAC;AAEF,8FAA8F;AAC9F,MAAM,UAAU,GAAG,2FAA2F,CAAC;AAE/G;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,IAAI,MAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;YAC7B,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACrC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACzB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC5C,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAClC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAChC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC;IACrC,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,iFAAiF;QACjF,IAAI,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAuB,CAAC;IAC7D,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAI,MAAM,CAAC,YAAY,CAA0B,IAAI,EAAE,CAAC;IACxE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC;IACF,MAAM,SAAS,GAAG,GAAW,EAAE;QAC7B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,OAAO,+EAA+E,EAAE,CAAC,CAAC,CAAC;QAC7H,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,EAAE;oBACV,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1F,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9E,OAAO,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAClD,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBACtD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1F,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;gBACpG,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE;oBACrB,GAAG,UAAU;oBACb,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,MAAM,CAAC,IAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvC,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBACtD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE;oBACvB,GAAG,UAAU;oBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7C,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC;YACX,CAAC;YACD;gBACE,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
package/dist/commands/build.js
CHANGED
|
@@ -7,19 +7,20 @@ import { fileSize, formatBytes } from '../build.js';
|
|
|
7
7
|
import { bold, dim, info, ok, warn } from '../log.js';
|
|
8
8
|
import { findWasmOpt } from '../toolchain.js';
|
|
9
9
|
import { appSpec, icuDataFor } from './dev.js';
|
|
10
|
-
import { describeApp, describeReport, prepare, requireToolchain } from './shared.js';
|
|
10
|
+
import { describeApp, describeReport, prepare, requireToolchain, wasmShim } from './shared.js';
|
|
11
11
|
export async function build(input, options) {
|
|
12
|
-
const
|
|
12
|
+
const shim = await wasmShim(options.verbose ? { verbose: true } : {});
|
|
13
|
+
const { app, report, staged, vendored } = await prepare(input, options, shim.path);
|
|
13
14
|
describeApp(app);
|
|
14
|
-
describeReport(report, app);
|
|
15
|
+
describeReport(report, app, vendored);
|
|
15
16
|
const toolchain = requireToolchain({ wasm: true });
|
|
16
17
|
const wasmOpt = options.optimize === false ? null : findWasmOpt();
|
|
17
18
|
if (options.optimize !== false && !wasmOpt) {
|
|
18
19
|
info(warn('wasm-opt not found; the module is not optimized (`swiftbrowser doctor --install` downloads binaryen)'));
|
|
19
20
|
}
|
|
20
21
|
const outDir = path.resolve(options.outDir ?? path.join(app.root, 'dist'));
|
|
21
|
-
const spec = appSpec(app, staged, toolchain, { wasmOpt, icu: icuDataFor(app, toolchain) });
|
|
22
|
-
info(dim(`\nbuilding ${app.name} for WebAssembly (release${wasmOpt ? ', wasm-opt -
|
|
22
|
+
const spec = appSpec(app, staged, toolchain, { wasmOpt, icu: icuDataFor(app, toolchain), vendored, shim });
|
|
23
|
+
info(dim(`\nbuilding ${app.name} for WebAssembly (release${wasmOpt ? ', wasm-opt -Oz' : ''})…`));
|
|
23
24
|
const started = Date.now();
|
|
24
25
|
// Re-stages with the ICU data, builds, and optimizes into `spec.wasm`.
|
|
25
26
|
await spec.build();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qEAAqE;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/check.js
CHANGED
|
@@ -5,9 +5,9 @@ import { checkHost } from '../build.js';
|
|
|
5
5
|
import { CliError, bold, dim, info, ok } from '../log.js';
|
|
6
6
|
import { describeApp, describeReport, prepare, requireToolchain } from './shared.js';
|
|
7
7
|
export async function check(input, options) {
|
|
8
|
-
const { app, report, staged } = await prepare(input, options);
|
|
8
|
+
const { app, report, staged, vendored } = await prepare(input, options);
|
|
9
9
|
describeApp(app);
|
|
10
|
-
const blocked = describeReport(report, app);
|
|
10
|
+
const blocked = describeReport(report, app, vendored);
|
|
11
11
|
const toolchain = requireToolchain({ wasm: false });
|
|
12
12
|
info(dim(`\ncompiling ${app.name} against the shim (Swift ${toolchain.version}, host build)…`));
|
|
13
13
|
const started = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,4BAA4B;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAa,EAAE,OAA2C;IACpF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,4BAA4B;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAa,EAAE,OAA2C;IACpF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxE,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,IAAI,4BAA4B,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChI,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC/D,MAAM,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,oCAAoC,CAAC,KAAK,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpL,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACtH,CAAC"}
|
package/dist/commands/dev.d.ts
CHANGED
|
@@ -3,17 +3,20 @@ import { type ICUData } from '../icu.js';
|
|
|
3
3
|
import { type ResolvedApp } from '../project.js';
|
|
4
4
|
import { type StagedApp } from '../stage.js';
|
|
5
5
|
import type { Toolchain } from '../toolchain.js';
|
|
6
|
-
import {
|
|
6
|
+
import type { Vendored } from '../vendor.js';
|
|
7
|
+
import { type AppOptions, type Shim } from './shared.js';
|
|
7
8
|
export interface DevOptions extends AppOptions {
|
|
8
9
|
port?: number;
|
|
9
10
|
host?: string | boolean;
|
|
10
11
|
open?: boolean;
|
|
11
12
|
}
|
|
12
|
-
/**
|
|
13
|
+
/** The trimmed ICU data for the app's languages (made once per SDK and language set, then cached). */
|
|
13
14
|
export declare function icuDataFor(app: ResolvedApp, toolchain: Toolchain): ICUData | null;
|
|
14
15
|
/** The registry entry the web dev server runs the app from. */
|
|
15
16
|
export declare function appSpec(app: ResolvedApp, staged: StagedApp, toolchain: Toolchain, options: {
|
|
16
17
|
wasmOpt?: string | null;
|
|
17
18
|
icu?: ICUData | null;
|
|
19
|
+
vendored?: Vendored;
|
|
20
|
+
shim: Shim;
|
|
18
21
|
}): AppSpec;
|
|
19
22
|
export declare function dev(input: string, options: DevOptions): Promise<void>;
|
package/dist/commands/dev.js
CHANGED
|
@@ -6,13 +6,10 @@ import { buildWasm, fileSize, formatBytes } from '../build.js';
|
|
|
6
6
|
import { describeICUData, prepareICUData } from '../icu.js';
|
|
7
7
|
import { CliError, bold, dim, info, ok } from '../log.js';
|
|
8
8
|
import { commonSourceBase, stage, wasmOutput } from '../stage.js';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
/** For a full-Foundation app, the trimmed ICU data (made once per SDK and language set, then cached). */
|
|
9
|
+
import { describeApp, describeReport, prepare, requireToolchain, wasmShim } from './shared.js';
|
|
10
|
+
/** The trimmed ICU data for the app's languages (made once per SDK and language set, then cached). */
|
|
12
11
|
export function icuDataFor(app, toolchain) {
|
|
13
|
-
|
|
14
|
-
return null;
|
|
15
|
-
const icu = prepareICUData(toolchain, app.locales);
|
|
12
|
+
const icu = prepareICUData(toolchain, app.locales, { collation: app.collation });
|
|
16
13
|
info(dim(` ${describeICUData(icu)}`));
|
|
17
14
|
return icu;
|
|
18
15
|
}
|
|
@@ -23,27 +20,36 @@ export function appSpec(app, staged, toolchain, options) {
|
|
|
23
20
|
displayName: app.displayName,
|
|
24
21
|
description: app.origin.kind === 'xcodeproj' ? `${path.basename(app.origin.project)} › ${app.origin.target}` : path.basename(app.root),
|
|
25
22
|
wasm: wasmOutput(app),
|
|
26
|
-
catalogs: app.
|
|
27
|
-
|
|
23
|
+
// The packages' catalogs join the app's: the page's catalog is the whole app's.
|
|
24
|
+
catalogs: [...app.catalogs, ...[...(options.vendored?.values() ?? [])].flatMap((copy) => copy.catalogs ?? [])],
|
|
25
|
+
// The compiled string tables publish as `<language>.lproj` folders (strings.ts).
|
|
26
|
+
resources: [...app.resources, ...staged.localizations],
|
|
28
27
|
locales: app.locales,
|
|
29
28
|
watch: [commonSourceBase(app)],
|
|
30
29
|
build: async () => {
|
|
31
30
|
// Re-stage first: a saved file is copied (and adjusted) before SwiftPM runs.
|
|
32
|
-
const fresh = stage(app,
|
|
31
|
+
const fresh = stage(app, options.shim.path, { icu: options.icu ?? null, ...(options.vendored ? { vendored: options.vendored } : {}) });
|
|
33
32
|
staged.originals = fresh.originals;
|
|
34
|
-
await buildWasm({ toolchain, staged: fresh, app, ...(options.wasmOpt ? { wasmOpt: options.wasmOpt } : {}) });
|
|
33
|
+
await buildWasm({ toolchain, staged: fresh, app, swiftFlags: options.shim.swiftFlags, ...(options.wasmOpt ? { wasmOpt: options.wasmOpt } : {}) });
|
|
35
34
|
},
|
|
36
35
|
};
|
|
37
36
|
if (app.icon)
|
|
38
37
|
spec.icon = app.icon;
|
|
38
|
+
if (app.urlSchemes)
|
|
39
|
+
spec.urlSchemes = app.urlSchemes;
|
|
40
|
+
if (app.corsProxy)
|
|
41
|
+
spec.corsProxy = app.corsProxy;
|
|
42
|
+
if (app.blockHosts?.length)
|
|
43
|
+
spec.blockedHosts = app.blockHosts;
|
|
39
44
|
return spec;
|
|
40
45
|
}
|
|
41
46
|
export async function dev(input, options) {
|
|
42
|
-
const
|
|
47
|
+
const shim = await wasmShim();
|
|
48
|
+
const { app, report, staged, vendored } = await prepare(input, options, shim.path);
|
|
43
49
|
describeApp(app);
|
|
44
|
-
describeReport(report, app);
|
|
50
|
+
describeReport(report, app, vendored);
|
|
45
51
|
const toolchain = requireToolchain({ wasm: true });
|
|
46
|
-
const spec = appSpec(app, staged, toolchain, { icu: icuDataFor(app, toolchain) });
|
|
52
|
+
const spec = appSpec(app, staged, toolchain, { icu: icuDataFor(app, toolchain), vendored, shim });
|
|
47
53
|
info(dim(`\nbuilding ${app.name} for WebAssembly (Swift ${toolchain.version}, ${staged.dir})…`));
|
|
48
54
|
const started = Date.now();
|
|
49
55
|
try {
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAgB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAgB,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAkB,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
/** The app name; defaults to one made from the directory's name. */
|
|
3
|
+
name?: string;
|
|
4
|
+
/** Defaults to `com.example.<name>`. */
|
|
5
|
+
bundleId?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface InitResult {
|
|
8
|
+
dir: string;
|
|
9
|
+
name: string;
|
|
10
|
+
/** Files written, relative to `dir`. */
|
|
11
|
+
written: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Writes a new project into `dir` (created if missing). An existing directory
|
|
15
|
+
* is fine as long as the project's own paths are free; a `.gitignore` there
|
|
16
|
+
* gets the lines it lacks and a README is added only where there is none.
|
|
17
|
+
*/
|
|
18
|
+
export declare function init(dirArg: string | undefined, options?: InitOptions): InitResult;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// `swiftbrowser init [<dir>] [--name <Name>]`: a new SwiftUI app, as an Xcode
|
|
2
|
+
// project that also runs with `swiftbrowser dev` (template.ts).
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { CliError, bold, dim, info, ok } from '../log.js';
|
|
6
|
+
import { APP_NAME, appNameFrom, mergeGitignore, projectFiles, readme } from '../template.js';
|
|
7
|
+
/**
|
|
8
|
+
* Writes a new project into `dir` (created if missing). An existing directory
|
|
9
|
+
* is fine as long as the project's own paths are free; a `.gitignore` there
|
|
10
|
+
* gets the lines it lacks and a README is added only where there is none.
|
|
11
|
+
*/
|
|
12
|
+
export function init(dirArg, options = {}) {
|
|
13
|
+
const dir = path.resolve(dirArg ?? '.');
|
|
14
|
+
const name = options.name ?? appNameFrom(path.basename(dir));
|
|
15
|
+
if (!name)
|
|
16
|
+
throw new CliError(`cannot make an app name from "${path.basename(dir)}"; pass --name <Name>`, 2);
|
|
17
|
+
if (!APP_NAME.test(name)) {
|
|
18
|
+
throw new CliError(`--name must be a Swift type name (a letter, then letters and digits): ${name}`, 2);
|
|
19
|
+
}
|
|
20
|
+
for (const taken of [`${name}.xcodeproj`, name]) {
|
|
21
|
+
if (existsSync(path.join(dir, taken)))
|
|
22
|
+
throw new CliError(`${path.join(dir, taken)} already exists; pick another --name or directory`);
|
|
23
|
+
}
|
|
24
|
+
const written = [];
|
|
25
|
+
const write = (relative, contents) => {
|
|
26
|
+
const file = path.join(dir, relative);
|
|
27
|
+
mkdirSync(path.dirname(file), { recursive: true });
|
|
28
|
+
writeFileSync(file, contents);
|
|
29
|
+
written.push(relative);
|
|
30
|
+
};
|
|
31
|
+
for (const file of projectFiles({ name, ...(options.bundleId ? { bundleId: options.bundleId } : {}) })) {
|
|
32
|
+
write(file.path, file.contents);
|
|
33
|
+
}
|
|
34
|
+
const gitignore = path.join(dir, '.gitignore');
|
|
35
|
+
const existing = existsSync(gitignore) ? readFileSync(gitignore, 'utf8') : undefined;
|
|
36
|
+
const merged = mergeGitignore(existing);
|
|
37
|
+
if (merged !== existing)
|
|
38
|
+
write('.gitignore', merged);
|
|
39
|
+
if (!existsSync(path.join(dir, 'README.md')))
|
|
40
|
+
write('README.md', readme(name));
|
|
41
|
+
const shown = path.relative(process.cwd(), dir) || '.';
|
|
42
|
+
info(ok(`created ${bold(name)} in ${shown}`));
|
|
43
|
+
for (const file of written)
|
|
44
|
+
info(dim(` ${file}`));
|
|
45
|
+
info(`\n${bold('Next')}`);
|
|
46
|
+
if (shown !== '.')
|
|
47
|
+
info(` cd ${/[\s"']/.test(shown) ? JSON.stringify(shown) : shown}`);
|
|
48
|
+
const steps = [
|
|
49
|
+
['npx @swiftbrowser/cli dev .', 'run it in the browser, rebuilding on save'],
|
|
50
|
+
[`open ${name}.xcodeproj`, 'or work on it in Xcode'],
|
|
51
|
+
];
|
|
52
|
+
const width = Math.max(...steps.map(([command]) => command.length)) + 3;
|
|
53
|
+
for (const [command, what] of steps)
|
|
54
|
+
info(` ${command.padEnd(width)}${dim(what)}`);
|
|
55
|
+
return { dir, name, written };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// `swiftbrowser kit`: compiles the shim for WebAssembly ahead of a build
|
|
2
|
+
// (the first `build` or `dev` does it otherwise) and prints where it is.
|
|
3
|
+
import { swiftPackagePath } from '@swiftbrowser/swift';
|
|
4
|
+
import { ensureKit, kitId } from '../kit.js';
|
|
5
|
+
import { dim, info, ok, warn } from '../log.js';
|
|
6
|
+
import { requireToolchain } from './shared.js';
|
|
7
|
+
export async function kit(options = {}) {
|
|
8
|
+
const toolchain = requireToolchain({ wasm: true });
|
|
9
|
+
const shim = swiftPackagePath();
|
|
10
|
+
const started = Date.now();
|
|
11
|
+
const found = await ensureKit(toolchain, shim, {
|
|
12
|
+
onBuild: () => info(dim(`compiling SwiftBrowser (${shim}) for WebAssembly, kit ${kitId(shim, toolchain)}…`)),
|
|
13
|
+
onPackaged: () => info(dim('copied from @swiftbrowser/kit')),
|
|
14
|
+
onPackagedRejected: (reason) => info(warn(`@swiftbrowser/kit's modules do not load with this toolchain (${reason})`)),
|
|
15
|
+
...(options.verbose ? { onOutput: (chunk) => process.stdout.write(chunk) } : {}),
|
|
16
|
+
});
|
|
17
|
+
const modules = Object.keys(found.manifest.targets).length;
|
|
18
|
+
info(ok(`kit ${dim(`${found.dir} (${modules} modules, ${((Date.now() - started) / 1000).toFixed(1)} s)`)}`));
|
|
19
|
+
return found.dir;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=kit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/commands/kit.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,UAAiC,EAAE;IAC3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE;QAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,IAAI,0BAA0B,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5G,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC5D,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gEAAgE,MAAM,GAAG,CAAC,CAAC;QACrH,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7G,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC"}
|
|
@@ -1,23 +1,44 @@
|
|
|
1
1
|
import { type CompatReport } from '../compat.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type Kit } from '../kit.js';
|
|
3
3
|
import { type ResolvedApp } from '../project.js';
|
|
4
4
|
import { type StagedApp } from '../stage.js';
|
|
5
5
|
import { type Toolchain } from '../toolchain.js';
|
|
6
|
+
import { type Vendored } from '../vendor.js';
|
|
6
7
|
export interface AppOptions {
|
|
7
8
|
target?: string;
|
|
8
9
|
config?: string;
|
|
9
|
-
|
|
10
|
+
/** `--cors-proxy`: replaces the config's `corsProxy`. */
|
|
11
|
+
corsProxy?: string;
|
|
12
|
+
/** `--block-host` (repeatable): added to the config's `blockHosts`. */
|
|
13
|
+
blockHosts?: string[];
|
|
10
14
|
}
|
|
11
15
|
export interface Prepared {
|
|
12
16
|
app: ResolvedApp;
|
|
13
17
|
report: CompatReport;
|
|
14
18
|
staged: StagedApp;
|
|
19
|
+
/** Packages built from a copy adjusted for the shim (vendor.ts). */
|
|
20
|
+
vendored: Vendored;
|
|
15
21
|
}
|
|
16
22
|
/** The required toolchain, or a CliError saying how to get it. */
|
|
17
23
|
export declare function requireToolchain(options: {
|
|
18
24
|
wasm: boolean;
|
|
19
25
|
}): Toolchain;
|
|
20
|
-
|
|
26
|
+
/** The package an app is staged against, and the flags its WebAssembly build adds. */
|
|
27
|
+
export interface Shim {
|
|
28
|
+
path: string;
|
|
29
|
+
swiftFlags: string[];
|
|
30
|
+
kit: Kit | null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The shim as `build` and `dev` use it: the kit (the shim compiled once for
|
|
34
|
+
* this version, kit.ts), built first if there is none, or the shim's sources
|
|
35
|
+
* when there is no toolchain yet (the command stops after the report) or with
|
|
36
|
+
* SWIFTBROWSER_KIT=0.
|
|
37
|
+
*/
|
|
38
|
+
export declare function wasmShim(options?: {
|
|
39
|
+
verbose?: boolean;
|
|
40
|
+
}): Promise<Shim>;
|
|
41
|
+
export declare function prepare(input: string, options: AppOptions, shimPackage?: string): Promise<Prepared>;
|
|
21
42
|
export declare function describeApp(app: ResolvedApp): void;
|
|
22
43
|
/** Prints the import report; returns whether anything is known to be unsupported. */
|
|
23
|
-
export declare function describeReport(report: CompatReport, app: ResolvedApp): boolean;
|
|
44
|
+
export declare function describeReport(report: CompatReport, app: ResolvedApp, vendored?: Vendored): boolean;
|