@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jdeighan/coffee-utils",
3
3
  "type": "module",
4
- "version": "16.0.23",
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 -c .",
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": "^8.0.23",
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.1.1"
49
- },
50
- "devDependencies": {
51
- "@jdeighan/unit-tester": "^3.0.71",
52
- "ava": "^6.0.1"
47
+ "svelte": "^4.2.9"
53
48
  }
54
49
  }
@@ -188,3 +188,5 @@ export var KeyedSet = class KeyedSet extends Map {
188
188
  };
189
189
 
190
190
  // ---------------------------------------------------------------------------
191
+
192
+ //# sourceMappingURL=KeyedSet.js.map
@@ -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
+ }
@@ -87,3 +87,5 @@ export var Section = class Section {
87
87
  }
88
88
 
89
89
  };
90
+
91
+ //# sourceMappingURL=Section.js.map
@@ -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
+ }
@@ -304,3 +304,5 @@ export var SectionMap = class SectionMap {
304
304
  }
305
305
 
306
306
  };
307
+
308
+ //# sourceMappingURL=SectionMap.js.map
@@ -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
@@ -116,3 +116,5 @@ export var joinBlocks = (...lBlocks) => {
116
116
  }
117
117
  return lNonEmptyBlocks.join('\n');
118
118
  };
119
+
120
+ //# sourceMappingURL=block.js.map
@@ -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
+ }
@@ -19,3 +19,5 @@ export var setCSSVar = (name, value, elem = undef) => {
19
19
  }
20
20
  elem.style.setProperty(name, value);
21
21
  };
22
+
23
+ //# sourceMappingURL=cssUtils.js.map
@@ -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, # rmSync, rmdirSync,
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, isDir, rmFileSync, mkdirSync,
19
- forEachLineInFile, fixPath,
20
- rmFile, rmDir, rmDirSync,
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, isDir, rmFileSync, mkdirSync,
29
- forEachLineInFile, rmDir, rmDirSync, rmFile,
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 fixJson = (filepath, func) =>
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 execCmd "git clone #{git_repo} #{dir}"
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
- return fs.readdirSync(dir, {withFileTypes: true}) \
295
- .filter((d) -> d.isDirectory() && !isSystemDir(d.name)) \
296
- .map((d) -> mkpath(d.name)) \
297
- .sort()
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, options=undef) =>
313
+ export pathTo = (fname, searchDir, hOptions={}) =>
339
314
 
340
- {direction, relative, directory} = getOptions(options, {
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), "relative & directory are incompatible"
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
- return "./#{fname}"
336
+ result = "./#{fname}"
354
337
  else if directory
355
- return fixPath(searchDir)
338
+ result = mkpath(searchDir)
356
339
  else
357
- return fixPath(filepath)
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
- for subdir in getSubDirs(searchDir)
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
- if defined(fpath = pathTo(fname, dirPath, options))
354
+ fpath = pathTo(fname, dirPath, hOptions)
355
+ if defined(fpath)
365
356
  if relative
366
- return fpath.replace('./', "./#{subdir}/")
357
+ result = fpath.replace('./', "./#{subdir}/")
367
358
  else if directory
368
- return fixPath(dirPath)
359
+ result = mkpath(dirPath)
369
360
  else
370
- return fixPath(fpath)
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
- return "../".repeat(nLevels) + fname
371
+ result = "../".repeat(nLevels) + fname
379
372
  else if directory
380
- return fixPath(dirPath)
373
+ result = mkpath(dirPath)
381
374
  else
382
- return fixPath(fpath)
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
- # ---------------------------------------------------------------------------