@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
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// The app's URL schemes, from its Info.plist: `CFBundleURLSchemes` of each
|
|
2
|
+
// `CFBundleURLTypes` entry. An app registers `myapp://` as its OAuth redirect
|
|
3
|
+
// and signs in with `ASWebAuthenticationSession`; in the browser that
|
|
4
|
+
// redirect has to come back through the page's callback page, and the shim
|
|
5
|
+
// swaps it in only for the app's own schemes (docs/ops-protocol.md, "Signing
|
|
6
|
+
// in"). The registry entry carries them to the page, which hands them to the
|
|
7
|
+
// app as `SB_URL_SCHEMES`.
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { parseXmlPlist } from '@swiftbrowser/xcodeproj';
|
|
11
|
+
/** A URL scheme as RFC 3986 spells one. */
|
|
12
|
+
const SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/;
|
|
13
|
+
/** The URL schemes an Info.plist declares (XML plists only), in order, without duplicates. */
|
|
14
|
+
export function urlSchemesInPlist(text) {
|
|
15
|
+
let plist;
|
|
16
|
+
try {
|
|
17
|
+
plist = parseXmlPlist(text);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
if (typeof plist !== 'object' || plist === null || Array.isArray(plist))
|
|
23
|
+
return [];
|
|
24
|
+
const types = plist['CFBundleURLTypes'];
|
|
25
|
+
if (!Array.isArray(types))
|
|
26
|
+
return [];
|
|
27
|
+
const schemes = [];
|
|
28
|
+
for (const type of types) {
|
|
29
|
+
if (typeof type !== 'object' || type === null || Array.isArray(type))
|
|
30
|
+
continue;
|
|
31
|
+
const names = type['CFBundleURLSchemes'];
|
|
32
|
+
if (!Array.isArray(names))
|
|
33
|
+
continue;
|
|
34
|
+
for (const name of names) {
|
|
35
|
+
if (typeof name === 'string' && SCHEME.test(name) && !schemes.includes(name))
|
|
36
|
+
schemes.push(name);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return schemes;
|
|
40
|
+
}
|
|
41
|
+
/** The URL schemes of the Info.plist at `file` (none when it cannot be read). */
|
|
42
|
+
export function urlSchemesInPlistFile(file) {
|
|
43
|
+
try {
|
|
44
|
+
return urlSchemesInPlist(readFileSync(file, 'utf8'));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The URL schemes of an Xcode target: its `INFOPLIST_FILE` (relative to the
|
|
52
|
+
* project's directory, `root`), when it has one.
|
|
53
|
+
*/
|
|
54
|
+
export function urlSchemesOfTarget(target, root) {
|
|
55
|
+
const file = target.settings?.()['INFOPLIST_FILE'];
|
|
56
|
+
return file ? urlSchemesInPlistFile(path.resolve(root, file)) : [];
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=urlSchemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlSchemes.js","sourceRoot":"","sources":["../src/urlSchemes.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,sEAAsE;AACtE,2EAA2E;AAC3E,6EAA6E;AAC7E,6EAA6E;AAC7E,2BAA2B;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,2CAA2C;AAC3C,MAAM,MAAM,GAAG,2BAA2B,CAAC;AAE3C,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnF,MAAM,KAAK,GAAI,KAAiC,CAAC,kBAAkB,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/E,MAAM,KAAK,GAAI,IAAgC,CAAC,oBAAoB,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyE,EAAE,IAAY;IACxH,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC"}
|
package/dist/vendor.d.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { type PackagePlan } from './packages.js';
|
|
2
|
+
import type { ResolvedApp } from './project.js';
|
|
3
|
+
import { type StageFeatures } from './stage.js';
|
|
4
|
+
import { type Toolchain } from './toolchain.js';
|
|
5
|
+
/** Modules the SwiftBrowser package provides in place of Apple's: a package importing one is built against the shim. */
|
|
6
|
+
export declare const SHIM_MODULES: ReadonlySet<string>;
|
|
7
|
+
/** A package of the build, as `swift package show-dependencies` lists it. */
|
|
8
|
+
export interface PackageNode {
|
|
9
|
+
identity: string;
|
|
10
|
+
name: string;
|
|
11
|
+
/** The repository URL, or the folder of a local package. */
|
|
12
|
+
url: string;
|
|
13
|
+
/** A version, or `unspecified` for a local package or a branch. */
|
|
14
|
+
version: string;
|
|
15
|
+
/** Where its sources are: SwiftPM's checkout, or the local folder. */
|
|
16
|
+
path: string;
|
|
17
|
+
/** Identities of the packages it depends on. */
|
|
18
|
+
dependencies: string[];
|
|
19
|
+
}
|
|
20
|
+
/** A package copied into the staging package and built against the shim. */
|
|
21
|
+
export interface VendoredPackage {
|
|
22
|
+
identity: string;
|
|
23
|
+
name: string;
|
|
24
|
+
/** Where it came from (checkout or local folder). */
|
|
25
|
+
source: string;
|
|
26
|
+
/** Whether `source` is a folder of the user's (a local package) rather than SwiftPM's checkout. */
|
|
27
|
+
local: boolean;
|
|
28
|
+
version: string;
|
|
29
|
+
/** The copy: `<staging>/Packages/<identity>`. */
|
|
30
|
+
dir: string;
|
|
31
|
+
/**
|
|
32
|
+
* Its targets that import a shim module: the shim modules they import, and
|
|
33
|
+
* the products they link; none for a package copied only because it
|
|
34
|
+
* depends on one.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* `uses`: why a target that imports no shim module is built against it
|
|
38
|
+
* anyway (Objective-C selectors, POSIX mutexes, Dispatch).
|
|
39
|
+
*/
|
|
40
|
+
targets: {
|
|
41
|
+
name: string;
|
|
42
|
+
imports: string[];
|
|
43
|
+
modules: string[];
|
|
44
|
+
uses?: string[];
|
|
45
|
+
}[];
|
|
46
|
+
/** For a package SwiftBrowser stands in for, why: `dir` holds a redirect to the shim's modules, not a copy. */
|
|
47
|
+
standIn?: string;
|
|
48
|
+
/** The modules it provides (its regular targets), which a source may import. */
|
|
49
|
+
modules?: string[];
|
|
50
|
+
/** How many edits SwiftBrowser's patch made to it (packagePatches.ts). */
|
|
51
|
+
patched?: number;
|
|
52
|
+
/** Its targets' asset catalogs (in `source`), which join the app's on the page. */
|
|
53
|
+
catalogs?: string[];
|
|
54
|
+
}
|
|
55
|
+
/** Identity → the copy; empty when no package imports a shim module. */
|
|
56
|
+
export type Vendored = ReadonlyMap<string, VendoredPackage>;
|
|
57
|
+
/** The packages of a `show-dependencies --format json` tree, root excluded, each once. */
|
|
58
|
+
export declare function packageNodes(tree: unknown): PackageNode[];
|
|
59
|
+
/** The Package.swift that only resolves the app's package dependencies. */
|
|
60
|
+
export declare function resolveManifest(plans: readonly PackagePlan[]): string;
|
|
61
|
+
/**
|
|
62
|
+
* The package that takes a stand-in's place for the packages that depend on
|
|
63
|
+
* it: a library per product, each forwarding to SwiftBrowser's module of the
|
|
64
|
+
* same name, through a target of its own (`_<Product>StandIn`, empty).
|
|
65
|
+
*/
|
|
66
|
+
export declare function redirectManifest(name: string, products: readonly string[], reason: string, swiftPackagePath: string): string;
|
|
67
|
+
/** `// swift-tools-version: 5.9` → [5, 9]; [5, 0] when the line is missing or unreadable. */
|
|
68
|
+
export declare function toolsVersion(manifest: string): [number, number];
|
|
69
|
+
/**
|
|
70
|
+
* The lines appended to a copied package's manifest: the SwiftBrowser package,
|
|
71
|
+
* the shim products and `SWIFTBROWSER` for `targets`, and its dependencies on
|
|
72
|
+
* other copied packages (`copies`, identity → folder) pointed at the copies.
|
|
73
|
+
* Reading a dependency's location (`Package.Dependency.kind`) takes tools
|
|
74
|
+
* version 5.6; an older manifest keeps its URLs, and the staging manifest's
|
|
75
|
+
* declaration of the copy takes their place (with a warning from SwiftPM).
|
|
76
|
+
*/
|
|
77
|
+
export declare function manifestPatch(targets: readonly {
|
|
78
|
+
name: string;
|
|
79
|
+
modules: readonly string[];
|
|
80
|
+
}[], swiftPackagePath: string, copies?: ReadonlyMap<string, string>, tools?: readonly [number, number]): string;
|
|
81
|
+
/** The shim products a target needs for its imports: the app's set (stage.ts), minus what only apps use. */
|
|
82
|
+
export declare function targetProducts(features: StageFeatures): string[];
|
|
83
|
+
/**
|
|
84
|
+
* Whether a package's sources import a shim module: a quick scan before
|
|
85
|
+
* asking SwiftPM. The sources are the folders SwiftPM looks in by default
|
|
86
|
+
* (`Sources`, `Source`, `src`, `srcs`) when the package has one, else the
|
|
87
|
+
* whole package; manifests and tests never count, nor a demo app beside the
|
|
88
|
+
* library.
|
|
89
|
+
*/
|
|
90
|
+
export declare function importsShim(dir: string): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* `Bundle.module` on the bridge's `Bundle`. SwiftPM's generated accessor
|
|
93
|
+
* declares `module` on Foundation's `Bundle` (for a target with resources),
|
|
94
|
+
* but in a staged target `Bundle` is the bridge's (the alias file), so
|
|
95
|
+
* `Bundle.module` and `bundle: .module` would find nothing. This one is the
|
|
96
|
+
* folder SwiftPM names the target's resources (`<package>_<target>.bundle`)
|
|
97
|
+
* inside the app's bundle, or the app's bundle when there is none.
|
|
98
|
+
*/
|
|
99
|
+
export declare function moduleBundleSource(bundleName: string): string;
|
|
100
|
+
/** Where the copies live, and the package that resolves the originals. */
|
|
101
|
+
export declare function vendorDir(app: ResolvedApp): string;
|
|
102
|
+
/**
|
|
103
|
+
* Resolves the app's package dependencies and copies the ones that import a
|
|
104
|
+
* shim module, and the ones that depend on those, into the staging package.
|
|
105
|
+
* Packages that are plain Swift all the way down are left to SwiftPM, as
|
|
106
|
+
* before. Returns the copies by identity; empty, without running SwiftPM,
|
|
107
|
+
* when the app has no packages to fetch.
|
|
108
|
+
*/
|
|
109
|
+
export declare function vendorPackages(app: ResolvedApp, toolchain: Toolchain, swiftPackagePath: string): Promise<Map<string, VendoredPackage>>;
|
package/dist/vendor.js
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
// Swift packages that import SwiftUI (or another module the shim provides).
|
|
2
|
+
//
|
|
3
|
+
// SwiftPM builds a package dependency as its manifest says, and no manifest
|
|
4
|
+
// says to depend on SwiftBrowser: on iOS, `import SwiftUI` finds the system
|
|
5
|
+
// framework. So a package that imports one of the shim's modules is copied
|
|
6
|
+
// into the staging package (`Packages/<identity>/`) and built from there:
|
|
7
|
+
//
|
|
8
|
+
// - its sources get the same adjustments as the app's (`transformSource`);
|
|
9
|
+
// - each target that imports a shim module gets the generated alias file
|
|
10
|
+
// (`fullFoundationSource`), as the app module does;
|
|
11
|
+
// - its manifest keeps everything it declares, with a few lines appended that
|
|
12
|
+
// add the SwiftBrowser package and, to those targets, the shim products and
|
|
13
|
+
// the `SWIFTBROWSER` define.
|
|
14
|
+
//
|
|
15
|
+
// A package that depends on a copied one is copied too, unchanged but for
|
|
16
|
+
// its manifest, which points that dependency at the copy. The staging
|
|
17
|
+
// manifest depends on every copy by path (a transitive one as well: should a
|
|
18
|
+
// manifest be too old to repoint, SwiftPM lets the root's declaration take
|
|
19
|
+
// the place of the URL, with a warning).
|
|
20
|
+
//
|
|
21
|
+
// Which packages there are, at which versions and where SwiftPM checked them
|
|
22
|
+
// out, comes from resolving the project's dependencies in a package of their
|
|
23
|
+
// own (`Packages/.resolve/`), with `swift package show-dependencies`.
|
|
24
|
+
import { createHash } from 'node:crypto';
|
|
25
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
26
|
+
import path from 'node:path';
|
|
27
|
+
import { ASSET_SYMBOLS_FILE, assetSymbolsSource, declaredStaticMembers, targetCatalogs } from './assetSymbols.js';
|
|
28
|
+
import { run } from './build.js';
|
|
29
|
+
import { LINKED_FRAMEWORKS, importsOf } from './compat.js';
|
|
30
|
+
import { CliError } from './log.js';
|
|
31
|
+
import { optionalRequirementNames } from './objc.js';
|
|
32
|
+
import { PACKAGE_PATCHES, applyPatch, checkPatch } from './packagePatches.js';
|
|
33
|
+
import { PACKAGE_STAND_INS, planPackages } from './packages.js';
|
|
34
|
+
import { FULL_FOUNDATION_FILE, declaredTypeNames, featuresOf, fullFoundationSource, stagingDir, transformSource, importsDispatch, importsObjectiveC, usesObjC, usesPosixMutex } from './stage.js';
|
|
35
|
+
import { toolchainEnv } from './toolchain.js';
|
|
36
|
+
/** Modules the SwiftBrowser package provides in place of Apple's: a package importing one is built against the shim. */
|
|
37
|
+
export const SHIM_MODULES = new Set(['SwiftUI', 'Charts', 'SwiftData', 'FoundationBridge', ...LINKED_FRAMEWORKS]);
|
|
38
|
+
/** The packages of a `show-dependencies --format json` tree, root excluded, each once. */
|
|
39
|
+
export function packageNodes(tree) {
|
|
40
|
+
const out = new Map();
|
|
41
|
+
const visit = (node) => {
|
|
42
|
+
for (const child of node['dependencies'] ?? []) {
|
|
43
|
+
const identity = String(child['identity']);
|
|
44
|
+
if (!out.has(identity)) {
|
|
45
|
+
out.set(identity, {
|
|
46
|
+
identity,
|
|
47
|
+
name: String(child['name']),
|
|
48
|
+
url: String(child['url']),
|
|
49
|
+
version: String(child['version']),
|
|
50
|
+
path: String(child['path']),
|
|
51
|
+
dependencies: (child['dependencies'] ?? []).map((d) => String(d['identity'])),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
visit(child);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
visit(tree);
|
|
58
|
+
return [...out.values()];
|
|
59
|
+
}
|
|
60
|
+
/** The Package.swift that only resolves the app's package dependencies. */
|
|
61
|
+
export function resolveManifest(plans) {
|
|
62
|
+
const dependencies = plans.flatMap((plan) => (plan.kind === 'dependency' ? [plan] : []));
|
|
63
|
+
const products = dependencies.flatMap((plan) => plan.package.products.map((p) => `.product(name: ${JSON.stringify(p)}, package: ${JSON.stringify(plan.identity)})`));
|
|
64
|
+
return `// swift-tools-version: 6.0
|
|
65
|
+
// Generated by @swiftbrowser/cli: resolves the app's package dependencies, so
|
|
66
|
+
// the ones that import SwiftUI can be built against the shim (vendor.ts).
|
|
67
|
+
import PackageDescription
|
|
68
|
+
|
|
69
|
+
let package = Package(
|
|
70
|
+
name: "Resolve",
|
|
71
|
+
dependencies: [
|
|
72
|
+
${dependencies.map((plan) => plan.declaration).join(',\n ')},
|
|
73
|
+
],
|
|
74
|
+
targets: [
|
|
75
|
+
.target(name: "Resolve", dependencies: [
|
|
76
|
+
${products.join(',\n ')},
|
|
77
|
+
], path: "Sources"),
|
|
78
|
+
]
|
|
79
|
+
)
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The package that takes a stand-in's place for the packages that depend on
|
|
84
|
+
* it: a library per product, each forwarding to SwiftBrowser's module of the
|
|
85
|
+
* same name, through a target of its own (`_<Product>StandIn`, empty).
|
|
86
|
+
*/
|
|
87
|
+
export function redirectManifest(name, products, reason, swiftPackagePath) {
|
|
88
|
+
const target = (product) => `_${product}StandIn`;
|
|
89
|
+
return `// swift-tools-version: 5.9
|
|
90
|
+
// Generated by @swiftbrowser/cli: SwiftBrowser stands in for ${name} (${reason}).
|
|
91
|
+
// Each product forwards to SwiftBrowser's module of the same name (vendor.ts).
|
|
92
|
+
import PackageDescription
|
|
93
|
+
|
|
94
|
+
let package = Package(
|
|
95
|
+
name: ${JSON.stringify(name)},
|
|
96
|
+
products: [
|
|
97
|
+
${products.map((p) => ` .library(name: ${JSON.stringify(p)}, targets: [${JSON.stringify(target(p))}]),`).join('\n')}
|
|
98
|
+
],
|
|
99
|
+
dependencies: [.package(name: "SwiftBrowser", path: ${JSON.stringify(swiftPackagePath)})],
|
|
100
|
+
targets: [
|
|
101
|
+
${products.map((p) => ` .target(name: ${JSON.stringify(target(p))}, dependencies: [.product(name: ${JSON.stringify(p)}, package: "SwiftBrowser")], path: ${JSON.stringify(`Sources/${target(p)}`)}),`).join('\n')}
|
|
102
|
+
]
|
|
103
|
+
)
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
/** `// swift-tools-version: 5.9` → [5, 9]; [5, 0] when the line is missing or unreadable. */
|
|
107
|
+
export function toolsVersion(manifest) {
|
|
108
|
+
const match = /^\/\/\s*swift-tools-version\s*:\s*(\d+)(?:\.(\d+))?/.exec(manifest);
|
|
109
|
+
return match ? [Number(match[1]), Number(match[2] ?? 0)] : [5, 0];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The lines appended to a copied package's manifest: the SwiftBrowser package,
|
|
113
|
+
* the shim products and `SWIFTBROWSER` for `targets`, and its dependencies on
|
|
114
|
+
* other copied packages (`copies`, identity → folder) pointed at the copies.
|
|
115
|
+
* Reading a dependency's location (`Package.Dependency.kind`) takes tools
|
|
116
|
+
* version 5.6; an older manifest keeps its URLs, and the staging manifest's
|
|
117
|
+
* declaration of the copy takes their place (with a warning from SwiftPM).
|
|
118
|
+
*/
|
|
119
|
+
export function manifestPatch(targets, swiftPackagePath, copies = new Map(), tools = [6, 0]) {
|
|
120
|
+
const lines = ['', '', '// Added by @swiftbrowser/cli to build this package in the browser (vendor.ts).'];
|
|
121
|
+
if (targets.length > 0) {
|
|
122
|
+
const entries = targets.map((t) => ` ${JSON.stringify(t.name)}: [${t.modules.map((m) => JSON.stringify(m)).join(', ')}],`);
|
|
123
|
+
lines.push('// These targets import SwiftUI (or another module SwiftBrowser provides),', '// so they build against its shim.', `package.dependencies.append(.package(name: "SwiftBrowser", path: ${JSON.stringify(swiftPackagePath)}))`, 'let _swiftBrowserProducts: [String: [String]] = [', ...entries, ']', 'for target in package.targets {', ' guard let products = _swiftBrowserProducts[target.name] else { continue }', ' target.dependencies += products.map { .product(name: $0, package: "SwiftBrowser") }', ' target.swiftSettings = (target.swiftSettings ?? []) + [.define("SWIFTBROWSER")]', '}');
|
|
124
|
+
}
|
|
125
|
+
lines.push('// The browser build is one module: a dynamic library (Backyard Birds\'s', '// packages are) would link the shim products into each library.', 'package.products = package.products.map { product in', ' guard let library = product as? Product.Library, library.type == .dynamic else { return product }', ' return .library(name: library.name, targets: library.targets)', '}');
|
|
126
|
+
const [major, minor] = tools;
|
|
127
|
+
if (copies.size > 0 && (major > 5 || (major === 5 && minor >= 6))) {
|
|
128
|
+
const entries = [...copies].map(([identity, dir]) => ` ${JSON.stringify(identity)}: ${JSON.stringify(dir)},`);
|
|
129
|
+
lines.push('// Packages it depends on that are built against the shim too, from their copies.', 'let _swiftBrowserCopies: [String: String] = [', ...entries, ']', 'package.dependencies = package.dependencies.map { dependency in', ' guard case .sourceControl(let name, let location, _) = dependency.kind else { return dependency }', ' var identity = String(location.split(separator: "/").last ?? "")', ' if identity.hasSuffix(".git") { identity.removeLast(4) }', ' guard let copy = _swiftBrowserCopies[identity.lowercased()] else { return dependency }',
|
|
130
|
+
// A path names the package after the copy's (lowercased) folder; a
|
|
131
|
+
// target that lists the product by itself ("SwiftSoup") finds it by
|
|
132
|
+
// the package's name, so the copy keeps the URL's.
|
|
133
|
+
' return .package(name: name ?? identity, path: copy)', '}');
|
|
134
|
+
}
|
|
135
|
+
return `${lines.join('\n')}\n`;
|
|
136
|
+
}
|
|
137
|
+
/** The shim products a target needs for its imports: the app's set (stage.ts), minus what only apps use. */
|
|
138
|
+
export function targetProducts(features) {
|
|
139
|
+
return [...new Set(['SwiftUI', 'Charts', 'FoundationBridge', 'os', ...(features.swiftData ? ['SwiftData'] : []), ...features.frameworks])];
|
|
140
|
+
}
|
|
141
|
+
/** The manifests of a package: Package.swift and its version-specific variants. */
|
|
142
|
+
function manifestFiles(dir) {
|
|
143
|
+
return readdirSync(dir).filter((name) => /^Package(@swift-[\d.]+)?\.swift$/.test(name));
|
|
144
|
+
}
|
|
145
|
+
/** Swift sources under `dir`, recursively. */
|
|
146
|
+
function swiftFiles(dir, out = []) {
|
|
147
|
+
if (!existsSync(dir))
|
|
148
|
+
return out;
|
|
149
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
150
|
+
const full = path.join(dir, entry.name);
|
|
151
|
+
if (entry.isDirectory()) {
|
|
152
|
+
if (!entry.name.startsWith('.'))
|
|
153
|
+
swiftFiles(full, out);
|
|
154
|
+
}
|
|
155
|
+
else if (entry.name.endsWith('.swift')) {
|
|
156
|
+
out.push(full);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Whether a package's sources import a shim module: a quick scan before
|
|
163
|
+
* asking SwiftPM. The sources are the folders SwiftPM looks in by default
|
|
164
|
+
* (`Sources`, `Source`, `src`, `srcs`) when the package has one, else the
|
|
165
|
+
* whole package; manifests and tests never count, nor a demo app beside the
|
|
166
|
+
* library.
|
|
167
|
+
*/
|
|
168
|
+
export function importsShim(dir) {
|
|
169
|
+
const roots = ['Sources', 'Source', 'src', 'srcs'].map((name) => path.join(dir, name)).filter((root) => existsSync(root));
|
|
170
|
+
const files = roots.length > 0 ? roots.flatMap((root) => swiftFiles(root)) : swiftFiles(dir);
|
|
171
|
+
for (const file of files) {
|
|
172
|
+
const relative = path.relative(dir, file);
|
|
173
|
+
if (!relative.includes(path.sep) && /^Package(@swift-[\d.]+)?\.swift$/.test(relative))
|
|
174
|
+
continue;
|
|
175
|
+
if (relative.split(path.sep).some((part) => part === 'Tests' || part === '.build'))
|
|
176
|
+
continue;
|
|
177
|
+
const text = readFileSync(file, 'utf8');
|
|
178
|
+
// Selectors and `@objc` need the bridge too (stage.ts, rewriteObjC), and
|
|
179
|
+
// so do POSIX mutexes (FoundationBridge/Locks.swift) and Dispatch.
|
|
180
|
+
if (importsOf(text).some((module) => SHIM_MODULES.has(module)) || usesObjC(text) || usesPosixMutex(text) || importsDispatch(text) || importsObjectiveC(text))
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* `Bundle.module` on the bridge's `Bundle`. SwiftPM's generated accessor
|
|
187
|
+
* declares `module` on Foundation's `Bundle` (for a target with resources),
|
|
188
|
+
* but in a staged target `Bundle` is the bridge's (the alias file), so
|
|
189
|
+
* `Bundle.module` and `bundle: .module` would find nothing. This one is the
|
|
190
|
+
* folder SwiftPM names the target's resources (`<package>_<target>.bundle`)
|
|
191
|
+
* inside the app's bundle, or the app's bundle when there is none.
|
|
192
|
+
*/
|
|
193
|
+
export function moduleBundleSource(bundleName) {
|
|
194
|
+
return `
|
|
195
|
+
extension FoundationBridge.Bundle {
|
|
196
|
+
/// The resources of this package target (\`${bundleName}.bundle\` in the app's bundle).
|
|
197
|
+
static var module: FoundationBridge.Bundle {
|
|
198
|
+
let main = FoundationBridge.Bundle.main
|
|
199
|
+
return FoundationBridge.Bundle(path: main.bundlePath + "/${bundleName}.bundle").flatMap { Foundation.FileManager.default.fileExists(atPath: $0.bundlePath) ? $0 : nil } ?? main
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
}
|
|
204
|
+
/** Where SwiftPM looks for a target's sources when the manifest gives no path. */
|
|
205
|
+
function targetDir(packageDir, target) {
|
|
206
|
+
if (target.path)
|
|
207
|
+
return path.join(packageDir, target.path);
|
|
208
|
+
for (const parent of ['Sources', 'Source', 'src', 'srcs']) {
|
|
209
|
+
const candidate = path.join(packageDir, parent, target.name);
|
|
210
|
+
if (existsSync(candidate))
|
|
211
|
+
return candidate;
|
|
212
|
+
}
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
function writeIfChanged(file, content) {
|
|
216
|
+
const bytes = typeof content === 'string' ? Buffer.from(content) : content;
|
|
217
|
+
if (existsSync(file) && readFileSync(file).equals(bytes))
|
|
218
|
+
return;
|
|
219
|
+
mkdirSync(path.dirname(file), { recursive: true });
|
|
220
|
+
writeFileSync(file, bytes);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Copies `from` into `to` (dot folders and `.build` left out), adjusting Swift
|
|
224
|
+
* sources (those under a `bridged` folder as sources of a module built against
|
|
225
|
+
* the bridge) after `patch`'s edits; removes what `from` no longer has.
|
|
226
|
+
*/
|
|
227
|
+
function copyPackage(from, to, bridged = [], patch) {
|
|
228
|
+
const kept = new Set();
|
|
229
|
+
// Optional requirements are called in other files than the protocol's.
|
|
230
|
+
const optionalRequirements = optionalRequirementNames(swiftFiles(from).map((file) => readFileSync(file, 'utf8')));
|
|
231
|
+
const walk = (dir) => {
|
|
232
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
233
|
+
if (entry.name.startsWith('.'))
|
|
234
|
+
continue;
|
|
235
|
+
const full = path.join(dir, entry.name);
|
|
236
|
+
const target = path.join(to, path.relative(from, full));
|
|
237
|
+
if (entry.isDirectory()) {
|
|
238
|
+
walk(full);
|
|
239
|
+
}
|
|
240
|
+
else if (entry.isFile()) {
|
|
241
|
+
const isManifest = dir === from && /^Package(@swift-[\d.]+)?\.swift$/.test(entry.name);
|
|
242
|
+
const inBridged = bridged.some((dir) => full.startsWith(dir + path.sep));
|
|
243
|
+
const content = entry.name.endsWith('.swift') && !isManifest
|
|
244
|
+
? transformSource(applyPatch(patch, path.relative(from, full), readFileSync(full, 'utf8')), { bridged: inBridged, optionalRequirements }).text
|
|
245
|
+
: readFileSync(full);
|
|
246
|
+
writeIfChanged(target, content);
|
|
247
|
+
kept.add(target);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
walk(from);
|
|
252
|
+
return kept;
|
|
253
|
+
}
|
|
254
|
+
function removeStale(dir, keep) {
|
|
255
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
256
|
+
if (entry.name === '.build')
|
|
257
|
+
continue;
|
|
258
|
+
const full = path.join(dir, entry.name);
|
|
259
|
+
if (entry.isDirectory()) {
|
|
260
|
+
removeStale(full, keep);
|
|
261
|
+
if (readdirSync(full).length === 0)
|
|
262
|
+
rmSync(full, { recursive: true });
|
|
263
|
+
}
|
|
264
|
+
else if (!keep.has(full)) {
|
|
265
|
+
rmSync(full, { force: true });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** Where the copies live, and the package that resolves the originals. */
|
|
270
|
+
export function vendorDir(app) {
|
|
271
|
+
return path.join(stagingDir(app), 'Packages');
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Resolves the app's package dependencies and copies the ones that import a
|
|
275
|
+
* shim module, and the ones that depend on those, into the staging package.
|
|
276
|
+
* Packages that are plain Swift all the way down are left to SwiftPM, as
|
|
277
|
+
* before. Returns the copies by identity; empty, without running SwiftPM,
|
|
278
|
+
* when the app has no packages to fetch.
|
|
279
|
+
*/
|
|
280
|
+
export async function vendorPackages(app, toolchain, swiftPackagePath) {
|
|
281
|
+
const vendored = new Map();
|
|
282
|
+
const plans = planPackages(app.packages);
|
|
283
|
+
if (!plans.some((plan) => plan.kind === 'dependency'))
|
|
284
|
+
return vendored;
|
|
285
|
+
const root = vendorDir(app);
|
|
286
|
+
const resolveDir = path.join(root, '.resolve');
|
|
287
|
+
writeIfChanged(path.join(resolveDir, 'Package.swift'), resolveManifest(plans));
|
|
288
|
+
writeIfChanged(path.join(resolveDir, 'Sources', 'Resolve.swift'), '// Nothing to build: the package only resolves dependencies.\n');
|
|
289
|
+
const treeFile = path.join(resolveDir, 'dependencies.json');
|
|
290
|
+
const env = toolchainEnv(toolchain);
|
|
291
|
+
const shown = await run(toolchain.swift, ['package', 'show-dependencies', '--format', 'json', '--output-path', treeFile], { cwd: resolveDir, env });
|
|
292
|
+
if (shown.status !== 0 || !existsSync(treeFile)) {
|
|
293
|
+
throw new CliError(`could not resolve the app's Swift packages:\n${shown.output.trim()}`);
|
|
294
|
+
}
|
|
295
|
+
const nodes = packageNodes(JSON.parse(readFileSync(treeFile, 'utf8')));
|
|
296
|
+
// The packages that import a shim module, and every package that depends on
|
|
297
|
+
// one of them (so that it depends on the copy).
|
|
298
|
+
// A package SwiftBrowser stands in for counts as copied: its "copy" is a redirect.
|
|
299
|
+
const copied = new Set(nodes.filter((node) => PACKAGE_STAND_INS[node.identity] || PACKAGE_PATCHES[node.identity] || (existsSync(node.path) && importsShim(node.path))).map((node) => node.identity));
|
|
300
|
+
for (let grew = true; grew;) {
|
|
301
|
+
grew = false;
|
|
302
|
+
for (const node of nodes) {
|
|
303
|
+
if (!copied.has(node.identity) && node.dependencies.some((identity) => copied.has(identity))) {
|
|
304
|
+
copied.add(node.identity);
|
|
305
|
+
grew = true;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const copyDir = (identity) => path.join(root, identity);
|
|
310
|
+
const keep = new Set([path.join(root, '.resolve')]);
|
|
311
|
+
for (const node of nodes) {
|
|
312
|
+
if (!copied.has(node.identity))
|
|
313
|
+
continue;
|
|
314
|
+
const dir = copyDir(node.identity);
|
|
315
|
+
const standIn = PACKAGE_STAND_INS[node.identity];
|
|
316
|
+
if (standIn) {
|
|
317
|
+
const files = new Set([path.join(dir, 'Package.swift')]);
|
|
318
|
+
writeIfChanged(path.join(dir, 'Package.swift'), redirectManifest(node.name, standIn.products, standIn.reason, swiftPackagePath));
|
|
319
|
+
for (const product of standIn.products) {
|
|
320
|
+
const file = path.join(dir, 'Sources', `_${product}StandIn`, `_${product}StandIn.swift`);
|
|
321
|
+
writeIfChanged(file, `// Empty: the product forwards to SwiftBrowser's ${product} module.\n`);
|
|
322
|
+
files.add(file);
|
|
323
|
+
}
|
|
324
|
+
removeStale(dir, files);
|
|
325
|
+
keep.add(dir);
|
|
326
|
+
vendored.set(node.identity, { identity: node.identity, name: node.name, source: node.path, local: false, version: node.version, dir, targets: [], standIn: standIn.reason, modules: [...standIn.products] });
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
const targets = [];
|
|
330
|
+
const moduleNames = [];
|
|
331
|
+
const cache = path.join(dir, TARGETS_CACHE);
|
|
332
|
+
// The targets built against the shim, found in the original sources
|
|
333
|
+
// first: their copies are adjusted as bridged modules.
|
|
334
|
+
const shimTargets = [];
|
|
335
|
+
mkdirSync(dir, { recursive: true });
|
|
336
|
+
for (const target of await dumpTargets(node.path, cache, toolchain)) {
|
|
337
|
+
if (target.type !== 'regular' && target.type !== 'executable')
|
|
338
|
+
continue;
|
|
339
|
+
moduleNames.push(target.name);
|
|
340
|
+
const sourceDir = targetDir(node.path, target);
|
|
341
|
+
if (!sourceDir)
|
|
342
|
+
continue;
|
|
343
|
+
const texts = swiftFiles(sourceDir).map((file) => readFileSync(file, 'utf8'));
|
|
344
|
+
const modules = new Set(texts.flatMap((text) => importsOf(text)).filter((module) => SHIM_MODULES.has(module)));
|
|
345
|
+
const uses = [
|
|
346
|
+
...(texts.some(usesObjC) ? ['Objective-C selectors'] : []),
|
|
347
|
+
...(texts.some(usesPosixMutex) ? ['POSIX mutexes'] : []),
|
|
348
|
+
...(texts.some(importsDispatch) ? ['Dispatch'] : []),
|
|
349
|
+
...(texts.some(importsObjectiveC) ? ['Objective-C associated objects'] : []),
|
|
350
|
+
];
|
|
351
|
+
if (modules.size === 0 && uses.length === 0)
|
|
352
|
+
continue;
|
|
353
|
+
targets.push({ name: target.name, imports: [...modules].sort(), modules: targetProducts(featuresOf(texts)), ...(uses.length > 0 ? { uses } : {}) });
|
|
354
|
+
shimTargets.push({ name: target.name, sourceDir, texts });
|
|
355
|
+
}
|
|
356
|
+
// SwiftBrowser's edits, checked against this version before anything is copied.
|
|
357
|
+
const patch = PACKAGE_PATCHES[node.identity];
|
|
358
|
+
if (patch)
|
|
359
|
+
checkPatch(node.identity, node.version, node.path, patch);
|
|
360
|
+
const files = copyPackage(node.path, dir, shimTargets.map((target) => target.sourceDir), patch);
|
|
361
|
+
files.add(cache);
|
|
362
|
+
const catalogs = [];
|
|
363
|
+
for (const { name, sourceDir, texts } of shimTargets) {
|
|
364
|
+
const aliases = path.join(dir, path.relative(node.path, sourceDir), FULL_FOUNDATION_FILE);
|
|
365
|
+
writeIfChanged(aliases, fullFoundationSource(featuresOf(texts), declaredTypeNames(texts)) + moduleBundleSource(`${node.identity}_${name}`));
|
|
366
|
+
files.add(aliases);
|
|
367
|
+
// Packages get the resource members only (Backyard Birds' declare their own `Color` members).
|
|
368
|
+
const targetCatalogList = targetCatalogs(sourceDir);
|
|
369
|
+
catalogs.push(...targetCatalogList);
|
|
370
|
+
const symbols = assetSymbolsSource(targetCatalogList, { declared: declaredStaticMembers(texts) });
|
|
371
|
+
if (symbols) {
|
|
372
|
+
const file = path.join(dir, path.relative(node.path, sourceDir), ASSET_SYMBOLS_FILE);
|
|
373
|
+
writeIfChanged(file, symbols);
|
|
374
|
+
files.add(file);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const copies = new Map(node.dependencies.filter((identity) => copied.has(identity)).map((identity) => [identity, copyDir(identity)]));
|
|
378
|
+
for (const manifest of manifestFiles(node.path)) {
|
|
379
|
+
const text = readFileSync(path.join(node.path, manifest), 'utf8');
|
|
380
|
+
writeIfChanged(path.join(dir, manifest), text + manifestPatch(targets, swiftPackagePath, copies, toolsVersion(text)));
|
|
381
|
+
}
|
|
382
|
+
removeStale(dir, files);
|
|
383
|
+
keep.add(dir);
|
|
384
|
+
vendored.set(node.identity, {
|
|
385
|
+
identity: node.identity,
|
|
386
|
+
name: node.name,
|
|
387
|
+
source: node.path,
|
|
388
|
+
local: !node.path.startsWith(`${resolveDir}${path.sep}`),
|
|
389
|
+
version: node.version,
|
|
390
|
+
dir,
|
|
391
|
+
targets,
|
|
392
|
+
modules: moduleNames,
|
|
393
|
+
...(patch ? { patched: patch.edits.length } : {}),
|
|
394
|
+
...(catalogs.length > 0 ? { catalogs } : {}),
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
// Copies of packages the app no longer uses.
|
|
398
|
+
for (const entry of readdirSync(root)) {
|
|
399
|
+
const full = path.join(root, entry);
|
|
400
|
+
if (!keep.has(full))
|
|
401
|
+
rmSync(full, { recursive: true, force: true });
|
|
402
|
+
}
|
|
403
|
+
return vendored;
|
|
404
|
+
}
|
|
405
|
+
/** Next to a copy: its targets, keyed by the manifests they were read from. */
|
|
406
|
+
const TARGETS_CACHE = '.swiftbrowser-targets.json';
|
|
407
|
+
/**
|
|
408
|
+
* The targets of a package's manifest. Evaluating a manifest takes a moment,
|
|
409
|
+
* so the result is kept in `cache` (in the copy, never in the user's folder)
|
|
410
|
+
* with a hash of the manifests it came from.
|
|
411
|
+
*/
|
|
412
|
+
async function dumpTargets(packageDir, cache, toolchain) {
|
|
413
|
+
const hash = createHash('sha256');
|
|
414
|
+
for (const manifest of manifestFiles(packageDir).sort())
|
|
415
|
+
hash.update(manifest).update(readFileSync(path.join(packageDir, manifest)));
|
|
416
|
+
hash.update(toolchain.version);
|
|
417
|
+
const key = hash.digest('hex');
|
|
418
|
+
if (existsSync(cache)) {
|
|
419
|
+
try {
|
|
420
|
+
const cached = JSON.parse(readFileSync(cache, 'utf8'));
|
|
421
|
+
if (cached.key === key)
|
|
422
|
+
return cached.targets;
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
// Unreadable: read the manifest again.
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// The scratch path keeps SwiftPM's caches out of the package's folder (it may be the user's).
|
|
429
|
+
const scratch = path.join(path.dirname(cache), '.build');
|
|
430
|
+
const dumped = await run(toolchain.swift, ['package', 'dump-package', '--package-path', packageDir, '--scratch-path', scratch], { cwd: path.dirname(cache), env: toolchainEnv(toolchain) });
|
|
431
|
+
if (dumped.status !== 0)
|
|
432
|
+
throw new CliError(`could not read the manifest of ${packageDir}:\n${dumped.output.trim()}`);
|
|
433
|
+
// stderr is interleaved; the JSON is the object from the first `{` at the start of a line.
|
|
434
|
+
const start = dumped.output.search(/^\{/m);
|
|
435
|
+
const manifest = JSON.parse(dumped.output.slice(start));
|
|
436
|
+
const targets = manifest.targets.map((t) => ({ name: t.name, type: t.type, path: t.path ?? null }));
|
|
437
|
+
writeIfChanged(cache, JSON.stringify({ key, targets }));
|
|
438
|
+
return targets;
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../src/vendor.ts"],"names":[],"mappings":"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"}
|