@jdeighan/coffee-utils 16.0.23 → 17.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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": "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",
|
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
|
-
# ---------------------------------------------------------------------------
|