functionalscript 0.0.234 → 0.0.238

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.
@@ -30,7 +30,7 @@ jobs:
30
30
  node-version: 14
31
31
  registry-url: https://registry.npmjs.org/
32
32
  - run: npm ci
33
- - run: node ./version
33
+ - run: node ./io/nodejs/version
34
34
  - run: npm publish
35
35
  env:
36
36
  NODE_AUTH_TOKEN: ${{secrets.npm_token}}
@@ -0,0 +1,22 @@
1
+ const map = require('../../types/map')
2
+ const object = require('../../types/object')
3
+ const run = require('../run')
4
+ const seq = require('../../types/sequence')
5
+
6
+ /**
7
+ * @typedef {{
8
+ * readonly map: object.Map<string>
9
+ * readonly run: run.Module
10
+ * }} Module
11
+ */
12
+
13
+ /**
14
+ * @typedef {{
15
+ * readonly map: map.Map<Module>
16
+ * readonly order: seq.Sequence<string>
17
+ * }} Cache
18
+ */
19
+
20
+ /** @typedef {(path: string) => string|undefined} ReadFile */
21
+
22
+ module.exports = {}
@@ -1,71 +1,23 @@
1
1
  const json = require('../../../json')
2
- const { isObject } = json
3
2
  const seq = require('../../../types/sequence')
4
- const { split } = require('../../path')
5
- const map = require('../../../types/map')
6
3
 
7
- /** @typedef {(directoryName: string) => undefined|string|Directory} Directory */
4
+ /** @typedef {readonly[string, string]} DependencyJson */
8
5
 
9
- const empty = () => undefined
6
+ /** @typedef {{readonly[k in string]: string}} DependencyMapJson */
10
7
 
11
- /**
12
- * @typedef {{
13
- * readonly get: (dir: string) => Item|undefined
14
- * readonly set: (dir: string) => (item: Item) => Map
15
- * }} Map
16
- */
8
+ /** @typedef {DependencyMapJson|undefined} DependenciesJson */
17
9
 
18
- /** @typedef {Map|string} Item */
10
+ /** @type {(entry: json.Entry) => boolean} */
11
+ const isDependencyJson = ([, v]) => typeof v === 'string'
19
12
 
20
- /** @typedef {readonly[string, Map]} Pair */
21
-
22
- /** @type {(prior: seq.Sequence<Pair>) => (dir: string) => seq.Sequence<Pair>} */
23
- const get = prior => dir => {
24
- const result = seq.next(prior)
25
- if (result === undefined) { throw 'panic' }
26
- const { first: [,m] } = result
27
- const child = m.get(dir)
28
- const childMap = child === undefined || typeof child === 'string' ? map.empty : child
29
- /** @type {Pair} */
30
- const pair = [dir, childMap]
31
- return seq.sequence(pair)(prior)
32
- }
33
-
34
- /** @typedef {readonly[string, Item]} Result */
35
-
36
- /** @type {(a: Result) => (b: Pair) => Result} */
37
- const set = ([aDir, item]) => ([bDir, bMap]) => [bDir, bMap.set(aDir)(item)]
38
-
39
- /** @type {(prior: Map) => (entry: json.Entry) => Map} */
40
- const addDirectory = prior => ([directory, id]) => {
41
- if (typeof id !== 'string') { return prior }
42
- const path = split(directory)
43
- const rev = seq.reduce(get)([['', prior]])(path)
44
- const result = seq.next(rev)
45
- if (result === undefined) { throw 'panic' }
46
- const { first: [dir], tail } = result
47
- const [, m] = seq.reduce(set)([dir, id])(tail)
48
- if (typeof m === 'string') { return prior }
49
- return m
50
- }
51
-
52
- /** @type {(m: Map) => Directory} */
53
- const func = m => dir => {
54
- const r = m.get(dir)
55
- if (typeof r !== 'object') { return r }
56
- return func(r)
57
- }
58
-
59
- /** @type {(packageJson: json.Unknown) => Directory} */
60
- const getDirectory = packageJson => {
61
- if (!isObject(packageJson)) { return empty }
62
- const dep = packageJson['dependencies']
63
- if (dep === undefined || !isObject(dep)) { return empty }
64
- const result = seq.reduce(addDirectory)(map.empty)(Object.entries(dep))
65
- return func(result)
13
+ /** @type {(j: json.Unknown|undefined) => j is DependenciesJson} */
14
+ const isDependenciesJson = j => {
15
+ if (j === undefined) { return true }
16
+ if (!json.isObject(j)) { return false }
17
+ return seq.every(seq.map(isDependencyJson)(Object.entries(j)))
66
18
  }
67
19
 
68
20
  module.exports = {
69
21
  /** @readonly */
70
- getDirectory,
71
- }
22
+ isDependenciesJson,
23
+ }
@@ -1,33 +1,12 @@
1
1
  const _ = require('.')
2
+ const json = require('../../../json')
3
+ const { sort } = require('../../../types/object')
4
+ const seq = require('../../../types/sequence')
2
5
 
3
6
  {
4
- const packageJson = { dependencies: {} }
5
- const dir = _.getDirectory(packageJson)
6
- const r = dir('x')
7
- if (r !== undefined) { throw r }
7
+ if (!_.isDependenciesJson(undefined)) { throw 'error' }
8
+ if (_.isDependenciesJson(null)) { throw 'error' }
9
+ if (!_.isDependenciesJson({})) { throw 'error' }
10
+ if (!_.isDependenciesJson({'a':'b'})) { throw 'error' }
11
+ if (_.isDependenciesJson({ 'a': 12 })) { throw 'error' }
8
12
  }
9
-
10
- {
11
- const packageJson = { dependencies: { 'x': 'e' } }
12
- const dir = _.getDirectory(packageJson)
13
- const r = dir('x')
14
- if (r !== 'e') { throw r }
15
- }
16
-
17
- {
18
- const packageJson = {
19
- dependencies: {
20
- 'x/a': 'xa',
21
- 'x/b': 'xb'
22
- }
23
- }
24
- const dir = _.getDirectory(packageJson)
25
- const x = dir('x')
26
- if (typeof x !== 'function') { throw x }
27
- const xa = x('a')
28
- if (xa !== 'xa') { throw xa }
29
- const xb = x('b')
30
- if (xb !== 'xb') { throw xb }
31
- const xc = x('c')
32
- if (xc !== undefined) { throw xc }
33
- }
@@ -1,37 +1,30 @@
1
1
  const json = require('../../json')
2
- const seq = require('../../types/sequence')
2
+ const dep = require('./dependencies')
3
+ const object = require('../../types/object')
4
+ const run = require('../run')
3
5
 
4
6
  /**
5
7
  * @typedef {{
8
+ * readonly name: string
6
9
  * readonly version: string
7
- * readonly dependencies?: Dependencies
8
- * }} Package
10
+ * readonly dependencies?: dep.DependenciesJson
11
+ * }} PackageJson
9
12
  */
10
13
 
11
- /** @type {(j: json.Unknown) => j is Package} */
12
- const isPackage = j => {
14
+ /** @type {(j: json.Unknown) => j is PackageJson} */
15
+ const isPackageJson = j => {
13
16
  if (!json.isObject(j)) { return false }
17
+ if (typeof j.name !== 'string') { return false }
14
18
  if (typeof j.version !== 'string') { return false }
15
- if (j.dependencies !== undefined && !isDependencies(j.dependencies)) { return false }
19
+ if (!dep.isDependenciesJson(j.dependencies)) { return false }
16
20
  return true
17
21
  }
18
22
 
19
- /**
20
- * @typedef {{
21
- * readonly [k in string]: string
22
- * }} Dependencies
23
- */
24
-
25
- /** @type {(entry: json.Entry) => boolean} */
26
- const isDependency = ([,v]) => typeof v === 'string'
23
+ /** @typedef {object.Map<string>} Files */
27
24
 
28
- /** @type {(j: json.Unknown) => j is Dependencies} */
29
- const isDependencies = j => {
30
- if (!json.isObject(j)) { return false }
31
- return seq.every(seq.map(isDependency)(Object.entries(j)))
32
- }
25
+ /** @typedef {object.Map<dep.DependencyJson>} PackageMap */
33
26
 
34
27
  module.exports = {
35
28
  /** @readonly */
36
- isPackage,
37
- }
29
+ isPackageJson,
30
+ }
@@ -1,14 +1,16 @@
1
1
  const _ = require('.')
2
2
 
3
+ require('./dependencies/test')
4
+
3
5
  {
4
- if (_.isPackage(null)) { throw 'error' }
5
- if (_.isPackage({})) { throw 'error' }
6
- if (_.isPackage({version:12})) { throw 'error' }
7
- if (!_.isPackage({version:"12"})) { throw 'error' }
8
- if (_.isPackage({version:"",dependencies:[]})) { throw 'error' }
9
- if (!_.isPackage({ version: "", dependencies: {} })) { throw 'error' }
10
- if (_.isPackage({ version: "", dependencies: { x: 12} })) { throw 'error' }
11
- if (!_.isPackage({ version: "", dependencies: { x: "12" } })) { throw 'error' }
6
+ if (_.isPackageJson(null)) { throw 'error' }
7
+ if (_.isPackageJson({})) { throw 'error' }
8
+ if (_.isPackageJson({name:'x',version:12})) { throw 'error' }
9
+ if (!_.isPackageJson({name:'x',version:"12"})) { throw 'error' }
10
+ if (_.isPackageJson({version:"",dependencies:[]})) { throw 'error' }
11
+ if (!_.isPackageJson({name:'a', version: "", dependencies: {} })) { throw 'error' }
12
+ if (_.isPackageJson({name:'b', version: "", dependencies: { x: 12} })) { throw 'error' }
13
+ if (!_.isPackageJson({name:'c', version: "", dependencies: { x: "12" } })) { throw 'error' }
12
14
  }
13
15
 
14
- module.exports = {}
16
+ module.exports = {}
@@ -1,6 +1,9 @@
1
1
  const seq = require("../../types/sequence")
2
2
  const option = require("../../types/option")
3
3
  const { compose } = require("../../types/function")
4
+ const dep = require("../package/dependencies")
5
+ const { at } = require("../../types/object")
6
+ const pack = require("../package")
4
7
 
5
8
  /** @typedef {readonly string[]} Items */
6
9
 
@@ -9,7 +12,7 @@ const { compose } = require("../../types/function")
9
12
  * readonly external: boolean
10
13
  * readonly dir: boolean
11
14
  * readonly items: Items
12
- * }} Path
15
+ * }} LocalPath
13
16
  */
14
17
 
15
18
  /** @type {(path: string) => readonly string[]} */
@@ -34,8 +37,8 @@ const normItemsOp = prior => item => {
34
37
  /** @type {(items: seq.Sequence<string>) => seq.Sequence<string>|undefined} */
35
38
  const normItems = compose(seq.reduce(normItemsOp)([]))(option.map(seq.reverse))
36
39
 
37
- /** @type {(local: string) => (path: string) => Path|undefined} */
38
- const parse = local => {
40
+ /** @type {(local: string) => (path: string) => LocalPath|undefined} */
41
+ const parseLocal = local => {
39
42
  /** @type {(path: string) => readonly[boolean, seq.Sequence<string>]} */
40
43
  const fSeq = path => {
41
44
  const pathSeq = split(path)
@@ -44,7 +47,7 @@ const parse = local => {
44
47
  default: { return [true, pathSeq] }
45
48
  }
46
49
  }
47
- /** @type {(path: string) => Path|undefined} */
50
+ /** @type {(path: string) => LocalPath|undefined} */
48
51
  const f = path => {
49
52
  const [external, items] = fSeq(path)
50
53
  const n = normItems(items)
@@ -58,9 +61,56 @@ const parse = local => {
58
61
  return f
59
62
  }
60
63
 
64
+ /** @typedef {readonly[string, seq.Sequence<string>]} IdPath */
65
+
66
+ /** @type {(prior: readonly[string|undefined, seq.Sequence<string>]) => seq.Thunk<IdPath>} */
67
+ const variants = prior => () => {
68
+ const [a, b] = prior
69
+ const r = seq.next(b)
70
+ if (r === undefined) { return undefined }
71
+ const { first, tail } = r
72
+ /** @type {IdPath} */
73
+ const n = [a === undefined ? first : `${a}/${first}`, tail]
74
+ return { first: n, tail: variants(n) }
75
+ }
76
+
77
+ /** @type {(d: dep.DependencyMapJson) => (p: IdPath) => IdPath|undefined} */
78
+ const mapDependency = d => ([external, internal]) => {
79
+ const id = at(external)(d)
80
+ return id === undefined ? undefined : [id, internal]
81
+ }
82
+
83
+ /**
84
+ * @typedef {{
85
+ * readonly name: string,
86
+ * readonly items: Items,
87
+ * readonly dir: boolean,
88
+ * }} Path
89
+ */
90
+
91
+ /** @type {(d: dep.DependenciesJson) => (dir: boolean) => (items: seq.Sequence<string>) => Path|undefined} */
92
+ const parseGlobal = d => dir => items => {
93
+ if (d === undefined) { return undefined }
94
+ const v = variants([undefined, items])
95
+ const r = seq.first(undefined)(seq.filterMap(mapDependency(d))(v))
96
+ if (r === undefined) { return undefined }
97
+ return { name: r[0], items: seq.toArray(r[1]), dir }
98
+ }
99
+
100
+ /** @type {(name: string) => (dependencies: dep.DependenciesJson) => (local: string) => (path: string) => Path|undefined } */
101
+ const parse = name => dependencies => local => path => {
102
+ const parsed = parseLocal(local)(path)
103
+ if (parsed === undefined) { return undefined }
104
+ const {external, dir, items} = parsed
105
+ if (!external) { return { name, items, dir } }
106
+ return parseGlobal(dependencies)(dir)(items)
107
+ }
108
+
61
109
  module.exports = {
62
110
  /** @readonly */
63
- split,
111
+ parseLocal,
112
+ /** @readonly */
113
+ parseGlobal,
64
114
  /** @readonly */
65
115
  parse,
66
116
  }
@@ -1,47 +1,64 @@
1
1
  const _ = require('.')
2
2
  const json = require('../../json')
3
- const { identity, compose } = require('../../types/function')
4
- const seq = require('../../types/sequence')
3
+ const { identity } = require('../../types/function')
5
4
 
6
- const stringify = json.stringify(identity)
5
+ /** @type {(g: json.Unknown|undefined) => string} */
6
+ const stringify = g => {
7
+ if (g === undefined) { throw g }
8
+ return json.stringify(identity)(g)
9
+ }
7
10
 
8
11
  {
9
- const result = _.parse('')('./a')
10
- if (result === undefined) { throw result }
12
+ const p = { name: '', version: '' }
13
+ const result = _.parseLocal('')('./a')
11
14
  if (stringify(result) !== '{"external":false,"dir":false,"items":["a"]}') { throw result }
12
15
  }
13
16
 
14
17
  {
15
- const result = _.parse('')('./a/')
16
- if (result === undefined) { throw result }
18
+ const result = _.parseLocal('')('./a/')
17
19
  if (stringify(result) !== '{"external":false,"dir":true,"items":["a"]}') { throw result }
18
20
  }
19
21
 
20
22
  {
21
- const result = _.parse('')('..')
23
+ const result = _.parseLocal('')('..')
22
24
  if (result !== undefined) { throw result }
23
25
  }
24
26
 
25
27
  {
26
- const result = _.parse('a')('')
27
- if (result === undefined) { throw result }
28
+ const result = _.parseLocal('a')('')
28
29
  if (stringify(result) !== '{"external":true,"dir":false,"items":[]}') { throw result }
29
30
  }
30
31
 
31
32
  {
32
- const result = _.parse('')('./a/b/.././c')
33
- if (result === undefined) { throw result }
33
+ const result = _.parseLocal('')('./a/b/.././c')
34
34
  if (stringify(result) !== '{"external":false,"dir":false,"items":["a","c"]}') { throw result }
35
35
  }
36
36
 
37
37
  {
38
- const result = _.parse('x/r')('./a/b/.././c')
39
- if (result === undefined) { throw result }
38
+ const result = _.parseLocal('x/r')('./a/b/.././c')
40
39
  if (stringify(result) !== '{"external":false,"dir":false,"items":["x","r","a","c"]}') { throw result }
41
40
  }
42
41
 
43
42
  {
44
- const result = _.parse('a')('a/b/.././c')
45
- if (result === undefined) { throw result }
43
+ const result = _.parseLocal('a')('a/b/.././c')
46
44
  if (stringify(result) !== '{"external":true,"dir":false,"items":["a","c"]}') { throw result }
47
45
  }
46
+
47
+ {
48
+ if (_.parseGlobal(undefined)(false)(['a', 'b']) !== undefined) { throw 'error' }
49
+ if (_.parseGlobal({})(false)(['b']) !== undefined) { throw 'error' }
50
+ if (_.parseGlobal({ b: 'x' })(false)(['d']) !== undefined) { throw 'error' }
51
+ {
52
+ const result = stringify(_.parseGlobal({ b: 'x' })(false)(['b']))
53
+ if (result !== '["x",""]') { throw result }
54
+ }
55
+ if (_.parseGlobal({ 'b/r': 'x' })(false)(['b']) !== undefined) { throw 'error' }
56
+ {
57
+ const result = stringify(_.parseGlobal({ 'b/r': 'x' })(false)(['b', 'r']))
58
+ if (result !== '["x",""]') { throw result }
59
+ }
60
+ {
61
+ const result = stringify(_.parseGlobal({ 'b/r': 'x' })(false)(['b', 'r', 'd', 't']))
62
+ if (result !== '["x","d/t"]') { throw result }
63
+ }
64
+ }
@@ -3,11 +3,11 @@ const { unwrap } = require('../../types/result')
3
3
  const run = require('../../commonjs/run')
4
4
 
5
5
  /** @type {(f: Function) => run.Module} */
6
- const createModule = f => req => mutableInfo => {
6
+ const build = f => immutableRequire => mutableData => {
7
7
  /** @type {(path: string) => unknown} */
8
8
  const mutableRequire = path => {
9
- const [result, info] = req(mutableInfo)(path)
10
- mutableInfo = info
9
+ const [result, data] = immutableRequire(mutableData)(path)
10
+ mutableData = data
11
11
  return unwrap(result)
12
12
  }
13
13
  const result = tryCatch(() => {
@@ -15,12 +15,12 @@ const createModule = f => req => mutableInfo => {
15
15
  f(mutableModule, mutableRequire)
16
16
  return mutableModule.exports
17
17
  })
18
- return [result, mutableInfo]
18
+ return [result, mutableData]
19
19
  }
20
20
 
21
21
  /** @type {run.Compile} */
22
22
  const compile = source =>
23
- tryCatch(() => createModule(Function('module', 'require', `"use strict";${source}`)))
23
+ tryCatch(() => build(Function('module', 'require', `"use strict";${source}`)))
24
24
 
25
25
  module.exports = {
26
26
  /** @readonly */
@@ -1,7 +1,7 @@
1
1
  const cp = require('child_process')
2
2
  const fs = require('fs')
3
- const json = require('./json')
4
- const { isPackage } = require('./commonjs/package')
3
+ const json = require('../../../json')
4
+ const { isPackageJson } = require('../../../commonjs/package')
5
5
 
6
6
  const b =cp.execSync('git log --oneline')
7
7
 
@@ -13,7 +13,7 @@ console.log(`version: ${v}`)
13
13
 
14
14
  const package_json = json.parse(fs.readFileSync('package.json').toString())
15
15
 
16
- if (!isPackage(package_json)) { throw 'error' }
16
+ if (!isPackageJson(package_json)) { throw 'error' }
17
17
 
18
18
  const x = { ...package_json, version: v }
19
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.234",
3
+ "version": "0.0.238",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {