@anvil-works/anvil-cli 0.7.6 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +347 -346
- package/dist/index.js +311 -310
- package/dist/services/deps.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -14414,323 +14414,65 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
|
|
|
14414
14414
|
return true;
|
|
14415
14415
|
}
|
|
14416
14416
|
}
|
|
14417
|
-
const
|
|
14418
|
-
const
|
|
14419
|
-
const
|
|
14420
|
-
function
|
|
14421
|
-
|
|
14422
|
-
try {
|
|
14423
|
-
const parsed = JSON.parse(errorBody);
|
|
14424
|
-
if ("string" == typeof parsed.error && parsed.error.trim()) return `${prefix}: ${parsed.error} (${status})`;
|
|
14425
|
-
} catch {}
|
|
14426
|
-
return `${prefix}: ${status} ${errorBody}`;
|
|
14427
|
-
}
|
|
14428
|
-
async function fetchAllDependencies(appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14429
|
-
const { commit, includeDocs = true, knownDependencies = [] } = options;
|
|
14430
|
-
const token = await auth_getValidAuthToken(anvilUrl, options.username);
|
|
14431
|
-
const body = {
|
|
14432
|
-
include_docs: includeDocs,
|
|
14433
|
-
known_dependencies: knownDependencies
|
|
14434
|
-
};
|
|
14435
|
-
if (commit) body.commit = commit;
|
|
14436
|
-
const resp = await fetch(`${anvilUrl}/ide/api/_/apps/${appId}/resolved-dependencies`, {
|
|
14437
|
-
method: "POST",
|
|
14438
|
-
headers: {
|
|
14439
|
-
Authorization: `Bearer ${token}`,
|
|
14440
|
-
"Content-Type": "application/json"
|
|
14441
|
-
},
|
|
14442
|
-
body: JSON.stringify(body)
|
|
14443
|
-
});
|
|
14444
|
-
if (!resp.ok) {
|
|
14445
|
-
const errorBody = await resp.text();
|
|
14446
|
-
throw new Error(formatFetchError("Failed to fetch dependencies", resp.status, errorBody));
|
|
14447
|
-
}
|
|
14448
|
-
return await resp.json();
|
|
14417
|
+
const external_timers_promises_namespaceObject = require("timers/promises");
|
|
14418
|
+
const WANT_NOT_VALID_RE = /\bwant\s+[0-9a-f]{7,40}\s+not valid\b/i;
|
|
14419
|
+
const FETCH_RETRY_DELAY_MS = 200;
|
|
14420
|
+
function isWantNotValidError(error) {
|
|
14421
|
+
return WANT_NOT_VALID_RE.test(error.message || "");
|
|
14449
14422
|
}
|
|
14450
|
-
|
|
14451
|
-
|
|
14452
|
-
|
|
14453
|
-
|
|
14454
|
-
|
|
14455
|
-
|
|
14456
|
-
|
|
14457
|
-
|
|
14458
|
-
|
|
14459
|
-
|
|
14460
|
-
|
|
14461
|
-
|
|
14462
|
-
|
|
14463
|
-
addedGitignoreEntry: false
|
|
14464
|
-
};
|
|
14423
|
+
class git_GitService extends Emitter {
|
|
14424
|
+
git;
|
|
14425
|
+
repoPath;
|
|
14426
|
+
static INDEX_LOCK_RETRY_DELAYS_MS = [
|
|
14427
|
+
25,
|
|
14428
|
+
50,
|
|
14429
|
+
100,
|
|
14430
|
+
200
|
|
14431
|
+
];
|
|
14432
|
+
constructor(repoPath){
|
|
14433
|
+
super();
|
|
14434
|
+
this.repoPath = external_path_default().resolve(repoPath);
|
|
14435
|
+
this.git = esm_default(this.repoPath);
|
|
14465
14436
|
}
|
|
14466
|
-
|
|
14467
|
-
|
|
14468
|
-
includeDocs
|
|
14469
|
-
});
|
|
14470
|
-
return {
|
|
14471
|
-
response,
|
|
14472
|
-
addedGitignoreEntry
|
|
14473
|
-
};
|
|
14474
|
-
}
|
|
14475
|
-
function depsDir(projectRoot) {
|
|
14476
|
-
return external_path_default().join(projectRoot, ANVIL_DEPS_DIR);
|
|
14477
|
-
}
|
|
14478
|
-
function depsManifestPath(projectRoot) {
|
|
14479
|
-
return external_path_default().join(depsDir(projectRoot), ANVIL_DEPS_MANIFEST);
|
|
14480
|
-
}
|
|
14481
|
-
function isResolvedDependencyManifestEntry(value) {
|
|
14482
|
-
if (!value || "object" != typeof value) return false;
|
|
14483
|
-
const entry = value;
|
|
14484
|
-
return "string" == typeof entry.app_id && entry.app_id.length > 0 && "string" == typeof entry.commit_id && entry.commit_id.length > 0 && (void 0 === entry.branch || "string" == typeof entry.branch);
|
|
14485
|
-
}
|
|
14486
|
-
function isCachedDependencyManifestEntry(value) {
|
|
14487
|
-
if (!isResolvedDependencyManifestEntry(value)) return false;
|
|
14488
|
-
const entry = value;
|
|
14489
|
-
return "string" == typeof entry.package_name && entry.package_name.length > 0;
|
|
14490
|
-
}
|
|
14491
|
-
function isDepsCacheManifest(value) {
|
|
14492
|
-
if (!value || "object" != typeof value) return false;
|
|
14493
|
-
const manifest = value;
|
|
14494
|
-
return manifest.version === DEPS_MANIFEST_VERSION && "boolean" == typeof manifest.includeDocs && Array.isArray(manifest.resolved_dependencies) && manifest.resolved_dependencies.every(isResolvedDependencyManifestEntry) && Array.isArray(manifest.cached_dependencies) && manifest.cached_dependencies.every(isCachedDependencyManifestEntry);
|
|
14495
|
-
}
|
|
14496
|
-
async function readDepsCacheManifest(projectRoot) {
|
|
14497
|
-
try {
|
|
14498
|
-
const raw = await promises_default().readFile(depsManifestPath(projectRoot), "utf-8");
|
|
14499
|
-
const parsed = JSON.parse(raw);
|
|
14500
|
-
return isDepsCacheManifest(parsed) ? parsed : void 0;
|
|
14501
|
-
} catch {
|
|
14502
|
-
return;
|
|
14437
|
+
getGit() {
|
|
14438
|
+
return this.git;
|
|
14503
14439
|
}
|
|
14504
|
-
|
|
14505
|
-
|
|
14506
|
-
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14507
|
-
if (!manifest || manifest.includeDocs !== includeDocs) return [];
|
|
14508
|
-
return manifest.resolved_dependencies.map(({ app_id, commit_id })=>({
|
|
14509
|
-
app_id,
|
|
14510
|
-
commit_id
|
|
14511
|
-
}));
|
|
14512
|
-
}
|
|
14513
|
-
function getDependencyWatchSubscriptionsFromManifest(manifest) {
|
|
14514
|
-
if (!manifest) return [];
|
|
14515
|
-
const cachedByAppId = new Map(manifest.cached_dependencies.map((dep)=>[
|
|
14516
|
-
dep.app_id,
|
|
14517
|
-
dep
|
|
14518
|
-
]));
|
|
14519
|
-
return manifest.resolved_dependencies.flatMap((dep)=>{
|
|
14520
|
-
if (!dep.branch) return [];
|
|
14521
|
-
return [
|
|
14522
|
-
{
|
|
14523
|
-
appId: dep.app_id,
|
|
14524
|
-
branch: dep.branch,
|
|
14525
|
-
packageName: cachedByAppId.get(dep.app_id)?.package_name
|
|
14526
|
-
}
|
|
14527
|
-
];
|
|
14528
|
-
});
|
|
14529
|
-
}
|
|
14530
|
-
function normalizeAnvilYamlDependenciesFromContent(content) {
|
|
14531
|
-
const parsed = external_js_yaml_default().load(content);
|
|
14532
|
-
if (!parsed || "object" != typeof parsed || !Array.isArray(parsed.dependencies)) return [];
|
|
14533
|
-
return normalizeAnvilYamlDependenciesValue(parsed.dependencies);
|
|
14534
|
-
}
|
|
14535
|
-
function normalizeAnvilYamlDependenciesValue(value) {
|
|
14536
|
-
if (!Array.isArray(value)) return [];
|
|
14537
|
-
return normalizeForComparison(value);
|
|
14538
|
-
}
|
|
14539
|
-
async function readAnvilYamlDependencies(projectRoot) {
|
|
14540
|
-
try {
|
|
14541
|
-
const content = await promises_default().readFile(external_path_default().join(projectRoot, "anvil.yaml"), "utf-8");
|
|
14542
|
-
return normalizeAnvilYamlDependenciesFromContent(content);
|
|
14543
|
-
} catch {
|
|
14544
|
-
return [];
|
|
14440
|
+
getRepoPath() {
|
|
14441
|
+
return this.repoPath;
|
|
14545
14442
|
}
|
|
14546
|
-
|
|
14547
|
-
|
|
14548
|
-
|
|
14549
|
-
|
|
14550
|
-
|
|
14551
|
-
|
|
14552
|
-
|
|
14553
|
-
|
|
14554
|
-
|
|
14555
|
-
]));
|
|
14556
|
-
return value;
|
|
14557
|
-
}
|
|
14558
|
-
function cachedManifestEntry(dep, packageName) {
|
|
14559
|
-
return {
|
|
14560
|
-
app_id: dep.app_id,
|
|
14561
|
-
commit_id: dep.commit_id,
|
|
14562
|
-
...dep.branch ? {
|
|
14563
|
-
branch: dep.branch
|
|
14564
|
-
} : {},
|
|
14565
|
-
package_name: packageName
|
|
14566
|
-
};
|
|
14567
|
-
}
|
|
14568
|
-
function safeDependencyPath(filePath, kind) {
|
|
14569
|
-
const normalizedPath = external_path_default().normalize(filePath);
|
|
14570
|
-
if (external_path_default().isAbsolute(normalizedPath) || normalizedPath.startsWith("..")) throw new Error(`Invalid dependency ${kind} path: ${filePath}`);
|
|
14571
|
-
return normalizedPath;
|
|
14572
|
-
}
|
|
14573
|
-
async function writeDepToCache(projectRoot, dep) {
|
|
14574
|
-
const depDir = external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name);
|
|
14575
|
-
await promises_default().rm(depDir, {
|
|
14576
|
-
recursive: true,
|
|
14577
|
-
force: true
|
|
14578
|
-
});
|
|
14579
|
-
await promises_default().mkdir(external_path_default().join(depDir, "client_code"), {
|
|
14580
|
-
recursive: true
|
|
14581
|
-
});
|
|
14582
|
-
await promises_default().mkdir(external_path_default().join(depDir, "server_code"), {
|
|
14583
|
-
recursive: true
|
|
14584
|
-
});
|
|
14585
|
-
await promises_default().writeFile(external_path_default().join(depDir, "anvil.yaml"), external_js_yaml_default().dump({
|
|
14586
|
-
package_name: dep.package_name
|
|
14587
|
-
}));
|
|
14588
|
-
for (const mod of dep.modules ?? [])if (mod.is_package) {
|
|
14589
|
-
const modDir = external_path_default().join(depDir, "client_code", mod.name);
|
|
14590
|
-
await promises_default().mkdir(modDir, {
|
|
14591
|
-
recursive: true
|
|
14592
|
-
});
|
|
14593
|
-
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
14594
|
-
} else await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${mod.name}.py`), mod.code);
|
|
14595
|
-
for (const form of dep.forms ?? []){
|
|
14596
|
-
const { code, class_name, is_package, ...formTemplate } = form;
|
|
14597
|
-
if (is_package) {
|
|
14598
|
-
const formDir = external_path_default().join(depDir, "client_code", class_name);
|
|
14599
|
-
await promises_default().mkdir(formDir, {
|
|
14600
|
-
recursive: true
|
|
14601
|
-
});
|
|
14602
|
-
await promises_default().writeFile(external_path_default().join(formDir, "__init__.py"), code);
|
|
14603
|
-
await promises_default().writeFile(external_path_default().join(formDir, "form_template.yaml"), external_js_yaml_default().dump(formTemplate));
|
|
14604
|
-
} else {
|
|
14605
|
-
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.py`), code);
|
|
14606
|
-
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.yaml`), external_js_yaml_default().dump(formTemplate));
|
|
14443
|
+
async getGitDir() {
|
|
14444
|
+
try {
|
|
14445
|
+
const gitDir = (await this.git.revparse([
|
|
14446
|
+
"--git-dir"
|
|
14447
|
+
])).trim();
|
|
14448
|
+
if (!external_path_default().isAbsolute(gitDir)) return external_path_default().resolve(this.repoPath, gitDir);
|
|
14449
|
+
return gitDir;
|
|
14450
|
+
} catch (e) {
|
|
14451
|
+
throw errors_createGitError.commandFailed("rev-parse --git-dir", e.message);
|
|
14607
14452
|
}
|
|
14608
14453
|
}
|
|
14609
|
-
|
|
14610
|
-
|
|
14611
|
-
|
|
14612
|
-
|
|
14613
|
-
|
|
14614
|
-
|
|
14615
|
-
|
|
14616
|
-
|
|
14617
|
-
|
|
14618
|
-
|
|
14619
|
-
|
|
14620
|
-
}
|
|
14621
|
-
await promises_default().writeFile(targetPath, Buffer.from(asset.content, "base64"));
|
|
14454
|
+
async getCurrentBranch() {
|
|
14455
|
+
try {
|
|
14456
|
+
const branchRef = await this.git.revparse([
|
|
14457
|
+
"--abbrev-ref",
|
|
14458
|
+
"HEAD"
|
|
14459
|
+
]);
|
|
14460
|
+
if ("HEAD" === branchRef) throw createSyncError.detachedHead();
|
|
14461
|
+
return branchRef;
|
|
14462
|
+
} catch (e) {
|
|
14463
|
+
if ("detached_head" === e.type) throw e;
|
|
14464
|
+
throw createSyncError.detachedHead();
|
|
14465
|
+
}
|
|
14622
14466
|
}
|
|
14623
|
-
|
|
14624
|
-
|
|
14625
|
-
|
|
14626
|
-
|
|
14627
|
-
|
|
14628
|
-
|
|
14629
|
-
|
|
14630
|
-
|
|
14631
|
-
|
|
14632
|
-
const includeDocs = options.includeDocs ?? true;
|
|
14633
|
-
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14634
|
-
const canReuseExistingCache = manifest?.includeDocs === includeDocs;
|
|
14635
|
-
if (!canReuseExistingCache) await clearDepsCache(projectRoot);
|
|
14636
|
-
const previousCached = canReuseExistingCache ? manifest.cached_dependencies : [];
|
|
14637
|
-
const resolvedAppIds = new Set(response.resolved_dependencies.map((dep)=>dep.app_id));
|
|
14638
|
-
for (const dep of previousCached)if (!resolvedAppIds.has(dep.app_id)) await promises_default().rm(external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name), {
|
|
14639
|
-
recursive: true,
|
|
14640
|
-
force: true
|
|
14641
|
-
});
|
|
14642
|
-
for (const dep of response.dependencies)await writeDepToCache(projectRoot, dep);
|
|
14643
|
-
const returnedByAppId = new Map(response.dependencies.map((dep)=>[
|
|
14644
|
-
dep.app_id,
|
|
14645
|
-
dep
|
|
14646
|
-
]));
|
|
14647
|
-
const previousByAppId = new Map(previousCached.map((dep)=>[
|
|
14648
|
-
dep.app_id,
|
|
14649
|
-
dep
|
|
14650
|
-
]));
|
|
14651
|
-
const cachedDependencies = response.resolved_dependencies.map((dep)=>{
|
|
14652
|
-
const returned = returnedByAppId.get(dep.app_id);
|
|
14653
|
-
if (returned) return cachedManifestEntry(returned, returned.package_name);
|
|
14654
|
-
const previous = previousByAppId.get(dep.app_id);
|
|
14655
|
-
if (!previous) return;
|
|
14656
|
-
return cachedManifestEntry(dep, previous.package_name);
|
|
14657
|
-
}).filter((dep)=>void 0 !== dep);
|
|
14658
|
-
const newManifest = {
|
|
14659
|
-
version: DEPS_MANIFEST_VERSION,
|
|
14660
|
-
includeDocs,
|
|
14661
|
-
resolved_dependencies: response.resolved_dependencies,
|
|
14662
|
-
cached_dependencies: cachedDependencies
|
|
14663
|
-
};
|
|
14664
|
-
await promises_default().mkdir(depsDir(projectRoot), {
|
|
14665
|
-
recursive: true
|
|
14666
|
-
});
|
|
14667
|
-
await promises_default().writeFile(depsManifestPath(projectRoot), `${JSON.stringify(newManifest, null, 2)}\n`);
|
|
14668
|
-
}
|
|
14669
|
-
async function clearDepsCache(projectRoot) {
|
|
14670
|
-
await promises_default().rm(depsDir(projectRoot), {
|
|
14671
|
-
recursive: true,
|
|
14672
|
-
force: true
|
|
14673
|
-
});
|
|
14674
|
-
}
|
|
14675
|
-
const external_timers_promises_namespaceObject = require("timers/promises");
|
|
14676
|
-
const WANT_NOT_VALID_RE = /\bwant\s+[0-9a-f]{7,40}\s+not valid\b/i;
|
|
14677
|
-
const FETCH_RETRY_DELAY_MS = 200;
|
|
14678
|
-
function isWantNotValidError(error) {
|
|
14679
|
-
return WANT_NOT_VALID_RE.test(error.message || "");
|
|
14680
|
-
}
|
|
14681
|
-
class git_GitService extends Emitter {
|
|
14682
|
-
git;
|
|
14683
|
-
repoPath;
|
|
14684
|
-
static INDEX_LOCK_RETRY_DELAYS_MS = [
|
|
14685
|
-
25,
|
|
14686
|
-
50,
|
|
14687
|
-
100,
|
|
14688
|
-
200
|
|
14689
|
-
];
|
|
14690
|
-
constructor(repoPath){
|
|
14691
|
-
super();
|
|
14692
|
-
this.repoPath = external_path_default().resolve(repoPath);
|
|
14693
|
-
this.git = esm_default(this.repoPath);
|
|
14694
|
-
}
|
|
14695
|
-
getGit() {
|
|
14696
|
-
return this.git;
|
|
14697
|
-
}
|
|
14698
|
-
getRepoPath() {
|
|
14699
|
-
return this.repoPath;
|
|
14700
|
-
}
|
|
14701
|
-
async getGitDir() {
|
|
14702
|
-
try {
|
|
14703
|
-
const gitDir = (await this.git.revparse([
|
|
14704
|
-
"--git-dir"
|
|
14705
|
-
])).trim();
|
|
14706
|
-
if (!external_path_default().isAbsolute(gitDir)) return external_path_default().resolve(this.repoPath, gitDir);
|
|
14707
|
-
return gitDir;
|
|
14708
|
-
} catch (e) {
|
|
14709
|
-
throw errors_createGitError.commandFailed("rev-parse --git-dir", e.message);
|
|
14710
|
-
}
|
|
14711
|
-
}
|
|
14712
|
-
async getCurrentBranch() {
|
|
14713
|
-
try {
|
|
14714
|
-
const branchRef = await this.git.revparse([
|
|
14715
|
-
"--abbrev-ref",
|
|
14716
|
-
"HEAD"
|
|
14717
|
-
]);
|
|
14718
|
-
if ("HEAD" === branchRef) throw createSyncError.detachedHead();
|
|
14719
|
-
return branchRef;
|
|
14720
|
-
} catch (e) {
|
|
14721
|
-
if ("detached_head" === e.type) throw e;
|
|
14722
|
-
throw createSyncError.detachedHead();
|
|
14723
|
-
}
|
|
14724
|
-
}
|
|
14725
|
-
async getCommitId() {
|
|
14726
|
-
try {
|
|
14727
|
-
const commitId = (await this.git.revparse([
|
|
14728
|
-
"HEAD"
|
|
14729
|
-
])).trim();
|
|
14730
|
-
return commitId;
|
|
14731
|
-
} catch (e) {
|
|
14732
|
-
throw errors_createGitError.commandFailed("revparse", e.message);
|
|
14733
|
-
}
|
|
14467
|
+
async getCommitId() {
|
|
14468
|
+
try {
|
|
14469
|
+
const commitId = (await this.git.revparse([
|
|
14470
|
+
"HEAD"
|
|
14471
|
+
])).trim();
|
|
14472
|
+
return commitId;
|
|
14473
|
+
} catch (e) {
|
|
14474
|
+
throw errors_createGitError.commandFailed("revparse", e.message);
|
|
14475
|
+
}
|
|
14734
14476
|
}
|
|
14735
14477
|
async getCommitInfo() {
|
|
14736
14478
|
try {
|
|
@@ -15122,6 +14864,265 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
|
|
|
15122
14864
|
throw errors_createGitError.commandFailed("status", e.message);
|
|
15123
14865
|
}
|
|
15124
14866
|
}
|
|
14867
|
+
const ANVIL_DEPS_DIR = ".anvil/deps";
|
|
14868
|
+
const ANVIL_DEPS_MANIFEST = "manifest.json";
|
|
14869
|
+
const DEPS_MANIFEST_VERSION = 1;
|
|
14870
|
+
function formatFetchError(prefix, status, errorBody) {
|
|
14871
|
+
if (!errorBody) return `${prefix}: ${status}`;
|
|
14872
|
+
try {
|
|
14873
|
+
const parsed = JSON.parse(errorBody);
|
|
14874
|
+
if ("string" == typeof parsed.error && parsed.error.trim()) return `${prefix}: ${parsed.error} (${status})`;
|
|
14875
|
+
} catch {}
|
|
14876
|
+
return `${prefix}: ${status} ${errorBody}`;
|
|
14877
|
+
}
|
|
14878
|
+
async function fetchAllDependencies(appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14879
|
+
const { commit, includeDocs = true, knownDependencies = [] } = options;
|
|
14880
|
+
const token = await auth_getValidAuthToken(anvilUrl, options.username);
|
|
14881
|
+
const body = {
|
|
14882
|
+
include_docs: includeDocs,
|
|
14883
|
+
known_dependencies: knownDependencies
|
|
14884
|
+
};
|
|
14885
|
+
if (commit) body.commit = commit;
|
|
14886
|
+
const resp = await fetch(`${anvilUrl}/ide/api/_/apps/${appId}/resolved-dependencies`, {
|
|
14887
|
+
method: "POST",
|
|
14888
|
+
headers: {
|
|
14889
|
+
Authorization: `Bearer ${token}`,
|
|
14890
|
+
"Content-Type": "application/json"
|
|
14891
|
+
},
|
|
14892
|
+
body: JSON.stringify(body)
|
|
14893
|
+
});
|
|
14894
|
+
if (!resp.ok) {
|
|
14895
|
+
const errorBody = await resp.text();
|
|
14896
|
+
throw new Error(formatFetchError("Failed to fetch dependencies", resp.status, errorBody));
|
|
14897
|
+
}
|
|
14898
|
+
return await resp.json();
|
|
14899
|
+
}
|
|
14900
|
+
async function refreshDependencyCache(projectRoot, appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14901
|
+
const includeDocs = options.includeDocs ?? true;
|
|
14902
|
+
const commit = options.commit ?? await new git_GitService(projectRoot).getCommitId();
|
|
14903
|
+
const knownDependencies = await getKnownDependenciesForCache(projectRoot, includeDocs);
|
|
14904
|
+
const response = await fetchAllDependencies(appId, anvilUrl, {
|
|
14905
|
+
username: options.username,
|
|
14906
|
+
commit,
|
|
14907
|
+
includeDocs,
|
|
14908
|
+
knownDependencies
|
|
14909
|
+
});
|
|
14910
|
+
if (!response.resolved_dependencies.length) {
|
|
14911
|
+
await clearDepsCache(projectRoot);
|
|
14912
|
+
return {
|
|
14913
|
+
response,
|
|
14914
|
+
addedGitignoreEntry: false
|
|
14915
|
+
};
|
|
14916
|
+
}
|
|
14917
|
+
const addedGitignoreEntry = await ensureProjectGitignoreIgnoresAnvilDir(projectRoot);
|
|
14918
|
+
await writeAllDepsToCache(projectRoot, response, {
|
|
14919
|
+
includeDocs
|
|
14920
|
+
});
|
|
14921
|
+
return {
|
|
14922
|
+
response,
|
|
14923
|
+
addedGitignoreEntry
|
|
14924
|
+
};
|
|
14925
|
+
}
|
|
14926
|
+
function depsDir(projectRoot) {
|
|
14927
|
+
return external_path_default().join(projectRoot, ANVIL_DEPS_DIR);
|
|
14928
|
+
}
|
|
14929
|
+
function depsManifestPath(projectRoot) {
|
|
14930
|
+
return external_path_default().join(depsDir(projectRoot), ANVIL_DEPS_MANIFEST);
|
|
14931
|
+
}
|
|
14932
|
+
function isResolvedDependencyManifestEntry(value) {
|
|
14933
|
+
if (!value || "object" != typeof value) return false;
|
|
14934
|
+
const entry = value;
|
|
14935
|
+
return "string" == typeof entry.app_id && entry.app_id.length > 0 && "string" == typeof entry.commit_id && entry.commit_id.length > 0 && (void 0 === entry.branch || "string" == typeof entry.branch);
|
|
14936
|
+
}
|
|
14937
|
+
function isCachedDependencyManifestEntry(value) {
|
|
14938
|
+
if (!isResolvedDependencyManifestEntry(value)) return false;
|
|
14939
|
+
const entry = value;
|
|
14940
|
+
return "string" == typeof entry.package_name && entry.package_name.length > 0;
|
|
14941
|
+
}
|
|
14942
|
+
function isDepsCacheManifest(value) {
|
|
14943
|
+
if (!value || "object" != typeof value) return false;
|
|
14944
|
+
const manifest = value;
|
|
14945
|
+
return manifest.version === DEPS_MANIFEST_VERSION && "boolean" == typeof manifest.includeDocs && Array.isArray(manifest.resolved_dependencies) && manifest.resolved_dependencies.every(isResolvedDependencyManifestEntry) && Array.isArray(manifest.cached_dependencies) && manifest.cached_dependencies.every(isCachedDependencyManifestEntry);
|
|
14946
|
+
}
|
|
14947
|
+
async function readDepsCacheManifest(projectRoot) {
|
|
14948
|
+
try {
|
|
14949
|
+
const raw = await promises_default().readFile(depsManifestPath(projectRoot), "utf-8");
|
|
14950
|
+
const parsed = JSON.parse(raw);
|
|
14951
|
+
return isDepsCacheManifest(parsed) ? parsed : void 0;
|
|
14952
|
+
} catch {
|
|
14953
|
+
return;
|
|
14954
|
+
}
|
|
14955
|
+
}
|
|
14956
|
+
async function getKnownDependenciesForCache(projectRoot, includeDocs) {
|
|
14957
|
+
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14958
|
+
if (!manifest || manifest.includeDocs !== includeDocs) return [];
|
|
14959
|
+
return manifest.resolved_dependencies.map(({ app_id, commit_id })=>({
|
|
14960
|
+
app_id,
|
|
14961
|
+
commit_id
|
|
14962
|
+
}));
|
|
14963
|
+
}
|
|
14964
|
+
function getDependencyWatchSubscriptionsFromManifest(manifest) {
|
|
14965
|
+
if (!manifest) return [];
|
|
14966
|
+
const cachedByAppId = new Map(manifest.cached_dependencies.map((dep)=>[
|
|
14967
|
+
dep.app_id,
|
|
14968
|
+
dep
|
|
14969
|
+
]));
|
|
14970
|
+
return manifest.resolved_dependencies.flatMap((dep)=>{
|
|
14971
|
+
if (!dep.branch) return [];
|
|
14972
|
+
return [
|
|
14973
|
+
{
|
|
14974
|
+
appId: dep.app_id,
|
|
14975
|
+
branch: dep.branch,
|
|
14976
|
+
packageName: cachedByAppId.get(dep.app_id)?.package_name
|
|
14977
|
+
}
|
|
14978
|
+
];
|
|
14979
|
+
});
|
|
14980
|
+
}
|
|
14981
|
+
function normalizeAnvilYamlDependenciesFromContent(content) {
|
|
14982
|
+
const parsed = external_js_yaml_default().load(content);
|
|
14983
|
+
if (!parsed || "object" != typeof parsed || !Array.isArray(parsed.dependencies)) return [];
|
|
14984
|
+
return normalizeAnvilYamlDependenciesValue(parsed.dependencies);
|
|
14985
|
+
}
|
|
14986
|
+
function normalizeAnvilYamlDependenciesValue(value) {
|
|
14987
|
+
if (!Array.isArray(value)) return [];
|
|
14988
|
+
return normalizeForComparison(value);
|
|
14989
|
+
}
|
|
14990
|
+
async function readAnvilYamlDependencies(projectRoot) {
|
|
14991
|
+
try {
|
|
14992
|
+
const content = await promises_default().readFile(external_path_default().join(projectRoot, "anvil.yaml"), "utf-8");
|
|
14993
|
+
return normalizeAnvilYamlDependenciesFromContent(content);
|
|
14994
|
+
} catch {
|
|
14995
|
+
return [];
|
|
14996
|
+
}
|
|
14997
|
+
}
|
|
14998
|
+
function anvilYamlDependenciesEqual(left, right) {
|
|
14999
|
+
return deepEqual(left, right);
|
|
15000
|
+
}
|
|
15001
|
+
function normalizeForComparison(value) {
|
|
15002
|
+
if (Array.isArray(value)) return value.map(normalizeForComparison);
|
|
15003
|
+
if (value && "object" == typeof value) return Object.fromEntries(Object.entries(value).sort(([left], [right])=>left.localeCompare(right)).map(([key, entryValue])=>[
|
|
15004
|
+
key,
|
|
15005
|
+
normalizeForComparison(entryValue)
|
|
15006
|
+
]));
|
|
15007
|
+
return value;
|
|
15008
|
+
}
|
|
15009
|
+
function cachedManifestEntry(dep, packageName) {
|
|
15010
|
+
return {
|
|
15011
|
+
app_id: dep.app_id,
|
|
15012
|
+
commit_id: dep.commit_id,
|
|
15013
|
+
...dep.branch ? {
|
|
15014
|
+
branch: dep.branch
|
|
15015
|
+
} : {},
|
|
15016
|
+
package_name: packageName
|
|
15017
|
+
};
|
|
15018
|
+
}
|
|
15019
|
+
function safeDependencyPath(filePath, kind) {
|
|
15020
|
+
const normalizedPath = external_path_default().normalize(filePath);
|
|
15021
|
+
if (external_path_default().isAbsolute(normalizedPath) || normalizedPath.startsWith("..")) throw new Error(`Invalid dependency ${kind} path: ${filePath}`);
|
|
15022
|
+
return normalizedPath;
|
|
15023
|
+
}
|
|
15024
|
+
async function writeDepToCache(projectRoot, dep) {
|
|
15025
|
+
const depDir = external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name);
|
|
15026
|
+
await promises_default().rm(depDir, {
|
|
15027
|
+
recursive: true,
|
|
15028
|
+
force: true
|
|
15029
|
+
});
|
|
15030
|
+
await promises_default().mkdir(external_path_default().join(depDir, "client_code"), {
|
|
15031
|
+
recursive: true
|
|
15032
|
+
});
|
|
15033
|
+
await promises_default().mkdir(external_path_default().join(depDir, "server_code"), {
|
|
15034
|
+
recursive: true
|
|
15035
|
+
});
|
|
15036
|
+
await promises_default().writeFile(external_path_default().join(depDir, "anvil.yaml"), external_js_yaml_default().dump({
|
|
15037
|
+
package_name: dep.package_name
|
|
15038
|
+
}));
|
|
15039
|
+
for (const mod of dep.modules ?? [])if (mod.is_package) {
|
|
15040
|
+
const modDir = external_path_default().join(depDir, "client_code", mod.name);
|
|
15041
|
+
await promises_default().mkdir(modDir, {
|
|
15042
|
+
recursive: true
|
|
15043
|
+
});
|
|
15044
|
+
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
15045
|
+
} else await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${mod.name}.py`), mod.code);
|
|
15046
|
+
for (const form of dep.forms ?? []){
|
|
15047
|
+
const { code, class_name, is_package, ...formTemplate } = form;
|
|
15048
|
+
if (is_package) {
|
|
15049
|
+
const formDir = external_path_default().join(depDir, "client_code", class_name);
|
|
15050
|
+
await promises_default().mkdir(formDir, {
|
|
15051
|
+
recursive: true
|
|
15052
|
+
});
|
|
15053
|
+
await promises_default().writeFile(external_path_default().join(formDir, "__init__.py"), code);
|
|
15054
|
+
await promises_default().writeFile(external_path_default().join(formDir, "form_template.yaml"), external_js_yaml_default().dump(formTemplate));
|
|
15055
|
+
} else {
|
|
15056
|
+
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.py`), code);
|
|
15057
|
+
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.yaml`), external_js_yaml_default().dump(formTemplate));
|
|
15058
|
+
}
|
|
15059
|
+
}
|
|
15060
|
+
for (const mod of dep.server_modules ?? [])if (mod.is_package) {
|
|
15061
|
+
const modDir = external_path_default().join(depDir, "server_code", mod.name);
|
|
15062
|
+
await promises_default().mkdir(modDir, {
|
|
15063
|
+
recursive: true
|
|
15064
|
+
});
|
|
15065
|
+
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
15066
|
+
} else await promises_default().writeFile(external_path_default().join(depDir, "server_code", `${mod.name}.py`), mod.code);
|
|
15067
|
+
for (const asset of dep.assets ?? []){
|
|
15068
|
+
const targetPath = external_path_default().join(depDir, "theme", "assets", safeDependencyPath(asset.name, "asset"));
|
|
15069
|
+
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
15070
|
+
recursive: true
|
|
15071
|
+
});
|
|
15072
|
+
await promises_default().writeFile(targetPath, Buffer.from(asset.content, "base64"));
|
|
15073
|
+
}
|
|
15074
|
+
for (const doc of dep.docs ?? []){
|
|
15075
|
+
const targetPath = external_path_default().join(depDir, safeDependencyPath(doc.path, "doc"));
|
|
15076
|
+
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
15077
|
+
recursive: true
|
|
15078
|
+
});
|
|
15079
|
+
await promises_default().writeFile(targetPath, doc.content);
|
|
15080
|
+
}
|
|
15081
|
+
}
|
|
15082
|
+
async function writeAllDepsToCache(projectRoot, response, options = {}) {
|
|
15083
|
+
const includeDocs = options.includeDocs ?? true;
|
|
15084
|
+
const manifest = await readDepsCacheManifest(projectRoot);
|
|
15085
|
+
const canReuseExistingCache = manifest?.includeDocs === includeDocs;
|
|
15086
|
+
if (!canReuseExistingCache) await clearDepsCache(projectRoot);
|
|
15087
|
+
const previousCached = canReuseExistingCache ? manifest.cached_dependencies : [];
|
|
15088
|
+
const resolvedAppIds = new Set(response.resolved_dependencies.map((dep)=>dep.app_id));
|
|
15089
|
+
for (const dep of previousCached)if (!resolvedAppIds.has(dep.app_id)) await promises_default().rm(external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name), {
|
|
15090
|
+
recursive: true,
|
|
15091
|
+
force: true
|
|
15092
|
+
});
|
|
15093
|
+
for (const dep of response.dependencies)await writeDepToCache(projectRoot, dep);
|
|
15094
|
+
const returnedByAppId = new Map(response.dependencies.map((dep)=>[
|
|
15095
|
+
dep.app_id,
|
|
15096
|
+
dep
|
|
15097
|
+
]));
|
|
15098
|
+
const previousByAppId = new Map(previousCached.map((dep)=>[
|
|
15099
|
+
dep.app_id,
|
|
15100
|
+
dep
|
|
15101
|
+
]));
|
|
15102
|
+
const cachedDependencies = response.resolved_dependencies.map((dep)=>{
|
|
15103
|
+
const returned = returnedByAppId.get(dep.app_id);
|
|
15104
|
+
if (returned) return cachedManifestEntry(returned, returned.package_name);
|
|
15105
|
+
const previous = previousByAppId.get(dep.app_id);
|
|
15106
|
+
if (!previous) return;
|
|
15107
|
+
return cachedManifestEntry(dep, previous.package_name);
|
|
15108
|
+
}).filter((dep)=>void 0 !== dep);
|
|
15109
|
+
const newManifest = {
|
|
15110
|
+
version: DEPS_MANIFEST_VERSION,
|
|
15111
|
+
includeDocs,
|
|
15112
|
+
resolved_dependencies: response.resolved_dependencies,
|
|
15113
|
+
cached_dependencies: cachedDependencies
|
|
15114
|
+
};
|
|
15115
|
+
await promises_default().mkdir(depsDir(projectRoot), {
|
|
15116
|
+
recursive: true
|
|
15117
|
+
});
|
|
15118
|
+
await promises_default().writeFile(depsManifestPath(projectRoot), `${JSON.stringify(newManifest, null, 2)}\n`);
|
|
15119
|
+
}
|
|
15120
|
+
async function clearDepsCache(projectRoot) {
|
|
15121
|
+
await promises_default().rm(depsDir(projectRoot), {
|
|
15122
|
+
recursive: true,
|
|
15123
|
+
force: true
|
|
15124
|
+
});
|
|
15125
|
+
}
|
|
15125
15126
|
const external_chokidar_namespaceObject = require("chokidar");
|
|
15126
15127
|
var external_chokidar_default = /*#__PURE__*/ __webpack_require__.n(external_chokidar_namespaceObject);
|
|
15127
15128
|
class FileWatcher extends Emitter {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/services/deps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/services/deps.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,qBAAqB,IAAI,CAAC;AAEhC,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,+BAA+B,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,6BAA6B;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IACzC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAuBD,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACjC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,qBAAqB,EAAE,+BAA+B,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,+BAA+B;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrE,KAAK,EAAE,KAAK,CAAC;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAC1B,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,UAAU,6BAA8B,SAAQ,+BAA+B;IAC3E,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,qBAAqB,CAAC;IACtC,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,+BAA+B,EAAE,CAAC;IACzD,mBAAmB,EAAE,6BAA6B,EAAE,CAAC;CACxD;AAMD;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,KAAK,EAAE,MAAM,EACb,QAAQ,SAAoB,EAC5B,OAAO,GAAE,2BAAgC,GAC1C,OAAO,CAAC,oBAAoB,CAAC,CA4B/B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,QAAQ,SAAoB,EAC5B,OAAO,GAAE,6BAAkC,GAC5C,OAAO,CAAC,4BAA4B,CAAC,CAmBvC;AA6CD,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAQvG;AAED,wBAAsB,4BAA4B,CAC9C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,OAAO,GACrB,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAM5C;AAED,wBAAgB,2CAA2C,CACvD,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GACxC,2BAA2B,EAAE,CAkB/B;AAED,wBAAgB,yCAAyC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMlF;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK3E;AAED,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjF;AAyGD;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAMD;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO9E"}
|