@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 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
- # ---------------------------------------------------------------------------