@anvil-works/anvil-cli 0.7.5 → 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/WatchSession.d.ts.map +1 -1
- package/dist/cli.js +348 -345
- package/dist/index.js +260 -257
- package/dist/services/deps.d.ts +2 -0
- package/dist/services/deps.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatchSession.d.ts","sourceRoot":"","sources":["../src/WatchSession.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"WatchSession.d.ts","sourceRoot":"","sources":["../src/WatchSession.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -14388,273 +14388,6 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
|
|
|
14388
14388
|
return true;
|
|
14389
14389
|
}
|
|
14390
14390
|
}
|
|
14391
|
-
const ANVIL_DEPS_DIR = ".anvil/deps";
|
|
14392
|
-
const ANVIL_DEPS_MANIFEST = "manifest.json";
|
|
14393
|
-
const DEPS_MANIFEST_VERSION = 1;
|
|
14394
|
-
function formatFetchError(prefix, status, errorBody) {
|
|
14395
|
-
if (!errorBody) return `${prefix}: ${status}`;
|
|
14396
|
-
try {
|
|
14397
|
-
const parsed = JSON.parse(errorBody);
|
|
14398
|
-
if ("string" == typeof parsed.error && parsed.error.trim()) return `${prefix}: ${parsed.error} (${status})`;
|
|
14399
|
-
} catch {}
|
|
14400
|
-
return `${prefix}: ${status} ${errorBody}`;
|
|
14401
|
-
}
|
|
14402
|
-
async function fetchAllDependencies(appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14403
|
-
const { commit, includeDocs = true, knownDependencies = [] } = options;
|
|
14404
|
-
const token = await auth_getValidAuthToken(anvilUrl);
|
|
14405
|
-
const body = {
|
|
14406
|
-
include_docs: includeDocs,
|
|
14407
|
-
known_dependencies: knownDependencies
|
|
14408
|
-
};
|
|
14409
|
-
if (commit) body.commit = commit;
|
|
14410
|
-
const resp = await fetch(`${anvilUrl}/ide/api/_/apps/${appId}/resolved-dependencies`, {
|
|
14411
|
-
method: "POST",
|
|
14412
|
-
headers: {
|
|
14413
|
-
Authorization: `Bearer ${token}`,
|
|
14414
|
-
"Content-Type": "application/json"
|
|
14415
|
-
},
|
|
14416
|
-
body: JSON.stringify(body)
|
|
14417
|
-
});
|
|
14418
|
-
if (!resp.ok) {
|
|
14419
|
-
const errorBody = await resp.text();
|
|
14420
|
-
throw new Error(formatFetchError("Failed to fetch dependencies", resp.status, errorBody));
|
|
14421
|
-
}
|
|
14422
|
-
return await resp.json();
|
|
14423
|
-
}
|
|
14424
|
-
async function refreshDependencyCache(projectRoot, appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14425
|
-
const includeDocs = options.includeDocs ?? true;
|
|
14426
|
-
const knownDependencies = await getKnownDependenciesForCache(projectRoot, includeDocs);
|
|
14427
|
-
const response = await fetchAllDependencies(appId, anvilUrl, {
|
|
14428
|
-
commit: options.commit,
|
|
14429
|
-
includeDocs,
|
|
14430
|
-
knownDependencies
|
|
14431
|
-
});
|
|
14432
|
-
if (!response.resolved_dependencies.length) {
|
|
14433
|
-
await clearDepsCache(projectRoot);
|
|
14434
|
-
return {
|
|
14435
|
-
response,
|
|
14436
|
-
addedGitignoreEntry: false
|
|
14437
|
-
};
|
|
14438
|
-
}
|
|
14439
|
-
const addedGitignoreEntry = await ensureProjectGitignoreIgnoresAnvilDir(projectRoot);
|
|
14440
|
-
await writeAllDepsToCache(projectRoot, response, {
|
|
14441
|
-
includeDocs
|
|
14442
|
-
});
|
|
14443
|
-
return {
|
|
14444
|
-
response,
|
|
14445
|
-
addedGitignoreEntry
|
|
14446
|
-
};
|
|
14447
|
-
}
|
|
14448
|
-
function depsDir(projectRoot) {
|
|
14449
|
-
return external_path_default().join(projectRoot, ANVIL_DEPS_DIR);
|
|
14450
|
-
}
|
|
14451
|
-
function depsManifestPath(projectRoot) {
|
|
14452
|
-
return external_path_default().join(depsDir(projectRoot), ANVIL_DEPS_MANIFEST);
|
|
14453
|
-
}
|
|
14454
|
-
function isResolvedDependencyManifestEntry(value) {
|
|
14455
|
-
if (!value || "object" != typeof value) return false;
|
|
14456
|
-
const entry = value;
|
|
14457
|
-
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);
|
|
14458
|
-
}
|
|
14459
|
-
function isCachedDependencyManifestEntry(value) {
|
|
14460
|
-
if (!isResolvedDependencyManifestEntry(value)) return false;
|
|
14461
|
-
const entry = value;
|
|
14462
|
-
return "string" == typeof entry.package_name && entry.package_name.length > 0;
|
|
14463
|
-
}
|
|
14464
|
-
function isDepsCacheManifest(value) {
|
|
14465
|
-
if (!value || "object" != typeof value) return false;
|
|
14466
|
-
const manifest = value;
|
|
14467
|
-
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);
|
|
14468
|
-
}
|
|
14469
|
-
async function readDepsCacheManifest(projectRoot) {
|
|
14470
|
-
try {
|
|
14471
|
-
const raw = await promises_default().readFile(depsManifestPath(projectRoot), "utf-8");
|
|
14472
|
-
const parsed = JSON.parse(raw);
|
|
14473
|
-
return isDepsCacheManifest(parsed) ? parsed : void 0;
|
|
14474
|
-
} catch {
|
|
14475
|
-
return;
|
|
14476
|
-
}
|
|
14477
|
-
}
|
|
14478
|
-
async function getKnownDependenciesForCache(projectRoot, includeDocs) {
|
|
14479
|
-
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14480
|
-
if (!manifest || manifest.includeDocs !== includeDocs) return [];
|
|
14481
|
-
return manifest.resolved_dependencies.map(({ app_id, commit_id })=>({
|
|
14482
|
-
app_id,
|
|
14483
|
-
commit_id
|
|
14484
|
-
}));
|
|
14485
|
-
}
|
|
14486
|
-
function getDependencyWatchSubscriptionsFromManifest(manifest) {
|
|
14487
|
-
if (!manifest) return [];
|
|
14488
|
-
const cachedByAppId = new Map(manifest.cached_dependencies.map((dep)=>[
|
|
14489
|
-
dep.app_id,
|
|
14490
|
-
dep
|
|
14491
|
-
]));
|
|
14492
|
-
return manifest.resolved_dependencies.flatMap((dep)=>{
|
|
14493
|
-
if (!dep.branch) return [];
|
|
14494
|
-
return [
|
|
14495
|
-
{
|
|
14496
|
-
appId: dep.app_id,
|
|
14497
|
-
branch: dep.branch,
|
|
14498
|
-
packageName: cachedByAppId.get(dep.app_id)?.package_name
|
|
14499
|
-
}
|
|
14500
|
-
];
|
|
14501
|
-
});
|
|
14502
|
-
}
|
|
14503
|
-
function normalizeAnvilYamlDependenciesFromContent(content) {
|
|
14504
|
-
const parsed = external_js_yaml_default().load(content);
|
|
14505
|
-
if (!parsed || "object" != typeof parsed || !Array.isArray(parsed.dependencies)) return [];
|
|
14506
|
-
return normalizeAnvilYamlDependenciesValue(parsed.dependencies);
|
|
14507
|
-
}
|
|
14508
|
-
function normalizeAnvilYamlDependenciesValue(value) {
|
|
14509
|
-
if (!Array.isArray(value)) return [];
|
|
14510
|
-
return normalizeForComparison(value);
|
|
14511
|
-
}
|
|
14512
|
-
async function readAnvilYamlDependencies(projectRoot) {
|
|
14513
|
-
try {
|
|
14514
|
-
const content = await promises_default().readFile(external_path_default().join(projectRoot, "anvil.yaml"), "utf-8");
|
|
14515
|
-
return normalizeAnvilYamlDependenciesFromContent(content);
|
|
14516
|
-
} catch {
|
|
14517
|
-
return [];
|
|
14518
|
-
}
|
|
14519
|
-
}
|
|
14520
|
-
function anvilYamlDependenciesEqual(left, right) {
|
|
14521
|
-
return deepEqual(left, right);
|
|
14522
|
-
}
|
|
14523
|
-
function normalizeForComparison(value) {
|
|
14524
|
-
if (Array.isArray(value)) return value.map(normalizeForComparison);
|
|
14525
|
-
if (value && "object" == typeof value) return Object.fromEntries(Object.entries(value).sort(([left], [right])=>left.localeCompare(right)).map(([key, entryValue])=>[
|
|
14526
|
-
key,
|
|
14527
|
-
normalizeForComparison(entryValue)
|
|
14528
|
-
]));
|
|
14529
|
-
return value;
|
|
14530
|
-
}
|
|
14531
|
-
function cachedManifestEntry(dep, packageName) {
|
|
14532
|
-
return {
|
|
14533
|
-
app_id: dep.app_id,
|
|
14534
|
-
commit_id: dep.commit_id,
|
|
14535
|
-
...dep.branch ? {
|
|
14536
|
-
branch: dep.branch
|
|
14537
|
-
} : {},
|
|
14538
|
-
package_name: packageName
|
|
14539
|
-
};
|
|
14540
|
-
}
|
|
14541
|
-
function safeDependencyPath(filePath, kind) {
|
|
14542
|
-
const normalizedPath = external_path_default().normalize(filePath);
|
|
14543
|
-
if (external_path_default().isAbsolute(normalizedPath) || normalizedPath.startsWith("..")) throw new Error(`Invalid dependency ${kind} path: ${filePath}`);
|
|
14544
|
-
return normalizedPath;
|
|
14545
|
-
}
|
|
14546
|
-
async function writeDepToCache(projectRoot, dep) {
|
|
14547
|
-
const depDir = external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name);
|
|
14548
|
-
await promises_default().rm(depDir, {
|
|
14549
|
-
recursive: true,
|
|
14550
|
-
force: true
|
|
14551
|
-
});
|
|
14552
|
-
await promises_default().mkdir(external_path_default().join(depDir, "client_code"), {
|
|
14553
|
-
recursive: true
|
|
14554
|
-
});
|
|
14555
|
-
await promises_default().mkdir(external_path_default().join(depDir, "server_code"), {
|
|
14556
|
-
recursive: true
|
|
14557
|
-
});
|
|
14558
|
-
await promises_default().writeFile(external_path_default().join(depDir, "anvil.yaml"), external_js_yaml_default().dump({
|
|
14559
|
-
package_name: dep.package_name
|
|
14560
|
-
}));
|
|
14561
|
-
for (const mod of dep.modules ?? [])if (mod.is_package) {
|
|
14562
|
-
const modDir = external_path_default().join(depDir, "client_code", mod.name);
|
|
14563
|
-
await promises_default().mkdir(modDir, {
|
|
14564
|
-
recursive: true
|
|
14565
|
-
});
|
|
14566
|
-
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
14567
|
-
} else await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${mod.name}.py`), mod.code);
|
|
14568
|
-
for (const form of dep.forms ?? []){
|
|
14569
|
-
const { code, class_name, is_package, ...formTemplate } = form;
|
|
14570
|
-
if (is_package) {
|
|
14571
|
-
const formDir = external_path_default().join(depDir, "client_code", class_name);
|
|
14572
|
-
await promises_default().mkdir(formDir, {
|
|
14573
|
-
recursive: true
|
|
14574
|
-
});
|
|
14575
|
-
await promises_default().writeFile(external_path_default().join(formDir, "__init__.py"), code);
|
|
14576
|
-
await promises_default().writeFile(external_path_default().join(formDir, "form_template.yaml"), external_js_yaml_default().dump(formTemplate));
|
|
14577
|
-
} else {
|
|
14578
|
-
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.py`), code);
|
|
14579
|
-
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.yaml`), external_js_yaml_default().dump(formTemplate));
|
|
14580
|
-
}
|
|
14581
|
-
}
|
|
14582
|
-
for (const mod of dep.server_modules ?? [])if (mod.is_package) {
|
|
14583
|
-
const modDir = external_path_default().join(depDir, "server_code", mod.name);
|
|
14584
|
-
await promises_default().mkdir(modDir, {
|
|
14585
|
-
recursive: true
|
|
14586
|
-
});
|
|
14587
|
-
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
14588
|
-
} else await promises_default().writeFile(external_path_default().join(depDir, "server_code", `${mod.name}.py`), mod.code);
|
|
14589
|
-
for (const asset of dep.assets ?? []){
|
|
14590
|
-
const targetPath = external_path_default().join(depDir, "theme", "assets", safeDependencyPath(asset.name, "asset"));
|
|
14591
|
-
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
14592
|
-
recursive: true
|
|
14593
|
-
});
|
|
14594
|
-
await promises_default().writeFile(targetPath, Buffer.from(asset.content, "base64"));
|
|
14595
|
-
}
|
|
14596
|
-
for (const doc of dep.docs ?? []){
|
|
14597
|
-
const targetPath = external_path_default().join(depDir, safeDependencyPath(doc.path, "doc"));
|
|
14598
|
-
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
14599
|
-
recursive: true
|
|
14600
|
-
});
|
|
14601
|
-
await promises_default().writeFile(targetPath, doc.content);
|
|
14602
|
-
}
|
|
14603
|
-
}
|
|
14604
|
-
async function writeAllDepsToCache(projectRoot, response, options = {}) {
|
|
14605
|
-
const includeDocs = options.includeDocs ?? true;
|
|
14606
|
-
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14607
|
-
const canReuseExistingCache = manifest?.includeDocs === includeDocs;
|
|
14608
|
-
if (!canReuseExistingCache) await clearDepsCache(projectRoot);
|
|
14609
|
-
const previousCached = canReuseExistingCache ? manifest.cached_dependencies : [];
|
|
14610
|
-
const resolvedAppIds = new Set(response.resolved_dependencies.map((dep)=>dep.app_id));
|
|
14611
|
-
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), {
|
|
14612
|
-
recursive: true,
|
|
14613
|
-
force: true
|
|
14614
|
-
});
|
|
14615
|
-
for (const dep of response.dependencies)await writeDepToCache(projectRoot, dep);
|
|
14616
|
-
const returnedByAppId = new Map(response.dependencies.map((dep)=>[
|
|
14617
|
-
dep.app_id,
|
|
14618
|
-
dep
|
|
14619
|
-
]));
|
|
14620
|
-
const previousByAppId = new Map(previousCached.map((dep)=>[
|
|
14621
|
-
dep.app_id,
|
|
14622
|
-
dep
|
|
14623
|
-
]));
|
|
14624
|
-
const cachedDependencies = response.resolved_dependencies.map((dep)=>{
|
|
14625
|
-
const returned = returnedByAppId.get(dep.app_id);
|
|
14626
|
-
if (returned) return cachedManifestEntry(returned, returned.package_name);
|
|
14627
|
-
const previous = previousByAppId.get(dep.app_id);
|
|
14628
|
-
if (!previous) return;
|
|
14629
|
-
return cachedManifestEntry(dep, previous.package_name);
|
|
14630
|
-
}).filter((dep)=>void 0 !== dep);
|
|
14631
|
-
const newManifest = {
|
|
14632
|
-
version: DEPS_MANIFEST_VERSION,
|
|
14633
|
-
includeDocs,
|
|
14634
|
-
resolved_dependencies: response.resolved_dependencies,
|
|
14635
|
-
cached_dependencies: cachedDependencies
|
|
14636
|
-
};
|
|
14637
|
-
await promises_default().mkdir(depsDir(projectRoot), {
|
|
14638
|
-
recursive: true
|
|
14639
|
-
});
|
|
14640
|
-
await promises_default().writeFile(depsManifestPath(projectRoot), `${JSON.stringify(newManifest, null, 2)}\n`);
|
|
14641
|
-
}
|
|
14642
|
-
async function clearDepsCache(projectRoot) {
|
|
14643
|
-
await promises_default().rm(depsDir(projectRoot), {
|
|
14644
|
-
recursive: true,
|
|
14645
|
-
force: true
|
|
14646
|
-
});
|
|
14647
|
-
}
|
|
14648
|
-
async function getCachedPackages(projectRoot) {
|
|
14649
|
-
try {
|
|
14650
|
-
const entries = await promises_default().readdir(depsDir(projectRoot), {
|
|
14651
|
-
withFileTypes: true
|
|
14652
|
-
});
|
|
14653
|
-
return entries.filter((entry)=>entry.isDirectory()).map((entry)=>entry.name);
|
|
14654
|
-
} catch {
|
|
14655
|
-
return [];
|
|
14656
|
-
}
|
|
14657
|
-
}
|
|
14658
14391
|
const external_timers_promises_namespaceObject = require("timers/promises");
|
|
14659
14392
|
const WANT_NOT_VALID_RE = /\bwant\s+[0-9a-f]{7,40}\s+not valid\b/i;
|
|
14660
14393
|
const FETCH_RETRY_DELAY_MS = 200;
|
|
@@ -15019,90 +14752,359 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
|
|
|
15019
14752
|
throw errors_createGitError.commandFailed("merge --ff-only", e.message);
|
|
15020
14753
|
}
|
|
15021
14754
|
}
|
|
15022
|
-
async deleteRef(ref) {
|
|
15023
|
-
try {
|
|
15024
|
-
await this.git.raw([
|
|
15025
|
-
"update-ref",
|
|
15026
|
-
"-d",
|
|
15027
|
-
ref
|
|
15028
|
-
]);
|
|
15029
|
-
} catch (e) {}
|
|
14755
|
+
async deleteRef(ref) {
|
|
14756
|
+
try {
|
|
14757
|
+
await this.git.raw([
|
|
14758
|
+
"update-ref",
|
|
14759
|
+
"-d",
|
|
14760
|
+
ref
|
|
14761
|
+
]);
|
|
14762
|
+
} catch (e) {}
|
|
14763
|
+
}
|
|
14764
|
+
async getRemotes() {
|
|
14765
|
+
try {
|
|
14766
|
+
const remotes = await this.git.getRemotes(true);
|
|
14767
|
+
return remotes.map((r)=>({
|
|
14768
|
+
name: r.name,
|
|
14769
|
+
fetchUrl: r.refs.fetch
|
|
14770
|
+
}));
|
|
14771
|
+
} catch (e) {
|
|
14772
|
+
throw errors_createGitError.commandFailed("remote", e.message);
|
|
14773
|
+
}
|
|
14774
|
+
}
|
|
14775
|
+
async isGitInitialized() {
|
|
14776
|
+
const gitPath = external_path_default().join(this.repoPath, ".git");
|
|
14777
|
+
return external_fs_.existsSync(gitPath);
|
|
14778
|
+
}
|
|
14779
|
+
async removeEmptyDirectories(removedFiles) {
|
|
14780
|
+
const directoriesToCheck = new Set();
|
|
14781
|
+
for (const file of removedFiles){
|
|
14782
|
+
let dir = external_path_default().dirname(file);
|
|
14783
|
+
while(dir && "." !== dir){
|
|
14784
|
+
directoriesToCheck.add(dir);
|
|
14785
|
+
const parentDir = external_path_default().dirname(dir);
|
|
14786
|
+
if (parentDir === dir) break;
|
|
14787
|
+
dir = parentDir;
|
|
14788
|
+
}
|
|
14789
|
+
}
|
|
14790
|
+
const sortedDirs = Array.from(directoriesToCheck).sort((a, b)=>b.split("/").length - a.split("/").length);
|
|
14791
|
+
for (const dir of sortedDirs)try {
|
|
14792
|
+
const dirPath = external_path_default().join(this.repoPath, dir);
|
|
14793
|
+
if (!external_fs_.existsSync(dirPath)) continue;
|
|
14794
|
+
const entries = await external_fs_.promises.readdir(dirPath);
|
|
14795
|
+
if (0 === entries.length) await external_fs_.promises.rmdir(dirPath);
|
|
14796
|
+
} catch (error) {}
|
|
14797
|
+
}
|
|
14798
|
+
}
|
|
14799
|
+
async function getStagedFileChanges(git, gitService) {
|
|
14800
|
+
try {
|
|
14801
|
+
const status = await git.status();
|
|
14802
|
+
const renames = status.renamed || [];
|
|
14803
|
+
const stagedFiles = status.files.filter((f)=>" " !== f.index && "?" !== f.index);
|
|
14804
|
+
const stagedModeOnlyPaths = new Set(gitService ? await gitService.discardStagedModeOnlyChanges(stagedFiles.filter((f)=>"R" !== f.index && "D" !== f.index).map((f)=>f.path)) : []);
|
|
14805
|
+
const stagedRenames = [];
|
|
14806
|
+
for (const f of stagedFiles)if ("R" === f.index) {
|
|
14807
|
+
const rename = renames.find((r)=>r.to === f.path);
|
|
14808
|
+
if (rename) stagedRenames.push({
|
|
14809
|
+
path: rename.to,
|
|
14810
|
+
type: "rename",
|
|
14811
|
+
from: rename.from
|
|
14812
|
+
});
|
|
14813
|
+
}
|
|
14814
|
+
const stagedRenamedFromPaths = new Set(stagedRenames.map((r)=>r.from));
|
|
14815
|
+
const stagedRenamedToPaths = new Set(stagedRenames.map((r)=>r.path));
|
|
14816
|
+
const changes = [];
|
|
14817
|
+
for (const f of stagedFiles){
|
|
14818
|
+
if ("R" !== f.index) {
|
|
14819
|
+
if (!stagedModeOnlyPaths.has(f.path)) {
|
|
14820
|
+
if (!(stagedRenamedFromPaths.has(f.path) || stagedRenamedToPaths.has(f.path))) if ("D" === f.index) changes.push({
|
|
14821
|
+
path: f.path,
|
|
14822
|
+
type: "unlink"
|
|
14823
|
+
});
|
|
14824
|
+
else if ("A" === f.index || "?" === f.index) changes.push({
|
|
14825
|
+
path: f.path,
|
|
14826
|
+
type: "add"
|
|
14827
|
+
});
|
|
14828
|
+
else changes.push({
|
|
14829
|
+
path: f.path,
|
|
14830
|
+
type: "change"
|
|
14831
|
+
});
|
|
14832
|
+
}
|
|
14833
|
+
}
|
|
14834
|
+
}
|
|
14835
|
+
changes.push(...stagedRenames);
|
|
14836
|
+
return changes;
|
|
14837
|
+
} catch (e) {
|
|
14838
|
+
throw errors_createGitError.commandFailed("status", e.message);
|
|
14839
|
+
}
|
|
14840
|
+
}
|
|
14841
|
+
const ANVIL_DEPS_DIR = ".anvil/deps";
|
|
14842
|
+
const ANVIL_DEPS_MANIFEST = "manifest.json";
|
|
14843
|
+
const DEPS_MANIFEST_VERSION = 1;
|
|
14844
|
+
function formatFetchError(prefix, status, errorBody) {
|
|
14845
|
+
if (!errorBody) return `${prefix}: ${status}`;
|
|
14846
|
+
try {
|
|
14847
|
+
const parsed = JSON.parse(errorBody);
|
|
14848
|
+
if ("string" == typeof parsed.error && parsed.error.trim()) return `${prefix}: ${parsed.error} (${status})`;
|
|
14849
|
+
} catch {}
|
|
14850
|
+
return `${prefix}: ${status} ${errorBody}`;
|
|
14851
|
+
}
|
|
14852
|
+
async function fetchAllDependencies(appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14853
|
+
const { commit, includeDocs = true, knownDependencies = [] } = options;
|
|
14854
|
+
const token = await auth_getValidAuthToken(anvilUrl, options.username);
|
|
14855
|
+
const body = {
|
|
14856
|
+
include_docs: includeDocs,
|
|
14857
|
+
known_dependencies: knownDependencies
|
|
14858
|
+
};
|
|
14859
|
+
if (commit) body.commit = commit;
|
|
14860
|
+
const resp = await fetch(`${anvilUrl}/ide/api/_/apps/${appId}/resolved-dependencies`, {
|
|
14861
|
+
method: "POST",
|
|
14862
|
+
headers: {
|
|
14863
|
+
Authorization: `Bearer ${token}`,
|
|
14864
|
+
"Content-Type": "application/json"
|
|
14865
|
+
},
|
|
14866
|
+
body: JSON.stringify(body)
|
|
14867
|
+
});
|
|
14868
|
+
if (!resp.ok) {
|
|
14869
|
+
const errorBody = await resp.text();
|
|
14870
|
+
throw new Error(formatFetchError("Failed to fetch dependencies", resp.status, errorBody));
|
|
14871
|
+
}
|
|
14872
|
+
return await resp.json();
|
|
14873
|
+
}
|
|
14874
|
+
async function refreshDependencyCache(projectRoot, appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14875
|
+
const includeDocs = options.includeDocs ?? true;
|
|
14876
|
+
const commit = options.commit ?? await new GitService(projectRoot).getCommitId();
|
|
14877
|
+
const knownDependencies = await getKnownDependenciesForCache(projectRoot, includeDocs);
|
|
14878
|
+
const response = await fetchAllDependencies(appId, anvilUrl, {
|
|
14879
|
+
username: options.username,
|
|
14880
|
+
commit,
|
|
14881
|
+
includeDocs,
|
|
14882
|
+
knownDependencies
|
|
14883
|
+
});
|
|
14884
|
+
if (!response.resolved_dependencies.length) {
|
|
14885
|
+
await clearDepsCache(projectRoot);
|
|
14886
|
+
return {
|
|
14887
|
+
response,
|
|
14888
|
+
addedGitignoreEntry: false
|
|
14889
|
+
};
|
|
14890
|
+
}
|
|
14891
|
+
const addedGitignoreEntry = await ensureProjectGitignoreIgnoresAnvilDir(projectRoot);
|
|
14892
|
+
await writeAllDepsToCache(projectRoot, response, {
|
|
14893
|
+
includeDocs
|
|
14894
|
+
});
|
|
14895
|
+
return {
|
|
14896
|
+
response,
|
|
14897
|
+
addedGitignoreEntry
|
|
14898
|
+
};
|
|
14899
|
+
}
|
|
14900
|
+
function depsDir(projectRoot) {
|
|
14901
|
+
return external_path_default().join(projectRoot, ANVIL_DEPS_DIR);
|
|
14902
|
+
}
|
|
14903
|
+
function depsManifestPath(projectRoot) {
|
|
14904
|
+
return external_path_default().join(depsDir(projectRoot), ANVIL_DEPS_MANIFEST);
|
|
14905
|
+
}
|
|
14906
|
+
function isResolvedDependencyManifestEntry(value) {
|
|
14907
|
+
if (!value || "object" != typeof value) return false;
|
|
14908
|
+
const entry = value;
|
|
14909
|
+
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);
|
|
14910
|
+
}
|
|
14911
|
+
function isCachedDependencyManifestEntry(value) {
|
|
14912
|
+
if (!isResolvedDependencyManifestEntry(value)) return false;
|
|
14913
|
+
const entry = value;
|
|
14914
|
+
return "string" == typeof entry.package_name && entry.package_name.length > 0;
|
|
14915
|
+
}
|
|
14916
|
+
function isDepsCacheManifest(value) {
|
|
14917
|
+
if (!value || "object" != typeof value) return false;
|
|
14918
|
+
const manifest = value;
|
|
14919
|
+
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);
|
|
14920
|
+
}
|
|
14921
|
+
async function readDepsCacheManifest(projectRoot) {
|
|
14922
|
+
try {
|
|
14923
|
+
const raw = await promises_default().readFile(depsManifestPath(projectRoot), "utf-8");
|
|
14924
|
+
const parsed = JSON.parse(raw);
|
|
14925
|
+
return isDepsCacheManifest(parsed) ? parsed : void 0;
|
|
14926
|
+
} catch {
|
|
14927
|
+
return;
|
|
14928
|
+
}
|
|
14929
|
+
}
|
|
14930
|
+
async function getKnownDependenciesForCache(projectRoot, includeDocs) {
|
|
14931
|
+
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14932
|
+
if (!manifest || manifest.includeDocs !== includeDocs) return [];
|
|
14933
|
+
return manifest.resolved_dependencies.map(({ app_id, commit_id })=>({
|
|
14934
|
+
app_id,
|
|
14935
|
+
commit_id
|
|
14936
|
+
}));
|
|
14937
|
+
}
|
|
14938
|
+
function getDependencyWatchSubscriptionsFromManifest(manifest) {
|
|
14939
|
+
if (!manifest) return [];
|
|
14940
|
+
const cachedByAppId = new Map(manifest.cached_dependencies.map((dep)=>[
|
|
14941
|
+
dep.app_id,
|
|
14942
|
+
dep
|
|
14943
|
+
]));
|
|
14944
|
+
return manifest.resolved_dependencies.flatMap((dep)=>{
|
|
14945
|
+
if (!dep.branch) return [];
|
|
14946
|
+
return [
|
|
14947
|
+
{
|
|
14948
|
+
appId: dep.app_id,
|
|
14949
|
+
branch: dep.branch,
|
|
14950
|
+
packageName: cachedByAppId.get(dep.app_id)?.package_name
|
|
14951
|
+
}
|
|
14952
|
+
];
|
|
14953
|
+
});
|
|
14954
|
+
}
|
|
14955
|
+
function normalizeAnvilYamlDependenciesFromContent(content) {
|
|
14956
|
+
const parsed = external_js_yaml_default().load(content);
|
|
14957
|
+
if (!parsed || "object" != typeof parsed || !Array.isArray(parsed.dependencies)) return [];
|
|
14958
|
+
return normalizeAnvilYamlDependenciesValue(parsed.dependencies);
|
|
14959
|
+
}
|
|
14960
|
+
function normalizeAnvilYamlDependenciesValue(value) {
|
|
14961
|
+
if (!Array.isArray(value)) return [];
|
|
14962
|
+
return normalizeForComparison(value);
|
|
14963
|
+
}
|
|
14964
|
+
async function readAnvilYamlDependencies(projectRoot) {
|
|
14965
|
+
try {
|
|
14966
|
+
const content = await promises_default().readFile(external_path_default().join(projectRoot, "anvil.yaml"), "utf-8");
|
|
14967
|
+
return normalizeAnvilYamlDependenciesFromContent(content);
|
|
14968
|
+
} catch {
|
|
14969
|
+
return [];
|
|
15030
14970
|
}
|
|
15031
|
-
|
|
15032
|
-
|
|
15033
|
-
|
|
15034
|
-
|
|
15035
|
-
|
|
15036
|
-
|
|
15037
|
-
|
|
15038
|
-
|
|
15039
|
-
|
|
14971
|
+
}
|
|
14972
|
+
function anvilYamlDependenciesEqual(left, right) {
|
|
14973
|
+
return deepEqual(left, right);
|
|
14974
|
+
}
|
|
14975
|
+
function normalizeForComparison(value) {
|
|
14976
|
+
if (Array.isArray(value)) return value.map(normalizeForComparison);
|
|
14977
|
+
if (value && "object" == typeof value) return Object.fromEntries(Object.entries(value).sort(([left], [right])=>left.localeCompare(right)).map(([key, entryValue])=>[
|
|
14978
|
+
key,
|
|
14979
|
+
normalizeForComparison(entryValue)
|
|
14980
|
+
]));
|
|
14981
|
+
return value;
|
|
14982
|
+
}
|
|
14983
|
+
function cachedManifestEntry(dep, packageName) {
|
|
14984
|
+
return {
|
|
14985
|
+
app_id: dep.app_id,
|
|
14986
|
+
commit_id: dep.commit_id,
|
|
14987
|
+
...dep.branch ? {
|
|
14988
|
+
branch: dep.branch
|
|
14989
|
+
} : {},
|
|
14990
|
+
package_name: packageName
|
|
14991
|
+
};
|
|
14992
|
+
}
|
|
14993
|
+
function safeDependencyPath(filePath, kind) {
|
|
14994
|
+
const normalizedPath = external_path_default().normalize(filePath);
|
|
14995
|
+
if (external_path_default().isAbsolute(normalizedPath) || normalizedPath.startsWith("..")) throw new Error(`Invalid dependency ${kind} path: ${filePath}`);
|
|
14996
|
+
return normalizedPath;
|
|
14997
|
+
}
|
|
14998
|
+
async function writeDepToCache(projectRoot, dep) {
|
|
14999
|
+
const depDir = external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name);
|
|
15000
|
+
await promises_default().rm(depDir, {
|
|
15001
|
+
recursive: true,
|
|
15002
|
+
force: true
|
|
15003
|
+
});
|
|
15004
|
+
await promises_default().mkdir(external_path_default().join(depDir, "client_code"), {
|
|
15005
|
+
recursive: true
|
|
15006
|
+
});
|
|
15007
|
+
await promises_default().mkdir(external_path_default().join(depDir, "server_code"), {
|
|
15008
|
+
recursive: true
|
|
15009
|
+
});
|
|
15010
|
+
await promises_default().writeFile(external_path_default().join(depDir, "anvil.yaml"), external_js_yaml_default().dump({
|
|
15011
|
+
package_name: dep.package_name
|
|
15012
|
+
}));
|
|
15013
|
+
for (const mod of dep.modules ?? [])if (mod.is_package) {
|
|
15014
|
+
const modDir = external_path_default().join(depDir, "client_code", mod.name);
|
|
15015
|
+
await promises_default().mkdir(modDir, {
|
|
15016
|
+
recursive: true
|
|
15017
|
+
});
|
|
15018
|
+
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
15019
|
+
} else await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${mod.name}.py`), mod.code);
|
|
15020
|
+
for (const form of dep.forms ?? []){
|
|
15021
|
+
const { code, class_name, is_package, ...formTemplate } = form;
|
|
15022
|
+
if (is_package) {
|
|
15023
|
+
const formDir = external_path_default().join(depDir, "client_code", class_name);
|
|
15024
|
+
await promises_default().mkdir(formDir, {
|
|
15025
|
+
recursive: true
|
|
15026
|
+
});
|
|
15027
|
+
await promises_default().writeFile(external_path_default().join(formDir, "__init__.py"), code);
|
|
15028
|
+
await promises_default().writeFile(external_path_default().join(formDir, "form_template.yaml"), external_js_yaml_default().dump(formTemplate));
|
|
15029
|
+
} else {
|
|
15030
|
+
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.py`), code);
|
|
15031
|
+
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.yaml`), external_js_yaml_default().dump(formTemplate));
|
|
15040
15032
|
}
|
|
15041
15033
|
}
|
|
15042
|
-
|
|
15043
|
-
const
|
|
15044
|
-
|
|
15034
|
+
for (const mod of dep.server_modules ?? [])if (mod.is_package) {
|
|
15035
|
+
const modDir = external_path_default().join(depDir, "server_code", mod.name);
|
|
15036
|
+
await promises_default().mkdir(modDir, {
|
|
15037
|
+
recursive: true
|
|
15038
|
+
});
|
|
15039
|
+
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
15040
|
+
} else await promises_default().writeFile(external_path_default().join(depDir, "server_code", `${mod.name}.py`), mod.code);
|
|
15041
|
+
for (const asset of dep.assets ?? []){
|
|
15042
|
+
const targetPath = external_path_default().join(depDir, "theme", "assets", safeDependencyPath(asset.name, "asset"));
|
|
15043
|
+
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
15044
|
+
recursive: true
|
|
15045
|
+
});
|
|
15046
|
+
await promises_default().writeFile(targetPath, Buffer.from(asset.content, "base64"));
|
|
15045
15047
|
}
|
|
15046
|
-
|
|
15047
|
-
const
|
|
15048
|
-
|
|
15049
|
-
|
|
15050
|
-
|
|
15051
|
-
|
|
15052
|
-
const parentDir = external_path_default().dirname(dir);
|
|
15053
|
-
if (parentDir === dir) break;
|
|
15054
|
-
dir = parentDir;
|
|
15055
|
-
}
|
|
15056
|
-
}
|
|
15057
|
-
const sortedDirs = Array.from(directoriesToCheck).sort((a, b)=>b.split("/").length - a.split("/").length);
|
|
15058
|
-
for (const dir of sortedDirs)try {
|
|
15059
|
-
const dirPath = external_path_default().join(this.repoPath, dir);
|
|
15060
|
-
if (!external_fs_.existsSync(dirPath)) continue;
|
|
15061
|
-
const entries = await external_fs_.promises.readdir(dirPath);
|
|
15062
|
-
if (0 === entries.length) await external_fs_.promises.rmdir(dirPath);
|
|
15063
|
-
} catch (error) {}
|
|
15048
|
+
for (const doc of dep.docs ?? []){
|
|
15049
|
+
const targetPath = external_path_default().join(depDir, safeDependencyPath(doc.path, "doc"));
|
|
15050
|
+
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
15051
|
+
recursive: true
|
|
15052
|
+
});
|
|
15053
|
+
await promises_default().writeFile(targetPath, doc.content);
|
|
15064
15054
|
}
|
|
15065
15055
|
}
|
|
15066
|
-
async function
|
|
15056
|
+
async function writeAllDepsToCache(projectRoot, response, options = {}) {
|
|
15057
|
+
const includeDocs = options.includeDocs ?? true;
|
|
15058
|
+
const manifest = await readDepsCacheManifest(projectRoot);
|
|
15059
|
+
const canReuseExistingCache = manifest?.includeDocs === includeDocs;
|
|
15060
|
+
if (!canReuseExistingCache) await clearDepsCache(projectRoot);
|
|
15061
|
+
const previousCached = canReuseExistingCache ? manifest.cached_dependencies : [];
|
|
15062
|
+
const resolvedAppIds = new Set(response.resolved_dependencies.map((dep)=>dep.app_id));
|
|
15063
|
+
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), {
|
|
15064
|
+
recursive: true,
|
|
15065
|
+
force: true
|
|
15066
|
+
});
|
|
15067
|
+
for (const dep of response.dependencies)await writeDepToCache(projectRoot, dep);
|
|
15068
|
+
const returnedByAppId = new Map(response.dependencies.map((dep)=>[
|
|
15069
|
+
dep.app_id,
|
|
15070
|
+
dep
|
|
15071
|
+
]));
|
|
15072
|
+
const previousByAppId = new Map(previousCached.map((dep)=>[
|
|
15073
|
+
dep.app_id,
|
|
15074
|
+
dep
|
|
15075
|
+
]));
|
|
15076
|
+
const cachedDependencies = response.resolved_dependencies.map((dep)=>{
|
|
15077
|
+
const returned = returnedByAppId.get(dep.app_id);
|
|
15078
|
+
if (returned) return cachedManifestEntry(returned, returned.package_name);
|
|
15079
|
+
const previous = previousByAppId.get(dep.app_id);
|
|
15080
|
+
if (!previous) return;
|
|
15081
|
+
return cachedManifestEntry(dep, previous.package_name);
|
|
15082
|
+
}).filter((dep)=>void 0 !== dep);
|
|
15083
|
+
const newManifest = {
|
|
15084
|
+
version: DEPS_MANIFEST_VERSION,
|
|
15085
|
+
includeDocs,
|
|
15086
|
+
resolved_dependencies: response.resolved_dependencies,
|
|
15087
|
+
cached_dependencies: cachedDependencies
|
|
15088
|
+
};
|
|
15089
|
+
await promises_default().mkdir(depsDir(projectRoot), {
|
|
15090
|
+
recursive: true
|
|
15091
|
+
});
|
|
15092
|
+
await promises_default().writeFile(depsManifestPath(projectRoot), `${JSON.stringify(newManifest, null, 2)}\n`);
|
|
15093
|
+
}
|
|
15094
|
+
async function clearDepsCache(projectRoot) {
|
|
15095
|
+
await promises_default().rm(depsDir(projectRoot), {
|
|
15096
|
+
recursive: true,
|
|
15097
|
+
force: true
|
|
15098
|
+
});
|
|
15099
|
+
}
|
|
15100
|
+
async function getCachedPackages(projectRoot) {
|
|
15067
15101
|
try {
|
|
15068
|
-
const
|
|
15069
|
-
|
|
15070
|
-
|
|
15071
|
-
|
|
15072
|
-
|
|
15073
|
-
|
|
15074
|
-
const rename = renames.find((r)=>r.to === f.path);
|
|
15075
|
-
if (rename) stagedRenames.push({
|
|
15076
|
-
path: rename.to,
|
|
15077
|
-
type: "rename",
|
|
15078
|
-
from: rename.from
|
|
15079
|
-
});
|
|
15080
|
-
}
|
|
15081
|
-
const stagedRenamedFromPaths = new Set(stagedRenames.map((r)=>r.from));
|
|
15082
|
-
const stagedRenamedToPaths = new Set(stagedRenames.map((r)=>r.path));
|
|
15083
|
-
const changes = [];
|
|
15084
|
-
for (const f of stagedFiles){
|
|
15085
|
-
if ("R" !== f.index) {
|
|
15086
|
-
if (!stagedModeOnlyPaths.has(f.path)) {
|
|
15087
|
-
if (!(stagedRenamedFromPaths.has(f.path) || stagedRenamedToPaths.has(f.path))) if ("D" === f.index) changes.push({
|
|
15088
|
-
path: f.path,
|
|
15089
|
-
type: "unlink"
|
|
15090
|
-
});
|
|
15091
|
-
else if ("A" === f.index || "?" === f.index) changes.push({
|
|
15092
|
-
path: f.path,
|
|
15093
|
-
type: "add"
|
|
15094
|
-
});
|
|
15095
|
-
else changes.push({
|
|
15096
|
-
path: f.path,
|
|
15097
|
-
type: "change"
|
|
15098
|
-
});
|
|
15099
|
-
}
|
|
15100
|
-
}
|
|
15101
|
-
}
|
|
15102
|
-
changes.push(...stagedRenames);
|
|
15103
|
-
return changes;
|
|
15104
|
-
} catch (e) {
|
|
15105
|
-
throw errors_createGitError.commandFailed("status", e.message);
|
|
15102
|
+
const entries = await promises_default().readdir(depsDir(projectRoot), {
|
|
15103
|
+
withFileTypes: true
|
|
15104
|
+
});
|
|
15105
|
+
return entries.filter((entry)=>entry.isDirectory()).map((entry)=>entry.name);
|
|
15106
|
+
} catch {
|
|
15107
|
+
return [];
|
|
15106
15108
|
}
|
|
15107
15109
|
}
|
|
15108
15110
|
const external_chokidar_namespaceObject = require("chokidar");
|
|
@@ -19209,6 +19211,7 @@ print(json.dumps({"issues": issues}))
|
|
|
19209
19211
|
try {
|
|
19210
19212
|
const previousSubscriptions = this.wsClient?.getDependencySubscriptions() ?? [];
|
|
19211
19213
|
const { response, addedGitignoreEntry } = await refreshDependencyCache(this.repoPath, this.appId, this.anvilUrl, {
|
|
19214
|
+
username: this.username,
|
|
19212
19215
|
includeDocs: true
|
|
19213
19216
|
});
|
|
19214
19217
|
if (addedGitignoreEntry) logger_logger.info("Added /.anvil/ to .gitignore");
|
|
@@ -23058,7 +23061,7 @@ print(json.dumps({"issues": issues}))
|
|
|
23058
23061
|
}
|
|
23059
23062
|
function registerDepsCommand(program) {
|
|
23060
23063
|
const deps = program.command("deps").description("Manage app dependencies");
|
|
23061
|
-
deps.command("fetch").description("Fetch dependencies into .anvil/deps/").option("--commit <commit>", "Fetch deps at specific commit").option("--exclude-docs", "Exclude dependency docs from .anvil/deps/").action(async (options)=>{
|
|
23064
|
+
deps.command("fetch").description("Fetch dependencies for checkout HEAD into .anvil/deps/").option("--commit <commit>", "Fetch deps at a specific app commit instead of checkout HEAD").option("--exclude-docs", "Exclude dependency docs from .anvil/deps/").action(async (options)=>{
|
|
23062
23065
|
try {
|
|
23063
23066
|
const projectRoot = process.cwd();
|
|
23064
23067
|
const anvilUrl = resolveAnvilUrl();
|
package/dist/index.js
CHANGED
|
@@ -14414,263 +14414,6 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
|
|
|
14414
14414
|
return true;
|
|
14415
14415
|
}
|
|
14416
14416
|
}
|
|
14417
|
-
const ANVIL_DEPS_DIR = ".anvil/deps";
|
|
14418
|
-
const ANVIL_DEPS_MANIFEST = "manifest.json";
|
|
14419
|
-
const DEPS_MANIFEST_VERSION = 1;
|
|
14420
|
-
function formatFetchError(prefix, status, errorBody) {
|
|
14421
|
-
if (!errorBody) return `${prefix}: ${status}`;
|
|
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);
|
|
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();
|
|
14449
|
-
}
|
|
14450
|
-
async function refreshDependencyCache(projectRoot, appId, anvilUrl = resolveAnvilUrl(), options = {}) {
|
|
14451
|
-
const includeDocs = options.includeDocs ?? true;
|
|
14452
|
-
const knownDependencies = await getKnownDependenciesForCache(projectRoot, includeDocs);
|
|
14453
|
-
const response = await fetchAllDependencies(appId, anvilUrl, {
|
|
14454
|
-
commit: options.commit,
|
|
14455
|
-
includeDocs,
|
|
14456
|
-
knownDependencies
|
|
14457
|
-
});
|
|
14458
|
-
if (!response.resolved_dependencies.length) {
|
|
14459
|
-
await clearDepsCache(projectRoot);
|
|
14460
|
-
return {
|
|
14461
|
-
response,
|
|
14462
|
-
addedGitignoreEntry: false
|
|
14463
|
-
};
|
|
14464
|
-
}
|
|
14465
|
-
const addedGitignoreEntry = await ensureProjectGitignoreIgnoresAnvilDir(projectRoot);
|
|
14466
|
-
await writeAllDepsToCache(projectRoot, response, {
|
|
14467
|
-
includeDocs
|
|
14468
|
-
});
|
|
14469
|
-
return {
|
|
14470
|
-
response,
|
|
14471
|
-
addedGitignoreEntry
|
|
14472
|
-
};
|
|
14473
|
-
}
|
|
14474
|
-
function depsDir(projectRoot) {
|
|
14475
|
-
return external_path_default().join(projectRoot, ANVIL_DEPS_DIR);
|
|
14476
|
-
}
|
|
14477
|
-
function depsManifestPath(projectRoot) {
|
|
14478
|
-
return external_path_default().join(depsDir(projectRoot), ANVIL_DEPS_MANIFEST);
|
|
14479
|
-
}
|
|
14480
|
-
function isResolvedDependencyManifestEntry(value) {
|
|
14481
|
-
if (!value || "object" != typeof value) return false;
|
|
14482
|
-
const entry = value;
|
|
14483
|
-
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);
|
|
14484
|
-
}
|
|
14485
|
-
function isCachedDependencyManifestEntry(value) {
|
|
14486
|
-
if (!isResolvedDependencyManifestEntry(value)) return false;
|
|
14487
|
-
const entry = value;
|
|
14488
|
-
return "string" == typeof entry.package_name && entry.package_name.length > 0;
|
|
14489
|
-
}
|
|
14490
|
-
function isDepsCacheManifest(value) {
|
|
14491
|
-
if (!value || "object" != typeof value) return false;
|
|
14492
|
-
const manifest = value;
|
|
14493
|
-
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);
|
|
14494
|
-
}
|
|
14495
|
-
async function readDepsCacheManifest(projectRoot) {
|
|
14496
|
-
try {
|
|
14497
|
-
const raw = await promises_default().readFile(depsManifestPath(projectRoot), "utf-8");
|
|
14498
|
-
const parsed = JSON.parse(raw);
|
|
14499
|
-
return isDepsCacheManifest(parsed) ? parsed : void 0;
|
|
14500
|
-
} catch {
|
|
14501
|
-
return;
|
|
14502
|
-
}
|
|
14503
|
-
}
|
|
14504
|
-
async function getKnownDependenciesForCache(projectRoot, includeDocs) {
|
|
14505
|
-
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14506
|
-
if (!manifest || manifest.includeDocs !== includeDocs) return [];
|
|
14507
|
-
return manifest.resolved_dependencies.map(({ app_id, commit_id })=>({
|
|
14508
|
-
app_id,
|
|
14509
|
-
commit_id
|
|
14510
|
-
}));
|
|
14511
|
-
}
|
|
14512
|
-
function getDependencyWatchSubscriptionsFromManifest(manifest) {
|
|
14513
|
-
if (!manifest) return [];
|
|
14514
|
-
const cachedByAppId = new Map(manifest.cached_dependencies.map((dep)=>[
|
|
14515
|
-
dep.app_id,
|
|
14516
|
-
dep
|
|
14517
|
-
]));
|
|
14518
|
-
return manifest.resolved_dependencies.flatMap((dep)=>{
|
|
14519
|
-
if (!dep.branch) return [];
|
|
14520
|
-
return [
|
|
14521
|
-
{
|
|
14522
|
-
appId: dep.app_id,
|
|
14523
|
-
branch: dep.branch,
|
|
14524
|
-
packageName: cachedByAppId.get(dep.app_id)?.package_name
|
|
14525
|
-
}
|
|
14526
|
-
];
|
|
14527
|
-
});
|
|
14528
|
-
}
|
|
14529
|
-
function normalizeAnvilYamlDependenciesFromContent(content) {
|
|
14530
|
-
const parsed = external_js_yaml_default().load(content);
|
|
14531
|
-
if (!parsed || "object" != typeof parsed || !Array.isArray(parsed.dependencies)) return [];
|
|
14532
|
-
return normalizeAnvilYamlDependenciesValue(parsed.dependencies);
|
|
14533
|
-
}
|
|
14534
|
-
function normalizeAnvilYamlDependenciesValue(value) {
|
|
14535
|
-
if (!Array.isArray(value)) return [];
|
|
14536
|
-
return normalizeForComparison(value);
|
|
14537
|
-
}
|
|
14538
|
-
async function readAnvilYamlDependencies(projectRoot) {
|
|
14539
|
-
try {
|
|
14540
|
-
const content = await promises_default().readFile(external_path_default().join(projectRoot, "anvil.yaml"), "utf-8");
|
|
14541
|
-
return normalizeAnvilYamlDependenciesFromContent(content);
|
|
14542
|
-
} catch {
|
|
14543
|
-
return [];
|
|
14544
|
-
}
|
|
14545
|
-
}
|
|
14546
|
-
function anvilYamlDependenciesEqual(left, right) {
|
|
14547
|
-
return deepEqual(left, right);
|
|
14548
|
-
}
|
|
14549
|
-
function normalizeForComparison(value) {
|
|
14550
|
-
if (Array.isArray(value)) return value.map(normalizeForComparison);
|
|
14551
|
-
if (value && "object" == typeof value) return Object.fromEntries(Object.entries(value).sort(([left], [right])=>left.localeCompare(right)).map(([key, entryValue])=>[
|
|
14552
|
-
key,
|
|
14553
|
-
normalizeForComparison(entryValue)
|
|
14554
|
-
]));
|
|
14555
|
-
return value;
|
|
14556
|
-
}
|
|
14557
|
-
function cachedManifestEntry(dep, packageName) {
|
|
14558
|
-
return {
|
|
14559
|
-
app_id: dep.app_id,
|
|
14560
|
-
commit_id: dep.commit_id,
|
|
14561
|
-
...dep.branch ? {
|
|
14562
|
-
branch: dep.branch
|
|
14563
|
-
} : {},
|
|
14564
|
-
package_name: packageName
|
|
14565
|
-
};
|
|
14566
|
-
}
|
|
14567
|
-
function safeDependencyPath(filePath, kind) {
|
|
14568
|
-
const normalizedPath = external_path_default().normalize(filePath);
|
|
14569
|
-
if (external_path_default().isAbsolute(normalizedPath) || normalizedPath.startsWith("..")) throw new Error(`Invalid dependency ${kind} path: ${filePath}`);
|
|
14570
|
-
return normalizedPath;
|
|
14571
|
-
}
|
|
14572
|
-
async function writeDepToCache(projectRoot, dep) {
|
|
14573
|
-
const depDir = external_path_default().join(projectRoot, ANVIL_DEPS_DIR, dep.package_name);
|
|
14574
|
-
await promises_default().rm(depDir, {
|
|
14575
|
-
recursive: true,
|
|
14576
|
-
force: true
|
|
14577
|
-
});
|
|
14578
|
-
await promises_default().mkdir(external_path_default().join(depDir, "client_code"), {
|
|
14579
|
-
recursive: true
|
|
14580
|
-
});
|
|
14581
|
-
await promises_default().mkdir(external_path_default().join(depDir, "server_code"), {
|
|
14582
|
-
recursive: true
|
|
14583
|
-
});
|
|
14584
|
-
await promises_default().writeFile(external_path_default().join(depDir, "anvil.yaml"), external_js_yaml_default().dump({
|
|
14585
|
-
package_name: dep.package_name
|
|
14586
|
-
}));
|
|
14587
|
-
for (const mod of dep.modules ?? [])if (mod.is_package) {
|
|
14588
|
-
const modDir = external_path_default().join(depDir, "client_code", mod.name);
|
|
14589
|
-
await promises_default().mkdir(modDir, {
|
|
14590
|
-
recursive: true
|
|
14591
|
-
});
|
|
14592
|
-
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
14593
|
-
} else await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${mod.name}.py`), mod.code);
|
|
14594
|
-
for (const form of dep.forms ?? []){
|
|
14595
|
-
const { code, class_name, is_package, ...formTemplate } = form;
|
|
14596
|
-
if (is_package) {
|
|
14597
|
-
const formDir = external_path_default().join(depDir, "client_code", class_name);
|
|
14598
|
-
await promises_default().mkdir(formDir, {
|
|
14599
|
-
recursive: true
|
|
14600
|
-
});
|
|
14601
|
-
await promises_default().writeFile(external_path_default().join(formDir, "__init__.py"), code);
|
|
14602
|
-
await promises_default().writeFile(external_path_default().join(formDir, "form_template.yaml"), external_js_yaml_default().dump(formTemplate));
|
|
14603
|
-
} else {
|
|
14604
|
-
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.py`), code);
|
|
14605
|
-
await promises_default().writeFile(external_path_default().join(depDir, "client_code", `${class_name}.yaml`), external_js_yaml_default().dump(formTemplate));
|
|
14606
|
-
}
|
|
14607
|
-
}
|
|
14608
|
-
for (const mod of dep.server_modules ?? [])if (mod.is_package) {
|
|
14609
|
-
const modDir = external_path_default().join(depDir, "server_code", mod.name);
|
|
14610
|
-
await promises_default().mkdir(modDir, {
|
|
14611
|
-
recursive: true
|
|
14612
|
-
});
|
|
14613
|
-
await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
|
|
14614
|
-
} else await promises_default().writeFile(external_path_default().join(depDir, "server_code", `${mod.name}.py`), mod.code);
|
|
14615
|
-
for (const asset of dep.assets ?? []){
|
|
14616
|
-
const targetPath = external_path_default().join(depDir, "theme", "assets", safeDependencyPath(asset.name, "asset"));
|
|
14617
|
-
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
14618
|
-
recursive: true
|
|
14619
|
-
});
|
|
14620
|
-
await promises_default().writeFile(targetPath, Buffer.from(asset.content, "base64"));
|
|
14621
|
-
}
|
|
14622
|
-
for (const doc of dep.docs ?? []){
|
|
14623
|
-
const targetPath = external_path_default().join(depDir, safeDependencyPath(doc.path, "doc"));
|
|
14624
|
-
await promises_default().mkdir(external_path_default().dirname(targetPath), {
|
|
14625
|
-
recursive: true
|
|
14626
|
-
});
|
|
14627
|
-
await promises_default().writeFile(targetPath, doc.content);
|
|
14628
|
-
}
|
|
14629
|
-
}
|
|
14630
|
-
async function writeAllDepsToCache(projectRoot, response, options = {}) {
|
|
14631
|
-
const includeDocs = options.includeDocs ?? true;
|
|
14632
|
-
const manifest = await readDepsCacheManifest(projectRoot);
|
|
14633
|
-
const canReuseExistingCache = manifest?.includeDocs === includeDocs;
|
|
14634
|
-
if (!canReuseExistingCache) await clearDepsCache(projectRoot);
|
|
14635
|
-
const previousCached = canReuseExistingCache ? manifest.cached_dependencies : [];
|
|
14636
|
-
const resolvedAppIds = new Set(response.resolved_dependencies.map((dep)=>dep.app_id));
|
|
14637
|
-
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), {
|
|
14638
|
-
recursive: true,
|
|
14639
|
-
force: true
|
|
14640
|
-
});
|
|
14641
|
-
for (const dep of response.dependencies)await writeDepToCache(projectRoot, dep);
|
|
14642
|
-
const returnedByAppId = new Map(response.dependencies.map((dep)=>[
|
|
14643
|
-
dep.app_id,
|
|
14644
|
-
dep
|
|
14645
|
-
]));
|
|
14646
|
-
const previousByAppId = new Map(previousCached.map((dep)=>[
|
|
14647
|
-
dep.app_id,
|
|
14648
|
-
dep
|
|
14649
|
-
]));
|
|
14650
|
-
const cachedDependencies = response.resolved_dependencies.map((dep)=>{
|
|
14651
|
-
const returned = returnedByAppId.get(dep.app_id);
|
|
14652
|
-
if (returned) return cachedManifestEntry(returned, returned.package_name);
|
|
14653
|
-
const previous = previousByAppId.get(dep.app_id);
|
|
14654
|
-
if (!previous) return;
|
|
14655
|
-
return cachedManifestEntry(dep, previous.package_name);
|
|
14656
|
-
}).filter((dep)=>void 0 !== dep);
|
|
14657
|
-
const newManifest = {
|
|
14658
|
-
version: DEPS_MANIFEST_VERSION,
|
|
14659
|
-
includeDocs,
|
|
14660
|
-
resolved_dependencies: response.resolved_dependencies,
|
|
14661
|
-
cached_dependencies: cachedDependencies
|
|
14662
|
-
};
|
|
14663
|
-
await promises_default().mkdir(depsDir(projectRoot), {
|
|
14664
|
-
recursive: true
|
|
14665
|
-
});
|
|
14666
|
-
await promises_default().writeFile(depsManifestPath(projectRoot), `${JSON.stringify(newManifest, null, 2)}\n`);
|
|
14667
|
-
}
|
|
14668
|
-
async function clearDepsCache(projectRoot) {
|
|
14669
|
-
await promises_default().rm(depsDir(projectRoot), {
|
|
14670
|
-
recursive: true,
|
|
14671
|
-
force: true
|
|
14672
|
-
});
|
|
14673
|
-
}
|
|
14674
14417
|
const external_timers_promises_namespaceObject = require("timers/promises");
|
|
14675
14418
|
const WANT_NOT_VALID_RE = /\bwant\s+[0-9a-f]{7,40}\s+not valid\b/i;
|
|
14676
14419
|
const FETCH_RETRY_DELAY_MS = 200;
|
|
@@ -15121,6 +14864,265 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
|
|
|
15121
14864
|
throw errors_createGitError.commandFailed("status", e.message);
|
|
15122
14865
|
}
|
|
15123
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
|
+
}
|
|
15124
15126
|
const external_chokidar_namespaceObject = require("chokidar");
|
|
15125
15127
|
var external_chokidar_default = /*#__PURE__*/ __webpack_require__.n(external_chokidar_namespaceObject);
|
|
15126
15128
|
class FileWatcher extends Emitter {
|
|
@@ -19225,6 +19227,7 @@ print(json.dumps({"issues": issues}))
|
|
|
19225
19227
|
try {
|
|
19226
19228
|
const previousSubscriptions = this.wsClient?.getDependencySubscriptions() ?? [];
|
|
19227
19229
|
const { response, addedGitignoreEntry } = await refreshDependencyCache(this.repoPath, this.appId, this.anvilUrl, {
|
|
19230
|
+
username: this.username,
|
|
19228
19231
|
includeDocs: true
|
|
19229
19232
|
});
|
|
19230
19233
|
if (addedGitignoreEntry) logger_logger.info("Added /.anvil/ to .gitignore");
|
package/dist/services/deps.d.ts
CHANGED
|
@@ -8,11 +8,13 @@ export interface DependencyAssetFile {
|
|
|
8
8
|
content: string;
|
|
9
9
|
}
|
|
10
10
|
export interface FetchAllDependenciesOptions {
|
|
11
|
+
username?: string;
|
|
11
12
|
commit?: string;
|
|
12
13
|
includeDocs?: boolean;
|
|
13
14
|
knownDependencies?: ResolvedDependencyManifestEntry[];
|
|
14
15
|
}
|
|
15
16
|
export interface RefreshDependencyCacheOptions {
|
|
17
|
+
username?: string;
|
|
16
18
|
commit?: string;
|
|
17
19
|
includeDocs?: boolean;
|
|
18
20
|
}
|
|
@@ -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":"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"}
|