@anvil-works/anvil-cli 0.5.13 → 0.5.15
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/CLILogger.d.ts +54 -0
- package/dist/CLILogger.d.ts.map +1 -0
- package/dist/EditorYaml.d.ts +57 -0
- package/dist/EditorYaml.d.ts.map +1 -0
- package/dist/Emitter.d.ts +32 -0
- package/dist/Emitter.d.ts.map +1 -0
- package/dist/SavePathRouter.d.ts +56 -0
- package/dist/SavePathRouter.d.ts.map +1 -0
- package/dist/WatchSession.d.ts +112 -0
- package/dist/WatchSession.d.ts.map +1 -0
- package/dist/api.d.ts +35 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2092 -2092
- package/dist/commands/checkout-picker.d.ts +25 -0
- package/dist/commands/checkout-picker.d.ts.map +1 -0
- package/dist/commands/checkout.d.ts +85 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/config.d.ts +30 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/configure.d.ts +13 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/gitCredential.d.ts +21 -0
- package/dist/commands/gitCredential.d.ts.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/logout.d.ts +5 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/version.d.ts +10 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/watch.d.ts +99 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/config.d.ts +56 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/errors.d.ts +151 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/globalConfig.d.ts +23 -0
- package/dist/globalConfig.d.ts.map +1 -0
- package/dist/index.js +41657 -17604
- package/dist/logger.d.ts +67 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/oauthHtml.d.ts +3 -0
- package/dist/oauthHtml.d.ts.map +1 -0
- package/dist/program.d.ts +5 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/services/anvil-api.d.ts +124 -0
- package/dist/services/anvil-api.d.ts.map +1 -0
- package/dist/services/auth.d.ts +69 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/git-auth.d.ts +19 -0
- package/dist/services/git-auth.d.ts.map +1 -0
- package/dist/services/git.d.ts +174 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/keychain.d.ts +9 -0
- package/dist/services/keychain.d.ts.map +1 -0
- package/dist/services/oauth-login.d.ts +46 -0
- package/dist/services/oauth-login.d.ts.map +1 -0
- package/dist/services/path-open.d.ts +8 -0
- package/dist/services/path-open.d.ts.map +1 -0
- package/dist/services/token-store.d.ts +37 -0
- package/dist/services/token-store.d.ts.map +1 -0
- package/dist/services/validation.d.ts +23 -0
- package/dist/services/validation.d.ts.map +1 -0
- package/dist/utils.d.ts +34 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/validators.d.ts +9 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/watch/ConflictResolver.d.ts +54 -0
- package/dist/watch/ConflictResolver.d.ts.map +1 -0
- package/dist/watch/FileWatcher.d.ts +68 -0
- package/dist/watch/FileWatcher.d.ts.map +1 -0
- package/dist/watch/SaveProcessor.d.ts +97 -0
- package/dist/watch/SaveProcessor.d.ts.map +1 -0
- package/dist/watch/SyncManager.d.ts +49 -0
- package/dist/watch/SyncManager.d.ts.map +1 -0
- package/dist/watch/WebSocketClient.d.ts +98 -0
- package/dist/watch/WebSocketClient.d.ts.map +1 -0
- package/dist/watch/index.d.ts +33 -0
- package/dist/watch/index.d.ts.map +1 -0
- package/package.json +15 -2
- package/scripts/install/install.sh +4 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SimpleGit } from "simple-git";
|
|
2
|
+
import { AuthError, GitError, NetworkError, ValidationError } from "../errors";
|
|
3
|
+
import { BranchSyncStatus } from "./git";
|
|
4
|
+
export type { BranchSyncStatus };
|
|
5
|
+
export interface AnvilAppInfo {
|
|
6
|
+
appName?: string;
|
|
7
|
+
}
|
|
8
|
+
export type ValidationServiceError = ValidationError | GitError | AuthError | NetworkError;
|
|
9
|
+
/**
|
|
10
|
+
* Validate that a directory is a valid Anvil app (has anvil.yaml and git).
|
|
11
|
+
* Returns app info on success.
|
|
12
|
+
* @throws {ValidationError} if validation fails
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateAnvilApp(repoPath: string): Promise<AnvilAppInfo>;
|
|
15
|
+
/**
|
|
16
|
+
* Validate branch sync status with Anvil server.
|
|
17
|
+
* Returns:
|
|
18
|
+
* - BranchSyncStatus if branch is out of sync (behind/ahead/diverged)
|
|
19
|
+
* - null if branch is in sync
|
|
20
|
+
* @throws {ValidationServiceError} on failure
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateBranchSyncStatus(git: SimpleGit, branchName: string, appId: string, anvilUrl: string, username?: string): Promise<BranchSyncStatus | null>;
|
|
23
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/services/validation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACH,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,eAAe,EAIlB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAGzC,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAMjC,MAAM,WAAW,YAAY;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAM3F;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwB9E;AAMD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC1C,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAmBlC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize line endings to LF (Unix-style)
|
|
3
|
+
* Converts Windows CRLF (\r\n) to LF (\n)
|
|
4
|
+
*/
|
|
5
|
+
export declare function normalizeLineEndings(content: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Convert a name to a valid Python identifier
|
|
8
|
+
* - Replace invalid characters with underscores
|
|
9
|
+
* - Prepend underscore if starts with a number
|
|
10
|
+
*/
|
|
11
|
+
export declare function pythonifyName(name: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Extract Python module/class name from a relative file path
|
|
14
|
+
* Handles both packages (__init__.py) and regular modules
|
|
15
|
+
* @param relativePath - File path like "client_code/foo/bar.py" or "client_code/foo/__init__.py"
|
|
16
|
+
* @param skipParts - Number of path parts to skip from the start (default: 1 to skip "client_code"/"server_code")
|
|
17
|
+
* @returns Python-ified module name like "foo.bar" or "foo" (for packages)
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractPythonName(relativePath: string, skipParts?: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Deep equality check (like lodash.isEqual)
|
|
22
|
+
* Recursively compares two values for structural equality
|
|
23
|
+
*/
|
|
24
|
+
export declare function deepEqual(a: any, b: any): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Parse HTML content with optional YAML frontmatter.
|
|
27
|
+
* Format: ---\n<yaml>\n---\n<html>
|
|
28
|
+
* Returns parsed frontmatter object (or {}) and HTML body.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseHtmlWithFrontmatter(htmlContent: string): {
|
|
31
|
+
frontmatter: any;
|
|
32
|
+
html: string;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM,CAOrF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CAoBjD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYhG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates form_template.yaml structure
|
|
3
|
+
*/
|
|
4
|
+
export declare function validateFormTemplate(yamlContent: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Validates anvil.yaml structure
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateAnvilYaml(yamlContent: string): boolean;
|
|
9
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAuDA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAkBjE;AAkDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAwB9D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { GitService } from "../services/git";
|
|
2
|
+
export interface FileChange {
|
|
3
|
+
path: string;
|
|
4
|
+
type: "change" | "add" | "unlink" | "rename";
|
|
5
|
+
from?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ConflictResolutionResult {
|
|
8
|
+
localOnlyChanges: FileChange[];
|
|
9
|
+
conflicts: FileChange[];
|
|
10
|
+
remoteOnlyChanges: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Detect which files changed remotely between two commits.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectRemoteChanges(gitService: GitService, oldCommitId: string, newCommitId: string): Promise<Set<string>>;
|
|
16
|
+
/**
|
|
17
|
+
* Categorize changes into local-only, remote-only, and conflicts.
|
|
18
|
+
*/
|
|
19
|
+
export declare function categorizeChanges(newChanges: FileChange[], locallyChangedFiles: Set<string>, remoteChangedFiles: Set<string>): ConflictResolutionResult;
|
|
20
|
+
/**
|
|
21
|
+
* Accept remote changes by checking out files from HEAD.
|
|
22
|
+
*/
|
|
23
|
+
export declare function acceptRemoteChanges(gitService: GitService, remoteOnlyChanges: string[]): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Build a set of locally changed files from git status.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildLocalChangesSet(status: {
|
|
28
|
+
modified: string[];
|
|
29
|
+
notAdded: string[];
|
|
30
|
+
created: string[];
|
|
31
|
+
deleted: string[];
|
|
32
|
+
}): Set<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Extract changes from git status.
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractChangesFromStatus(status: {
|
|
37
|
+
modified: string[];
|
|
38
|
+
notAdded: string[];
|
|
39
|
+
created: string[];
|
|
40
|
+
deleted: string[];
|
|
41
|
+
renamed: Array<{
|
|
42
|
+
from: string;
|
|
43
|
+
to: string;
|
|
44
|
+
}>;
|
|
45
|
+
}): FileChange[];
|
|
46
|
+
/**
|
|
47
|
+
* Log conflict resolution results.
|
|
48
|
+
*/
|
|
49
|
+
export declare function logConflictResolution(result: ConflictResolutionResult): void;
|
|
50
|
+
/**
|
|
51
|
+
* Delete files that were removed on Anvil but exist locally as untracked.
|
|
52
|
+
*/
|
|
53
|
+
export declare function deleteFilesRemovedOnAnvil(gitService: GitService, unstagedFiles: string[], remotelyChangedFiles: Set<string>): Promise<string[]>;
|
|
54
|
+
//# sourceMappingURL=ConflictResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictResolver.d.ts","sourceRoot":"","sources":["../../src/watch/ConflictResolver.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACrC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAQtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,UAAU,EAAE,UAAU,EAAE,EACxB,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,EAChC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,wBAAwB,CAyB1B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,GAAG,CAAC,MAAM,CAAC,CAEd;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,GAAG,UAAU,EAAE,CAkBf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAc5E;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC3C,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,EAAE,EACvB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BnB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Emitter } from "../Emitter";
|
|
2
|
+
export interface FileWatcherEvents {
|
|
3
|
+
"file-change": {
|
|
4
|
+
event: string;
|
|
5
|
+
path: string;
|
|
6
|
+
relativePath: string;
|
|
7
|
+
};
|
|
8
|
+
"branch-change": {
|
|
9
|
+
newBranch: string;
|
|
10
|
+
};
|
|
11
|
+
"index-change": void;
|
|
12
|
+
error: {
|
|
13
|
+
error: Error;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface FileWatcherOptions {
|
|
17
|
+
repoPath: string;
|
|
18
|
+
gitDir: string;
|
|
19
|
+
stagedOnly?: boolean;
|
|
20
|
+
getCurrentBranch: () => Promise<string>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* FileWatcher class for watching file and git changes.
|
|
24
|
+
*/
|
|
25
|
+
export declare class FileWatcher extends Emitter<FileWatcherEvents> {
|
|
26
|
+
private repoPath;
|
|
27
|
+
private gitDir;
|
|
28
|
+
private stagedOnly;
|
|
29
|
+
private getCurrentBranch;
|
|
30
|
+
private headWatcher;
|
|
31
|
+
private fileWatcher;
|
|
32
|
+
private currentBranch;
|
|
33
|
+
private sessionId;
|
|
34
|
+
constructor(options: FileWatcherOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Initialize and start watching.
|
|
37
|
+
*/
|
|
38
|
+
start(currentBranch: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Start watching .git/HEAD for branch changes.
|
|
41
|
+
*/
|
|
42
|
+
private startHeadWatcher;
|
|
43
|
+
/**
|
|
44
|
+
* Start watching .git/index for staged changes (staged-only mode).
|
|
45
|
+
*/
|
|
46
|
+
private startIndexWatcher;
|
|
47
|
+
/**
|
|
48
|
+
* Start watching repository files (normal mode).
|
|
49
|
+
*/
|
|
50
|
+
private startFileWatcher;
|
|
51
|
+
/**
|
|
52
|
+
* Get the current branch being watched.
|
|
53
|
+
*/
|
|
54
|
+
getCurrentWatchedBranch(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Update the current branch (after restart).
|
|
57
|
+
*/
|
|
58
|
+
setCurrentBranch(branch: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Stop watching and cleanup.
|
|
61
|
+
*/
|
|
62
|
+
cleanup(): void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a FileWatcher instance.
|
|
66
|
+
*/
|
|
67
|
+
export declare function createFileWatcher(options: FileWatcherOptions): FileWatcher;
|
|
68
|
+
//# sourceMappingURL=FileWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileWatcher.d.ts","sourceRoot":"","sources":["../../src/watch/FileWatcher.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,MAAM,WAAW,iBAAiB;IAC9B,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,eAAe,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IACvD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,kBAAkB;IASvC;;OAEG;IACG,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmCzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACH,uBAAuB,IAAI,MAAM;IAIjC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,OAAO,IAAI,IAAI;CAiBlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAE1E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { EditorYamlManager } from "../EditorYaml";
|
|
2
|
+
import { Emitter } from "../Emitter";
|
|
3
|
+
import { GitService } from "../services/git";
|
|
4
|
+
import type { FileChange } from "./ConflictResolver";
|
|
5
|
+
export interface SaveProcessorEvents {
|
|
6
|
+
"save-started": {
|
|
7
|
+
fileCount: number;
|
|
8
|
+
};
|
|
9
|
+
"save-succeeded": {
|
|
10
|
+
newCommitId: string;
|
|
11
|
+
fileCount: number;
|
|
12
|
+
};
|
|
13
|
+
"save-failed": {
|
|
14
|
+
error: string;
|
|
15
|
+
fileCount: number;
|
|
16
|
+
};
|
|
17
|
+
"save-complete": {
|
|
18
|
+
newCommitId: string;
|
|
19
|
+
fileCount: number;
|
|
20
|
+
};
|
|
21
|
+
"validation-failed": {
|
|
22
|
+
reason: string;
|
|
23
|
+
currentBranch: string;
|
|
24
|
+
};
|
|
25
|
+
"sync-conflict": {
|
|
26
|
+
retryAttempt: number;
|
|
27
|
+
maxRetries: number;
|
|
28
|
+
reason: string;
|
|
29
|
+
};
|
|
30
|
+
"max-retries-exceeded": {
|
|
31
|
+
retries: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export interface SaveProcessorConfig {
|
|
35
|
+
repoPath: string;
|
|
36
|
+
appId: string;
|
|
37
|
+
anvilUrl: string;
|
|
38
|
+
editSession: string;
|
|
39
|
+
stagedOnly: boolean;
|
|
40
|
+
username?: string;
|
|
41
|
+
gitService: GitService;
|
|
42
|
+
editorYaml: EditorYamlManager;
|
|
43
|
+
getAuthToken: () => string;
|
|
44
|
+
setAuthToken: (token: string) => void;
|
|
45
|
+
getCurrentBranch: () => string;
|
|
46
|
+
getCommitId: () => string;
|
|
47
|
+
setCommitId: (commitId: string) => void;
|
|
48
|
+
isSettlePeriodOver: () => boolean;
|
|
49
|
+
getRemainingSettleTime: () => number;
|
|
50
|
+
isCleanedUp: () => boolean;
|
|
51
|
+
isPaused: () => boolean;
|
|
52
|
+
}
|
|
53
|
+
type SyncCallback = (filePaths: Set<string>) => Promise<{
|
|
54
|
+
localOnlyChanges: FileChange[];
|
|
55
|
+
conflicts: FileChange[];
|
|
56
|
+
}>;
|
|
57
|
+
type PostSaveCallback = () => Promise<void>;
|
|
58
|
+
export declare class SaveProcessor extends Emitter<SaveProcessorEvents> {
|
|
59
|
+
private hasPendingChanges;
|
|
60
|
+
private debounceTimer;
|
|
61
|
+
private saveSequence;
|
|
62
|
+
private readonly SAVE_DEBOUNCE_MS;
|
|
63
|
+
private readonly MAX_RETRIES;
|
|
64
|
+
private config;
|
|
65
|
+
private syncCallback;
|
|
66
|
+
private postSaveCallback;
|
|
67
|
+
constructor(config: SaveProcessorConfig);
|
|
68
|
+
setSyncCallback(callback: SyncCallback): void;
|
|
69
|
+
setPostSaveCallback(callback: PostSaveCallback): void;
|
|
70
|
+
queueSave(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Force an immediate save.
|
|
73
|
+
* @throws {SaveError | AuthError | GitError | NetworkError} on failure
|
|
74
|
+
*/
|
|
75
|
+
forceSave(): Promise<void>;
|
|
76
|
+
cleanup(): void;
|
|
77
|
+
private processSaveBatchWithEvents;
|
|
78
|
+
private getSuccessMessage;
|
|
79
|
+
private processSaveBatch;
|
|
80
|
+
private getStagedChanges;
|
|
81
|
+
private getUnstagedChanges;
|
|
82
|
+
private detectUnstagedRenames;
|
|
83
|
+
private getHeadAnvilYaml;
|
|
84
|
+
private processBatchedChanges;
|
|
85
|
+
private logSaveResult;
|
|
86
|
+
private sendSavesToAnvil;
|
|
87
|
+
private sanitizePayload;
|
|
88
|
+
private handleAuthError;
|
|
89
|
+
private handleConflict;
|
|
90
|
+
private handleSuccess;
|
|
91
|
+
rerouteChanges(changes: FileChange[]): Promise<{
|
|
92
|
+
newSaveArray: Array<[any[], any]>;
|
|
93
|
+
newFilePaths: string[];
|
|
94
|
+
}>;
|
|
95
|
+
}
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=SaveProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveProcessor.d.ts","sourceRoot":"","sources":["../../src/watch/SaveProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { EditorYamlManager } from "../EditorYaml";
|
|
2
|
+
import { Emitter } from "../Emitter";
|
|
3
|
+
import { GitService } from "../services/git";
|
|
4
|
+
import { type FileChange } from "./ConflictResolver";
|
|
5
|
+
export interface SyncManagerEvents {
|
|
6
|
+
"sync-started": {};
|
|
7
|
+
"sync-completed": {
|
|
8
|
+
localOnlyChanges: number;
|
|
9
|
+
conflicts: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface SyncManagerConfig {
|
|
13
|
+
repoPath: string;
|
|
14
|
+
appId: string;
|
|
15
|
+
anvilUrl: string;
|
|
16
|
+
username?: string;
|
|
17
|
+
gitService: GitService;
|
|
18
|
+
editorYaml: EditorYamlManager;
|
|
19
|
+
getAuthToken: () => string;
|
|
20
|
+
setAuthToken: (token: string) => void;
|
|
21
|
+
getCurrentBranch: () => string;
|
|
22
|
+
getCommitId: () => string;
|
|
23
|
+
setCommitId: (commitId: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare class SyncManager extends Emitter<SyncManagerEvents> {
|
|
26
|
+
private config;
|
|
27
|
+
private syncInProgress;
|
|
28
|
+
constructor(config: SyncManagerConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Syncs remote changes while preserving local modifications.
|
|
31
|
+
* Handles three-way conflict resolution: remote-only, local-only, and true conflicts.
|
|
32
|
+
*
|
|
33
|
+
* @param knownLocalChanges - Optional set of files known to be changed locally
|
|
34
|
+
* @returns Object containing localOnlyChanges and conflicts arrays
|
|
35
|
+
* @throws {AuthError | GitError} on failure
|
|
36
|
+
*/
|
|
37
|
+
syncRemoteChanges(knownLocalChanges?: Set<string>): Promise<{
|
|
38
|
+
localOnlyChanges: FileChange[];
|
|
39
|
+
conflicts: FileChange[];
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Fetch latest from Anvil and reset the working directory.
|
|
43
|
+
* @throws {AuthError | GitError} on failure
|
|
44
|
+
*/
|
|
45
|
+
fetchAndResetFromAnvil(): Promise<void>;
|
|
46
|
+
private deleteFilesRemovedOnAnvilLocally;
|
|
47
|
+
private discardFormattingOnlyYamlChanges;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=SyncManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncManager.d.ts","sourceRoot":"","sources":["../../src/watch/SyncManager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAQH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAC9B,cAAc,EAAE,EAAE,CAAC;IACnB,gBAAgB,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,qBAAa,WAAY,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IACvD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE,iBAAiB;IAKrC;;;;;;;OAOG;IACG,iBAAiB,CACnB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC;QAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;QAAC,SAAS,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IA2CvE;;;OAGG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;YAoB/B,gCAAgC;YAUhC,gCAAgC;CAkGjD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Emitter } from "../Emitter";
|
|
2
|
+
export interface WebSocketClientEvents {
|
|
3
|
+
"repo-update": {
|
|
4
|
+
ref: string;
|
|
5
|
+
commitHash: string;
|
|
6
|
+
saveSeq?: {
|
|
7
|
+
session: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
"repo-invalidate": void;
|
|
11
|
+
connected: void;
|
|
12
|
+
disconnected: {
|
|
13
|
+
code: number;
|
|
14
|
+
reason: string;
|
|
15
|
+
};
|
|
16
|
+
error: {
|
|
17
|
+
error: Error;
|
|
18
|
+
};
|
|
19
|
+
"auth-failed": void;
|
|
20
|
+
}
|
|
21
|
+
export interface WebSocketClientOptions {
|
|
22
|
+
appId: string;
|
|
23
|
+
anvilUrl: string;
|
|
24
|
+
authToken: string;
|
|
25
|
+
currentBranch: string;
|
|
26
|
+
editSession: string;
|
|
27
|
+
username?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* WebSocketClient for real-time Anvil communication.
|
|
31
|
+
*/
|
|
32
|
+
export declare class WebSocketClient extends Emitter<WebSocketClientEvents> {
|
|
33
|
+
private ws;
|
|
34
|
+
private appId;
|
|
35
|
+
private anvilUrl;
|
|
36
|
+
private authToken;
|
|
37
|
+
private currentBranch;
|
|
38
|
+
private editSession;
|
|
39
|
+
private username?;
|
|
40
|
+
private reconnectAttempts;
|
|
41
|
+
private connectAttempts;
|
|
42
|
+
private reconnectTimer;
|
|
43
|
+
private heartbeatTimer;
|
|
44
|
+
private pongTimeoutTimer;
|
|
45
|
+
private reconnectDelayMs;
|
|
46
|
+
private isClosing;
|
|
47
|
+
private sessionId;
|
|
48
|
+
private lastDisconnectSummary;
|
|
49
|
+
private readonly RECONNECT_DELAY_BASE_MS;
|
|
50
|
+
private readonly RECONNECT_DELAY_MAX_MS;
|
|
51
|
+
private readonly HEARTBEAT_INTERVAL_MS;
|
|
52
|
+
private readonly HEARTBEAT_TIMEOUT_MS;
|
|
53
|
+
constructor(options: WebSocketClientOptions);
|
|
54
|
+
/**
|
|
55
|
+
* Connect to the WebSocket server.
|
|
56
|
+
*/
|
|
57
|
+
connect(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Handle incoming WebSocket message.
|
|
60
|
+
*/
|
|
61
|
+
private handleMessage;
|
|
62
|
+
/**
|
|
63
|
+
* Update the auth token (after refresh).
|
|
64
|
+
*/
|
|
65
|
+
updateAuthToken(token: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Update the current branch (after branch change).
|
|
68
|
+
*/
|
|
69
|
+
updateBranch(branch: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get the edit session ID.
|
|
72
|
+
*/
|
|
73
|
+
getEditSession(): string;
|
|
74
|
+
/**
|
|
75
|
+
* Close the WebSocket connection.
|
|
76
|
+
*/
|
|
77
|
+
close(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Check if the WebSocket is connected.
|
|
80
|
+
*/
|
|
81
|
+
isConnected(): boolean;
|
|
82
|
+
private scheduleReconnect;
|
|
83
|
+
private getConnectionContext;
|
|
84
|
+
private getConnectionTarget;
|
|
85
|
+
private formatCloseSummary;
|
|
86
|
+
private summarizeUnexpectedResponse;
|
|
87
|
+
private getHandshakeMetadata;
|
|
88
|
+
private getHeaderValue;
|
|
89
|
+
private startHeartbeat;
|
|
90
|
+
private markSocketResponsive;
|
|
91
|
+
private stopHeartbeat;
|
|
92
|
+
private teardownSocket;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create a WebSocketClient instance.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createWebSocketClient(options: WebSocketClientOptions): WebSocketClient;
|
|
98
|
+
//# sourceMappingURL=WebSocketClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../../src/watch/WebSocketClient.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKrC,MAAM,WAAW,qBAAqB;IAClC,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAClF,iBAAiB,EAAE,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IACxB,aAAa,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,OAAO,CAAC,qBAAqB,CAAC;IAC/D,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAE1B,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,qBAAqB,CAAuB;IAEpD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;gBAElC,OAAO,EAAE,sBAAsB;IAY3C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6H9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAalC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,2BAA2B;IAcnC,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;CA6BzB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAEtF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch module - handles bidirectional sync between local files and Anvil server.
|
|
3
|
+
*
|
|
4
|
+
* ## Architecture
|
|
5
|
+
*
|
|
6
|
+
* Components:
|
|
7
|
+
* - FileWatcher: Monitors local filesystem for changes (emits events)
|
|
8
|
+
* - WebSocketClient: Manages server connection (emits events for state changes)
|
|
9
|
+
* - SyncManager: Coordinates server→local sync (returns Results for operations)
|
|
10
|
+
* - SaveProcessor: Handles local→server sync (returns Results, emits progress events)
|
|
11
|
+
* - ConflictResolver: Resolves conflicts during sync (pure functions returning Results)
|
|
12
|
+
*
|
|
13
|
+
* ## Event vs Result Pattern
|
|
14
|
+
*
|
|
15
|
+
* Events are used for:
|
|
16
|
+
* - Asynchronous notifications (file changes, connection state, progress)
|
|
17
|
+
* - UI/logging updates that don't affect control flow
|
|
18
|
+
* - Situations where multiple listeners need to react
|
|
19
|
+
*
|
|
20
|
+
* Results are used for:
|
|
21
|
+
* - Operations that can fail and need error handling
|
|
22
|
+
* - Control flow decisions (retry, abort, continue)
|
|
23
|
+
* - Composable operations via .andThen(), .map(), etc.
|
|
24
|
+
*
|
|
25
|
+
* Example: SaveProcessor emits "save-started" event for UI feedback,
|
|
26
|
+
* but returns Result<void, SaveError> for the actual save operation.
|
|
27
|
+
*/
|
|
28
|
+
export * from "./FileWatcher";
|
|
29
|
+
export * from "./WebSocketClient";
|
|
30
|
+
export * from "./ConflictResolver";
|
|
31
|
+
export * from "./SaveProcessor";
|
|
32
|
+
export * from "./SyncManager";
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvil-works/anvil-cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.15",
|
|
4
4
|
"description": "CLI tool for developing Anvil apps locally",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/
|
|
6
|
+
"types": "dist/api.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/api.d.ts",
|
|
10
|
+
"require": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./api": {
|
|
14
|
+
"types": "./dist/api.d.ts",
|
|
15
|
+
"require": "./dist/index.js",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
7
20
|
"bin": {
|
|
8
21
|
"anvil": "./dist/cli.js"
|
|
9
22
|
},
|
|
@@ -42,11 +42,13 @@ append_path_export() {
|
|
|
42
42
|
persist_path_hint() {
|
|
43
43
|
append_path_export "$HOME/.profile"
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
shell_name="${SHELL##*/}"
|
|
46
|
+
|
|
47
|
+
if [ -n "${ZSH_VERSION:-}" ] || [ "$shell_name" = "zsh" ] || [ -f "$HOME/.zshrc" ]; then
|
|
46
48
|
append_path_export "$HOME/.zshrc"
|
|
47
49
|
fi
|
|
48
50
|
|
|
49
|
-
if [ -n "${BASH_VERSION:-}" ] || [ "$
|
|
51
|
+
if [ -n "${BASH_VERSION:-}" ] || [ "$shell_name" = "bash" ] || [ -f "$HOME/.bashrc" ]; then
|
|
50
52
|
append_path_export "$HOME/.bashrc"
|
|
51
53
|
fi
|
|
52
54
|
}
|