@w5s/dev 1.4.0 → 1.5.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/dist/block.d.ts CHANGED
@@ -16,7 +16,7 @@ export interface BlockOptions {
16
16
  /**
17
17
  * Insert position
18
18
  */
19
- insertPosition?: ['before', 'BeginningOfFile'] | ['after', 'EndOfFile'];
19
+ insertPosition?: ['before', 'BeginningOfFile' | RegExp] | ['after', 'EndOfFile' | RegExp];
20
20
  /**
21
21
  * Block target state
22
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC;IAC3C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACxE;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC9B;AA0ED;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,iBAE1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,QAE9C"}
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC;IAC3C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;IAC1F;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC9B;AAmGD;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,iBAE1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,QAE9C"}
package/dist/block.js CHANGED
@@ -4,6 +4,23 @@ exports.blockSync = exports.block = void 0;
4
4
  const file_js_1 = require("./file.js");
5
5
  const EOF = 'EndOfFile';
6
6
  const BOF = 'BeginningOfFile';
7
+ const insertAt = (str, index, toInsert) => str.slice(0, index) + toInsert + str.slice(index);
8
+ const matchLast = (string, regexp) => {
9
+ const matcher = new RegExp(regexp.source, `${regexp.flags}g`);
10
+ let firstIndex = -1;
11
+ let lastIndex = -1;
12
+ let matches;
13
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
14
+ while (true) {
15
+ matches = matcher.exec(string);
16
+ if (matches == null) {
17
+ break;
18
+ }
19
+ firstIndex = matches.index;
20
+ lastIndex = matcher.lastIndex;
21
+ }
22
+ return { firstIndex, lastIndex };
23
+ };
7
24
  function toFileOptions(options) {
8
25
  const { marker = (mark) => `# ${mark.toUpperCase()} MANAGED BLOCK`, path, block: blockName, insertPosition = ['after', EOF], state = 'present', } = options;
9
26
  const EOL = '\n';
@@ -33,20 +50,26 @@ function toFileOptions(options) {
33
50
  return fullContent;
34
51
  }
35
52
  switch (positionDirection) {
36
- case 'after': {
37
- // insert
38
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
39
- if (positionAnchor === EOF) {
40
- return fullContent + EOL + replaceBlock;
53
+ case 'before': {
54
+ if (positionAnchor !== BOF) {
55
+ const { firstIndex } = matchLast(fullContent, positionAnchor);
56
+ if (firstIndex >= 0) {
57
+ return insertAt(fullContent, firstIndex, replaceBlock + EOL);
58
+ }
41
59
  }
42
- return fullContent;
60
+ // Beginning of file
61
+ return replaceBlock + EOL + fullContent;
43
62
  }
44
- case 'before': {
45
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
46
- if (positionAnchor === BOF) {
47
- return replaceBlock + EOL + fullContent;
63
+ case 'after': {
64
+ // insert
65
+ if (positionAnchor !== EOF) {
66
+ const { lastIndex } = matchLast(fullContent, positionAnchor);
67
+ if (lastIndex >= 0) {
68
+ return insertAt(fullContent, lastIndex, EOL + replaceBlock);
69
+ }
48
70
  }
49
- return fullContent;
71
+ // end of file
72
+ return fullContent + EOL + replaceBlock;
50
73
  }
51
74
  default: {
52
75
  throw new Error(`Unsupported position ${String(positionDirection)}`);
package/dist/block.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w5s/dev",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Shared development constants and functions",
5
5
  "keywords": [
6
6
  "config",
@@ -43,5 +43,5 @@
43
43
  "publishConfig": {
44
44
  "access": "public"
45
45
  },
46
- "gitHead": "40aa9e728c83ee50a5a381817c59df91458cf6a0"
46
+ "gitHead": "824cd89a55dcf5b99977c51c8c54c00143769f24"
47
47
  }
package/src/block.ts CHANGED
@@ -18,7 +18,7 @@ export interface BlockOptions {
18
18
  /**
19
19
  * Insert position
20
20
  */
21
- insertPosition?: ['before', 'BeginningOfFile'] | ['after', 'EndOfFile'];
21
+ insertPosition?: ['before', 'BeginningOfFile' | RegExp] | ['after', 'EndOfFile' | RegExp];
22
22
  /**
23
23
  * Block target state
24
24
  */
@@ -27,6 +27,23 @@ export interface BlockOptions {
27
27
 
28
28
  const EOF = 'EndOfFile';
29
29
  const BOF = 'BeginningOfFile';
30
+ const insertAt = (str: string, index: number, toInsert: string) => str.slice(0, index) + toInsert + str.slice(index);
31
+ const matchLast = (string: string, regexp: RegExp) => {
32
+ const matcher = new RegExp(regexp.source, `${regexp.flags}g`);
33
+ let firstIndex = -1;
34
+ let lastIndex = -1;
35
+ let matches;
36
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
37
+ while (true) {
38
+ matches = matcher.exec(string);
39
+ if (matches == null) {
40
+ break;
41
+ }
42
+ firstIndex = matches.index;
43
+ lastIndex = matcher.lastIndex;
44
+ }
45
+ return { firstIndex, lastIndex };
46
+ };
30
47
 
31
48
  function toFileOptions(options: BlockOptions): FileOptions {
32
49
  const {
@@ -68,22 +85,30 @@ function toFileOptions(options: BlockOptions): FileOptions {
68
85
  return fullContent;
69
86
  }
70
87
  switch (positionDirection) {
71
- case 'after': {
72
- // insert
73
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
74
- if (positionAnchor === EOF) {
75
- return fullContent + EOL + replaceBlock;
88
+ case 'before': {
89
+ if (positionAnchor !== BOF) {
90
+ const { firstIndex } = matchLast(fullContent, positionAnchor);
91
+ if (firstIndex >= 0) {
92
+ return insertAt(fullContent, firstIndex, replaceBlock + EOL);
93
+ }
76
94
  }
77
95
 
78
- return fullContent;
96
+ // Beginning of file
97
+ return replaceBlock + EOL + fullContent;
79
98
  }
80
- case 'before': {
81
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
82
- if (positionAnchor === BOF) {
83
- return replaceBlock + EOL + fullContent;
99
+ case 'after': {
100
+ // insert
101
+ if (positionAnchor !== EOF) {
102
+ const { lastIndex } = matchLast(fullContent, positionAnchor);
103
+ if (lastIndex >= 0) {
104
+ return insertAt(fullContent, lastIndex, EOL + replaceBlock);
105
+ }
84
106
  }
85
- return fullContent;
107
+
108
+ // end of file
109
+ return fullContent + EOL + replaceBlock;
86
110
  }
111
+
87
112
  default: {
88
113
  throw new Error(`Unsupported position ${String(positionDirection)}`);
89
114
  }