functionalscript 0.2.0 → 0.2.1

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 (248) hide show
  1. package/dev/module.mjs +1 -1
  2. package/jsr.json +59 -59
  3. package/out/com/cpp/module.f.mjs +123 -0
  4. package/out/com/cpp/test.f.mjs +40 -0
  5. package/out/com/cpp/testlib.f.mjs +7 -0
  6. package/out/com/cs/module.f.mjs +95 -0
  7. package/out/com/cs/test.f.mjs +43 -0
  8. package/out/com/cs/testlib.f.mjs +7 -0
  9. package/out/com/rust/module.f.mjs +213 -0
  10. package/out/com/rust/test.f.mjs +123 -0
  11. package/out/com/rust/testlib.f.mjs +7 -0
  12. package/out/com/test/build.f.mjs +98 -0
  13. package/out/com/test/build.mjs +40 -0
  14. package/out/com/types/module.f.mjs +51 -0
  15. package/out/com/types/testlib.f.mjs +30 -0
  16. package/out/commonjs/build/module.f.mjs +107 -0
  17. package/out/commonjs/build/test.f.mjs +102 -0
  18. package/out/commonjs/module/function/module.f.mjs +15 -0
  19. package/out/commonjs/module/module.f.mjs +48 -0
  20. package/out/commonjs/module.f.mjs +10 -0
  21. package/out/commonjs/module.mjs +26 -0
  22. package/out/commonjs/package/dependencies/module.f.mjs +21 -0
  23. package/out/commonjs/package/dependencies/test.f.mjs +15 -0
  24. package/out/commonjs/package/module.f.mjs +40 -0
  25. package/out/commonjs/package/test.f.mjs +27 -0
  26. package/out/commonjs/path/module.f.mjs +171 -0
  27. package/out/commonjs/path/test.f.mjs +231 -0
  28. package/out/commonjs/test.mjs +87 -0
  29. package/out/dev/index.mjs +2 -0
  30. package/out/dev/module.f.mjs +2 -0
  31. package/out/dev/module.mjs +167 -0
  32. package/out/dev/test/module.f.mjs +134 -0
  33. package/out/dev/test.f.mjs +58 -0
  34. package/out/dev/test.mjs +52 -0
  35. package/out/djs/module.f.mjs +75 -0
  36. package/out/djs/parser/module.f.mjs +432 -0
  37. package/out/djs/parser/test.f.mjs +535 -0
  38. package/out/djs/test.f.mjs +84 -0
  39. package/out/djs/tokenizer/module.f.mjs +87 -0
  40. package/out/djs/tokenizer/test.f.mjs +480 -0
  41. package/out/fsc/module.f.mjs +105 -0
  42. package/out/fsc/test.f.mjs +19 -0
  43. package/out/fsm/module.f.mjs +80 -0
  44. package/out/fsm/test.f.mjs +138 -0
  45. package/out/html/module.f.mjs +94 -0
  46. package/out/html/test.f.mjs +45 -0
  47. package/out/issues/test.f.mjs +66 -0
  48. package/out/js/tokenizer/module.f.mjs +686 -0
  49. package/out/js/tokenizer/test.f.mjs +844 -0
  50. package/out/json/module.f.mjs +89 -0
  51. package/out/json/parser/module.f.mjs +224 -0
  52. package/out/json/parser/test.f.mjs +321 -0
  53. package/out/json/serializer/module.f.mjs +67 -0
  54. package/out/json/serializer/test.f.mjs +87 -0
  55. package/out/json/test.f.mjs +61 -0
  56. package/out/json/tokenizer/module.f.mjs +78 -0
  57. package/out/json/tokenizer/test.f.mjs +420 -0
  58. package/out/nanvm-lib/tests/test.f.mjs +87 -0
  59. package/out/nodejs/version/main.mjs +3 -0
  60. package/out/nodejs/version/module.f.mjs +34 -0
  61. package/out/nodejs/version/test.f.mjs +97 -0
  62. package/out/prime_field/module.f.mjs +87 -0
  63. package/out/prime_field/test.f.mjs +145 -0
  64. package/out/secp/module.f.mjs +113 -0
  65. package/out/secp/test.f.mjs +63 -0
  66. package/out/sha2/module.f.mjs +172 -0
  67. package/out/sha2/test.f.mjs +86 -0
  68. package/out/text/ascii/module.f.mjs +154 -0
  69. package/out/text/ascii/test.f.mjs +14 -0
  70. package/out/text/module.f.mjs +19 -0
  71. package/out/text/sgr/module.f.mjs +17 -0
  72. package/out/text/test.f.mjs +19 -0
  73. package/out/text/utf16/module.f.mjs +86 -0
  74. package/out/text/utf16/test.f.mjs +145 -0
  75. package/out/text/utf8/module.f.mjs +126 -0
  76. package/out/text/utf8/test.f.mjs +175 -0
  77. package/out/types/array/module.f.mjs +95 -0
  78. package/out/types/array/test.f.mjs +116 -0
  79. package/out/types/bigfloat/module.f.mjs +77 -0
  80. package/out/types/bigfloat/test.f.mjs +349 -0
  81. package/out/types/bigint/module.f.mjs +114 -0
  82. package/out/types/bigint/test.f.mjs +192 -0
  83. package/out/types/btree/find/module.f.mjs +137 -0
  84. package/out/types/btree/find/test.f.mjs +156 -0
  85. package/out/types/btree/module.f.mjs +34 -0
  86. package/out/types/btree/remove/module.f.mjs +209 -0
  87. package/out/types/btree/remove/test.f.mjs +638 -0
  88. package/out/types/btree/set/module.f.mjs +114 -0
  89. package/out/types/btree/set/test.f.mjs +390 -0
  90. package/out/types/btree/test.f.mjs +83 -0
  91. package/out/types/btree/types/module.f.mjs +50 -0
  92. package/out/types/byte_set/module.f.mjs +42 -0
  93. package/out/types/byte_set/test.f.mjs +123 -0
  94. package/out/types/function/compare/module.f.mjs +22 -0
  95. package/out/types/function/compare/test.f.mjs +8 -0
  96. package/out/types/function/module.f.mjs +44 -0
  97. package/out/types/function/operator/module.f.mjs +60 -0
  98. package/out/types/function/test.f.mjs +15 -0
  99. package/out/types/list/module.f.mjs +269 -0
  100. package/out/types/list/test.f.mjs +401 -0
  101. package/out/types/map/module.f.mjs +54 -0
  102. package/out/types/map/test.f.mjs +115 -0
  103. package/out/types/nibble_set/module.f.mjs +19 -0
  104. package/out/types/nibble_set/test.f.mjs +90 -0
  105. package/out/types/nullable/module.f.mjs +9 -0
  106. package/out/types/nullable/test.f.mjs +12 -0
  107. package/out/types/number/module.f.mjs +12 -0
  108. package/out/types/number/test.f.mjs +126 -0
  109. package/out/types/object/module.f.mjs +27 -0
  110. package/out/types/object/test.f.mjs +17 -0
  111. package/out/types/range/module.f.mjs +6 -0
  112. package/out/types/range/test.f.mjs +18 -0
  113. package/out/types/range_map/module.f.mjs +84 -0
  114. package/out/types/range_map/test.f.mjs +201 -0
  115. package/out/types/result/module.f.mjs +25 -0
  116. package/out/types/result/module.mjs +16 -0
  117. package/out/types/sorted_list/module.f.mjs +102 -0
  118. package/out/types/sorted_list/test.f.mjs +66 -0
  119. package/out/types/sorted_set/module.f.mjs +29 -0
  120. package/out/types/sorted_set/test.f.mjs +80 -0
  121. package/out/types/string/module.f.mjs +17 -0
  122. package/out/types/string/test.f.mjs +58 -0
  123. package/out/types/string_set/module.f.mjs +29 -0
  124. package/out/types/string_set/test.f.mjs +65 -0
  125. package/package.json +5 -4
  126. package/tsconfig.json +2 -2
  127. /package/{com → out/com}/cpp/module.f.d.mts +0 -0
  128. /package/{com → out/com}/cpp/test.f.d.mts +0 -0
  129. /package/{com → out/com}/cpp/testlib.f.d.mts +0 -0
  130. /package/{com → out/com}/cs/module.f.d.mts +0 -0
  131. /package/{com → out/com}/cs/test.f.d.mts +0 -0
  132. /package/{com → out/com}/cs/testlib.f.d.mts +0 -0
  133. /package/{com → out/com}/rust/module.f.d.mts +0 -0
  134. /package/{com → out/com}/rust/test.f.d.mts +0 -0
  135. /package/{com → out/com}/rust/testlib.f.d.mts +0 -0
  136. /package/{com → out/com}/test/build.d.mts +0 -0
  137. /package/{com → out/com}/test/build.f.d.mts +0 -0
  138. /package/{com → out/com}/types/module.f.d.mts +0 -0
  139. /package/{com → out/com}/types/testlib.f.d.mts +0 -0
  140. /package/{commonjs → out/commonjs}/build/module.f.d.mts +0 -0
  141. /package/{commonjs → out/commonjs}/build/test.f.d.mts +0 -0
  142. /package/{commonjs → out/commonjs}/module/function/module.f.d.mts +0 -0
  143. /package/{commonjs → out/commonjs}/module/module.f.d.mts +0 -0
  144. /package/{commonjs → out/commonjs}/module.d.mts +0 -0
  145. /package/{commonjs → out/commonjs}/module.f.d.mts +0 -0
  146. /package/{commonjs → out/commonjs}/package/dependencies/module.f.d.mts +0 -0
  147. /package/{commonjs → out/commonjs}/package/dependencies/test.f.d.mts +0 -0
  148. /package/{commonjs → out/commonjs}/package/module.f.d.mts +0 -0
  149. /package/{commonjs → out/commonjs}/package/test.f.d.mts +0 -0
  150. /package/{commonjs → out/commonjs}/path/module.f.d.mts +0 -0
  151. /package/{commonjs → out/commonjs}/path/test.f.d.mts +0 -0
  152. /package/{commonjs → out/commonjs}/test.d.mts +0 -0
  153. /package/{dev → out/dev}/index.d.mts +0 -0
  154. /package/{dev → out/dev}/module.d.mts +0 -0
  155. /package/{dev → out/dev}/module.f.d.mts +0 -0
  156. /package/{dev → out/dev}/test/module.f.d.mts +0 -0
  157. /package/{dev → out/dev}/test.d.mts +0 -0
  158. /package/{dev → out/dev}/test.f.d.mts +0 -0
  159. /package/{djs → out/djs}/module.f.d.mts +0 -0
  160. /package/{djs → out/djs}/parser/module.f.d.mts +0 -0
  161. /package/{djs → out/djs}/parser/test.f.d.mts +0 -0
  162. /package/{djs → out/djs}/test.f.d.mts +0 -0
  163. /package/{djs → out/djs}/tokenizer/module.f.d.mts +0 -0
  164. /package/{djs → out/djs}/tokenizer/test.f.d.mts +0 -0
  165. /package/{fsc → out/fsc}/module.f.d.mts +0 -0
  166. /package/{fsc → out/fsc}/test.f.d.mts +0 -0
  167. /package/{fsm → out/fsm}/module.f.d.mts +0 -0
  168. /package/{fsm → out/fsm}/test.f.d.mts +0 -0
  169. /package/{html → out/html}/module.f.d.mts +0 -0
  170. /package/{html → out/html}/test.f.d.mts +0 -0
  171. /package/{issues → out/issues}/test.f.d.mts +0 -0
  172. /package/{js → out/js}/tokenizer/module.f.d.mts +0 -0
  173. /package/{js → out/js}/tokenizer/test.f.d.mts +0 -0
  174. /package/{json → out/json}/module.f.d.mts +0 -0
  175. /package/{json → out/json}/parser/module.f.d.mts +0 -0
  176. /package/{json → out/json}/parser/test.f.d.mts +0 -0
  177. /package/{json → out/json}/serializer/module.f.d.mts +0 -0
  178. /package/{json → out/json}/serializer/test.f.d.mts +0 -0
  179. /package/{json → out/json}/test.f.d.mts +0 -0
  180. /package/{json → out/json}/tokenizer/module.f.d.mts +0 -0
  181. /package/{json → out/json}/tokenizer/test.f.d.mts +0 -0
  182. /package/{nanvm-lib → out/nanvm-lib}/tests/test.f.d.mts +0 -0
  183. /package/{nodejs → out/nodejs}/version/main.d.mts +0 -0
  184. /package/{nodejs → out/nodejs}/version/module.f.d.mts +0 -0
  185. /package/{nodejs → out/nodejs}/version/test.f.d.mts +0 -0
  186. /package/{prime_field → out/prime_field}/module.f.d.mts +0 -0
  187. /package/{prime_field → out/prime_field}/test.f.d.mts +0 -0
  188. /package/{secp → out/secp}/module.f.d.mts +0 -0
  189. /package/{secp → out/secp}/test.f.d.mts +0 -0
  190. /package/{sha2 → out/sha2}/module.f.d.mts +0 -0
  191. /package/{sha2 → out/sha2}/test.f.d.mts +0 -0
  192. /package/{text → out/text}/ascii/module.f.d.mts +0 -0
  193. /package/{text → out/text}/ascii/test.f.d.mts +0 -0
  194. /package/{text → out/text}/module.f.d.mts +0 -0
  195. /package/{text → out/text}/sgr/module.f.d.mts +0 -0
  196. /package/{text → out/text}/test.f.d.mts +0 -0
  197. /package/{text → out/text}/utf16/module.f.d.mts +0 -0
  198. /package/{text → out/text}/utf16/test.f.d.mts +0 -0
  199. /package/{text → out/text}/utf8/module.f.d.mts +0 -0
  200. /package/{text → out/text}/utf8/test.f.d.mts +0 -0
  201. /package/{types → out/types}/array/module.f.d.mts +0 -0
  202. /package/{types → out/types}/array/test.f.d.mts +0 -0
  203. /package/{types → out/types}/bigfloat/module.f.d.mts +0 -0
  204. /package/{types → out/types}/bigfloat/test.f.d.mts +0 -0
  205. /package/{types → out/types}/bigint/module.f.d.mts +0 -0
  206. /package/{types → out/types}/bigint/test.f.d.mts +0 -0
  207. /package/{types → out/types}/btree/find/module.f.d.mts +0 -0
  208. /package/{types → out/types}/btree/find/test.f.d.mts +0 -0
  209. /package/{types → out/types}/btree/module.f.d.mts +0 -0
  210. /package/{types → out/types}/btree/remove/module.f.d.mts +0 -0
  211. /package/{types → out/types}/btree/remove/test.f.d.mts +0 -0
  212. /package/{types → out/types}/btree/set/module.f.d.mts +0 -0
  213. /package/{types → out/types}/btree/set/test.f.d.mts +0 -0
  214. /package/{types → out/types}/btree/test.f.d.mts +0 -0
  215. /package/{types → out/types}/btree/types/module.f.d.mts +0 -0
  216. /package/{types → out/types}/byte_set/module.f.d.mts +0 -0
  217. /package/{types → out/types}/byte_set/test.f.d.mts +0 -0
  218. /package/{types → out/types}/function/compare/module.f.d.mts +0 -0
  219. /package/{types → out/types}/function/compare/test.f.d.mts +0 -0
  220. /package/{types → out/types}/function/module.f.d.mts +0 -0
  221. /package/{types → out/types}/function/operator/module.f.d.mts +0 -0
  222. /package/{types → out/types}/function/test.f.d.mts +0 -0
  223. /package/{types → out/types}/list/module.f.d.mts +0 -0
  224. /package/{types → out/types}/list/test.f.d.mts +0 -0
  225. /package/{types → out/types}/map/module.f.d.mts +0 -0
  226. /package/{types → out/types}/map/test.f.d.mts +0 -0
  227. /package/{types → out/types}/nibble_set/module.f.d.mts +0 -0
  228. /package/{types → out/types}/nibble_set/test.f.d.mts +0 -0
  229. /package/{types → out/types}/nullable/module.f.d.mts +0 -0
  230. /package/{types → out/types}/nullable/test.f.d.mts +0 -0
  231. /package/{types → out/types}/number/module.f.d.mts +0 -0
  232. /package/{types → out/types}/number/test.f.d.mts +0 -0
  233. /package/{types → out/types}/object/module.f.d.mts +0 -0
  234. /package/{types → out/types}/object/test.f.d.mts +0 -0
  235. /package/{types → out/types}/range/module.f.d.mts +0 -0
  236. /package/{types → out/types}/range/test.f.d.mts +0 -0
  237. /package/{types → out/types}/range_map/module.f.d.mts +0 -0
  238. /package/{types → out/types}/range_map/test.f.d.mts +0 -0
  239. /package/{types → out/types}/result/module.d.mts +0 -0
  240. /package/{types → out/types}/result/module.f.d.mts +0 -0
  241. /package/{types → out/types}/sorted_list/module.f.d.mts +0 -0
  242. /package/{types → out/types}/sorted_list/test.f.d.mts +0 -0
  243. /package/{types → out/types}/sorted_set/module.f.d.mts +0 -0
  244. /package/{types → out/types}/sorted_set/test.f.d.mts +0 -0
  245. /package/{types → out/types}/string/module.f.d.mts +0 -0
  246. /package/{types → out/types}/string/test.f.d.mts +0 -0
  247. /package/{types → out/types}/string_set/module.f.d.mts +0 -0
  248. /package/{types → out/types}/string_set/test.f.d.mts +0 -0
@@ -0,0 +1,102 @@
1
+ import * as _ from './module.f.mjs';
2
+ import * as map from '../../types/map/module.f.mjs';
3
+ import * as Module from '../module/module.f.mjs';
4
+ import * as ModuleFunction from '../module/function/module.f.mjs';
5
+ import * as Result from '../../types/result/module.f.mjs';
6
+ import * as Package from '../package/module.f.mjs';
7
+ import * as o from '../../types/object/module.f.mjs';
8
+ const { at } = o;
9
+ /** @type {{ readonly [k in string]?: Result.Result<ModuleFunction.Function_, unknown> }} */
10
+ const compileMap = {
11
+ ':index.js': [
12
+ 'ok',
13
+ require_ => m0 => {
14
+ let [r, m] = require_('./b')(m0);
15
+ if (r[0] === 'error') {
16
+ throw JSON.stringify(r);
17
+ }
18
+ [r, m] = require_('./a/')(m);
19
+ if (r[0] === 'error') {
20
+ throw JSON.stringify(r);
21
+ }
22
+ [r, m] = require_('x/r')(m);
23
+ if (r[0] === 'error') {
24
+ throw JSON.stringify(r);
25
+ }
26
+ return [['ok', ':index.js'], m];
27
+ }
28
+ ],
29
+ ':b.js': [
30
+ 'ok',
31
+ () => m0 => [['ok', ':b.js'], m0]
32
+ ],
33
+ ':a/index.js': [
34
+ 'ok',
35
+ () => m0 => [['ok', ':a/index.js'], m0]
36
+ ],
37
+ 'x:r.js': [
38
+ 'ok',
39
+ () => m0 => [['ok', 'x:r.js'], m0]
40
+ ],
41
+ };
42
+ /** @type {ModuleFunction.Compile} */
43
+ const compile = source => compileMap[source] ?? ['error', 'invalid source'];
44
+ /** @typedef {{ readonly [k in string]: string }} StringMap */
45
+ /** @type {{ readonly [k in string]: { readonly dependencies: StringMap, readonly files: StringMap }}} */
46
+ const packageMap = {
47
+ '': {
48
+ dependencies: {
49
+ 'x': '/node_modules/x'
50
+ },
51
+ files: {
52
+ 'index.js': ':index.js',
53
+ 'b.js': ':b.js',
54
+ 'a/index.js': ':a/index.js',
55
+ }
56
+ },
57
+ '/node_modules/x': {
58
+ dependencies: {},
59
+ files: {
60
+ 'r.js': 'x:r.js'
61
+ }
62
+ },
63
+ };
64
+ /** @type {Package.Get} */
65
+ const packageGet = packageId => {
66
+ const p = at(packageId)(packageMap);
67
+ return p === null ? null :
68
+ {
69
+ dependency: dependency => at(dependency)(p.dependencies),
70
+ file: file => at(file)(p.files),
71
+ };
72
+ };
73
+ const getOrBuild = _.getOrBuild(compile)(packageGet)(/** @type {Module.MapInterface<map.Map<Module.State>>} */ (map));
74
+ export default () => {
75
+ let [r, m] = getOrBuild({ package: '', path: ['index.js'] })(map.empty);
76
+ {
77
+ if (r === null) {
78
+ throw 'r === null';
79
+ }
80
+ const x = JSON.stringify(r);
81
+ if (x !==
82
+ '["ok",{"exports":":index.js","requireMap":{"./a/":"/a/index.js","./b":"/b.js","x/r":"/node_modules/x/r.js"}}]') {
83
+ throw `0:${x}`;
84
+ }
85
+ }
86
+ {
87
+ [r, m] = getOrBuild({ package: '', path: ['b.js'] })(m);
88
+ const x = JSON.stringify(r);
89
+ if (x !==
90
+ '["ok",{"exports":":b.js","requireMap":{}}]') {
91
+ throw x;
92
+ }
93
+ }
94
+ {
95
+ [r, m] = getOrBuild({ package: '', path: ['c.js'] })(m);
96
+ const x = JSON.stringify(r);
97
+ if (x !==
98
+ '["error",["file not found"]]') {
99
+ throw x;
100
+ }
101
+ }
102
+ };
@@ -0,0 +1,15 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ /**
3
+ * An IO interface for creating and running module functions.
4
+ */
5
+ import * as TypesResult from '../../../types/result/module.f.mjs';
6
+ /** @typedef {<M>(require: Require<M>) => (prior: M) => Result<M>} Function_ */
7
+ /**
8
+ * @template M
9
+ * @typedef {readonly[TypesResult.Result<unknown, unknown>, M]} Result
10
+ */
11
+ /**
12
+ * @template M
13
+ * @typedef {(path: string) => (prior: M) => Result<M>} Require
14
+ */
15
+ /** @typedef {(source: string) => TypesResult.Result<Function_, unknown>} Compile */
@@ -0,0 +1,48 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ import * as O from '../../types/object/module.f.mjs';
3
+ /**
4
+ * @template M
5
+ * @typedef {{
6
+ * readonly at: (moduleId: string) => (moduleMap: M) => State | null
7
+ * readonly setReplace: (moduleId: string) => (moduleState: State) => (moduleMap: M) => M
8
+ * }} MapInterface
9
+ */
10
+ /**
11
+ * @typedef {|
12
+ * readonly['ok', Module] |
13
+ * readonly['error', Error]
14
+ * } State
15
+ */
16
+ /**
17
+ * @typedef {{
18
+ * readonly exports: unknown
19
+ * readonly requireMap: O.Map<string>
20
+ * }} Module
21
+ */
22
+ /**
23
+ * @typedef {|
24
+ * ['file not found'] |
25
+ * ['compilation error', unknown] |
26
+ * ['runtime error', unknown] |
27
+ * ['circular reference']
28
+ * } Error
29
+ */
30
+ /**
31
+ * @typedef {{
32
+ * readonly package: string
33
+ * readonly path: readonly string[]
34
+ * }} Id
35
+ */
36
+ /** @type {(id: Id) => Id | null} */
37
+ export const dir = id => {
38
+ const len = id.path.length;
39
+ if (len < 1) {
40
+ return null;
41
+ }
42
+ return {
43
+ package: id.package,
44
+ path: id.path.slice(0, len - 1)
45
+ };
46
+ };
47
+ /** @type {(id: Id) => string} */
48
+ export const idToString = id => `${id.package}/${id.path.join('/')}`;
@@ -0,0 +1,10 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ export {};
3
+ /** @typedef {(packageName: string) => PackageMap|Package|null} PackageMap */
4
+ /**
5
+ * @typedef {readonly[
6
+ * string,
7
+ * PackageMap,
8
+ * (fileName: string) => string|null
9
+ * ]} Package
10
+ */
@@ -0,0 +1,26 @@
1
+ import unsafeResult from '../types/result/module.mjs';
2
+ const { tryCatch } = unsafeResult;
3
+ import * as result from '../types/result/module.f.mjs';
4
+ const { unwrap } = result;
5
+ import * as ModuleFunction from './module/function/module.f.mjs';
6
+ /** @type {(f: Function) => ModuleFunction.Function_} */
7
+ const build = f => immutableRequire => mutableData => {
8
+ /** @type {(path: string) => unknown} */
9
+ const mutableRequire = path => {
10
+ const [result, data] = immutableRequire(path)(mutableData);
11
+ // Side effect: setting a variable from a nested function (closure)
12
+ // is not allowed in FunctionalScript.
13
+ mutableData = data;
14
+ return unwrap(result);
15
+ };
16
+ const result = tryCatch(() => {
17
+ const mutableModule = { exports: {} };
18
+ f(mutableModule, mutableRequire);
19
+ return mutableModule.exports;
20
+ });
21
+ return [result, mutableData];
22
+ };
23
+ /** @type {ModuleFunction.Compile} */
24
+ export const compile = source =>
25
+ // Side effect: a `Function` constructor is not allowed in FunctionalScript.
26
+ tryCatch(() => build(Function('module', 'require', `"use strict";${source}`)));
@@ -0,0 +1,21 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ import * as json from '../../../json/module.f.mjs';
3
+ const { isObject } = json;
4
+ import * as list from '../../../types/list/module.f.mjs';
5
+ const { map, every } = list;
6
+ const { entries } = Object;
7
+ /** @typedef {readonly[string, string]} DependencyJson */
8
+ /** @typedef {{readonly[k in string]: string}} DependencyMapJson */
9
+ /** @typedef {DependencyMapJson|null} DependenciesJson */
10
+ /** @type {(entry: json.Entry) => boolean} */
11
+ const isDependencyJson = ([, v]) => typeof v === 'string';
12
+ /** @type {(j: json.Unknown) => j is DependenciesJson} */
13
+ export const isDependenciesJson = j => {
14
+ if (j === null) {
15
+ return true;
16
+ }
17
+ if (!isObject(j)) {
18
+ return false;
19
+ }
20
+ return every(map(isDependencyJson)(entries(j)));
21
+ };
@@ -0,0 +1,15 @@
1
+ import * as _ from './module.f.mjs';
2
+ export default () => {
3
+ if (!_.isDependenciesJson(null)) {
4
+ throw 'error';
5
+ }
6
+ if (!_.isDependenciesJson({})) {
7
+ throw 'error';
8
+ }
9
+ if (!_.isDependenciesJson({ 'a': 'b' })) {
10
+ throw 'error';
11
+ }
12
+ if (_.isDependenciesJson({ 'a': 12 })) {
13
+ throw 'error';
14
+ }
15
+ };
@@ -0,0 +1,40 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ import * as json from '../../json/module.f.mjs';
3
+ const { isObject } = json;
4
+ import * as dependencies from './dependencies/module.f.mjs';
5
+ const { isDependenciesJson } = dependencies;
6
+ import * as o from '../../types/object/module.f.mjs';
7
+ const { at } = o;
8
+ /**
9
+ * @typedef {{
10
+ * readonly name: string
11
+ * readonly version: string
12
+ * readonly dependencies?: dependencies.DependenciesJson
13
+ * }} PackageJson
14
+ */
15
+ /** @type {(j: json.Unknown) => j is PackageJson} */
16
+ export const isPackageJson = j => {
17
+ if (!isObject(j)) {
18
+ return false;
19
+ }
20
+ if (typeof j.name !== 'string') {
21
+ return false;
22
+ }
23
+ if (typeof j.version !== 'string') {
24
+ return false;
25
+ }
26
+ if (!isDependenciesJson(at('dependencies')(j))) {
27
+ return false;
28
+ }
29
+ return true;
30
+ };
31
+ /**
32
+ * @typedef {{
33
+ * readonly dependency: (localPackageId: string) => string | null
34
+ * readonly file: (localFileId: string) => string | null
35
+ * }} Package
36
+ */
37
+ /**
38
+ * @note Current package has an empty string '' as a packageId.
39
+ * @typedef {(packageId: string) => Package | null} Get
40
+ */
@@ -0,0 +1,27 @@
1
+ import * as _ from './module.f.mjs';
2
+ export default () => {
3
+ if (_.isPackageJson(null)) {
4
+ throw 'error';
5
+ }
6
+ if (_.isPackageJson({})) {
7
+ throw 'error';
8
+ }
9
+ if (_.isPackageJson({ name: 'x', version: 12 })) {
10
+ throw 'error';
11
+ }
12
+ if (!_.isPackageJson({ name: 'x', version: "12" })) {
13
+ throw 'error';
14
+ }
15
+ if (_.isPackageJson({ version: "", dependencies: [] })) {
16
+ throw 'error';
17
+ }
18
+ if (!_.isPackageJson({ name: 'a', version: "", dependencies: {} })) {
19
+ throw 'error';
20
+ }
21
+ if (_.isPackageJson({ name: 'b', version: "", dependencies: { x: 12 } })) {
22
+ throw 'error';
23
+ }
24
+ if (!_.isPackageJson({ name: 'c', version: "", dependencies: { x: "12" } })) {
25
+ throw 'error';
26
+ }
27
+ };
@@ -0,0 +1,171 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ import * as list from '../../types/list/module.f.mjs';
3
+ const { next, fold, reverse, first, flat, toArray, filterMap, isEmpty, concat } = list;
4
+ import * as string from '../../types/string/module.f.mjs';
5
+ const { join } = string;
6
+ import * as Package from '../package/module.f.mjs';
7
+ import * as Module from '../module/module.f.mjs';
8
+ /** @typedef {readonly string[]} Items */
9
+ /**
10
+ * @typedef {{
11
+ * readonly external: boolean
12
+ * readonly dir: boolean
13
+ * readonly items: Items
14
+ * }} LocalPath
15
+ */
16
+ /** @type {(path: string) => readonly string[]} */
17
+ const split = path => path.split('/');
18
+ /** @typedef {readonly[list.List<string>] | null} OptionList */
19
+ /** @type {(items: string) => (prior: OptionList) => OptionList} */
20
+ const normItemsOp = first => prior => {
21
+ if (prior === null) {
22
+ return null;
23
+ }
24
+ const tail = prior[0];
25
+ switch (first) {
26
+ case '':
27
+ case '.': {
28
+ return prior;
29
+ }
30
+ case '..': {
31
+ const result = next(tail);
32
+ if (result === null) {
33
+ return null;
34
+ }
35
+ return [result.tail];
36
+ }
37
+ default: {
38
+ return [{ first, tail }];
39
+ }
40
+ }
41
+ };
42
+ /** @type {(items: list.List<string>) => OptionList} */
43
+ const normItems = items => {
44
+ const result = fold(normItemsOp)([list.empty])(items);
45
+ return result === null ? result : [reverse(result[0])];
46
+ };
47
+ const firstNull = first(null);
48
+ /** @type {(local: string) => (path: string) => LocalPath|null} */
49
+ export const parseLocal = local => {
50
+ /** @type {(path: string) => readonly[boolean, boolean, list.List<string>]} */
51
+ const fSeq = path => {
52
+ const pathSeq = split(path);
53
+ const dir = [null, '', '.', '..'].includes(pathSeq[pathSeq.length - 1]);
54
+ return /** @type {readonly (string|null)[]} */ (['.', '..']).includes(firstNull(pathSeq)) ?
55
+ [false, dir, flat([split(local), pathSeq])] :
56
+ [true, dir, pathSeq];
57
+ };
58
+ // /** @type {(path: string) => LocalPath|null} */
59
+ return path => {
60
+ const [external, dir, items] = fSeq(path);
61
+ const n = normItems(items);
62
+ if (n === null) {
63
+ return null;
64
+ }
65
+ return {
66
+ external,
67
+ dir,
68
+ items: toArray(n[0])
69
+ };
70
+ };
71
+ };
72
+ /** @typedef {readonly[string, list.List<string>]} IdPath */
73
+ /** @type {(prior: readonly[string|null, list.List<string>]) => list.Thunk<IdPath>} */
74
+ const variants = prior => () => {
75
+ const [a, b] = prior;
76
+ const r = next(b);
77
+ if (r === list.empty) {
78
+ return list.empty;
79
+ }
80
+ const { first, tail } = r;
81
+ /** @type {IdPath} */
82
+ const n = [a === null ? first : `${a}/${first}`, tail];
83
+ return { first: n, tail: variants(n) };
84
+ };
85
+ /** @type {(d: (local: string) => string|null) => (p: IdPath) => IdPath|null} */
86
+ const mapDependency = d => ([external, internal]) => {
87
+ const id = d(external);
88
+ return id === null ? null : [id, internal];
89
+ };
90
+ /**
91
+ * @typedef {{
92
+ * readonly package: string,
93
+ * readonly items: Items,
94
+ * readonly dir: boolean,
95
+ * }} Path
96
+ */
97
+ /**
98
+ * @type {(d: (local: string) => string|null) =>
99
+ * (dir: boolean) =>
100
+ * (items: list.List<string>) =>
101
+ * Path|null}
102
+ */
103
+ export const parseGlobal = dependencies => {
104
+ const fMap = filterMap(mapDependency(dependencies));
105
+ return dir => items => {
106
+ const v = variants([null, items]);
107
+ const r = firstNull(fMap(v));
108
+ if (r === null) {
109
+ return null;
110
+ }
111
+ return { package: r[0], items: toArray(r[1]), dir };
112
+ };
113
+ };
114
+ /**
115
+ * @type {(packageId: string) =>
116
+ * (dependencies: (local: string) => string|null) =>
117
+ * (local: string) =>
118
+ * (path: string) =>
119
+ * Path|null }
120
+ */
121
+ export const parse = packageId => dependencies => {
122
+ const pg = parseGlobal(dependencies);
123
+ return local => path => {
124
+ const parsed = parseLocal(local)(path);
125
+ if (parsed === null) {
126
+ return null;
127
+ }
128
+ const { external, dir, items } = parsed;
129
+ if (!external) {
130
+ return { package: packageId, items, dir };
131
+ }
132
+ return pg(dir)(items);
133
+ };
134
+ };
135
+ /**
136
+ * @typedef {{
137
+ * readonly id: Module.Id
138
+ * readonly source: string
139
+ * }} FoundResult
140
+ */
141
+ /** @typedef {FoundResult| null} Result */
142
+ /**
143
+ * @type {(packageGet: Package.Get) =>
144
+ * (moduleId: Module.Id) =>
145
+ * (path: string) =>
146
+ * Result
147
+ * }
148
+ */
149
+ export const parseAndFind = packageGet => moduleId => path => {
150
+ const currentPack = packageGet(moduleId.package);
151
+ if (currentPack === null) {
152
+ return null;
153
+ }
154
+ const p = parse(moduleId.package)(currentPack.dependency)(moduleId.path.join('/'))(path);
155
+ if (p === null) {
156
+ return null;
157
+ }
158
+ const pack = packageGet(p.package);
159
+ if (pack === null) {
160
+ return null;
161
+ }
162
+ /** @type {(file: string) => FoundResult | null } */
163
+ const tryFile = file => {
164
+ const source = pack.file(file);
165
+ return source === null ? null : { id: { package: p.package, path: file.split('/') }, source };
166
+ };
167
+ const file = p.items.join('/');
168
+ const indexJs = join('/')(concat(p.items)(['index.js']));
169
+ const fileList = p.dir || isEmpty(p.items) ? [indexJs] : [file, `${file}.js`, indexJs];
170
+ return firstNull(filterMap(tryFile)(fileList));
171
+ };