@jdeighan/coffee-utils 16.0.23 → 17.0.0
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/package.json +4 -9
- package/src/lib/KeyedSet.js +2 -0
- package/src/lib/KeyedSet.js.map +13 -0
- package/src/lib/Section.js +2 -0
- package/src/lib/Section.js.map +13 -0
- package/src/lib/SectionMap.js +2 -0
- package/src/lib/SectionMap.js.map +13 -0
- package/src/lib/block.js +2 -0
- package/src/lib/block.js.map +13 -0
- package/src/lib/cssUtils.js +2 -0
- package/src/lib/cssUtils.js.map +13 -0
- package/src/lib/fs.coffee +76 -133
- package/src/lib/fs.js +95 -155
- package/src/lib/fs.js.map +13 -0
- package/src/lib/fsa.js +2 -0
- package/src/lib/fsa.js.map +13 -0
- package/src/lib/html.coffee +2 -2
- package/src/lib/html.js +8 -6
- package/src/lib/html.js.map +13 -0
- package/src/lib/server.js +2 -0
- package/src/lib/server.js.map +13 -0
- package/src/lib/indent.coffee +0 -199
- package/src/lib/indent.js +0 -216
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@jdeighan/coffee-utils",
|
3
3
|
"type": "module",
|
4
|
-
"version": "
|
4
|
+
"version": "17.0.0",
|
5
5
|
"description": "A set of utility functions for CoffeeScript",
|
6
6
|
"main": "coffee_utils.js",
|
7
7
|
"exports": {
|
@@ -10,7 +10,6 @@
|
|
10
10
|
"./fs": "./src/lib/fs.js",
|
11
11
|
"./fsa": "./src/lib/fsa.js",
|
12
12
|
"./block": "./src/lib/block.js",
|
13
|
-
"./indent": "./src/lib/indent.js",
|
14
13
|
"./html": "./src/lib/html.js",
|
15
14
|
"./section": "./src/lib/Section.js",
|
16
15
|
"./sectionmap": "./src/lib/SectionMap.js",
|
@@ -24,7 +23,7 @@
|
|
24
23
|
"verbose": false
|
25
24
|
},
|
26
25
|
"scripts": {
|
27
|
-
"build": "cls && coffee -
|
26
|
+
"build": "cls && coffee -cm .",
|
28
27
|
"test": "npm run build && npx ava ./test/*.test.js && git status"
|
29
28
|
},
|
30
29
|
"repository": {
|
@@ -41,14 +40,10 @@
|
|
41
40
|
},
|
42
41
|
"homepage": "https://github.com/johndeighan/coffee-utils#readme",
|
43
42
|
"dependencies": {
|
44
|
-
"@jdeighan/base-utils": "^
|
43
|
+
"@jdeighan/base-utils": "^12.0.1",
|
45
44
|
"cross-env": "^7.0.3",
|
46
45
|
"n-readlines": "^1.0.1",
|
47
46
|
"readline-sync": "^1.4.10",
|
48
|
-
"svelte": "^4.
|
49
|
-
},
|
50
|
-
"devDependencies": {
|
51
|
-
"@jdeighan/unit-tester": "^3.0.71",
|
52
|
-
"ava": "^6.0.1"
|
47
|
+
"svelte": "^4.2.9"
|
53
48
|
}
|
54
49
|
}
|
package/src/lib/KeyedSet.js
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"file": "KeyedSet.js",
|
4
|
+
"sourceRoot": "..\\..\\",
|
5
|
+
"sources": [
|
6
|
+
"src\\lib\\KeyedSet.coffee"
|
7
|
+
],
|
8
|
+
"names": [],
|
9
|
+
"mappings": "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",
|
10
|
+
"sourcesContent": [
|
11
|
+
"# KeyedSet.coffee\r\n\r\nimport {\r\n\tundef, defined, notdefined, OL, deepCopy,\r\n\tisString, isNonEmptyString, isArray, isHash,\r\n\tisEmpty, nonEmpty, isArrayOfStrings,\r\n\t} from '@jdeighan/base-utils'\r\nimport {assert, croak} from '@jdeighan/base-utils/exceptions'\r\nimport {LOG, LOGVALUE} from '@jdeighan/base-utils/log'\r\nimport {\r\n\tdbgEnter, dbgReturn, dbg,\r\n\t} from '@jdeighan/base-utils/debug'\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport class KeyedSet extends Map\r\n\r\n\tconstructor: (@setName, lKeyNames, @sep='|') ->\r\n\t\t# --- lKeyNames can be:\r\n\t\t# 1. a non-empty string\r\n\t\t# 2. an array of non-empty strings\r\n\r\n\t\tdbgEnter 'KeyedSet'\r\n\t\tsuper()\r\n\t\tassert isNonEmptyString(@setName), \"bad set name: #{OL(@setName)}\"\r\n\t\tif isString(lKeyNames)\r\n\t\t\tassert nonEmpty(lKeyNames), \"empty string key name\"\r\n\t\t\t@lKeyNames = [lKeyNames]\r\n\t\t\t@numKeys = 1\r\n\t\telse if isArray(lKeyNames)\r\n\t\t\tassert nonEmpty(lKeyNames), \"empty key name array\"\r\n\t\t\tfor name in lKeyNames\r\n\t\t\t\tassert isNonEmptyString(name),\r\n\t\t\t\t\t\t\"name not a non-empty string: #{OL(name)}\"\r\n\t\t\t@numKeys = lKeyNames.length\r\n\t\t\t@lKeyNames = lKeyNames\r\n\t\telse\r\n\t\t\tcroak \"Invalid key names: #{OL(lKeyNames)}\"\r\n\t\tdbg \"key is #{OL(@lKeyNames)}\"\r\n\t\tdbgReturn 'KeyedSet'\r\n\r\n\t# ..........................................................\r\n\r\n\tadd: (keyVal, hData={}) ->\r\n\r\n\t\tdbgEnter 'add', keyVal, hData\r\n\t\tassert ! @has(keyVal), \"adding duplicate key #{OL(keyVal)}\"\r\n\t\tassert isHash(hData), \"hData not a hash: #{OL(hData)}\"\r\n\t\tdbg \"not a duplicate\"\r\n\r\n\t\thItem = deepCopy hData\r\n\r\n\t\t# --- Add key values to hItem\r\n\t\tlKeyVals = @getKeyValues keyVal\r\n\t\tfor name,i in @lKeyNames\r\n\t\t\tassert notdefined(hItem[name]),\r\n\t\t\t\t\t\"hData has key #{name}\"\r\n\t\t\thItem[name] = lKeyVals[i]\r\n\r\n\t\tkey = @getKey(keyVal)\r\n\t\tdbg 'key', key\r\n\t\tdbg 'value', hItem\r\n\t\t@set key, hItem # set() is a method in Map, the base class\r\n\t\t@length = @size # add to all methods that change size\r\n\t\tdbgReturn 'add'\r\n\t\treturn this # allow chaining\r\n\r\n\t# ..........................................................\r\n\r\n\tgetKey: (keyVal) ->\r\n\t\t# --- Get the actual key used in the underlying Map object\r\n\r\n\t\tdbgEnter 'getKey'\r\n\t\tkey = @getKeyValues(keyVal).join(@sep)\r\n\t\tdbgReturn 'getKey', key\r\n\t\treturn key\r\n\r\n\t# ..........................................................\r\n\r\n\tgetKeyValues: (keyVal) ->\r\n\t\t# --- Accepts either a string or an array of strings\r\n\t\t# But all keys must be non-empty strings\r\n\t\t# Always returns an array\r\n\r\n\t\tdbgEnter 'getKeyValues', keyVal\r\n\t\tif isString(keyVal)\r\n\t\t\tlKeyVals = [keyVal]\r\n\t\telse if isArray(keyVal)\r\n\t\t\tlKeyVals = keyVal\r\n\t\telse\r\n\t\t\tcroak \"Bad key value: #{OL(keyVal)}\"\r\n\t\tassert (lKeyVals.length == @numKeys), \"Bad # keys in #{OL(keyVal)}\"\r\n\t\tfor val in lKeyVals\r\n\t\t\tassert isNonEmptyString(val), \"Bad key val: #{OL(val)}\"\r\n\t\tdbgReturn 'getKeyValues', lKeyVals\r\n\t\treturn lKeyVals\r\n\r\n\t# ..........................................................\r\n\r\n\thas: (keyVal) ->\r\n\r\n\t\treturn super @getKey(keyVal)\r\n\r\n\t# ..........................................................\r\n\r\n\tupdate: (keyVal, hData={}) ->\r\n\r\n\t\tdbgEnter 'update', keyVal, hData\r\n\t\tkey = @getKey(keyVal)\r\n\t\tdbg \"key = #{OL(key)}\"\r\n\t\thItem = @get(key)\r\n\t\tdbg 'hItem', hItem\r\n\t\tassert defined(hItem), \"updating missing key #{OL(keyVal)}\"\r\n\t\tfor key,val of hData\r\n\t\t\thItem[key] = val\r\n\t\tdbgReturn 'update'\r\n\t\treturn this # allow chaining\r\n\r\n\t# ..........................................................\r\n\r\n\tremove: (keyVal) ->\r\n\r\n\t\tkey = @getKey(keyVal)\r\n\t\tif ! @delete key\r\n\t\t\tcroak \"No key #{OL(keyVal)} in #{@setName}\"\r\n\t\t@length = @size # add to all methods that change size\r\n\t\treturn this # allow chaining\r\n\r\n\t# ..........................................................\r\n\r\n\tgetAllItems: () ->\r\n\t\t# --- Useful for unit tests, but it's usually better\r\n\t\t# to use a generator like .entries()\r\n\r\n\t\treturn Array.from(@values())\r\n\r\n\t# ..........................................................\r\n\r\n\tget: (keyVal) ->\r\n\t\t# --- Override to require that it exists\r\n\r\n\t\titem = super @getKey(keyVal)\r\n\t\tassert defined(item), \"No such item: #{OL(keyVal)} in #{@setName}\"\r\n\t\treturn item\r\n\r\n\t# ..........................................................\r\n\r\n\tdump: () ->\r\n\r\n\t\tconsole.log \"DUMP #{@setName}:\"\r\n\t\tfor [key, value] from @entries()\r\n\t\t\tconsole.log \"#{OL(key)}: #{OL(value)}\"\r\n\r\n# ---------------------------------------------------------------------------\r\n"
|
12
|
+
]
|
13
|
+
}
|
package/src/lib/Section.js
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"file": "Section.js",
|
4
|
+
"sourceRoot": "..\\..\\",
|
5
|
+
"sources": [
|
6
|
+
"src\\lib\\Section.coffee"
|
7
|
+
],
|
8
|
+
"names": [],
|
9
|
+
"mappings": ";AAAgB;AAEhB,OAAA;EAAQ,MAAR;EAAgB,KAAhB;CAAA,MAAA;;AACA,OAAA;EAAQ,GAAR;EAAa,QAAb;EAAuB,SAAvB;CAAA,MAAA;;AACA,OAAA;EACC,IADD;EACO,KADP;EACc,OADd;EACuB,OADvB;EACgC,OADhC;EACyC,UADzC;EACqD,OADrD;CAAA,MAAA,uBAJgB;;;AAUhB,OAAA,IAAa,UAAN,MAAA,QAAA;EAEN,WAAa,KAAA,aAAkB,KAAlB,CAAA;IAAC,IAAC,CAAA;IAAM,IAAC,CAAA,oBACvB;;IAEE,IAAC,CAAA,MAAD,GAAU;IACV,IAAG,OAAA,CAAQ,IAAC,CAAA,QAAT,CAAH;MACC,MAAA,CAAO,UAAA,CAAW,IAAC,CAAA,QAAZ,CAAP,EAA8B,cAA9B,EADD;;EAJY,CAAd;;;EASC,OAAS,CAAA,CAAA;AAER,WAAQ,IAAC,CAAA,MAAM,CAAC,MAAR,KAAkB;EAFlB,CATV;;;EAeC,QAAU,CAAA,CAAA;AAET,WAAQ,IAAC,CAAA,MAAM,CAAC,MAAR,GAAiB;EAFhB,CAfX;;;EAqBC,GAAK,CAAC,IAAD,CAAA;AAEN,QAAA,CAAA,EAAA,GAAA,EAAA;IAAE,IAAG,OAAA,CAAQ,IAAR,CAAH;MACC,KAAA,sCAAA;;QACC,IAAC,CAAA,MAAM,CAAC,IAAR,CAAa,IAAb;MADD,CADD;KAAA,MAAA;MAIC,IAAC,CAAA,MAAM,CAAC,IAAR,CAAa,IAAb,EAJD;;EAFI,CArBN;;;EAgCC,OAAS,CAAC,IAAD,CAAA;IAER,IAAG,OAAA,CAAQ,IAAR,CAAH;MACC,IAAC,CAAA,MAAD,GAAU,CAAC,GAAA,IAAD,EAAU,GAAA,IAAC,CAAA,MAAX,EADX;KAAA,MAAA;MAGC,IAAC,CAAA,MAAD,GAAU,CAAC,IAAD,EAAO,GAAA,IAAC,CAAA,MAAR,EAHX;;EAFQ,CAhCV;;;EA0CC,QAAU,CAAA,CAAA;AAET,WAAO,IAAC,CAAA;EAFC,CA1CX;;;EAgDC,QAAU,CAAA,CAAA;AAEX,QAAA;IAAE,QAAA,CAAS,kBAAT;IACA,IAAI,IAAC,CAAA,MAAM,CAAC,MAAR,KAAkB,CAAtB;MACC,SAAA,CAAU,kBAAV,EAA8B,KAA9B;AACA,aAAO,MAFR;;IAGA,KAAA,GAAQ,OAAA,CAAQ,IAAC,CAAA,MAAT;IACR,IAAG,OAAA,CAAQ,IAAC,CAAA,QAAT,CAAH;MACC,KAAA,GAAQ,IAAC,CAAA,QAAD,CAAU,KAAV,EADT;;IAEA,SAAA,CAAU,kBAAV,EAA8B,KAA9B;AACA,WAAO;EAVE;;AAlDJ",
|
10
|
+
"sourcesContent": [
|
11
|
+
"# Section.coffee\r\n\r\nimport {assert, croak} from '@jdeighan/base-utils/exceptions'\r\nimport {dbg, dbgEnter, dbgReturn} from '@jdeighan/base-utils/debug'\r\nimport {\r\n\tpass, undef, defined, isArray, isEmpty, isFunction, toBlock,\r\n\t} from '@jdeighan/base-utils'\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport class Section\r\n\r\n\tconstructor: (@name, @replacer=undef) ->\r\n\t\t# --- name can be undef or empty\r\n\r\n\t\t@lParts = []\r\n\t\tif defined(@replacer)\r\n\t\t\tassert isFunction(@replacer), \"bad replacer\"\r\n\r\n\t# ..........................................................\r\n\r\n\tisEmpty: () ->\r\n\r\n\t\treturn (@lParts.length == 0)\r\n\r\n\t# ..........................................................\r\n\r\n\tnonEmpty: () ->\r\n\r\n\t\treturn (@lParts.length > 0)\r\n\r\n\t# ..........................................................\r\n\r\n\tadd: (data) ->\r\n\r\n\t\tif isArray(data)\r\n\t\t\tfor line in data\r\n\t\t\t\t@lParts.push line\r\n\t\telse\r\n\t\t\t@lParts.push data\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tprepend: (data) ->\r\n\r\n\t\tif isArray(data)\r\n\t\t\t@lParts = [data..., @lParts...]\r\n\t\telse\r\n\t\t\t@lParts = [data, @lParts...]\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tgetParts: () ->\r\n\r\n\t\treturn @lParts\r\n\r\n\t# ..........................................................\r\n\r\n\tgetBlock: () ->\r\n\r\n\t\tdbgEnter \"Section.getBlock\"\r\n\t\tif (@lParts.length == 0)\r\n\t\t\tdbgReturn \"Section.getBlock\", undef\r\n\t\t\treturn undef\r\n\t\tblock = toBlock(@lParts)\r\n\t\tif defined(@replacer)\r\n\t\t\tblock = @replacer block\r\n\t\tdbgReturn \"Section.getBlock\", block\r\n\t\treturn block\r\n"
|
12
|
+
]
|
13
|
+
}
|
package/src/lib/SectionMap.js
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"file": "SectionMap.js",
|
4
|
+
"sourceRoot": "..\\..\\",
|
5
|
+
"sources": [
|
6
|
+
"src\\lib\\SectionMap.coffee"
|
7
|
+
],
|
8
|
+
"names": [],
|
9
|
+
"mappings": ";AAAmB;AAAA,IAAA,aAAA,EAAA;;AAEnB,OAAA;EACC,IADD;EACO,KADP;EACc,OADd;EACuB,UADvB;EACmC,EADnC;EACuC,OADvC;EACgD,QADhD;EAEC,QAFD;EAEW,MAFX;EAEmB,OAFnB;EAE4B,gBAF5B;EAGC,UAHD;EAGa,MAHb;EAGqB,OAHrB;EAG8B,gBAH9B;EAGgD,eAHhD;CAAA,MAAA;;AAKA,OAAA;EAAQ,MAAR;EAAgB,KAAhB;CAAA,MAAA;;AACA,OAAA;EAAQ,GAAR;EAAa,QAAb;EAAuB,OAAvB;CAAA,MAAA;;AACA,OAAA;EACC,GADD;EACM,QADN;EACgB,SADhB;EAC2B,QAD3B;EACqC,SADrC;CAAA,MAAA;;AAGA,OAAA;EAAQ,MAAR;EAAgB,QAAhB;CAAA,MAAA;;AAEA,OAAA;EAAQ,OAAR;CAAA,MAAA,iCAdmB;;;AAkBnB,aAAA,GAAgB,CAAC,IAAD,CAAA,GAAA;AAEf,SAAO,QAAA,CAAS,IAAT,CAAA,IAAkB,IAAI,CAAC,KAAL,CAAW,kBAAX;AAFV,EAlBG;;;AAwBnB,SAAA,GAAY,CAAC,IAAD,CAAA,GAAA;AAEX,SAAO,QAAA,CAAS,IAAT,CAAA,IAAkB,IAAI,CAAC,KAAL,CAAW,kBAAX;AAFd,EAxBO;;;AA8BnB,OAAA,IAAa,aAAN,MAAA,WAAA;EAEN,WAAa,CAAC,IAAD,eAAmB,CAAA,CAAnB,CAAA;IAAO,IAAC,CAAA,wBACtB;;;;;;;;IAQE,QAAA,CAAS,YAAT,EAAuB,IAAvB,EAA6B,IAAC,CAAA,UAA9B;IAEA,IAAC,CAAA,SAAD,CAAW,IAAX;IACA,IAAC,CAAA,cAAD,CAAgB,IAAC,CAAA,UAAjB;IAEA,IAAC,CAAA,SAAD,GAAa,CAAA,EAbf;IAcE,IAAC,CAAA,KAAD,GAAS;MAAC,GAAA,EAAK,IAAC,CAAA,SAAP;IAAA;IAET,IAAC,CAAA,IAAD,CAAM,IAAC,CAAA,SAAP;IAEA,GAAA,CAAI,WAAJ,EAAiB,IAAC,CAAA,SAAlB;IACA,GAAA,CAAI,OAAJ,EAAa,IAAC,CAAA,KAAd;IACA,SAAA,CAAU,YAAV;EArBY,CAAd;;;EAyBC,IAAM,CAAC,KAAD,CAAA;AAEP,QAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA;IAAE,QAAA,CAAS,MAAT,EAAiB,KAAjB;IACA,MAAA,CAAO,OAAA,CAAQ,KAAR,CAAP,EAAuB,cAAvB;IACA,MAAA,CAAO,QAAA,CAAS,KAAT,CAAP,EAAwB,aAAxB;IAEA,SAAA,GAAY,KAAK,CAAC,CAAD;IACjB,IAAG,SAAA,CAAU,SAAV,CAAH;MACC,GAAA,CAAI,CAAA,eAAA,CAAA,CAAkB,EAAA,CAAG,SAAH,CAAlB,CAAA,CAAJ;MACA,KAAA,GAAQ,KAAK,CAAC,KAAN,CAAY,CAAZ;MACR,IAAC,CAAA,KAAD,CAAO,SAAP,EAAkB,KAAlB,EAHD;;IAKA,KAAA,uCAAA;;MACC,IAAG,OAAA,CAAQ,IAAR,CAAH;QACC,GAAA,CAAI,cAAJ;QACA,IAAC,CAAA,IAAD,CAAM,IAAN,EAFD;OAAA,MAGK,IAAG,aAAA,CAAc,IAAd,CAAH;QACJ,GAAA,CAAI,CAAA,UAAA,CAAA,CAAa,EAAA,CAAG,IAAH,CAAb,CAAA,CAAJ;QACA,IAAC,CAAA,SAAD,CAAW,IAAX,EAFI;OAAA,MAAA;QAIJ,MAAA,CAAO,QAAA,CAAS,IAAT,CAAP,EAAuB,CAAA,kBAAA,CAAA,CAAqB,EAAA,CAAG,IAAH,CAArB,CAAA,CAAvB,EAJI;;IAJN;IASA,SAAA,CAAU,MAAV;EArBK,CAzBP;;;EAmDC,KAAO,CAAC,IAAD,EAAO,KAAP,CAAA;IAEN,MAAA,CAAO,OAAA,CAAQ,KAAR,CAAP,EAAuB,sBAAvB;IACA,MAAA,CAAO,QAAA,CAAS,KAAT,CAAP,EAAwB,sBAAxB;IACA,MAAA,CAAO,UAAA,CAAW,IAAC,CAAA,KAAK,CAAC,IAAD,CAAjB,CAAP,EAAiC,CAAA,IAAA,CAAA,CAAO,EAAA,CAAG,IAAH,CAAP,CAAA,eAAA,CAAjC;IACA,IAAC,CAAA,KAAK,CAAC,IAAD,CAAN,GAAe;EALT,CAnDR;;;EA6DC,SAAW,CAAC,IAAD,CAAA;IAEV,MAAA,CAAO,UAAA,CAAW,IAAC,CAAA,SAAS,CAAC,IAAD,CAArB,CAAP,EAAqC,wBAArC;IACA,IAAC,CAAA,SAAS,CAAC,IAAD,CAAV,GAAmB,IAAI,OAAJ,CAAY,IAAZ,EAAkB,IAAC,CAAA,UAAU,CAAC,IAAD,CAA7B;EAHT,CA7DZ;;;EAqEC,QAAU,CAAC,OAAK,KAAN,CAAA;AACX,QAAA,KAAA,EAAA,IAAA,EAAA,OAAA,EAAA,QAAA;;;;;;;IAOE,QAAA,CAAS,qBAAT,EAAgC,IAAhC;IACA,IAAG,CAAE,QAAA,CAAS,IAAT,CAAF,IAAoB,CAAE,gBAAA,CAAiB,IAAjB,CAAzB;MACC,KAAA,CAAM,CAAA,UAAA,CAAA,CAAa,EAAA,CAAG,IAAH,CAAb,CAAA,CAAN,EADD;;IAGA,IAAG,aAAA,CAAc,IAAd,CAAH;MACC,GAAA,CAAI,wBAAJ,EAAH;;MAEG,KAAA,GAAQ,IAAC,CAAA,OAAD,CAAS,IAAT,CAAc,CAAC,QAAf,CAAA,EAHT;KAAA,MAIK,IAAG,SAAA,CAAU,IAAV,CAAH;MACJ,GAAA,CAAI,oBAAJ;MACA,OAAA;;AAAU;AAAA;QAAA,KAAA,qCAAA;;UACT,IAAG,OAAA,CAAQ,IAAR,CAAH;yBACC,IAAC,CAAA,QAAD,CAAU,IAAI,CAAC,CAAD,CAAd,GADD;WAAA,MAEK,IAAG,QAAA,CAAS,IAAT,CAAH;yBACJ,IAAC,CAAA,QAAD,CAAU,IAAV,GADI;WAAA,MAAA;yBAGJ,KAAA,CAAM,CAAA,YAAA,CAAA,CAAe,IAAf,CAAA,yBAAA,CAAN,GAHI;;QAHI,CAAA;;;MAOV,KAAA,GAAQ,OAAA,CAAQ,OAAR;MACR,QAAA,GAAW,IAAC,CAAA,UAAU,CAAC,IAAD;MACtB,GAAA,CAAI,CAAA,gBAAA,CAAA,CAAmB,EAAA,CAAG,QAAH,CAAnB,CAAA,CAAJ;MACA,IAAG,OAAA,CAAQ,QAAR,CAAH;QACC,KAAA,GAAQ,QAAA,CAAS,KAAT,EADT;OAZI;KAAA,MAcA,IAAG,QAAA,CAAS,IAAT,CAAH;MACJ,GAAA,CAAI,0BAAJ,EAAH;;MAEG,KAAA,GAAQ,KAHJ;KAAA,MAIA,IAAG,OAAA,CAAQ,IAAR,CAAH;MACJ,GAAA,CAAI,kBAAJ;MACA,OAAA;;AAAU;QAAA,KAAA,sCAAA;;uBACT,IAAC,CAAA,QAAD,CAAU,IAAV;QADS,CAAA;;;MAEV,KAAA,GAAQ,OAAA,CAAQ,OAAR,EAJJ;KAAA,MAAA;MAMJ,KAAA,CAAM,CAAA,SAAA,CAAA,CAAY,EAAA,CAAG,IAAH,CAAZ,CAAA,CAAN,EANI;;IAQL,SAAA,CAAU,qBAAV,EAAiC,KAAjC;AACA,WAAO;EA3CE,CArEX;;;;;EAsHc,EAAb,WAAa,CAAC,OAAK,KAAN,CAAA;AAEd,QAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,GAAA,EAAA,IAAA,EAAA,IAAA,EAAA;IAAE,QAAA,CAAS,aAAT,EAAwB,IAAxB;IACA,IAAG,UAAA,CAAW,IAAX,CAAH;MACC,IAAA,GAAO,IAAC,CAAA,UADT;;IAGA,IAAG,aAAA,CAAc,IAAd,CAAH;MACC,GAAA,CAAI,iBAAJ;MACA,QAAA,CAAS,aAAT,EAAwB,IAAC,CAAA,OAAD,CAAS,IAAT,CAAxB;MACA,MAAM,IAAC,CAAA,OAAD,CAAS,IAAT;MACN,SAAA,CAAU,aAAV,EAJD;KAAA,MAKK,IAAG,SAAA,CAAU,IAAV,CAAH;MACJ,GAAA,CAAI,aAAJ;AACA;MAAA,KAAA,qCAAA;;QACC,QAAA,CAAS,aAAT;QACA,OAAW,IAAC,CAAA,WAAD,CAAa,IAAb;QACX,SAAA,CAAU,aAAV;MAHD,CAFI;KAAA,MAMA,IAAG,OAAA,CAAQ,IAAR,CAAH;MACJ,GAAA,CAAI,UAAJ;MACA,KAAA,wCAAA;;QACC,QAAA,CAAS,aAAT;QACA,OAAW,IAAC,CAAA,WAAD,CAAa,IAAb;QACX,SAAA,CAAU,aAAV;MAHD,CAFI;;IAML,SAAA,CAAU,aAAV;EAvBY,CAtHd;;;EAkJC,OAAS,CAAC,OAAK,KAAN,CAAA;AAEV,QAAA,GAAA,EAAA;AAAE;IAAA,KAAA,WAAA;MACC,IAAG,IAAI,CAAC,QAAL,CAAA,CAAH;AACC,eAAO,MADR;;IADD;AAGA,WAAO;EALC,CAlJV;;;EA2JC,QAAU,CAAC,OAAK,KAAN,CAAA;AAEX,QAAA,GAAA,EAAA;AAAE;IAAA,KAAA,WAAA;MACC,IAAG,IAAI,CAAC,QAAL,CAAA,CAAH;AACC,eAAO,KADR;;IADD;AAGA,WAAO;EALE,CA3JX;;;EAoKC,OAAS,CAAC,IAAD,CAAA;AAEV,QAAA;IAAE,IAAA,GAAO,IAAC,CAAA,SAAS,CAAC,IAAD;IACjB,MAAA,CAAO,OAAA,CAAQ,IAAR,CAAP,EAAsB,CAAA,iBAAA,CAAA,CAAoB,EAAA,CAAG,IAAH,CAApB,CAAA,CAAtB;AACA,WAAO;EAJC,CApKV;;;EA4KC,YAAc,CAAC,IAAD,CAAA;AAEf,QAAA;IAAE,MAAA,CAAO,SAAA,CAAU,IAAV,CAAP,EAAwB,CAAA,aAAA,CAAA,CAAgB,EAAA,CAAG,IAAH,CAAhB,CAAA,CAAxB;IACA,QAAA,GAAW,IAAC,CAAA,KAAK,CAAC,IAAD;IACjB,MAAA,CAAO,OAAA,CAAQ,QAAR,CAAP,EAA0B,CAAA,YAAA,CAAA,CAAe,EAAA,CAAG,IAAH,CAAf,CAAA,CAA1B;AACA,WAAO,IAAC,CAAA,OAAD,CAAS,QAAQ,CAAC,CAAD,CAAjB;EALM,CA5Kf;;;EAqLC,WAAa,CAAC,IAAD,CAAA;AAEd,QAAA;IAAE,MAAA,CAAO,SAAA,CAAU,IAAV,CAAP,EAAwB,CAAA,aAAA,CAAA,CAAgB,EAAA,CAAG,IAAH,CAAhB,CAAA,CAAxB;IACA,QAAA,GAAW,IAAC,CAAA,KAAK,CAAC,IAAD;IACjB,MAAA,CAAO,OAAA,CAAQ,QAAR,CAAP,EAA0B,CAAA,YAAA,CAAA,CAAe,EAAA,CAAG,IAAH,CAAf,CAAA,CAA1B;AACA,WAAO,IAAC,CAAA,OAAD,CAAS,QAAQ,CAAC,QAAQ,CAAC,MAAT,GAAkB,CAAnB,CAAjB;EALK,CArLd;;;EA8LC,SAAW,CAAC,IAAD,CAAA;IAEV,QAAA,CAAS,WAAT;IACA,IAAG,QAAA,CAAS,IAAT,CAAH;MACC,GAAA,CAAI,kBAAJ;MACA,MAAA,CAAO,MAAA,CAAO,IAAP,CAAP,EAAqB,UAArB;MACA,IAAC,CAAA,SAAD,GAAa,QAAA,CAAS,IAAT,EAHd;KAAA,MAAA;MAKC,IAAC,CAAA,SAAD,GAAa,KALd;;IAOA,MAAA,CAAO,OAAA,CAAQ,IAAC,CAAA,SAAT,CAAP,EAA4B,cAA5B;IACA,MAAA,CAAO,QAAA,CAAS,IAAC,CAAA,SAAV,CAAP,EAA6B,eAA7B;IACA,IAAG,SAAA,CAAU,IAAC,CAAA,SAAS,CAAC,CAAD,CAApB,CAAH;MACC,OAAA,CAAQ,WAAR,EAAqB,IAAC,CAAA,SAAtB;MACA,KAAA,CAAM,mCAAN,EAFD;;IAGA,SAAA,CAAU,WAAV;EAfU,CA9LZ;;;EAkNC,cAAgB,CAAC,CAAD,CAAA;AAEjB,QAAA,IAAA,EAAA;IAAE,MAAA,CAAO,MAAA,CAAO,CAAP,CAAP,EAAkB,yBAAlB;IACA,KAAA,QAAA;;MACC,MAAA,CAAO,SAAA,CAAU,GAAV,CAAA,IAAkB,aAAA,CAAc,GAAd,CAAzB,EAA6C,kBAA7C;MACA,MAAA,CAAO,UAAA,CAAW,IAAX,CAAP,EACE,CAAA,aAAA,CAAA,CAAgB,EAAA,CAAG,GAAH,CAAhB,CAAA,kBAAA,CADF;IAFD;EAHe;;AApNV",
|
10
|
+
"sourcesContent": [
|
11
|
+
"# SectionMap.coffee\r\n\r\nimport {\r\n\tpass, undef, defined, notdefined, OL, isEmpty, nonEmpty,\r\n\tisString, isHash, isArray, isNonEmptyString,\r\n\tisFunction, jsType, toBlock, isArrayOfStrings, isNonEmptyArray,\r\n\t} from '@jdeighan/base-utils'\r\nimport {assert, croak} from '@jdeighan/base-utils/exceptions'\r\nimport {LOG, LOGVALUE, LOGTAML} from '@jdeighan/base-utils/log'\r\nimport {\r\n\tdbg, dbgEnter, dbgReturn, dbgYield, dbgResume,\r\n\t} from '@jdeighan/base-utils/debug'\r\nimport {isTAML, fromTAML} from '@jdeighan/base-utils/taml'\r\n\r\nimport {Section} from '@jdeighan/coffee-utils/section'\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nisSectionName = (name) =>\r\n\r\n\treturn isString(name) && name.match(/^[a-z][a-z0-9_]*/)\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nisSetName = (name) =>\r\n\r\n\treturn isString(name) && name.match(/^[A-Z][a-z0-9_]*/)\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport class SectionMap\r\n\r\n\tconstructor: (tree, @hReplacers={}) ->\r\n\t\t# --- tree is a tree of section/set names\r\n\t\t# or a TAML string that converts to one\r\n\t\t# --- hReplacers are callbacks that are called\r\n\t\t# when a set or section is processed\r\n\t\t# should be <name> -> <function>\r\n\t\t# <name> can be a section name or a set name\r\n\t\t# <function> should be <block> -> <block>\r\n\r\n\t\tdbgEnter \"SectionMap\", tree, @hReplacers\r\n\r\n\t\t@checkTree tree\r\n\t\t@checkReplacers @hReplacers\r\n\r\n\t\t@hSections = {} # --- {section name: Section Object}\r\n\t\t@hSets = {ALL: @lFullTree} # --- {set name: array of parts}\r\n\r\n\t\t@init @lFullTree\r\n\r\n\t\tdbg 'hSections', @hSections\r\n\t\tdbg 'hSets', @hSets\r\n\t\tdbgReturn \"SectionMap\"\r\n\r\n\t# ..........................................................\r\n\r\n\tinit: (lTree) ->\r\n\r\n\t\tdbgEnter \"init\", lTree\r\n\t\tassert isArray(lTree), \"not an array\"\r\n\t\tassert nonEmpty(lTree), \"empty array\"\r\n\r\n\t\tfirstItem = lTree[0]\r\n\t\tif isSetName(firstItem)\r\n\t\t\tdbg \"found set name #{OL(firstItem)}\"\r\n\t\t\tlTree = lTree.slice(1)\r\n\t\t\t@mkSet firstItem, lTree\r\n\r\n\t\tfor item in lTree\r\n\t\t\tif isArray(item)\r\n\t\t\t\tdbg \"init subtree\"\r\n\t\t\t\t@init item\r\n\t\t\telse if isSectionName(item)\r\n\t\t\t\tdbg \"mkSection #{OL(item)}\"\r\n\t\t\t\t@mkSection item\r\n\t\t\telse\r\n\t\t\t\tassert isString(item), \"Bad item in tree: #{OL(item)}\"\r\n\t\tdbgReturn \"init\"\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tmkSet: (name, lTree) ->\r\n\r\n\t\tassert isArray(lTree), \"tree is not an array\"\r\n\t\tassert nonEmpty(lTree), \"set without sections\"\r\n\t\tassert notdefined(@hSets[name]), \"set #{OL(name)} already exists\"\r\n\t\t@hSets[name] = lTree\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tmkSection: (name) ->\r\n\r\n\t\tassert notdefined(@hSections[name]), \"duplicate section name\"\r\n\t\t@hSections[name] = new Section(name, @hReplacers[name])\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tgetBlock: (desc='ALL') ->\r\n\t\t# ..........................................................\r\n\t\t# --- desc can be:\r\n\t\t# a section name\r\n\t\t# a set name\r\n\t\t# an array of section or set names or literal strings\r\n\t\t# i.e. it should NOT contain sub-arrays\r\n\r\n\t\tdbgEnter \"SectionMap.getBlock\", desc\r\n\t\tif ! isString(desc) && ! isArrayOfStrings(desc)\r\n\t\t\tcroak \"Bad desc: #{OL(desc)}\"\r\n\r\n\t\tif isSectionName(desc)\r\n\t\t\tdbg \"item is a section name\"\r\n\t\t\t# --- a section's getBlock() applies any replacer\r\n\t\t\tblock = @section(desc).getBlock()\r\n\t\telse if isSetName(desc)\r\n\t\t\tdbg \"item is a set name\"\r\n\t\t\tlBlocks = for item in @hSets[desc]\r\n\t\t\t\tif isArray(item)\r\n\t\t\t\t\t@getBlock item[0]\r\n\t\t\t\telse if isString(item)\r\n\t\t\t\t\t@getBlock item\r\n\t\t\t\telse\r\n\t\t\t\t\tcroak \"Item in set #{desc} is not a string or array\"\r\n\t\t\tblock = toBlock(lBlocks)\r\n\t\t\treplacer = @hReplacers[desc]\r\n\t\t\tdbg \"replacer for is #{OL(replacer)}\"\r\n\t\t\tif defined(replacer)\r\n\t\t\t\tblock = replacer(block)\r\n\t\telse if isString(desc)\r\n\t\t\tdbg \"item is a literal string\"\r\n\t\t\t# --- a literal string\r\n\t\t\tblock = desc\r\n\t\telse if isArray(desc)\r\n\t\t\tdbg \"item is an array\"\r\n\t\t\tlBlocks = for item in desc\r\n\t\t\t\t@getBlock(item)\r\n\t\t\tblock = toBlock(lBlocks)\r\n\t\telse\r\n\t\t\tcroak \"Bad arg: #{OL(desc)}\"\r\n\r\n\t\tdbgReturn \"SectionMap.getBlock\", block\r\n\t\treturn block\r\n\r\n\t# ..........................................................\r\n\t# --- does NOT call any replacers, and skips literal strings\r\n\t# so only useful for isEmpty() and nonEmpty()\r\n\r\n\tallSections: (desc=undef) ->\r\n\r\n\t\tdbgEnter \"allSections\", desc\r\n\t\tif notdefined(desc)\r\n\t\t\tdesc = @lFullTree\r\n\r\n\t\tif isSectionName(desc)\r\n\t\t\tdbg \"is section name\"\r\n\t\t\tdbgYield \"allSections\", @section(desc)\r\n\t\t\tyield @section(desc)\r\n\t\t\tdbgResume \"allSections\"\r\n\t\telse if isSetName(desc)\r\n\t\t\tdbg \"is set name\"\r\n\t\t\tfor name in @hSets[desc]\r\n\t\t\t\tdbgYield \"allSections\"\r\n\t\t\t\tyield from @allSections(name)\r\n\t\t\t\tdbgResume \"allSections\"\r\n\t\telse if isArray(desc)\r\n\t\t\tdbg \"is array\"\r\n\t\t\tfor item in desc\r\n\t\t\t\tdbgYield \"allSections\"\r\n\t\t\t\tyield from @allSections(item)\r\n\t\t\t\tdbgResume \"allSections\"\r\n\t\tdbgReturn \"allSections\"\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tisEmpty: (desc=undef) ->\r\n\r\n\t\tfor sect from @allSections(desc)\r\n\t\t\tif sect.nonEmpty()\r\n\t\t\t\treturn false\r\n\t\treturn true\r\n\r\n\t# ..........................................................\r\n\r\n\tnonEmpty: (desc=undef) ->\r\n\r\n\t\tfor sect from @allSections(desc)\r\n\t\t\tif sect.nonEmpty()\r\n\t\t\t\treturn true\r\n\t\treturn false\r\n\r\n\t# ..........................................................\r\n\r\n\tsection: (name) ->\r\n\r\n\t\tsect = @hSections[name]\r\n\t\tassert defined(sect), \"No section named #{OL(name)}\"\r\n\t\treturn sect\r\n\r\n\t# ..........................................................\r\n\r\n\tfirstSection: (name) ->\r\n\r\n\t\tassert isSetName(name), \"bad set name #{OL(name)}\"\r\n\t\tlSubTree = @hSets[name]\r\n\t\tassert defined(lSubTree), \"no such set #{OL(name)}\"\r\n\t\treturn @section(lSubTree[0])\r\n\r\n\t# ..........................................................\r\n\r\n\tlastSection: (name) ->\r\n\r\n\t\tassert isSetName(name), \"bad set name #{OL(name)}\"\r\n\t\tlSubTree = @hSets[name]\r\n\t\tassert defined(lSubTree), \"no such set #{OL(name)}\"\r\n\t\treturn @section(lSubTree[lSubTree.length - 1])\r\n\r\n\t# ..........................................................\r\n\r\n\tcheckTree: (tree) ->\r\n\r\n\t\tdbgEnter \"checkTree\"\r\n\t\tif isString(tree)\r\n\t\t\tdbg \"tree is a string\"\r\n\t\t\tassert isTAML(tree), \"not TAML\"\r\n\t\t\t@lFullTree = fromTAML(tree)\r\n\t\telse\r\n\t\t\t@lFullTree = tree\r\n\r\n\t\tassert isArray(@lFullTree), \"not an array\"\r\n\t\tassert nonEmpty(@lFullTree), \"tree is empty\"\r\n\t\tif isSetName(@lFullTree[0])\r\n\t\t\tLOGTAML 'lFullTree', @lFullTree\r\n\t\t\tcroak \"tree cannot begin with a set name\"\r\n\t\tdbgReturn \"checkTree\"\r\n\t\treturn\r\n\r\n\t# ..........................................................\r\n\r\n\tcheckReplacers: (h) ->\r\n\r\n\t\tassert isHash(h), \"replacers is not a hash\"\r\n\t\tfor key,func of h\r\n\t\t\tassert isSetName(key) || isSectionName(key), \"bad replacer key\"\r\n\t\t\tassert isFunction(func),\r\n\t\t\t\t\t\"replacer for #{OL(key)} is not a function\"\r\n\t\treturn\r\n\r\n"
|
12
|
+
]
|
13
|
+
}
|
package/src/lib/block.js
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"file": "block.js",
|
4
|
+
"sourceRoot": "..\\..\\",
|
5
|
+
"sources": [
|
6
|
+
"src\\lib\\block.coffee"
|
7
|
+
],
|
8
|
+
"names": [],
|
9
|
+
"mappings": "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",
|
10
|
+
"sourcesContent": [
|
11
|
+
"# block.coffee\r\n\r\nimport fs from 'fs'\r\nimport readline from 'readline'\r\n\r\nimport {assert, croak} from '@jdeighan/base-utils/exceptions'\r\nimport {dbgEnter, dbgReturn, dbg} from '@jdeighan/base-utils/debug'\r\nimport {\r\n\tundef, pass, defined, notdefined, rtrim, OL, isArrayOfStrings,\r\n\tisEmpty, isString, isArray, nonEmpty, toArray, toBlock,\r\n\t} from '@jdeighan/base-utils'\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport splitBlock = (block) =>\r\n\r\n\tassert isString(block), \"not a string\"\r\n\tpos = block.indexOf('\\n')\r\n\tif (pos == -1)\r\n\t\treturn [block, undef]\r\n\telse\r\n\t\treturn [block.substring(0, pos), block.substring(pos+1)]\r\n\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport firstLine = (block) =>\r\n\r\n\tdbgEnter 'firstLine', block\r\n\tassert isString(block), \"not a string\"\r\n\tpos = block.indexOf('\\n')\r\n\tif (pos >= 0)\r\n\t\tblock = block.substring(0, pos)\r\n\tdbgReturn 'firstLine', block\r\n\treturn block\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport remainingLines = (block) =>\r\n\r\n\tassert isString(block), \"not a string\"\r\n\tpos = block.indexOf('\\n')\r\n\tif (pos == -1)\r\n\t\treturn undef\r\n\telse\r\n\t\treturn block.substring(pos+1)\r\n\r\n# ---------------------------------------------------------------------------\r\n# normalizeBlock - remove blank lines, trim each line\r\n# - collapse internal whitespace to ' '\r\n\r\nexport normalizeBlock = (content) =>\r\n\r\n\tif typeof content != 'string'\r\n\t\tthrow new Error(\"normalizeBlock(): not a string\")\r\n\tlLines = for line in toArray(content)\r\n\t\tline = line.trim()\r\n\t\tline.replace(/\\s+/g, ' ')\r\n\tlLines = lLines.filter (line) -> line != ''\r\n\treturn lLines.join('\\n')\r\n\r\n# ---------------------------------------------------------------------------\r\n# truncateBlock - limit block to a certain number of lines\r\n\r\nexport truncateBlock = (str, numLines) =>\r\n\r\n\tlLines = toArray str\r\n\tlLines.length = numLines\r\n\treturn toBlock lLines\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport joinBlocks = (lBlocks...) =>\r\n\r\n\tlNonEmptyBlocks = []\r\n\tfor block in lBlocks.flat(999)\r\n\t\tassert isString(block), \"joinBlocks(): #{block} is not a string\"\r\n\t\tif nonEmpty(block)\r\n\t\t\tlNonEmptyBlocks.push block\r\n\treturn lNonEmptyBlocks.join('\\n')\r\n"
|
12
|
+
]
|
13
|
+
}
|
package/src/lib/cssUtils.js
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"file": "cssUtils.js",
|
4
|
+
"sourceRoot": "..\\..\\",
|
5
|
+
"sources": [
|
6
|
+
"src\\lib\\cssUtils.coffee"
|
7
|
+
],
|
8
|
+
"names": [],
|
9
|
+
"mappings": ";AAAiB;AAEjB,OAAA;EAAQ,KAAR;CAAA,MAAA,uBAFiB;;;AAMjB,OAAA,IAAO,SAAA,GAAY,CAAC,IAAD,EAAO,OAAK,KAAZ,CAAA,GAAA;EAElB,IAAI,IAAA,KAAQ,KAAZ;IACC,IAAA,GAAO,SADR;;AAEA,SAAO,gBAAA,CAAiB,IAAjB,CAAsB,CAAC,gBAAvB,CAAwC,IAAxC;AAJW,EANF;;;AAcjB,OAAA,IAAO,SAAA,GAAY,CAAC,IAAD,EAAO,KAAP,EAAc,OAAK,KAAnB,CAAA,GAAA;EAElB,IAAI,IAAA,KAAQ,KAAZ;IACC,IAAA,GAAO,SADR;;EAEA,IAAI,CAAC,KAAK,CAAC,WAAX,CAAuB,IAAvB,EAA6B,KAA7B;AAJkB",
|
10
|
+
"sourcesContent": [
|
11
|
+
"# cssUtils.coffee\r\n\r\nimport {undef} from '@jdeighan/base-utils'\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport getCSSVar = (name, elem=undef) =>\r\n\r\n\tif (elem == undef)\r\n\t\telem = document\r\n\treturn getComputedStyle(elem).getPropertyValue(name)\r\n\r\n# ---------------------------------------------------------------------------\r\n\r\nexport setCSSVar = (name, value, elem=undef) =>\r\n\r\n\tif (elem == undef)\r\n\t\telem = document\r\n\telem.style.setProperty(name, value)\r\n\treturn\r\n"
|
12
|
+
]
|
13
|
+
}
|
package/src/lib/fs.coffee
CHANGED
@@ -5,7 +5,7 @@ import pathlib from 'path'
|
|
5
5
|
import urllib from 'url'
|
6
6
|
import fs from 'fs'
|
7
7
|
import {
|
8
|
-
readFile, writeFile, rm, rmdir,
|
8
|
+
readFile, writeFile, rm, rmdir,
|
9
9
|
} from 'node:fs/promises'
|
10
10
|
import {execSync} from 'node:child_process'
|
11
11
|
|
@@ -13,11 +13,12 @@ import {
|
|
13
13
|
undef, pass, defined, notdefined, rtrim, isEmpty, nonEmpty,
|
14
14
|
isString, isArray, isHash, isRegExp, isFunction, isBoolean,
|
15
15
|
OL, toBlock, getOptions, isArrayOfStrings, deepCopy,
|
16
|
+
runCmd,
|
16
17
|
} from '@jdeighan/base-utils'
|
17
18
|
import {
|
18
|
-
mydir, mkpath, isFile,
|
19
|
-
forEachLineInFile,
|
20
|
-
|
19
|
+
fileExt, mydir, mkpath, isFile, mkDir, rmDir, rmFile,
|
20
|
+
forEachLineInFile, isDir, parsePath,
|
21
|
+
barf, barfJSON, slurp, slurpJSON, withExt,
|
21
22
|
} from '@jdeighan/base-utils/fs'
|
22
23
|
import {assert, croak} from '@jdeighan/base-utils/exceptions'
|
23
24
|
import {LOG, LOGVALUE} from '@jdeighan/base-utils/log'
|
@@ -25,8 +26,9 @@ import {dbg, dbgEnter, dbgReturn} from '@jdeighan/base-utils/debug'
|
|
25
26
|
import {fromTAML} from '@jdeighan/base-utils/taml'
|
26
27
|
|
27
28
|
export {
|
28
|
-
mydir, mkpath, isFile,
|
29
|
-
forEachLineInFile,
|
29
|
+
fileExt, mydir, mkpath, isFile, mkDir, rmDir, rmFile,
|
30
|
+
forEachLineInFile, isDir, parsePath,
|
31
|
+
barf, barfJSON, slurp, slurpJSON, withExt,
|
30
32
|
}
|
31
33
|
|
32
34
|
fix = true
|
@@ -59,29 +61,7 @@ export fixFile = (filepath, func) =>
|
|
59
61
|
|
60
62
|
# --------------------------------------------------------------------------
|
61
63
|
|
62
|
-
export
|
63
|
-
|
64
|
-
contents = await readFile(filepath, {encoding: 'utf8'})
|
65
|
-
hJson = JSON.parse(contents)
|
66
|
-
func(hJson) # modify in place
|
67
|
-
output = JSON.stringify(hJson, null, 3)
|
68
|
-
output = fixOutput(output)
|
69
|
-
await writeFile(filepath, output, {encoding: 'utf8'})
|
70
|
-
return
|
71
|
-
|
72
|
-
# --------------------------------------------------------------------------
|
73
|
-
|
74
|
-
export fixFileSync = (filepath, func) =>
|
75
|
-
|
76
|
-
contents = fs.readFileSync(filepath, {encoding: 'utf8'})
|
77
|
-
output = func(contents) # returns modified contents
|
78
|
-
output = fixOutput(output)
|
79
|
-
fs.writeFileSync(filepath, output, {encoding: 'utf8'})
|
80
|
-
return
|
81
|
-
|
82
|
-
# --------------------------------------------------------------------------
|
83
|
-
|
84
|
-
export fixJsonSync = (filepath, func) =>
|
64
|
+
export fixJSON = (filepath, func) =>
|
85
65
|
|
86
66
|
contents = fs.readFileSync(filepath, {encoding: 'utf8'})
|
87
67
|
hJson = JSON.parse(contents)
|
@@ -91,22 +71,12 @@ export fixJsonSync = (filepath, func) =>
|
|
91
71
|
fs.writeFileSync(filepath, output, {encoding: 'utf8'})
|
92
72
|
return
|
93
73
|
|
94
|
-
# --------------------------------------------------------------------------
|
95
|
-
|
96
|
-
export execCmdSync = (cmdLine) =>
|
97
|
-
|
98
|
-
execSync cmdLine, {}, (error, stdout, stderr) =>
|
99
|
-
if (error)
|
100
|
-
LOG "ERROR in #{cmdLine}: #{error.code}"
|
101
|
-
process.exit 1
|
102
|
-
return stdout
|
103
|
-
|
104
74
|
# ---------------------------------------------------------------------------
|
105
75
|
|
106
76
|
export cloneRepo = (user, repo, dir) =>
|
107
77
|
|
108
78
|
git_repo = "https://github.com/#{user}/#{repo}.git"
|
109
|
-
return
|
79
|
+
return runCmd "git clone #{git_repo} #{dir}"
|
110
80
|
|
111
81
|
# ---------------------------------------------------------------------------
|
112
82
|
|
@@ -167,16 +137,6 @@ export fileStub = (path) =>
|
|
167
137
|
|
168
138
|
# ---------------------------------------------------------------------------
|
169
139
|
|
170
|
-
export fileExt = (path) =>
|
171
|
-
|
172
|
-
assert isString(path), "fileExt(): path not a string"
|
173
|
-
if lMatches = path.match(/\.[A-Za-z0-9_]+$/)
|
174
|
-
return lMatches[0]
|
175
|
-
else
|
176
|
-
return ''
|
177
|
-
|
178
|
-
# ---------------------------------------------------------------------------
|
179
|
-
|
180
140
|
export getFullPath = (filepath) =>
|
181
141
|
|
182
142
|
return mkpath(pathlib.resolve(filepath))
|
@@ -249,18 +209,6 @@ export forEachSetOfBlocks = (filepath, func, \
|
|
249
209
|
dbgReturn 'forEachSetOfBlocks'
|
250
210
|
return
|
251
211
|
|
252
|
-
# ---------------------------------------------------------------------------
|
253
|
-
# withExt - change file extention in a file name
|
254
|
-
|
255
|
-
export withExt = (path, newExt) =>
|
256
|
-
|
257
|
-
assert newExt, "withExt(): No newExt provided"
|
258
|
-
if newExt.indexOf('.') != 0
|
259
|
-
newExt = '.' + newExt
|
260
|
-
|
261
|
-
{dir, name, ext} = pathlib.parse(path)
|
262
|
-
return mkpath(dir, "#{name}#{newExt}")
|
263
|
-
|
264
212
|
# ---------------------------------------------------------------------------
|
265
213
|
# removeFileWithExt - remove file with different ext
|
266
214
|
|
@@ -282,19 +230,46 @@ export removeFileWithExt = (path, newExt, hOptions={}) =>
|
|
282
230
|
|
283
231
|
# ---------------------------------------------------------------------------
|
284
232
|
|
233
|
+
isHiddenDir = (dir) ->
|
234
|
+
|
235
|
+
hFileInfo = parsePath(dir)
|
236
|
+
base = hFileInfo.lDirs.pop()
|
237
|
+
return (base.substring(0, 1) == '.')
|
238
|
+
|
239
|
+
# ---------------------------------------------------------------------------
|
240
|
+
|
285
241
|
isSystemDir = (dir) ->
|
286
242
|
|
287
243
|
return dir in ['$Recycle.Bin', '$WinREAgent']
|
288
244
|
|
289
245
|
# ---------------------------------------------------------------------------
|
290
246
|
# Get all subdirectories of a directory
|
247
|
+
# don't return hidden or system subdirectories
|
248
|
+
# Return value is just named, not full paths
|
291
249
|
|
292
250
|
export getSubDirs = (dir) =>
|
293
251
|
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
252
|
+
dbgEnter 'getSubDirs', dir
|
253
|
+
assert isDir(dir), "not a directory"
|
254
|
+
|
255
|
+
doInclude = (d) ->
|
256
|
+
if !d.isDirectory()
|
257
|
+
return false
|
258
|
+
dirName = d.name
|
259
|
+
if isSystemDir(dirName) || (dirName.substring(0,1) == '.')
|
260
|
+
return false
|
261
|
+
return true
|
262
|
+
|
263
|
+
hOptions = {
|
264
|
+
withFileTypes: true
|
265
|
+
recursive: false
|
266
|
+
}
|
267
|
+
lSubDirs = fs.readdirSync(dir, hOptions) \
|
268
|
+
.filter(doInclude) \
|
269
|
+
.map((d) -> d.name) \
|
270
|
+
.sort()
|
271
|
+
dbgReturn 'getSubDirs', lSubDirs
|
272
|
+
return lSubDirs
|
298
273
|
|
299
274
|
# ---------------------------------------------------------------------------
|
300
275
|
# Get path to parent directory of a directory
|
@@ -335,39 +310,57 @@ export forEachFile = (dir, cb, filt=undef, level=0) =>
|
|
335
310
|
|
336
311
|
# ---------------------------------------------------------------------------
|
337
312
|
|
338
|
-
export pathTo = (fname, searchDir,
|
313
|
+
export pathTo = (fname, searchDir, hOptions={}) =>
|
339
314
|
|
340
|
-
|
315
|
+
dbgEnter 'pathTo', fname, searchDir, hOptions
|
316
|
+
{direction, relative, directory} = getOptions(hOptions, {
|
341
317
|
direction: 'down'
|
342
318
|
relative: false
|
343
319
|
directory: false # return only the directory the file is in
|
344
320
|
})
|
321
|
+
dbg "direction = #{direction}"
|
322
|
+
dbg "relative = #{relative}"
|
323
|
+
dbg "directory = #{directory}"
|
345
324
|
|
346
|
-
assert !(relative && directory),
|
325
|
+
assert !(relative && directory),
|
326
|
+
"relative & directory are incompatible"
|
347
327
|
if ! searchDir
|
348
328
|
searchDir = process.cwd()
|
349
329
|
assert isDir(searchDir), "Not a directory: #{OL(searchDir)}"
|
330
|
+
|
331
|
+
# --- first check if the file is in searchDir
|
332
|
+
|
350
333
|
filepath = mkpath(searchDir, fname)
|
351
334
|
if isFile(filepath)
|
352
335
|
if relative
|
353
|
-
|
336
|
+
result = "./#{fname}"
|
354
337
|
else if directory
|
355
|
-
|
338
|
+
result = mkpath(searchDir)
|
356
339
|
else
|
357
|
-
|
340
|
+
result = mkpath(filepath)
|
341
|
+
dbgReturn 'pathTo', result
|
342
|
+
return result
|
343
|
+
|
344
|
+
dbg "not found in searchDir '#{searchDir}'"
|
358
345
|
|
359
346
|
if (direction == 'down')
|
360
347
|
# --- Search all directories in this directory
|
361
348
|
# getSubDirs() returns dirs sorted alphabetically
|
362
|
-
|
349
|
+
lSubDirs = getSubDirs(searchDir)
|
350
|
+
dbg 'lSubDirs', lSubDirs
|
351
|
+
for subdir in lSubDirs
|
352
|
+
# --- subdir is a simple name, not a full path
|
363
353
|
dirPath = mkpath(searchDir, subdir)
|
364
|
-
|
354
|
+
fpath = pathTo(fname, dirPath, hOptions)
|
355
|
+
if defined(fpath)
|
365
356
|
if relative
|
366
|
-
|
357
|
+
result = fpath.replace('./', "./#{subdir}/")
|
367
358
|
else if directory
|
368
|
-
|
359
|
+
result = mkpath(dirPath)
|
369
360
|
else
|
370
|
-
|
361
|
+
result = mkpath(fpath)
|
362
|
+
dbgReturn 'pathTo', result
|
363
|
+
return result
|
371
364
|
else if (direction == 'up')
|
372
365
|
nLevels = 0
|
373
366
|
while defined(dirPath = getParentDir(searchDir))
|
@@ -375,14 +368,17 @@ export pathTo = (fname, searchDir, options=undef) =>
|
|
375
368
|
fpath = mkpath(dirPath, fname)
|
376
369
|
if isFile(fpath)
|
377
370
|
if relative
|
378
|
-
|
371
|
+
result = "../".repeat(nLevels) + fname
|
379
372
|
else if directory
|
380
|
-
|
373
|
+
result = mkpath(dirPath)
|
381
374
|
else
|
382
|
-
|
375
|
+
result = mkpath(fpath)
|
376
|
+
dbgReturn 'pathTo', result
|
377
|
+
return result
|
383
378
|
searchDir = dirPath
|
384
379
|
else
|
385
380
|
croak "pathTo(): Invalid direction '#{direction}'"
|
381
|
+
dbgReturn 'pathTo', undef
|
386
382
|
return undef
|
387
383
|
|
388
384
|
# ---------------------------------------------------------------------------
|
@@ -431,56 +427,3 @@ export shortenPath = (path) =>
|
|
431
427
|
return str
|
432
428
|
|
433
429
|
# ---------------------------------------------------------------------------
|
434
|
-
|
435
|
-
export parseSource = (source) =>
|
436
|
-
# --- returns {
|
437
|
-
# dir
|
438
|
-
# filename
|
439
|
-
# fullpath
|
440
|
-
# stub
|
441
|
-
# ext
|
442
|
-
# purpose
|
443
|
-
# }
|
444
|
-
# --- NOTE: source may be a file URL, e.g. import.meta.url
|
445
|
-
|
446
|
-
dbgEnter "parseSource", source
|
447
|
-
assert isString(source),\
|
448
|
-
"parseSource(): source not a string: #{OL(source)}"
|
449
|
-
if source == 'unit test'
|
450
|
-
croak "A source of 'unit test' is deprecated"
|
451
|
-
if source.match(/^file\:\/\//)
|
452
|
-
source = urllib.fileURLToPath(source)
|
453
|
-
|
454
|
-
if isDir(source)
|
455
|
-
hSourceInfo = {
|
456
|
-
dir: source
|
457
|
-
fullpath: source
|
458
|
-
}
|
459
|
-
else
|
460
|
-
hInfo = pathlib.parse(source)
|
461
|
-
if hInfo.dir
|
462
|
-
dir = mkpath(hInfo.dir) # change \ to /
|
463
|
-
hSourceInfo = {
|
464
|
-
dir
|
465
|
-
fullpath: mkpath(dir, hInfo.base)
|
466
|
-
filename: hInfo.base
|
467
|
-
stub: hInfo.name
|
468
|
-
ext: hInfo.ext
|
469
|
-
}
|
470
|
-
else
|
471
|
-
hSourceInfo = {
|
472
|
-
filename: hInfo.base
|
473
|
-
stub: hInfo.name
|
474
|
-
ext: hInfo.ext
|
475
|
-
}
|
476
|
-
|
477
|
-
# --- check for a 'purpose'
|
478
|
-
if lMatches = hSourceInfo.stub.match(///
|
479
|
-
\.
|
480
|
-
([A-Za-z_]+)
|
481
|
-
$///)
|
482
|
-
hSourceInfo.purpose = lMatches[1]
|
483
|
-
dbgReturn "parseSource", hSourceInfo
|
484
|
-
return hSourceInfo
|
485
|
-
|
486
|
-
# ---------------------------------------------------------------------------
|