@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/index.js CHANGED
@@ -14414,323 +14414,65 @@ 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, 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
- 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
- username: options.username,
14455
- commit: options.commit,
14456
- includeDocs,
14457
- knownDependencies
14458
- });
14459
- if (!response.resolved_dependencies.length) {
14460
- await clearDepsCache(projectRoot);
14461
- return {
14462
- response,
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
- const addedGitignoreEntry = await ensureProjectGitignoreIgnoresAnvilDir(projectRoot);
14467
- await writeAllDepsToCache(projectRoot, response, {
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
- async function getKnownDependenciesForCache(projectRoot, includeDocs) {
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
- function anvilYamlDependenciesEqual(left, right) {
14548
- return deepEqual(left, right);
14549
- }
14550
- function normalizeForComparison(value) {
14551
- if (Array.isArray(value)) return value.map(normalizeForComparison);
14552
- if (value && "object" == typeof value) return Object.fromEntries(Object.entries(value).sort(([left], [right])=>left.localeCompare(right)).map(([key, entryValue])=>[
14553
- key,
14554
- normalizeForComparison(entryValue)
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
- for (const mod of dep.server_modules ?? [])if (mod.is_package) {
14610
- const modDir = external_path_default().join(depDir, "server_code", mod.name);
14611
- await promises_default().mkdir(modDir, {
14612
- recursive: true
14613
- });
14614
- await promises_default().writeFile(external_path_default().join(modDir, "__init__.py"), mod.code);
14615
- } else await promises_default().writeFile(external_path_default().join(depDir, "server_code", `${mod.name}.py`), mod.code);
14616
- for (const asset of dep.assets ?? []){
14617
- const targetPath = external_path_default().join(depDir, "theme", "assets", safeDependencyPath(asset.name, "asset"));
14618
- await promises_default().mkdir(external_path_default().dirname(targetPath), {
14619
- recursive: true
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
- for (const doc of dep.docs ?? []){
14624
- const targetPath = external_path_default().join(depDir, safeDependencyPath(doc.path, "doc"));
14625
- await promises_default().mkdir(external_path_default().dirname(targetPath), {
14626
- recursive: true
14627
- });
14628
- await promises_default().writeFile(targetPath, doc.content);
14629
- }
14630
- }
14631
- async function writeAllDepsToCache(projectRoot, response, options = {}) {
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":"AAcA,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,CAkBvC;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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvil-works/anvil-cli",
3
- "version": "0.7.6",
3
+ "version": "0.7.7",
4
4
  "description": "CLI tool for developing Anvil apps locally",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/api.d.ts",