11import * as $ from "@goscript/builtin/index.js" ;
22import { ErrUnimplemented } from "./error.gs.js" ;
3+ import { getDeno , getEnv , getNodeFS , getPlatform , newHostError } from "./types_js.gs.js" ;
34
4- // JavaScript-specific stubs for file constants and operations
5- // These provide the required constants and stub implementations
5+ function pickFirstEnv ( keys : string [ ] ) : string {
6+ for ( const key of keys ) {
7+ const value = getEnv ( key )
8+ if ( value !== "" ) {
9+ return value
10+ }
11+ }
12+ return ""
13+ }
614
715// File open flags - using values compatible with typical Unix systems
816export const O_RDONLY = 0
@@ -19,7 +27,7 @@ export const SEEK_SET = 0
1927export const SEEK_CUR = 1
2028export const SEEK_END = 2
2129
22- // LinkError stub for compatibility
30+ // LinkError carries details for link-related path errors.
2331export class LinkError {
2432 public get Op ( ) : string {
2533 return this . _fields . Op . value
@@ -76,23 +84,77 @@ export class LinkError {
7684 }
7785}
7886
79- // Directory and file operation stubs
8087export function Readlink ( name : string ) : [ string , $ . GoError ] {
88+ const denoObj = getDeno ( )
89+ if ( denoObj ?. readLinkSync ) {
90+ try {
91+ return [ denoObj . readLinkSync ( name ) , null ]
92+ } catch ( err ) {
93+ return [ "" , newHostError ( err ) ]
94+ }
95+ }
96+ const nodeFS = getNodeFS ( )
97+ if ( nodeFS ?. readlinkSync ) {
98+ try {
99+ return [ nodeFS . readlinkSync ( name ) , null ]
100+ } catch ( err ) {
101+ return [ "" , newHostError ( err ) ]
102+ }
103+ }
81104 return [ "" , ErrUnimplemented ]
82105}
83106
84107export function TempDir ( ) : string {
85- return "/tmp"
108+ const value = pickFirstEnv ( [ "TMPDIR" , "TEMP" , "TMP" ] )
109+ if ( value !== "" ) {
110+ return value
111+ }
112+ return getPlatform ( ) === "win32" ? "." : "/tmp"
86113}
87114
88115export function UserCacheDir ( ) : [ string , $ . GoError ] {
89- return [ "" , ErrUnimplemented ]
116+ if ( getPlatform ( ) === "win32" ) {
117+ const value = pickFirstEnv ( [ "LOCALAPPDATA" , "APPDATA" , "USERPROFILE" ] )
118+ if ( value !== "" ) {
119+ return [ value , null ]
120+ }
121+ return [ "" , ErrUnimplemented ]
122+ }
123+ const value = pickFirstEnv ( [ "XDG_CACHE_HOME" ] )
124+ if ( value !== "" ) {
125+ return [ value , null ]
126+ }
127+ const [ home , err ] = UserHomeDir ( )
128+ if ( err !== null || home === "" ) {
129+ return [ "" , err ?? ErrUnimplemented ]
130+ }
131+ return [ home . replace ( / \/ + $ / , "" ) + "/.cache" , null ]
90132}
91133
92134export function UserConfigDir ( ) : [ string , $ . GoError ] {
93- return [ "" , ErrUnimplemented ]
135+ if ( getPlatform ( ) === "win32" ) {
136+ const value = pickFirstEnv ( [ "APPDATA" , "USERPROFILE" ] )
137+ if ( value !== "" ) {
138+ return [ value , null ]
139+ }
140+ return [ "" , ErrUnimplemented ]
141+ }
142+ const value = pickFirstEnv ( [ "XDG_CONFIG_HOME" ] )
143+ if ( value !== "" ) {
144+ return [ value , null ]
145+ }
146+ const [ home , err ] = UserHomeDir ( )
147+ if ( err !== null || home === "" ) {
148+ return [ "" , err ?? ErrUnimplemented ]
149+ }
150+ return [ home . replace ( / \/ + $ / , "" ) + "/.config" , null ]
94151}
95152
96153export function UserHomeDir ( ) : [ string , $ . GoError ] {
154+ const keys = getPlatform ( ) === "win32" ? [ "USERPROFILE" , "HOMEDRIVE" , "HOME" ] : [ "HOME" ]
155+ const value = pickFirstEnv ( keys )
156+ if ( value !== "" ) {
157+ return [ value , null ]
158+ }
97159 return [ "" , ErrUnimplemented ]
98- }
160+ }
0 commit comments