firefly-compiler 0.4.36 → 0.4.46

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.
Files changed (116) hide show
  1. package/.hintrc +4 -4
  2. package/.vscode/settings.json +4 -4
  3. package/bin/Release.ff +99 -49
  4. package/bin/firefly.mjs +1 -1
  5. package/compiler/Builder.ff +257 -257
  6. package/compiler/Compiler.ff +227 -227
  7. package/compiler/Dependencies.ff +186 -186
  8. package/compiler/DependencyLock.ff +17 -17
  9. package/compiler/JsEmitter.ff +946 -946
  10. package/compiler/LspHook.ff +202 -202
  11. package/compiler/ModuleCache.ff +178 -178
  12. package/compiler/Workspace.ff +88 -88
  13. package/core/.firefly/include/package-lock.json +394 -394
  14. package/core/.firefly/include/package.json +5 -5
  15. package/core/.firefly/include/prepare.sh +1 -1
  16. package/core/.firefly/package.ff +2 -2
  17. package/core/Array.ff +265 -265
  18. package/core/Atomic.ff +64 -64
  19. package/core/Box.ff +7 -7
  20. package/core/BrowserSystem.ff +40 -37
  21. package/core/Buffer.ff +3 -3
  22. package/core/BuildSystem.ff +148 -145
  23. package/core/Crypto.ff +96 -95
  24. package/core/Equal.ff +36 -36
  25. package/core/HttpClient.ff +87 -87
  26. package/core/Instant.ff +17 -0
  27. package/core/JsSystem.ff +69 -69
  28. package/core/Json.ff +434 -434
  29. package/core/List.ff +415 -415
  30. package/core/Lock.ff +144 -144
  31. package/core/NodeSystem.ff +189 -189
  32. package/core/Ordering.ff +161 -161
  33. package/core/Path.ff +401 -401
  34. package/core/Random.ff +134 -134
  35. package/core/RbMap.ff +216 -216
  36. package/core/Show.ff +43 -43
  37. package/core/SourceLocation.ff +68 -68
  38. package/core/Stream.ff +1 -1
  39. package/core/Task.ff +141 -141
  40. package/experimental/benchmarks/ListGrab.ff +23 -23
  41. package/experimental/benchmarks/ListGrab.java +55 -55
  42. package/experimental/benchmarks/Pyrotek45.ff +30 -30
  43. package/experimental/benchmarks/Pyrotek45.java +64 -64
  44. package/experimental/bidirectional/Bidi.ff +88 -88
  45. package/experimental/random/Index.ff +53 -53
  46. package/experimental/random/Process.ff +120 -120
  47. package/experimental/random/RunLength.ff +3 -3
  48. package/experimental/random/Scrape.ff +51 -51
  49. package/experimental/random/Symbols.ff +73 -73
  50. package/experimental/random/Tensor.ff +52 -52
  51. package/experimental/random/Units.ff +36 -36
  52. package/experimental/s3/S3TestAuthorizationHeader.ff +38 -38
  53. package/experimental/s3/S3TestPut.ff +15 -15
  54. package/experimental/tests/TestJson.ff +26 -26
  55. package/firefly.sh +0 -0
  56. package/fireflysite/Main.ff +13 -13
  57. package/lsp/.firefly/package.ff +1 -1
  58. package/lsp/CompletionHandler.ff +811 -811
  59. package/lsp/Handler.ff +714 -714
  60. package/lsp/HoverHandler.ff +79 -79
  61. package/lsp/LanguageServer.ff +272 -272
  62. package/lsp/SignatureHelpHandler.ff +55 -55
  63. package/lsp/SymbolHandler.ff +181 -181
  64. package/lsp/TestReferences.ff +16 -16
  65. package/lsp/TestReferencesCase.ff +7 -7
  66. package/lsp/stderr.txt +1 -1
  67. package/lsp/stdout.txt +34 -34
  68. package/lux/.firefly/package.ff +1 -1
  69. package/lux/Css.ff +648 -648
  70. package/lux/CssTest.ff +48 -48
  71. package/lux/Lux.ff +487 -487
  72. package/lux/LuxEvent.ff +116 -116
  73. package/lux/Main.ff +128 -128
  74. package/lux/Main2.ff +144 -144
  75. package/output/js/ff/compiler/Builder.mjs +43 -43
  76. package/output/js/ff/compiler/Dependencies.mjs +3 -3
  77. package/output/js/ff/core/Array.mjs +59 -59
  78. package/output/js/ff/core/Atomic.mjs +36 -36
  79. package/output/js/ff/core/BrowserSystem.mjs +19 -11
  80. package/output/js/ff/core/Buffer.mjs +7 -7
  81. package/output/js/ff/core/BuildSystem.mjs +38 -30
  82. package/output/js/ff/core/Crypto.mjs +67 -68
  83. package/output/js/ff/core/HttpClient.mjs +24 -24
  84. package/output/js/ff/core/Instant.mjs +38 -0
  85. package/output/js/ff/core/Json.mjs +147 -147
  86. package/output/js/ff/core/List.mjs +50 -50
  87. package/output/js/ff/core/Lock.mjs +97 -97
  88. package/output/js/ff/core/NodeSystem.mjs +77 -77
  89. package/output/js/ff/core/Ordering.mjs +8 -8
  90. package/output/js/ff/core/Path.mjs +231 -231
  91. package/output/js/ff/core/Random.mjs +56 -56
  92. package/output/js/ff/core/Stream.mjs +2 -2
  93. package/output/js/ff/core/Task.mjs +31 -31
  94. package/package.json +29 -29
  95. package/rpc/.firefly/package.ff +1 -1
  96. package/rpc/Rpc.ff +69 -69
  97. package/s3/.firefly/package.ff +1 -0
  98. package/{experimental/s3 → s3}/S3.ff +92 -92
  99. package/unsafejs/UnsafeJs.ff +19 -19
  100. package/vscode/LICENSE.txt +21 -21
  101. package/vscode/Prepublish.ff +15 -15
  102. package/vscode/README.md +16 -16
  103. package/vscode/client/package.json +22 -22
  104. package/vscode/client/src/extension.ts +104 -104
  105. package/vscode/icons/firefly-icon.svg +10 -10
  106. package/vscode/language-configuration.json +61 -61
  107. package/vscode/package-lock.json +3623 -3623
  108. package/vscode/package.json +160 -160
  109. package/vscode/snippets.json +241 -241
  110. package/webserver/.firefly/include/package-lock.json +16 -16
  111. package/webserver/.firefly/include/package.json +5 -5
  112. package/webserver/.firefly/package.ff +2 -2
  113. package/webserver/WebServer.ff +685 -685
  114. package/websocket/.firefly/package.ff +1 -1
  115. package/websocket/WebSocket.ff +131 -131
  116. package/crypto/SubtleCrypto.ff +0 -149
package/core/Equal.ff CHANGED
@@ -1,36 +1,36 @@
1
- trait T: Equal {
2
- equals(x: T, y: T): Bool
3
- }
4
-
5
- notEquals[T: Equal](x: T, y: T): Bool {
6
- !equals(x, y)
7
- }
8
-
9
- instance Nothing: Equal {
10
- equals(x: Nothing, y: Nothing): Bool {True}
11
- }
12
-
13
- instance Bool: Equal {
14
- equals(x: Bool, y: Bool): Bool
15
- target js sync """return x_ === y_"""
16
- }
17
-
18
- instance Char: Equal {
19
- equals(x: Char, y: Char): Bool
20
- target js sync """return x_ === y_"""
21
- }
22
-
23
- instance Int: Equal {
24
- equals(x: Int, y: Int): Bool
25
- target js sync """return x_ === y_"""
26
- }
27
-
28
- instance Float: Equal {
29
- equals(x: Float, y: Float): Bool
30
- target js sync """return x_ === y_"""
31
- }
32
-
33
- instance String: Equal {
34
- equals(x: String, y: String): Bool
35
- target js sync """return x_ === y_"""
36
- }
1
+ trait T: Equal {
2
+ equals(x: T, y: T): Bool
3
+ }
4
+
5
+ notEquals[T: Equal](x: T, y: T): Bool {
6
+ !equals(x, y)
7
+ }
8
+
9
+ instance Nothing: Equal {
10
+ equals(x: Nothing, y: Nothing): Bool {True}
11
+ }
12
+
13
+ instance Bool: Equal {
14
+ equals(x: Bool, y: Bool): Bool
15
+ target js sync """return x_ === y_"""
16
+ }
17
+
18
+ instance Char: Equal {
19
+ equals(x: Char, y: Char): Bool
20
+ target js sync """return x_ === y_"""
21
+ }
22
+
23
+ instance Int: Equal {
24
+ equals(x: Int, y: Int): Bool
25
+ target js sync """return x_ === y_"""
26
+ }
27
+
28
+ instance Float: Equal {
29
+ equals(x: Float, y: Float): Bool
30
+ target js sync """return x_ === y_"""
31
+ }
32
+
33
+ instance String: Equal {
34
+ equals(x: String, y: String): Bool
35
+ target js sync """return x_ === y_"""
36
+ }
@@ -1,87 +1,87 @@
1
- capability HttpClient {}
2
- capability FetchBody {}
3
- capability FetchResponse {}
4
- data FetchRedirect {
5
- RedirectFollow
6
- RedirectError
7
- RedirectManual
8
- }
9
-
10
- extend self: HttpClient {
11
-
12
- fetch(
13
- url: String
14
- method: String = "GET"
15
- headers: List[Pair[String, String]] = emptyList
16
- body: Option[FetchBody] = None
17
- redirect: FetchRedirect = RedirectFollow
18
- // The rest of the options are only respected by browsers - see the MDN fetch() documentation
19
- referrer: Option[String] = None
20
- integrity: Option[String] = None
21
- mode: Option[String] = None
22
- credentials: Option[String] = None
23
- cache: Option[String] = None
24
- throw: Bool = True
25
- ): FetchResponse
26
- target js async """
27
- try {
28
- const options = {headers: {}, signal: $task.controller.signal}
29
- options.method = method_
30
- headers_.forEach(pair => {options.headers[pair.first_] = pair.second_})
31
- if(body_.value_) options.body = body_.value_
32
- if(redirect_.RedirectError) options.redirect = "error"
33
- else if(redirect_.RedirectManual) options.redirect = "manual"
34
- if(referrer_.value_) options.referrer = referrer_.value_
35
- if(integrity_.value_) options.integrity = integrity_.value_
36
- if(mode_.value_) options.mode = mode_.value_
37
- if(credentials_.value_) options.credentials = credentials_.value_
38
- if(cache_.value_) options.cache = cache_.value_
39
- let result = await fetch(url_, options)
40
- if(throw_ && !result.ok) throw new Error("Unexpected HTTP status code: " + result.status)
41
- return result
42
- } finally {
43
- if($task.controller.signal.aborted) $task.controller = new AbortController()
44
- }
45
- """
46
-
47
- }
48
-
49
- emptyList: List[Pair[String, String]] = [] // TODO: Why won't this type check when inlined? Probably some dangling unification variable?
50
-
51
- bodyText(body: String): FetchBody
52
- target js sync "return body_"
53
- target js async "return body_"
54
-
55
- bodyBuffer(body: Buffer): FetchBody
56
- target js sync "return body_"
57
- target js async "return body_"
58
-
59
- extend self: FetchResponse {
60
-
61
- ok(): Bool
62
- target js async "return self_.ok"
63
-
64
- status(): Int
65
- target js async "return self_.status"
66
-
67
- statusText(): String
68
- target js async "return self_.statusText"
69
-
70
- header(name: String): Option[String]
71
- target js async """
72
- const header = self_.headers.get(name_)
73
- return header != null
74
- ? ff_core_Option.Some(header)
75
- : ff_core_Option.None()
76
- """
77
-
78
- readText(): String
79
- target js async "return await self_.text()"
80
-
81
- readJson(): Json
82
- target js async "return await self_.json()"
83
-
84
- readBuffer(): Buffer
85
- target js async "return new DataView(await self_.arrayBuffer())"
86
-
87
- }
1
+ capability HttpClient {}
2
+ capability FetchBody {}
3
+ capability FetchResponse {}
4
+ data FetchRedirect {
5
+ RedirectFollow
6
+ RedirectError
7
+ RedirectManual
8
+ }
9
+
10
+ extend self: HttpClient {
11
+
12
+ fetch(
13
+ url: String
14
+ method: String = "GET"
15
+ headers: List[Pair[String, String]] = emptyList
16
+ body: Option[FetchBody] = None
17
+ redirect: FetchRedirect = RedirectFollow
18
+ // The rest of the options are only respected by browsers - see the MDN fetch() documentation
19
+ referrer: Option[String] = None
20
+ integrity: Option[String] = None
21
+ mode: Option[String] = None
22
+ credentials: Option[String] = None
23
+ cache: Option[String] = None
24
+ throw: Bool = True
25
+ ): FetchResponse
26
+ target js async """
27
+ try {
28
+ const options = {headers: {}, signal: $task.controller.signal}
29
+ options.method = method_
30
+ headers_.forEach(pair => {options.headers[pair.first_] = pair.second_})
31
+ if(body_.value_) options.body = body_.value_
32
+ if(redirect_.RedirectError) options.redirect = "error"
33
+ else if(redirect_.RedirectManual) options.redirect = "manual"
34
+ if(referrer_.value_) options.referrer = referrer_.value_
35
+ if(integrity_.value_) options.integrity = integrity_.value_
36
+ if(mode_.value_) options.mode = mode_.value_
37
+ if(credentials_.value_) options.credentials = credentials_.value_
38
+ if(cache_.value_) options.cache = cache_.value_
39
+ let result = await fetch(url_, options)
40
+ if(throw_ && !result.ok) throw new Error("Unexpected HTTP status code: " + result.status)
41
+ return result
42
+ } finally {
43
+ if($task.controller.signal.aborted) $task.controller = new AbortController()
44
+ }
45
+ """
46
+
47
+ }
48
+
49
+ emptyList: List[Pair[String, String]] = [] // TODO: Why won't this type check when inlined? Probably some dangling unification variable?
50
+
51
+ bodyText(body: String): FetchBody
52
+ target js sync "return body_"
53
+ target js async "return body_"
54
+
55
+ bodyBuffer(body: Buffer): FetchBody
56
+ target js sync "return body_"
57
+ target js async "return body_"
58
+
59
+ extend self: FetchResponse {
60
+
61
+ ok(): Bool
62
+ target js async "return self_.ok"
63
+
64
+ status(): Int
65
+ target js async "return self_.status"
66
+
67
+ statusText(): String
68
+ target js async "return self_.statusText"
69
+
70
+ header(name: String): Option[String]
71
+ target js async """
72
+ const header = self_.headers.get(name_)
73
+ return header != null
74
+ ? ff_core_Option.Some(header)
75
+ : ff_core_Option.None()
76
+ """
77
+
78
+ readText(): String
79
+ target js async "return await self_.text()"
80
+
81
+ readJson(): Json
82
+ target js async "return await self_.json()"
83
+
84
+ readBuffer(): Buffer
85
+ target js async "return new DataView(await self_.arrayBuffer())"
86
+
87
+ }
package/core/Instant.ff CHANGED
@@ -1,9 +1,26 @@
1
1
  newtype Instant(since1970: Duration)
2
2
 
3
+ fromIso(date: String): Option[Instant] {
4
+ let zone = date.endsWith("Z") || date.contains("+") || date.dropWhile {_ != 'T'}.contains("-")
5
+ if(zone && date.takeWhile {_ != 'T'}.contains("-") && date.contains("T") && date.contains(":")) {
6
+ internalParseDate(date)
7
+ }
8
+ }
9
+
3
10
  extend self: Instant {
4
11
 
5
12
  add(duration: Duration): Instant {
6
13
  Instant(Duration(self.since1970.seconds + duration.seconds))
7
14
  }
15
+
16
+ toIso(): String
17
+ target js sync """
18
+ return new Date(self_ * 1000).toISOString();
19
+ """
8
20
 
9
21
  }
22
+
23
+ internalParseDate(date: String): Instant
24
+ target js sync """
25
+ return Date.parse(date_) * 0.001;
26
+ """
package/core/JsSystem.ff CHANGED
@@ -1,69 +1,69 @@
1
- class JsSystem {} // TODO: It has to be async if the async ffi is to be called - solve in the compiler?
2
-
3
- extend self: JsSystem {
4
-
5
- global(): JsValue
6
- target js sync "return self_"
7
-
8
- parseJson(json: String): JsValue
9
- target js sync "return JSON.parse(json_)"
10
-
11
- null(): JsValue
12
- target js sync "return null"
13
-
14
- undefined(): JsValue
15
- target js sync "return void 0"
16
-
17
- value[T: IsJsValue](jsValue: T): JsValue
18
- target js sync "return jsValue_"
19
-
20
- object(): JsValue
21
- target js sync "return {}"
22
-
23
- array(values: List[JsValue]): JsValue
24
- target js sync "return values_.slice()"
25
-
26
- json(value: Json): JsValue
27
- target js sync "return value_"
28
-
29
- function0[R](body: () => R): JsValue
30
- target js sync "return body_"
31
- target js async "return () => body_($task)"
32
-
33
- function1[R](body: JsValue => R): JsValue
34
- target js sync "return body_"
35
- target js async "return a1 => body_(a1, $task)"
36
-
37
- function2[R](body: (JsValue, JsValue) => R): JsValue
38
- target js sync "return body_"
39
- target js async "return (a1, a2) => body_(a1, a2, $task)"
40
-
41
- function3[R](body: (JsValue, JsValue, JsValue) => R): JsValue
42
- target js sync "return body_"
43
- target js async "return (a1, a2, a3) => body_(a1, a2, a3, $task)"
44
-
45
- function4[R](body: (JsValue, JsValue, JsValue, JsValue) => R): JsValue
46
- target js sync "return body_"
47
- target js async "return (a1, a2, a3, a4) => body_(a1, a2, a3, a4, $task)"
48
-
49
- function5[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
50
- target js sync "return body_"
51
- target js async "return (a1, a2, a3, a4, a5) => body_(a1, a2, a3, a4, a5, $task)"
52
-
53
- function6[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
54
- target js sync "return body_"
55
- target js async "return (a1, a2, a3, a4, a5, a6) => body_(a1, a2, a3, a4, a5, a6, $task)"
56
-
57
- function7[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
58
- target js sync "return body_"
59
- target js async "return (a1, a2, a3, a4, a5, a6, a7) => body_(a1, a2, a3, a4, a5, a6, a7, $task)"
60
-
61
- function8[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
62
- target js sync "return body_"
63
- target js async "return (a1, a2, a3, a4, a5, a6, a7, a8) => body_(a1, a2, a3, a4, a5, a6, a7, a8, $task)"
64
-
65
- function9[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
66
- target js sync "return body_"
67
- target js async "return (a1, a2, a3, a4, a5, a6, a7, a8, a9) => body_(a1, a2, a3, a4, a5, a6, a7, a8, a9, $task)"
68
-
69
- }
1
+ class JsSystem {} // TODO: It has to be async if the async ffi is to be called - solve in the compiler?
2
+
3
+ extend self: JsSystem {
4
+
5
+ global(): JsValue
6
+ target js sync "return self_"
7
+
8
+ parseJson(json: String): JsValue
9
+ target js sync "return JSON.parse(json_)"
10
+
11
+ null(): JsValue
12
+ target js sync "return null"
13
+
14
+ undefined(): JsValue
15
+ target js sync "return void 0"
16
+
17
+ value[T: IsJsValue](jsValue: T): JsValue
18
+ target js sync "return jsValue_"
19
+
20
+ object(): JsValue
21
+ target js sync "return {}"
22
+
23
+ array(values: List[JsValue]): JsValue
24
+ target js sync "return values_.slice()"
25
+
26
+ json(value: Json): JsValue
27
+ target js sync "return value_"
28
+
29
+ function0[R](body: () => R): JsValue
30
+ target js sync "return body_"
31
+ target js async "return () => body_($task)"
32
+
33
+ function1[R](body: JsValue => R): JsValue
34
+ target js sync "return body_"
35
+ target js async "return a1 => body_(a1, $task)"
36
+
37
+ function2[R](body: (JsValue, JsValue) => R): JsValue
38
+ target js sync "return body_"
39
+ target js async "return (a1, a2) => body_(a1, a2, $task)"
40
+
41
+ function3[R](body: (JsValue, JsValue, JsValue) => R): JsValue
42
+ target js sync "return body_"
43
+ target js async "return (a1, a2, a3) => body_(a1, a2, a3, $task)"
44
+
45
+ function4[R](body: (JsValue, JsValue, JsValue, JsValue) => R): JsValue
46
+ target js sync "return body_"
47
+ target js async "return (a1, a2, a3, a4) => body_(a1, a2, a3, a4, $task)"
48
+
49
+ function5[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
50
+ target js sync "return body_"
51
+ target js async "return (a1, a2, a3, a4, a5) => body_(a1, a2, a3, a4, a5, $task)"
52
+
53
+ function6[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
54
+ target js sync "return body_"
55
+ target js async "return (a1, a2, a3, a4, a5, a6) => body_(a1, a2, a3, a4, a5, a6, $task)"
56
+
57
+ function7[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
58
+ target js sync "return body_"
59
+ target js async "return (a1, a2, a3, a4, a5, a6, a7) => body_(a1, a2, a3, a4, a5, a6, a7, $task)"
60
+
61
+ function8[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
62
+ target js sync "return body_"
63
+ target js async "return (a1, a2, a3, a4, a5, a6, a7, a8) => body_(a1, a2, a3, a4, a5, a6, a7, a8, $task)"
64
+
65
+ function9[R](body: (JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue, JsValue) => R): JsValue
66
+ target js sync "return body_"
67
+ target js async "return (a1, a2, a3, a4, a5, a6, a7, a8, a9) => body_(a1, a2, a3, a4, a5, a6, a7, a8, a9, $task)"
68
+
69
+ }