firefly-compiler 0.4.40 → 0.4.48
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/.hintrc +4 -4
- package/.vscode/settings.json +4 -4
- package/bin/Release.ff +136 -71
- package/bin/firefly.mjs +1 -1
- package/compiler/Builder.ff +257 -257
- package/compiler/Compiler.ff +227 -227
- package/compiler/Dependencies.ff +186 -186
- package/compiler/DependencyLock.ff +17 -17
- package/compiler/JsEmitter.ff +946 -946
- package/compiler/LspHook.ff +202 -202
- package/compiler/ModuleCache.ff +178 -178
- package/compiler/Workspace.ff +88 -88
- package/core/.firefly/include/package-lock.json +394 -394
- package/core/.firefly/include/package.json +5 -5
- package/core/.firefly/include/prepare.sh +1 -1
- package/core/.firefly/package.ff +2 -2
- package/core/Array.ff +265 -265
- package/core/Atomic.ff +64 -64
- package/core/Box.ff +7 -7
- package/core/BrowserSystem.ff +40 -40
- package/core/BuildSystem.ff +148 -148
- package/core/Crypto.ff +96 -102
- package/core/Equal.ff +36 -36
- package/core/HttpClient.ff +87 -87
- package/core/JsSystem.ff +69 -69
- package/core/Json.ff +434 -434
- package/core/List.ff +486 -415
- package/core/Lock.ff +144 -144
- package/core/NodeSystem.ff +189 -189
- package/core/Ordering.ff +161 -161
- package/core/Path.ff +401 -401
- package/core/Random.ff +134 -134
- package/core/RbMap.ff +216 -216
- package/core/Show.ff +43 -43
- package/core/SourceLocation.ff +68 -68
- package/core/Task.ff +141 -141
- package/experimental/benchmarks/ListGrab.ff +23 -23
- package/experimental/benchmarks/ListGrab.java +55 -55
- package/experimental/benchmarks/Pyrotek45.ff +30 -30
- package/experimental/benchmarks/Pyrotek45.java +64 -64
- package/experimental/bidirectional/Bidi.ff +88 -88
- package/experimental/random/Index.ff +53 -53
- package/experimental/random/Process.ff +120 -120
- package/experimental/random/Scrape.ff +51 -51
- package/experimental/random/Symbols.ff +73 -73
- package/experimental/random/Tensor.ff +52 -52
- package/experimental/random/Units.ff +36 -36
- package/experimental/s3/S3TestAuthorizationHeader.ff +38 -38
- package/experimental/s3/S3TestPut.ff +15 -15
- package/experimental/tests/TestJson.ff +26 -26
- package/firefly.sh +0 -0
- package/fireflysite/Main.ff +13 -13
- package/lsp/.firefly/package.ff +1 -1
- package/lsp/CompletionHandler.ff +808 -811
- package/lsp/Handler.ff +714 -714
- package/lsp/HoverHandler.ff +79 -79
- package/lsp/LanguageServer.ff +272 -272
- package/lsp/SignatureHelpHandler.ff +55 -55
- package/lsp/SymbolHandler.ff +181 -181
- package/lsp/TestReferences.ff +16 -16
- package/lsp/TestReferencesCase.ff +7 -7
- package/lsp/stderr.txt +1 -1
- package/lsp/stdin.txt +10 -10
- package/lsp/stdout.txt +40 -40
- package/lux/.firefly/package.ff +1 -1
- package/lux/Css.ff +648 -648
- package/lux/CssTest.ff +48 -48
- package/lux/Lux.ff +487 -487
- package/lux/LuxEvent.ff +116 -116
- package/lux/Main.ff +128 -128
- package/lux/Main2.ff +144 -144
- package/output/js/ff/compiler/Builder.mjs +43 -43
- package/output/js/ff/compiler/Dependencies.mjs +3 -3
- package/output/js/ff/core/Array.mjs +59 -59
- package/output/js/ff/core/Atomic.mjs +36 -36
- package/output/js/ff/core/BrowserSystem.mjs +11 -11
- package/output/js/ff/core/BuildSystem.mjs +30 -30
- package/output/js/ff/core/Crypto.mjs +58 -62
- package/output/js/ff/core/HttpClient.mjs +24 -24
- package/output/js/ff/core/Json.mjs +147 -147
- package/output/js/ff/core/List.mjs +196 -50
- package/output/js/ff/core/Lock.mjs +97 -97
- package/output/js/ff/core/NodeSystem.mjs +77 -77
- package/output/js/ff/core/Ordering.mjs +8 -8
- package/output/js/ff/core/Path.mjs +231 -231
- package/output/js/ff/core/Random.mjs +56 -56
- package/output/js/ff/core/Task.mjs +31 -31
- package/package.json +29 -29
- package/rpc/.firefly/package.ff +1 -1
- package/rpc/Rpc.ff +69 -69
- package/s3/.firefly/package.ff +1 -1
- package/s3/S3.ff +93 -93
- package/unsafejs/UnsafeJs.ff +19 -19
- package/vscode/LICENSE.txt +21 -21
- package/vscode/Prepublish.ff +15 -15
- package/vscode/README.md +16 -16
- package/vscode/client/package.json +22 -22
- package/vscode/client/src/extension.ts +104 -104
- package/vscode/icons/firefly-icon.svg +10 -10
- package/vscode/language-configuration.json +61 -61
- package/vscode/package-lock.json +3623 -3623
- package/vscode/package.json +160 -160
- package/vscode/snippets.json +241 -241
- package/webserver/.firefly/include/package-lock.json +16 -16
- package/webserver/.firefly/include/package.json +5 -5
- package/webserver/.firefly/package.ff +2 -2
- package/webserver/WebServer.ff +685 -685
- package/websocket/.firefly/package.ff +1 -1
- package/websocket/WebSocket.ff +131 -131
package/compiler/Dependencies.ff
CHANGED
|
@@ -1,186 +1,186 @@
|
|
|
1
|
-
import Parser
|
|
2
|
-
import Syntax
|
|
3
|
-
import Tokenizer
|
|
4
|
-
import Workspace
|
|
5
|
-
import LspHook
|
|
6
|
-
import DependencyLock
|
|
7
|
-
|
|
8
|
-
capability Dependencies(
|
|
9
|
-
workspace: Workspace
|
|
10
|
-
mutable packages: Map[PackagePair, PackageInfo]
|
|
11
|
-
mutable packagePaths: Map[PackagePair, Path]
|
|
12
|
-
mutable singleFilePackages: Set[PackagePair]
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
capability ResolvedDependencies(
|
|
16
|
-
mainPackagePair: PackagePair
|
|
17
|
-
packages: Map[PackagePair, PackageInfo]
|
|
18
|
-
packagePaths: Map[PackagePair, Path]
|
|
19
|
-
singleFilePackages: Set[PackagePair]
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
extend self: Dependencies {
|
|
23
|
-
|
|
24
|
-
loadPackageInfo(
|
|
25
|
-
packagePair: PackagePair
|
|
26
|
-
path: Path
|
|
27
|
-
): PackageInfo {
|
|
28
|
-
let packageDirectory = if(path.extension() == ".ff") {path.parent().grab()} else {path}
|
|
29
|
-
let sharedPackageFile = packageDirectory.slash(".firefly").slash("package.ff")
|
|
30
|
-
let packageFile = if(sharedPackageFile.exists()) {
|
|
31
|
-
sharedPackageFile
|
|
32
|
-
} else {
|
|
33
|
-
self.singleFilePackages = self.singleFilePackages.add(packagePair)
|
|
34
|
-
path
|
|
35
|
-
}
|
|
36
|
-
let code = packageFile.readText()
|
|
37
|
-
self.parsePackageFile(packagePair, packageFile.relativeTo(path), code)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
parsePackageFile(
|
|
41
|
-
packagePair: PackagePair
|
|
42
|
-
fileName: String
|
|
43
|
-
code: String
|
|
44
|
-
): PackageInfo {
|
|
45
|
-
let tokens = Tokenizer.tokenize(fileName, code, None, True)
|
|
46
|
-
let parser = Parser.new(packagePair, fileName, tokens, False, LspHook.disabled())
|
|
47
|
-
let info = parser.parsePackageInfo()
|
|
48
|
-
self.addCoreDependencyIfMissing(info)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
addCoreDependencyIfMissing(info: PackageInfo): PackageInfo {
|
|
52
|
-
if(info.dependencies.any {d =>
|
|
53
|
-
d.packagePair.group == "ff" && d.packagePair.name == "core"
|
|
54
|
-
}) {
|
|
55
|
-
info
|
|
56
|
-
} else {
|
|
57
|
-
let coreDependency = DDependency(
|
|
58
|
-
at = info.package.at
|
|
59
|
-
packagePair = PackagePair("ff", "core")
|
|
60
|
-
version = Version(info.package.at, 0, 0, 0)
|
|
61
|
-
safety = Trusted
|
|
62
|
-
targets = info.package.targets
|
|
63
|
-
)
|
|
64
|
-
info.PackageInfo(dependencies = [coreDependency, ...info.dependencies])
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
processPackageInfo(
|
|
69
|
-
packageInfo: PackageInfo
|
|
70
|
-
): List[DDependency] {
|
|
71
|
-
self.packages = self.packages.add(packageInfo.package.packagePair, packageInfo)
|
|
72
|
-
packageInfo.dependencies.filter {!self.packages.contains(_.packagePair)}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
fetchDependency(
|
|
76
|
-
path: Path
|
|
77
|
-
httpClient: HttpClient
|
|
78
|
-
dependencyLock: DependencyLock
|
|
79
|
-
dependency: DDependency
|
|
80
|
-
): Path {
|
|
81
|
-
let location = self.workspace.findPackageLocation(dependency.packagePair, dependency.version)
|
|
82
|
-
if(location.contains(":") && !location.dropFirst(1).startsWith(":")) {
|
|
83
|
-
if(location.startsWith("http://") || location.startsWith("https://")) {
|
|
84
|
-
let packagePair = dependency.packagePair
|
|
85
|
-
let directory = if(path.isDirectory()) {path} else {path.parent().grab()}
|
|
86
|
-
let dependenciesPath = directory.slash(".firefly").slash("dependencies")
|
|
87
|
-
let dependencyPath = dependenciesPath.slash(packagePair.group).slash(packagePair.name)
|
|
88
|
-
let tarGzPath = dependenciesPath.slash(Workspace.tarGzName(packagePair, dependency.version))
|
|
89
|
-
let donePath = dependenciesPath.slash(Workspace.tarGzName(packagePair, dependency.version) + ".done")
|
|
90
|
-
if(!donePath.exists()) {
|
|
91
|
-
dependencyLock.do(donePath.absolute()) {
|
|
92
|
-
if(!donePath.exists()) {
|
|
93
|
-
Log.trace("Fetching " + location)
|
|
94
|
-
let response = httpClient.fetch(location, throw = False)
|
|
95
|
-
if(!response.ok()) {
|
|
96
|
-
panic("Could not download dependency: " + location)
|
|
97
|
-
}
|
|
98
|
-
let buffer = response.readBuffer()
|
|
99
|
-
if(dependencyPath.exists()) {
|
|
100
|
-
dependencyPath.delete()
|
|
101
|
-
}
|
|
102
|
-
dependencyPath.createDirectory(createParentDirectories = True)
|
|
103
|
-
tarGzPath.writeStream([buffer].toStream())
|
|
104
|
-
internalExtractTarGz(tarGzPath, dependencyPath)
|
|
105
|
-
tarGzPath.renameTo(donePath)
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
dependencyPath
|
|
110
|
-
} else {
|
|
111
|
-
panic("Loading packages by this protocol is not supported: " + location)
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
path.path(location)
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
processDependencies(
|
|
119
|
-
path: Path
|
|
120
|
-
httpClient: HttpClient
|
|
121
|
-
dependencyLock: DependencyLock
|
|
122
|
-
dependencies: List[DDependency]
|
|
123
|
-
): Unit {
|
|
124
|
-
// Remember to check for cycles
|
|
125
|
-
let packageInfos = dependencies.map {dependency =>
|
|
126
|
-
let dependencyPath = self.fetchDependency(path, httpClient, dependencyLock, dependency)
|
|
127
|
-
self.packagePaths = self.packagePaths.add(dependency.packagePair, dependencyPath)
|
|
128
|
-
let packageInfo = self.loadPackageInfo(dependency.packagePair, dependencyPath)
|
|
129
|
-
checkPackagePairs(dependency.packagePair, packageInfo.package.packagePair)
|
|
130
|
-
packageInfo
|
|
131
|
-
}
|
|
132
|
-
let newDependencies = packageInfos.flatMap {self.processPackageInfo(_)}
|
|
133
|
-
if(newDependencies != []) {
|
|
134
|
-
self.processDependencies(path, httpClient, dependencyLock, newDependencies)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
process(fetch: HttpClient, dependencyLock: DependencyLock, path: Path): ResolvedDependencies {
|
|
141
|
-
let workspace = Workspace.loadWorkspace(path)
|
|
142
|
-
let self = Dependencies(workspace, [].toMap(), [].toMap(), [].toSet())
|
|
143
|
-
let packageInfo = self.loadPackageInfo(PackagePair("script", "script"), path)
|
|
144
|
-
let newDependencies = self.processPackageInfo(packageInfo)
|
|
145
|
-
self.processDependencies(path, fetch, dependencyLock, newDependencies)
|
|
146
|
-
let packagePaths = self.packagePaths.add(packageInfo.package.packagePair, findScriptPackageLocation(path))
|
|
147
|
-
ResolvedDependencies(
|
|
148
|
-
mainPackagePair = packageInfo.package.packagePair
|
|
149
|
-
packages = self.packages
|
|
150
|
-
packagePaths = packagePaths
|
|
151
|
-
singleFilePackages = self.singleFilePackages
|
|
152
|
-
)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
findScriptPackageLocation(path: Path): Path {
|
|
156
|
-
let packageDirectory = if(path.extension() == ".ff") {path.parent().grab()} else {path}
|
|
157
|
-
function go(directory: Path): Path {
|
|
158
|
-
let packageFile = directory.slash(".firefly").slash("package.ff")
|
|
159
|
-
if(packageFile.exists()) {
|
|
160
|
-
directory
|
|
161
|
-
} elseIf {!directory.parent().isEmpty()} {
|
|
162
|
-
go(directory.parent().grab())
|
|
163
|
-
} else {
|
|
164
|
-
packageDirectory
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
go(packageDirectory)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
checkPackagePairs(dependencyPair: PackagePair, packagePair: PackagePair): Unit {
|
|
171
|
-
if(
|
|
172
|
-
packagePair.group != dependencyPair.group ||
|
|
173
|
-
packagePair.name != dependencyPair.name
|
|
174
|
-
) {
|
|
175
|
-
panic(
|
|
176
|
-
"Dependency declaration and package declaration disagree on package name: " +
|
|
177
|
-
dependencyPair.groupName() + " vs. " + packagePair.groupName()
|
|
178
|
-
)
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
internalExtractTarGz(tarGzPath: Path, path: Path): Unit
|
|
183
|
-
target node async """
|
|
184
|
-
import * as tar from 'tar'
|
|
185
|
-
await tar.extract({file: tarGzPath_, cwd: path_, strict: true})
|
|
186
|
-
"""
|
|
1
|
+
import Parser
|
|
2
|
+
import Syntax
|
|
3
|
+
import Tokenizer
|
|
4
|
+
import Workspace
|
|
5
|
+
import LspHook
|
|
6
|
+
import DependencyLock
|
|
7
|
+
|
|
8
|
+
capability Dependencies(
|
|
9
|
+
workspace: Workspace
|
|
10
|
+
mutable packages: Map[PackagePair, PackageInfo]
|
|
11
|
+
mutable packagePaths: Map[PackagePair, Path]
|
|
12
|
+
mutable singleFilePackages: Set[PackagePair]
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
capability ResolvedDependencies(
|
|
16
|
+
mainPackagePair: PackagePair
|
|
17
|
+
packages: Map[PackagePair, PackageInfo]
|
|
18
|
+
packagePaths: Map[PackagePair, Path]
|
|
19
|
+
singleFilePackages: Set[PackagePair]
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
extend self: Dependencies {
|
|
23
|
+
|
|
24
|
+
loadPackageInfo(
|
|
25
|
+
packagePair: PackagePair
|
|
26
|
+
path: Path
|
|
27
|
+
): PackageInfo {
|
|
28
|
+
let packageDirectory = if(path.extension() == ".ff") {path.parent().grab()} else {path}
|
|
29
|
+
let sharedPackageFile = packageDirectory.slash(".firefly").slash("package.ff")
|
|
30
|
+
let packageFile = if(sharedPackageFile.exists()) {
|
|
31
|
+
sharedPackageFile
|
|
32
|
+
} else {
|
|
33
|
+
self.singleFilePackages = self.singleFilePackages.add(packagePair)
|
|
34
|
+
path
|
|
35
|
+
}
|
|
36
|
+
let code = packageFile.readText()
|
|
37
|
+
self.parsePackageFile(packagePair, packageFile.relativeTo(path), code)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
parsePackageFile(
|
|
41
|
+
packagePair: PackagePair
|
|
42
|
+
fileName: String
|
|
43
|
+
code: String
|
|
44
|
+
): PackageInfo {
|
|
45
|
+
let tokens = Tokenizer.tokenize(fileName, code, None, True)
|
|
46
|
+
let parser = Parser.new(packagePair, fileName, tokens, False, LspHook.disabled())
|
|
47
|
+
let info = parser.parsePackageInfo()
|
|
48
|
+
self.addCoreDependencyIfMissing(info)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
addCoreDependencyIfMissing(info: PackageInfo): PackageInfo {
|
|
52
|
+
if(info.dependencies.any {d =>
|
|
53
|
+
d.packagePair.group == "ff" && d.packagePair.name == "core"
|
|
54
|
+
}) {
|
|
55
|
+
info
|
|
56
|
+
} else {
|
|
57
|
+
let coreDependency = DDependency(
|
|
58
|
+
at = info.package.at
|
|
59
|
+
packagePair = PackagePair("ff", "core")
|
|
60
|
+
version = Version(info.package.at, 0, 0, 0)
|
|
61
|
+
safety = Trusted
|
|
62
|
+
targets = info.package.targets
|
|
63
|
+
)
|
|
64
|
+
info.PackageInfo(dependencies = [coreDependency, ...info.dependencies])
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
processPackageInfo(
|
|
69
|
+
packageInfo: PackageInfo
|
|
70
|
+
): List[DDependency] {
|
|
71
|
+
self.packages = self.packages.add(packageInfo.package.packagePair, packageInfo)
|
|
72
|
+
packageInfo.dependencies.filter {!self.packages.contains(_.packagePair)}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fetchDependency(
|
|
76
|
+
path: Path
|
|
77
|
+
httpClient: HttpClient
|
|
78
|
+
dependencyLock: DependencyLock
|
|
79
|
+
dependency: DDependency
|
|
80
|
+
): Path {
|
|
81
|
+
let location = self.workspace.findPackageLocation(dependency.packagePair, dependency.version)
|
|
82
|
+
if(location.contains(":") && !location.dropFirst(1).startsWith(":")) {
|
|
83
|
+
if(location.startsWith("http://") || location.startsWith("https://")) {
|
|
84
|
+
let packagePair = dependency.packagePair
|
|
85
|
+
let directory = if(path.isDirectory()) {path} else {path.parent().grab()}
|
|
86
|
+
let dependenciesPath = directory.slash(".firefly").slash("dependencies")
|
|
87
|
+
let dependencyPath = dependenciesPath.slash(packagePair.group).slash(packagePair.name)
|
|
88
|
+
let tarGzPath = dependenciesPath.slash(Workspace.tarGzName(packagePair, dependency.version))
|
|
89
|
+
let donePath = dependenciesPath.slash(Workspace.tarGzName(packagePair, dependency.version) + ".done")
|
|
90
|
+
if(!donePath.exists()) {
|
|
91
|
+
dependencyLock.do(donePath.absolute()) {
|
|
92
|
+
if(!donePath.exists()) {
|
|
93
|
+
Log.trace("Fetching " + location)
|
|
94
|
+
let response = httpClient.fetch(location, throw = False)
|
|
95
|
+
if(!response.ok()) {
|
|
96
|
+
panic("Could not download dependency: " + location)
|
|
97
|
+
}
|
|
98
|
+
let buffer = response.readBuffer()
|
|
99
|
+
if(dependencyPath.exists()) {
|
|
100
|
+
dependencyPath.delete()
|
|
101
|
+
}
|
|
102
|
+
dependencyPath.createDirectory(createParentDirectories = True)
|
|
103
|
+
tarGzPath.writeStream([buffer].toStream())
|
|
104
|
+
internalExtractTarGz(tarGzPath, dependencyPath)
|
|
105
|
+
tarGzPath.renameTo(donePath)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
dependencyPath
|
|
110
|
+
} else {
|
|
111
|
+
panic("Loading packages by this protocol is not supported: " + location)
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
path.path(location)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
processDependencies(
|
|
119
|
+
path: Path
|
|
120
|
+
httpClient: HttpClient
|
|
121
|
+
dependencyLock: DependencyLock
|
|
122
|
+
dependencies: List[DDependency]
|
|
123
|
+
): Unit {
|
|
124
|
+
// Remember to check for cycles
|
|
125
|
+
let packageInfos = dependencies.map {dependency =>
|
|
126
|
+
let dependencyPath = self.fetchDependency(path, httpClient, dependencyLock, dependency)
|
|
127
|
+
self.packagePaths = self.packagePaths.add(dependency.packagePair, dependencyPath)
|
|
128
|
+
let packageInfo = self.loadPackageInfo(dependency.packagePair, dependencyPath)
|
|
129
|
+
checkPackagePairs(dependency.packagePair, packageInfo.package.packagePair)
|
|
130
|
+
packageInfo
|
|
131
|
+
}
|
|
132
|
+
let newDependencies = packageInfos.flatMap {self.processPackageInfo(_)}
|
|
133
|
+
if(newDependencies != []) {
|
|
134
|
+
self.processDependencies(path, httpClient, dependencyLock, newDependencies)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
process(fetch: HttpClient, dependencyLock: DependencyLock, path: Path): ResolvedDependencies {
|
|
141
|
+
let workspace = Workspace.loadWorkspace(path)
|
|
142
|
+
let self = Dependencies(workspace, [].toMap(), [].toMap(), [].toSet())
|
|
143
|
+
let packageInfo = self.loadPackageInfo(PackagePair("script", "script"), path)
|
|
144
|
+
let newDependencies = self.processPackageInfo(packageInfo)
|
|
145
|
+
self.processDependencies(path, fetch, dependencyLock, newDependencies)
|
|
146
|
+
let packagePaths = self.packagePaths.add(packageInfo.package.packagePair, findScriptPackageLocation(path))
|
|
147
|
+
ResolvedDependencies(
|
|
148
|
+
mainPackagePair = packageInfo.package.packagePair
|
|
149
|
+
packages = self.packages
|
|
150
|
+
packagePaths = packagePaths
|
|
151
|
+
singleFilePackages = self.singleFilePackages
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
findScriptPackageLocation(path: Path): Path {
|
|
156
|
+
let packageDirectory = if(path.extension() == ".ff") {path.parent().grab()} else {path}
|
|
157
|
+
function go(directory: Path): Path {
|
|
158
|
+
let packageFile = directory.slash(".firefly").slash("package.ff")
|
|
159
|
+
if(packageFile.exists()) {
|
|
160
|
+
directory
|
|
161
|
+
} elseIf {!directory.parent().isEmpty()} {
|
|
162
|
+
go(directory.parent().grab())
|
|
163
|
+
} else {
|
|
164
|
+
packageDirectory
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
go(packageDirectory)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
checkPackagePairs(dependencyPair: PackagePair, packagePair: PackagePair): Unit {
|
|
171
|
+
if(
|
|
172
|
+
packagePair.group != dependencyPair.group ||
|
|
173
|
+
packagePair.name != dependencyPair.name
|
|
174
|
+
) {
|
|
175
|
+
panic(
|
|
176
|
+
"Dependency declaration and package declaration disagree on package name: " +
|
|
177
|
+
dependencyPair.groupName() + " vs. " + packagePair.groupName()
|
|
178
|
+
)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
internalExtractTarGz(tarGzPath: Path, path: Path): Unit
|
|
183
|
+
target node async """
|
|
184
|
+
import * as tar from 'tar'
|
|
185
|
+
await tar.extract({file: tarGzPath_, cwd: path_, strict: true})
|
|
186
|
+
"""
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
capability DependencyLock(
|
|
2
|
-
doneLocks: StringMap[Lock]
|
|
3
|
-
task: Task
|
|
4
|
-
)
|
|
5
|
-
|
|
6
|
-
new(task: Task): DependencyLock {
|
|
7
|
-
DependencyLock(StringMap.new(), task)
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
extend self: DependencyLock {
|
|
11
|
-
do[T](doneFile: String, body: () => T): T {
|
|
12
|
-
let lock = self.doneLocks.getOrSet(doneFile) {self.task.lock()}
|
|
13
|
-
lock.do(reentrant = False) {
|
|
14
|
-
body()
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
capability DependencyLock(
|
|
2
|
+
doneLocks: StringMap[Lock]
|
|
3
|
+
task: Task
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
new(task: Task): DependencyLock {
|
|
7
|
+
DependencyLock(StringMap.new(), task)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
extend self: DependencyLock {
|
|
11
|
+
do[T](doneFile: String, body: () => T): T {
|
|
12
|
+
let lock = self.doneLocks.getOrSet(doneFile) {self.task.lock()}
|
|
13
|
+
lock.do(reentrant = False) {
|
|
14
|
+
body()
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|