@design.estate/wcctools 5.1.0 → 6.1.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.
Files changed (262) hide show
  1. package/.smartconfig.json +7 -3
  2. package/changelog.md +28 -0
  3. package/cli.js +3 -0
  4. package/dist_shell/bundle.js +2970 -0
  5. package/dist_shell/bundle.js.map +1 -0
  6. package/dist_shell/bundle.js.third-party-notices.json +1722 -0
  7. package/dist_shell/bundle.js.third-party-notices.txt +4195 -0
  8. package/dist_shell/index.html +21 -0
  9. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  10. package/dist_ts/00_commitinfo_data.js +9 -0
  11. package/dist_ts/classes.devapi.d.ts +11 -0
  12. package/dist_ts/classes.devapi.js +21 -0
  13. package/dist_ts/classes.devserver.d.ts +49 -0
  14. package/dist_ts/classes.devserver.js +142 -0
  15. package/dist_ts/cli.d.ts +6 -0
  16. package/dist_ts/cli.js +51 -0
  17. package/dist_ts/index.d.ts +3 -0
  18. package/dist_ts/index.js +4 -0
  19. package/dist_ts/paths.d.ts +4 -0
  20. package/dist_ts/paths.js +6 -0
  21. package/dist_ts/plugins.d.ts +20 -0
  22. package/dist_ts/plugins.js +27 -0
  23. package/dist_ts/shellcontent.d.ts +9 -0
  24. package/dist_ts/shellcontent.js +42 -0
  25. package/dist_ts/standards/baselines.d.ts +27 -0
  26. package/dist_ts/standards/baselines.js +83 -0
  27. package/dist_ts/standards/checker.d.ts +21 -0
  28. package/dist_ts/standards/checker.js +88 -0
  29. package/dist_ts/standards/classes.gitrepo.d.ts +13 -0
  30. package/dist_ts/standards/classes.gitrepo.js +43 -0
  31. package/dist_ts/standards/classes.sourceedits.d.ts +15 -0
  32. package/dist_ts/standards/classes.sourceedits.js +54 -0
  33. package/dist_ts/standards/classes.standardfixer.d.ts +40 -0
  34. package/dist_ts/standards/classes.standardfixer.js +210 -0
  35. package/dist_ts/standards/classes.standardproject.d.ts +80 -0
  36. package/dist_ts/standards/classes.standardproject.js +195 -0
  37. package/dist_ts/standards/classes.standardtree.d.ts +56 -0
  38. package/dist_ts/standards/classes.standardtree.js +207 -0
  39. package/dist_ts/standards/cli.d.ts +7 -0
  40. package/dist_ts/standards/cli.js +89 -0
  41. package/dist_ts/standards/config.d.ts +33 -0
  42. package/dist_ts/standards/config.js +139 -0
  43. package/dist_ts/standards/errors.d.ts +9 -0
  44. package/dist_ts/standards/errors.js +17 -0
  45. package/dist_ts/standards/helpers.ast.d.ts +56 -0
  46. package/dist_ts/standards/helpers.ast.js +172 -0
  47. package/dist_ts/standards/helpers.paths.d.ts +36 -0
  48. package/dist_ts/standards/helpers.paths.js +86 -0
  49. package/dist_ts/standards/index.d.ts +14 -0
  50. package/dist_ts/standards/index.js +15 -0
  51. package/dist_ts/standards/output.d.ts +7 -0
  52. package/dist_ts/standards/output.js +57 -0
  53. package/dist_ts/standards/ratchet.d.ts +15 -0
  54. package/dist_ts/standards/ratchet.js +45 -0
  55. package/dist_ts/standards/rule.d.ts +50 -0
  56. package/dist_ts/standards/rule.js +9 -0
  57. package/dist_ts/standards/rules/barrel.element-index.d.ts +7 -0
  58. package/dist_ts/standards/rules/barrel.element-index.js +108 -0
  59. package/dist_ts/standards/rules/barrel.no-demo-export.d.ts +3 -0
  60. package/dist_ts/standards/rules/barrel.no-demo-export.js +29 -0
  61. package/dist_ts/standards/rules/demo.fixture-not-exported.d.ts +3 -0
  62. package/dist_ts/standards/rules/demo.fixture-not-exported.js +29 -0
  63. package/dist_ts/standards/rules/demo.groups.d.ts +6 -0
  64. package/dist_ts/standards/rules/demo.groups.js +72 -0
  65. package/dist_ts/standards/rules/demo.required.d.ts +3 -0
  66. package/dist_ts/standards/rules/demo.required.js +48 -0
  67. package/dist_ts/standards/rules/demo.separate-file.d.ts +3 -0
  68. package/dist_ts/standards/rules/demo.separate-file.js +38 -0
  69. package/dist_ts/standards/rules/demo.shape.d.ts +3 -0
  70. package/dist_ts/standards/rules/demo.shape.js +38 -0
  71. package/dist_ts/standards/rules/docs.component-index.d.ts +8 -0
  72. package/dist_ts/standards/rules/docs.component-index.js +84 -0
  73. package/dist_ts/standards/rules/element.exported.d.ts +3 -0
  74. package/dist_ts/standards/rules/element.exported.js +33 -0
  75. package/dist_ts/standards/rules/element.literal-tag.d.ts +3 -0
  76. package/dist_ts/standards/rules/element.literal-tag.js +30 -0
  77. package/dist_ts/standards/rules/element.reachable.d.ts +3 -0
  78. package/dist_ts/standards/rules/element.reachable.js +48 -0
  79. package/dist_ts/standards/rules/element.tag-map.d.ts +3 -0
  80. package/dist_ts/standards/rules/element.tag-map.js +83 -0
  81. package/dist_ts/standards/rules/i18n.literals.d.ts +3 -0
  82. package/dist_ts/standards/rules/i18n.literals.js +52 -0
  83. package/dist_ts/standards/rules/index.d.ts +12 -0
  84. package/dist_ts/standards/rules/index.js +83 -0
  85. package/dist_ts/standards/rules/layout.element-folder.d.ts +3 -0
  86. package/dist_ts/standards/rules/layout.element-folder.js +47 -0
  87. package/dist_ts/standards/rules/layout.entry-file-name.d.ts +3 -0
  88. package/dist_ts/standards/rules/layout.entry-file-name.js +71 -0
  89. package/dist_ts/standards/rules/layout.entry.d.ts +3 -0
  90. package/dist_ts/standards/rules/layout.entry.js +38 -0
  91. package/dist_ts/standards/rules/layout.group-folder.d.ts +3 -0
  92. package/dist_ts/standards/rules/layout.group-folder.js +22 -0
  93. package/dist_ts/standards/rules/layout.shared-00.d.ts +3 -0
  94. package/dist_ts/standards/rules/layout.shared-00.js +36 -0
  95. package/dist_ts/standards/rules/naming.class-matches-tag.d.ts +3 -0
  96. package/dist_ts/standards/rules/naming.class-matches-tag.js +26 -0
  97. package/dist_ts/standards/rules/naming.lowercase-files.d.ts +3 -0
  98. package/dist_ts/standards/rules/naming.lowercase-files.js +26 -0
  99. package/dist_ts/standards/rules/naming.tag-prefix.d.ts +3 -0
  100. package/dist_ts/standards/rules/naming.tag-prefix.js +23 -0
  101. package/dist_ts/standards/rules/props.accessor.d.ts +3 -0
  102. package/dist_ts/standards/rules/props.accessor.js +35 -0
  103. package/dist_ts/standards/rules/props.object-no-attribute.d.ts +3 -0
  104. package/dist_ts/standards/rules/props.object-no-attribute.js +42 -0
  105. package/dist_ts/standards/rules/props.reflect-primitive.d.ts +5 -0
  106. package/dist_ts/standards/rules/props.reflect-primitive.js +41 -0
  107. package/dist_ts/standards/rules/props.typed.d.ts +6 -0
  108. package/dist_ts/standards/rules/props.typed.js +64 -0
  109. package/dist_ts/standards/rules/shared.d.ts +38 -0
  110. package/dist_ts/standards/rules/shared.js +103 -0
  111. package/dist_ts/standards/rules/style.bdtheme.d.ts +5 -0
  112. package/dist_ts/standards/rules/style.bdtheme.js +28 -0
  113. package/dist_ts_interfaces/bridge.d.ts +88 -0
  114. package/dist_ts_interfaces/bridge.js +2 -0
  115. package/dist_ts_interfaces/catalog.d.ts +32 -0
  116. package/dist_ts_interfaces/catalog.js +6 -0
  117. package/dist_ts_interfaces/index.d.ts +4 -0
  118. package/dist_ts_interfaces/index.js +5 -0
  119. package/dist_ts_interfaces/plugins.d.ts +2 -0
  120. package/dist_ts_interfaces/plugins.js +3 -0
  121. package/dist_ts_interfaces/requests.d.ts +15 -0
  122. package/dist_ts_interfaces/requests.js +2 -0
  123. package/dist_ts_interfaces/standard.d.ts +93 -0
  124. package/dist_ts_interfaces/standard.js +6 -0
  125. package/dist_ts_shared/index.d.ts +1 -0
  126. package/dist_ts_shared/index.js +2 -0
  127. package/dist_ts_shared/plugins.d.ts +2 -0
  128. package/dist_ts_shared/plugins.js +3 -0
  129. package/dist_ts_shared/previewroute.d.ts +18 -0
  130. package/dist_ts_shared/previewroute.js +47 -0
  131. package/{dist_ts_web → dist_ts_shell}/elements/wcc-contextmenu.js +1 -1
  132. package/dist_ts_shell/elements/wcc-preview-frame.d.ts +23 -0
  133. package/dist_ts_shell/elements/wcc-preview-frame.js +197 -0
  134. package/dist_ts_shell/elements/wcc-properties.d.ts +49 -0
  135. package/{dist_ts_web → dist_ts_shell}/elements/wcc-properties.js +149 -216
  136. package/{dist_ts_web → dist_ts_shell}/elements/wcc-record-button.js +1 -1
  137. package/{dist_ts_web → dist_ts_shell}/elements/wcc-recording-panel.d.ts +2 -2
  138. package/{dist_ts_web → dist_ts_shell}/elements/wcc-recording-panel.js +12 -16
  139. package/dist_ts_shell/elements/wcc-shell.d.ts +87 -0
  140. package/dist_ts_shell/elements/wcc-shell.js +524 -0
  141. package/{dist_ts_web → dist_ts_shell}/elements/wcc-sidebar.d.ts +12 -10
  142. package/{dist_ts_web → dist_ts_shell}/elements/wcc-sidebar.js +137 -183
  143. package/dist_ts_shell/index.d.ts +4 -0
  144. package/dist_ts_shell/index.js +5 -0
  145. package/dist_ts_shell/plugins.d.ts +4 -0
  146. package/dist_ts_shell/plugins.js +5 -0
  147. package/dist_ts_shell/previewconnection.d.ts +30 -0
  148. package/dist_ts_shell/previewconnection.js +86 -0
  149. package/dist_ts_shell/services/recorder.service.js +353 -0
  150. package/dist_ts_web/00_commitinfo_data.js +2 -2
  151. package/dist_ts_web/catalog.d.ts +45 -0
  152. package/dist_ts_web/catalog.js +153 -0
  153. package/dist_ts_web/elementproperties.d.ts +15 -0
  154. package/dist_ts_web/elementproperties.js +89 -0
  155. package/dist_ts_web/elements/wcc-preview.d.ts +19 -0
  156. package/dist_ts_web/elements/wcc-preview.js +164 -0
  157. package/dist_ts_web/elements/wcc-standalone-notice.d.ts +14 -0
  158. package/dist_ts_web/elements/wcc-standalone-notice.js +110 -0
  159. package/dist_ts_web/elements/wcctools.helpers.d.ts +2 -6
  160. package/dist_ts_web/elements/wcctools.helpers.js +1 -7
  161. package/dist_ts_web/index.d.ts +2 -5
  162. package/dist_ts_web/index.js +38 -17
  163. package/dist_ts_web/previewbridge.d.ts +39 -0
  164. package/dist_ts_web/previewbridge.js +153 -0
  165. package/dist_ts_web/renderedtree.d.ts +5 -0
  166. package/dist_ts_web/renderedtree.js +37 -0
  167. package/dist_ts_web/wcctools.interfaces.d.ts +3 -6
  168. package/dist_ts_web/wcctools.interfaces.js +1 -1
  169. package/dist_ts_web/wcctools.plugins.d.ts +3 -1
  170. package/dist_ts_web/wcctools.plugins.js +4 -2
  171. package/package.json +17 -7
  172. package/readme.md +93 -28
  173. package/ts/00_commitinfo_data.ts +8 -0
  174. package/ts/classes.devapi.ts +25 -0
  175. package/ts/classes.devserver.ts +161 -0
  176. package/ts/cli.ts +53 -0
  177. package/ts/index.ts +3 -0
  178. package/ts/paths.ts +7 -0
  179. package/ts/plugins.ts +37 -0
  180. package/ts/shellcontent.ts +42 -0
  181. package/ts/standards/baselines.ts +100 -0
  182. package/ts/standards/checker.ts +114 -0
  183. package/ts/standards/classes.gitrepo.ts +48 -0
  184. package/ts/standards/classes.sourceedits.ts +58 -0
  185. package/ts/standards/classes.standardfixer.ts +234 -0
  186. package/ts/standards/classes.standardproject.ts +250 -0
  187. package/ts/standards/classes.standardtree.ts +220 -0
  188. package/ts/standards/cli.ts +86 -0
  189. package/ts/standards/config.ts +160 -0
  190. package/ts/standards/errors.ts +18 -0
  191. package/ts/standards/helpers.ast.ts +208 -0
  192. package/ts/standards/helpers.paths.ts +119 -0
  193. package/ts/standards/index.ts +22 -0
  194. package/ts/standards/output.ts +65 -0
  195. package/ts/standards/ratchet.ts +63 -0
  196. package/ts/standards/rule.ts +58 -0
  197. package/ts/standards/rules/barrel.element-index.ts +112 -0
  198. package/ts/standards/rules/barrel.no-demo-export.ts +30 -0
  199. package/ts/standards/rules/demo.fixture-not-exported.ts +30 -0
  200. package/ts/standards/rules/demo.groups.ts +74 -0
  201. package/ts/standards/rules/demo.required.ts +49 -0
  202. package/ts/standards/rules/demo.separate-file.ts +40 -0
  203. package/ts/standards/rules/demo.shape.ts +42 -0
  204. package/ts/standards/rules/docs.component-index.ts +88 -0
  205. package/ts/standards/rules/element.exported.ts +35 -0
  206. package/ts/standards/rules/element.literal-tag.ts +30 -0
  207. package/ts/standards/rules/element.reachable.ts +49 -0
  208. package/ts/standards/rules/element.tag-map.ts +87 -0
  209. package/ts/standards/rules/i18n.literals.ts +58 -0
  210. package/ts/standards/rules/index.ts +87 -0
  211. package/ts/standards/rules/layout.element-folder.ts +49 -0
  212. package/ts/standards/rules/layout.entry-file-name.ts +73 -0
  213. package/ts/standards/rules/layout.entry.ts +40 -0
  214. package/ts/standards/rules/layout.group-folder.ts +23 -0
  215. package/ts/standards/rules/layout.shared-00.ts +37 -0
  216. package/ts/standards/rules/naming.class-matches-tag.ts +27 -0
  217. package/ts/standards/rules/naming.lowercase-files.ts +27 -0
  218. package/ts/standards/rules/naming.tag-prefix.ts +24 -0
  219. package/ts/standards/rules/props.accessor.ts +37 -0
  220. package/ts/standards/rules/props.object-no-attribute.ts +45 -0
  221. package/ts/standards/rules/props.reflect-primitive.ts +44 -0
  222. package/ts/standards/rules/props.typed.ts +70 -0
  223. package/ts/standards/rules/shared.ts +127 -0
  224. package/ts/standards/rules/style.bdtheme.ts +31 -0
  225. package/ts_web/00_commitinfo_data.ts +1 -1
  226. package/ts_web/catalog.ts +194 -0
  227. package/ts_web/elementproperties.ts +96 -0
  228. package/ts_web/elements/wcc-preview.ts +111 -0
  229. package/ts_web/elements/wcc-standalone-notice.ts +65 -0
  230. package/ts_web/elements/wcctools.helpers.ts +2 -10
  231. package/ts_web/index.ts +38 -19
  232. package/ts_web/previewbridge.ts +189 -0
  233. package/ts_web/readme.md +26 -85
  234. package/ts_web/renderedtree.ts +43 -0
  235. package/ts_web/wcctools.interfaces.ts +4 -7
  236. package/ts_web/wcctools.plugins.ts +6 -1
  237. package/dist_bundle/bundle.js +0 -92419
  238. package/dist_bundle/bundle.js.map +0 -1
  239. package/dist_ts_web/elements/wcc-dashboard.d.ts +0 -119
  240. package/dist_ts_web/elements/wcc-dashboard.js +0 -700
  241. package/dist_ts_web/elements/wcc-frame.d.ts +0 -22
  242. package/dist_ts_web/elements/wcc-frame.js +0 -256
  243. package/dist_ts_web/elements/wcc-properties.d.ts +0 -43
  244. package/dist_ts_web/pages/index.d.ts +0 -1
  245. package/dist_ts_web/pages/index.js +0 -2
  246. package/dist_ts_web/services/recorder.service.js +0 -353
  247. package/ts_web/elements/wcc-contextmenu.ts +0 -291
  248. package/ts_web/elements/wcc-dashboard.ts +0 -672
  249. package/ts_web/elements/wcc-frame.ts +0 -189
  250. package/ts_web/elements/wcc-properties.ts +0 -1089
  251. package/ts_web/elements/wcc-record-button.ts +0 -108
  252. package/ts_web/elements/wcc-recording-panel.ts +0 -1010
  253. package/ts_web/elements/wcc-sidebar.ts +0 -1470
  254. package/ts_web/pages/index.ts +0 -1
  255. package/ts_web/services/recorder.service.ts +0 -451
  256. package/ts_web/types/dom-mediacapture-stub/index.d.ts +0 -12
  257. package/ts_web/types/dom-mediacapture-stub/package.json +0 -6
  258. package/ts_web/types/dom-webcodecs-stub/index.d.ts +0 -2
  259. package/ts_web/types/dom-webcodecs-stub/package.json +0 -6
  260. /package/{dist_ts_web → dist_ts_shell}/elements/wcc-contextmenu.d.ts +0 -0
  261. /package/{dist_ts_web → dist_ts_shell}/elements/wcc-record-button.d.ts +0 -0
  262. /package/{dist_ts_web → dist_ts_shell}/services/recorder.service.d.ts +0 -0
@@ -0,0 +1,139 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { StandardConfigError } from './errors.js';
3
+ import { severityIn } from './rule.js';
4
+ import { standardRules } from './rules/index.js';
5
+ /** The key of wcctools' configuration in `.smartconfig.json`. */
6
+ export const wcctoolsConfigKey = '@design.estate/wcctools';
7
+ /**
8
+ * Writes through the Smartconfig instance that read the configuration, so a write is refused
9
+ * (SmartconfigChangedError) when `.smartconfig.json` changed in between. Other keys of the
10
+ * `@design.estate/wcctools` block keep their values.
11
+ */
12
+ export class SmartconfigStandardConfigWriter {
13
+ smartconfig;
14
+ constructor(smartconfigArg) {
15
+ this.smartconfig = smartconfigArg;
16
+ }
17
+ async writeStandardConfig(configArg) {
18
+ const block = this.smartconfig.dataFor(wcctoolsConfigKey, {});
19
+ await this.smartconfig.writeDataFor(wcctoolsConfigKey, { ...block, standard: configArg });
20
+ }
21
+ }
22
+ const isPlainObject = (valueArg) => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
23
+ const knownKeys = ['profile', 'tagPrefix', 'groupNames', 'allowlist', 'baselines'];
24
+ /** Validates the `standard` object; collects every problem into one StandardConfigError. */
25
+ export const validateStandardConfig = (valueArg) => {
26
+ const problems = [];
27
+ if (valueArg === undefined) {
28
+ throw new StandardConfigError([`"${wcctoolsConfigKey}".standard is missing`]);
29
+ }
30
+ if (!isPlainObject(valueArg)) {
31
+ throw new StandardConfigError([`"${wcctoolsConfigKey}".standard must be an object`]);
32
+ }
33
+ for (const key of Object.keys(valueArg)) {
34
+ if (!knownKeys.includes(key)) {
35
+ problems.push(`standard.${key} is not a known key (${knownKeys.join(', ')})`);
36
+ }
37
+ }
38
+ const profile = valueArg.profile ?? 'base';
39
+ if (profile !== 'base' && profile !== 'dees') {
40
+ problems.push(`standard.profile must be 'base' or 'dees'`);
41
+ }
42
+ if (valueArg.tagPrefix === undefined) {
43
+ problems.push('standard.tagPrefix is missing');
44
+ }
45
+ else if (typeof valueArg.tagPrefix !== 'string' || !/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(valueArg.tagPrefix)) {
46
+ problems.push('standard.tagPrefix must be a lowercase tag prefix without the trailing hyphen, e.g. "dees"');
47
+ }
48
+ if (valueArg.groupNames !== undefined) {
49
+ if (!isPlainObject(valueArg.groupNames)) {
50
+ problems.push('standard.groupNames must be an object of area → display name');
51
+ }
52
+ else {
53
+ for (const [area, name] of Object.entries(valueArg.groupNames)) {
54
+ if (typeof name !== 'string' || name.length === 0) {
55
+ problems.push(`standard.groupNames.${area} must be a non-empty string`);
56
+ }
57
+ }
58
+ }
59
+ }
60
+ const rulesById = new Map(standardRules.map((ruleArg) => [ruleArg.id, ruleArg]));
61
+ if (valueArg.allowlist !== undefined) {
62
+ if (!isPlainObject(valueArg.allowlist)) {
63
+ problems.push('standard.allowlist must be an object of rule id → entries');
64
+ }
65
+ else {
66
+ for (const [ruleId, entries] of Object.entries(valueArg.allowlist)) {
67
+ const rule = rulesById.get(ruleId);
68
+ if (!rule) {
69
+ problems.push(`standard.allowlist: unknown rule '${ruleId}'`);
70
+ continue;
71
+ }
72
+ if (!rule.allowlistCategories) {
73
+ problems.push(`standard.allowlist: rule '${ruleId}' takes no allowlist entries`);
74
+ continue;
75
+ }
76
+ if (!isPlainObject(entries)) {
77
+ problems.push(`standard.allowlist['${ruleId}'] must be an object of '<file>#<member>' → '<category>: <reason>'`);
78
+ continue;
79
+ }
80
+ for (const [key, value] of Object.entries(entries)) {
81
+ const match = typeof value === 'string' ? /^([a-z-]+):\s*(\S.*)$/.exec(value) : null;
82
+ if (!match) {
83
+ problems.push(`standard.allowlist['${ruleId}']['${key}'] must be '<category>: <reason>'`);
84
+ }
85
+ else if (!rule.allowlistCategories.includes(match[1])) {
86
+ problems.push(`standard.allowlist['${ruleId}']['${key}']: unknown category '${match[1]}' (${rule.allowlistCategories.join(', ')})`);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ }
92
+ if (valueArg.baselines !== undefined) {
93
+ if (!isPlainObject(valueArg.baselines)) {
94
+ problems.push('standard.baselines must be an object of rule id → file → count');
95
+ }
96
+ else {
97
+ for (const [ruleId, counts] of Object.entries(valueArg.baselines)) {
98
+ const rule = rulesById.get(ruleId);
99
+ if (!rule) {
100
+ problems.push(`standard.baselines: unknown rule '${ruleId}'`);
101
+ continue;
102
+ }
103
+ if ((profile === 'base' || profile === 'dees') && severityIn(rule, profile) !== 'error') {
104
+ problems.push(`standard.baselines: '${ruleId}' is not an error rule of the '${profile}' profile; baselines hold error rules only`);
105
+ continue;
106
+ }
107
+ if (!isPlainObject(counts)) {
108
+ problems.push(`standard.baselines['${ruleId}'] must be an object of file → count`);
109
+ continue;
110
+ }
111
+ for (const [file, count] of Object.entries(counts)) {
112
+ if (typeof count !== 'number' || !Number.isInteger(count) || count < 1) {
113
+ problems.push(`standard.baselines['${ruleId}']['${file}'] must be an integer of at least 1`);
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ if (problems.length > 0) {
120
+ throw new StandardConfigError(problems);
121
+ }
122
+ return { config: valueArg, profile: profile };
123
+ };
124
+ /** Reads and validates `.smartconfig.json` → `@design.estate/wcctools` → `standard` of a repository. */
125
+ export const openStandardConfig = (rootDirArg) => {
126
+ let smartconfig;
127
+ try {
128
+ smartconfig = new plugins.smartconfig.Smartconfig(rootDirArg);
129
+ }
130
+ catch (error) {
131
+ throw new StandardConfigError([`.smartconfig.json cannot be read: ${error instanceof Error ? error.message : String(error)}`]);
132
+ }
133
+ if (!smartconfig.smartconfigJsonExists) {
134
+ throw new StandardConfigError([`${rootDirArg} has no .smartconfig.json`]);
135
+ }
136
+ const wcctoolsConfig = smartconfig.dataFor(wcctoolsConfigKey, {});
137
+ return { loaded: validateStandardConfig(wcctoolsConfig.standard), writer: new SmartconfigStandardConfigWriter(smartconfig) };
138
+ };
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc3RhbmRhcmRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFLakQsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDO0FBa0IzRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLCtCQUErQjtJQUN6QixXQUFXLENBQWtDO0lBRTlELFlBQVksY0FBK0M7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUEwQjtRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBMEIsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkYsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7Q0FDRjtBQUVELE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBaUIsRUFBdUMsRUFBRSxDQUMvRSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFaEYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFbkYsNEZBQTRGO0FBQzVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsUUFBaUIsRUFBeUIsRUFBRTtJQUNqRixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsSUFBSSxpQkFBaUIsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsSUFBSSxpQkFBaUIsOEJBQThCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLHdCQUF3QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDO0lBQzNDLElBQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDckMsUUFBUSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2pELENBQUM7U0FBTSxJQUFJLE9BQU8sUUFBUSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDL0csUUFBUSxDQUFDLElBQUksQ0FBQyw0RkFBNEYsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDaEYsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO2dCQUMxRSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDN0UsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNWLFFBQVEsQ0FBQyxJQUFJLENBQUMscUNBQXFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQzlELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLE1BQU0sOEJBQThCLENBQUMsQ0FBQztvQkFDakYsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsTUFBTSxvRUFBb0UsQ0FBQyxDQUFDO29CQUNqSCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDckYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE1BQU0sT0FBTyxHQUFHLG1DQUFtQyxDQUFDLENBQUM7b0JBQzVGLENBQUM7eUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEQsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsTUFBTSxPQUFPLEdBQUcseUJBQXlCLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEksQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDVixRQUFRLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUM5RCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQ3hGLFFBQVEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLE1BQU0sa0NBQWtDLE9BQU8sNENBQTRDLENBQUMsQ0FBQztvQkFDbkksU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsTUFBTSxzQ0FBc0MsQ0FBQyxDQUFDO29CQUNuRixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDbkQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkUsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsTUFBTSxPQUFPLElBQUkscUNBQXFDLENBQUMsQ0FBQztvQkFDL0YsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFzQyxFQUFFLE9BQU8sRUFBRSxPQUEyQixFQUFFLENBQUM7QUFDbEcsQ0FBQyxDQUFDO0FBRUYsd0dBQXdHO0FBQ3hHLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsVUFBa0IsRUFBeUIsRUFBRTtJQUM5RSxJQUFJLFdBQTRDLENBQUM7SUFDakQsSUFBSSxDQUFDO1FBQ0gsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQW1CLENBQUMsQ0FBQyxxQ0FBcUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7SUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsR0FBRyxVQUFVLDJCQUEyQixDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBcUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksK0JBQStCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztBQUMvSCxDQUFDLENBQUMifQ==
@@ -0,0 +1,9 @@
1
+ /** The `standard` configuration is missing or invalid; the CLI exits with code 2. */
2
+ export declare class StandardConfigError extends Error {
3
+ readonly problems: string[];
4
+ constructor(problemsArg: string[]);
5
+ }
6
+ /** A precondition or argument of `check`/`fix` is not met; the CLI exits with code 2. */
7
+ export declare class StandardUsageError extends Error {
8
+ constructor(messageArg: string);
9
+ }
@@ -0,0 +1,17 @@
1
+ /** The `standard` configuration is missing or invalid; the CLI exits with code 2. */
2
+ export class StandardConfigError extends Error {
3
+ problems;
4
+ constructor(problemsArg) {
5
+ super(`Invalid wcctools standard configuration in .smartconfig.json:\n${problemsArg.map((problemArg) => ` - ${problemArg}`).join('\n')}`);
6
+ this.name = 'StandardConfigError';
7
+ this.problems = problemsArg;
8
+ }
9
+ }
10
+ /** A precondition or argument of `check`/`fix` is not met; the CLI exits with code 2. */
11
+ export class StandardUsageError extends Error {
12
+ constructor(messageArg) {
13
+ super(messageArg);
14
+ this.name = 'StandardUsageError';
15
+ }
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc3RhbmRhcmRzL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxRkFBcUY7QUFDckYsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDNUIsUUFBUSxDQUFXO0lBRW5DLFlBQVksV0FBcUI7UUFDL0IsS0FBSyxDQUFDLGtFQUFrRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxPQUFPLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzSSxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVELHlGQUF5RjtBQUN6RixNQUFNLE9BQU8sa0JBQW1CLFNBQVEsS0FBSztJQUMzQyxZQUFZLFVBQWtCO1FBQzVCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRiJ9
@@ -0,0 +1,56 @@
1
+ import * as plugins from '../plugins.js';
2
+ export type TNode = plugins.typescript.Node;
3
+ export type TSourceFile = plugins.typescript.SourceFile;
4
+ export type TClassDeclaration = plugins.typescript.ClassDeclaration;
5
+ export type TClassElement = plugins.typescript.ClassElement;
6
+ export type TPropertyDeclaration = plugins.typescript.PropertyDeclaration;
7
+ export type TObjectLiteralExpression = plugins.typescript.ObjectLiteralExpression;
8
+ export type TCallExpression = plugins.typescript.CallExpression;
9
+ export type TExpression = plugins.typescript.Expression;
10
+ export type TTypeNode = plugins.typescript.TypeNode;
11
+ export type TStringLiteralLike = plugins.typescript.StringLiteralLike;
12
+ export declare const parseSource: (fileArg: string, textArg: string) => TSourceFile;
13
+ /** 1-based line and column of a position. */
14
+ export declare const lineAndColumn: (sourceFileArg: TSourceFile, positionArg: number) => {
15
+ line: number;
16
+ column: number;
17
+ };
18
+ /** The called name of `name(...)` or `a.b.name(...)`. */
19
+ export declare const calleeName: (expressionArg: TExpression) => string | null;
20
+ /** The decorator call named `nameArg` on a node, e.g. `@customElement('x')`. */
21
+ export declare const findDecoratorCall: (nodeArg: TNode, namesArg: readonly string[]) => {
22
+ name: string;
23
+ call: TCallExpression;
24
+ } | null;
25
+ export declare const hasModifier: (nodeArg: TNode, kindArg: plugins.typescript.SyntaxKind) => boolean;
26
+ /** The text of a member name: identifier, private identifier (with '#'), string or numeric literal. */
27
+ export declare const memberNameText: (memberArg: TClassElement) => string | null;
28
+ export declare const isStatic: (memberArg: TNode) => boolean;
29
+ /** The static property declaration `static <name> = …` of a class. */
30
+ export declare const findStaticProperty: (classArg: TClassDeclaration, nameArg: string) => TPropertyDeclaration | null;
31
+ export declare const isStringLiteralLike: (nodeArg: TNode | undefined) => nodeArg is TStringLiteralLike;
32
+ /** A property assignment `key: value` of an object literal, by key. */
33
+ export declare const objectProperty: (objectArg: TObjectLiteralExpression, keyArg: string) => plugins.typescript.PropertyAssignment | null;
34
+ /** The source text of an object literal property's value, or null. */
35
+ export declare const objectPropertyText: (objectArg: TObjectLiteralExpression, keyArg: string) => string | null;
36
+ /** The indentation (leading whitespace) of the line a position is on. */
37
+ export declare const indentationAt: (textArg: string, positionArg: number) => string;
38
+ export interface ITextEdit {
39
+ start: number;
40
+ end: number;
41
+ text: string;
42
+ }
43
+ /**
44
+ * The edit that adds `propertyTextArg` (e.g. `reflect: true`) as the last property of an object
45
+ * literal, following the literal's own layout: inline literals stay on one line, multi-line
46
+ * literals get a new line with the indentation of their last property.
47
+ */
48
+ export declare const appendObjectPropertyEdit: (objectArg: TObjectLiteralExpression, propertyTextArg: string) => ITextEdit;
49
+ /** The edit that adds `propertyTextArg` (e.g. `type: String`) as the first property of an object literal. */
50
+ export declare const prependObjectPropertyEdit: (objectArg: TObjectLiteralExpression, propertyTextArg: string) => ITextEdit;
51
+ /** The position after the last import declaration, at the start of the following line; 0 without imports. */
52
+ export declare const afterLastImport: (sourceFileArg: TSourceFile) => number;
53
+ /** The module an identifier is imported from in a file, e.g. `html` → `lit`. */
54
+ export declare const importSourceOf: (sourceFileArg: TSourceFile, identifierArg: string) => string | null;
55
+ /** Every relative-capable module specifier literal of a file: imports, re-exports, dynamic `import()` and `import('…')` types. */
56
+ export declare const moduleSpecifierLiterals: (sourceFileArg: TSourceFile) => TStringLiteralLike[];
@@ -0,0 +1,172 @@
1
+ import * as plugins from '../plugins.js';
2
+ const ts = plugins.typescript;
3
+ export const parseSource = (fileArg, textArg) => ts.createSourceFile(fileArg, textArg, ts.ScriptTarget.Latest, true);
4
+ /** 1-based line and column of a position. */
5
+ export const lineAndColumn = (sourceFileArg, positionArg) => {
6
+ const location = sourceFileArg.getLineAndCharacterOfPosition(positionArg);
7
+ return { line: location.line + 1, column: location.character + 1 };
8
+ };
9
+ /** The called name of `name(...)` or `a.b.name(...)`. */
10
+ export const calleeName = (expressionArg) => {
11
+ if (ts.isIdentifier(expressionArg)) {
12
+ return expressionArg.text;
13
+ }
14
+ if (ts.isPropertyAccessExpression(expressionArg)) {
15
+ return expressionArg.name.text;
16
+ }
17
+ return null;
18
+ };
19
+ /** The decorator call named `nameArg` on a node, e.g. `@customElement('x')`. */
20
+ export const findDecoratorCall = (nodeArg, namesArg) => {
21
+ if (!ts.canHaveDecorators(nodeArg)) {
22
+ return null;
23
+ }
24
+ for (const decorator of ts.getDecorators(nodeArg) ?? []) {
25
+ if (ts.isCallExpression(decorator.expression)) {
26
+ const name = calleeName(decorator.expression.expression);
27
+ if (name && namesArg.includes(name)) {
28
+ return { name, call: decorator.expression };
29
+ }
30
+ }
31
+ }
32
+ return null;
33
+ };
34
+ export const hasModifier = (nodeArg, kindArg) => ts.canHaveModifiers(nodeArg) && (ts.getModifiers(nodeArg) ?? []).some((modifierArg) => modifierArg.kind === kindArg);
35
+ /** The text of a member name: identifier, private identifier (with '#'), string or numeric literal. */
36
+ export const memberNameText = (memberArg) => {
37
+ const name = memberArg.name;
38
+ if (!name) {
39
+ return null;
40
+ }
41
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
42
+ return name.text;
43
+ }
44
+ if (ts.isPrivateIdentifier(name)) {
45
+ return name.text;
46
+ }
47
+ return null;
48
+ };
49
+ export const isStatic = (memberArg) => hasModifier(memberArg, ts.SyntaxKind.StaticKeyword);
50
+ /** The static property declaration `static <name> = …` of a class. */
51
+ export const findStaticProperty = (classArg, nameArg) => {
52
+ for (const member of classArg.members) {
53
+ if (ts.isPropertyDeclaration(member) && isStatic(member) && memberNameText(member) === nameArg) {
54
+ return member;
55
+ }
56
+ }
57
+ return null;
58
+ };
59
+ export const isStringLiteralLike = (nodeArg) => !!nodeArg && (ts.isStringLiteral(nodeArg) || ts.isNoSubstitutionTemplateLiteral(nodeArg));
60
+ /** A property assignment `key: value` of an object literal, by key. */
61
+ export const objectProperty = (objectArg, keyArg) => {
62
+ for (const property of objectArg.properties) {
63
+ if (ts.isPropertyAssignment(property)) {
64
+ const name = property.name;
65
+ if ((ts.isIdentifier(name) || ts.isStringLiteral(name)) && name.text === keyArg) {
66
+ return property;
67
+ }
68
+ }
69
+ }
70
+ return null;
71
+ };
72
+ /** The source text of an object literal property's value, or null. */
73
+ export const objectPropertyText = (objectArg, keyArg) => objectProperty(objectArg, keyArg)?.initializer.getText() ?? null;
74
+ /** The indentation (leading whitespace) of the line a position is on. */
75
+ export const indentationAt = (textArg, positionArg) => {
76
+ const lineStart = textArg.lastIndexOf('\n', positionArg - 1) + 1;
77
+ return /^[ \t]*/.exec(textArg.slice(lineStart))[0];
78
+ };
79
+ /**
80
+ * The edit that adds `propertyTextArg` (e.g. `reflect: true`) as the last property of an object
81
+ * literal, following the literal's own layout: inline literals stay on one line, multi-line
82
+ * literals get a new line with the indentation of their last property.
83
+ */
84
+ export const appendObjectPropertyEdit = (objectArg, propertyTextArg) => {
85
+ const sourceText = objectArg.getSourceFile().text;
86
+ const properties = objectArg.properties;
87
+ if (properties.length === 0) {
88
+ return { start: objectArg.getStart(), end: objectArg.end, text: `{ ${propertyTextArg} }` };
89
+ }
90
+ const last = properties[properties.length - 1];
91
+ const closeBrace = objectArg.end - 1;
92
+ const between = sourceText.slice(last.end, closeBrace);
93
+ const multiLine = sourceText.slice(objectArg.getStart(), objectArg.end).includes('\n');
94
+ if (multiLine) {
95
+ const indentation = indentationAt(sourceText, last.getStart());
96
+ const commaIndex = between.indexOf(',');
97
+ if (commaIndex !== -1) {
98
+ const at = last.end + commaIndex + 1;
99
+ return { start: at, end: at, text: `\n${indentation}${propertyTextArg},` };
100
+ }
101
+ return { start: last.end, end: last.end, text: `,\n${indentation}${propertyTextArg}` };
102
+ }
103
+ return { start: last.end, end: last.end, text: `, ${propertyTextArg}` };
104
+ };
105
+ /** The edit that adds `propertyTextArg` (e.g. `type: String`) as the first property of an object literal. */
106
+ export const prependObjectPropertyEdit = (objectArg, propertyTextArg) => {
107
+ const sourceText = objectArg.getSourceFile().text;
108
+ const properties = objectArg.properties;
109
+ if (properties.length === 0) {
110
+ return { start: objectArg.getStart(), end: objectArg.end, text: `{ ${propertyTextArg} }` };
111
+ }
112
+ const first = properties[0];
113
+ const multiLine = sourceText.slice(objectArg.getStart(), objectArg.end).includes('\n');
114
+ const start = first.getStart();
115
+ if (multiLine && sourceText.slice(objectArg.getStart() + 1, start).includes('\n')) {
116
+ return { start, end: start, text: `${propertyTextArg},\n${indentationAt(sourceText, start)}` };
117
+ }
118
+ return { start, end: start, text: `${propertyTextArg}, ` };
119
+ };
120
+ /** The position after the last import declaration, at the start of the following line; 0 without imports. */
121
+ export const afterLastImport = (sourceFileArg) => {
122
+ let position = 0;
123
+ for (const statement of sourceFileArg.statements) {
124
+ if (ts.isImportDeclaration(statement) || ts.isImportEqualsDeclaration(statement)) {
125
+ position = statement.end;
126
+ }
127
+ }
128
+ if (position === 0) {
129
+ return 0;
130
+ }
131
+ const newline = sourceFileArg.text.indexOf('\n', position);
132
+ return newline === -1 ? sourceFileArg.text.length : newline + 1;
133
+ };
134
+ /** The module an identifier is imported from in a file, e.g. `html` → `lit`. */
135
+ export const importSourceOf = (sourceFileArg, identifierArg) => {
136
+ for (const statement of sourceFileArg.statements) {
137
+ if (!ts.isImportDeclaration(statement) || !statement.importClause || !ts.isStringLiteral(statement.moduleSpecifier)) {
138
+ continue;
139
+ }
140
+ const clause = statement.importClause;
141
+ if (clause.name?.text === identifierArg) {
142
+ return statement.moduleSpecifier.text;
143
+ }
144
+ const bindings = clause.namedBindings;
145
+ if (bindings && ts.isNamespaceImport(bindings) && bindings.name.text === identifierArg) {
146
+ return statement.moduleSpecifier.text;
147
+ }
148
+ if (bindings && ts.isNamedImports(bindings) && bindings.elements.some((elementArg) => elementArg.name.text === identifierArg)) {
149
+ return statement.moduleSpecifier.text;
150
+ }
151
+ }
152
+ return null;
153
+ };
154
+ /** Every relative-capable module specifier literal of a file: imports, re-exports, dynamic `import()` and `import('…')` types. */
155
+ export const moduleSpecifierLiterals = (sourceFileArg) => {
156
+ const found = [];
157
+ const visit = (nodeArg) => {
158
+ if ((ts.isImportDeclaration(nodeArg) || ts.isExportDeclaration(nodeArg)) && nodeArg.moduleSpecifier && isStringLiteralLike(nodeArg.moduleSpecifier)) {
159
+ found.push(nodeArg.moduleSpecifier);
160
+ }
161
+ else if (ts.isCallExpression(nodeArg) && nodeArg.expression.kind === ts.SyntaxKind.ImportKeyword && isStringLiteralLike(nodeArg.arguments[0])) {
162
+ found.push(nodeArg.arguments[0]);
163
+ }
164
+ else if (ts.isImportTypeNode(nodeArg) && ts.isLiteralTypeNode(nodeArg.argument) && isStringLiteralLike(nodeArg.argument.literal)) {
165
+ found.push(nodeArg.argument.literal);
166
+ }
167
+ ts.forEachChild(nodeArg, visit);
168
+ };
169
+ visit(sourceFileArg);
170
+ return found;
171
+ };
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5hc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdGFuZGFyZHMvaGVscGVycy5hc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQWE5QixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFlLEVBQUUsT0FBZSxFQUFlLEVBQUUsQ0FDM0UsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFdEUsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGFBQTBCLEVBQUUsV0FBbUIsRUFBb0MsRUFBRTtJQUNqSCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsNkJBQTZCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNyRSxDQUFDLENBQUM7QUFFRix5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsYUFBMEIsRUFBaUIsRUFBRTtJQUN0RSxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQUksRUFBRSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDakQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFD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
@@ -0,0 +1,36 @@
1
+ export declare const toPosix: (pathArg: string) => string;
2
+ export declare const dirOf: (fileArg: string) => string;
3
+ export declare const baseOf: (fileArg: string) => string;
4
+ export declare const joinPath: (...partsArg: string[]) => string;
5
+ /** A demo file: `<name>.demo.ts`, `demo.ts`, `<name>.demodata.ts` (and similar), or any file under `ts_web/demos/`. */
6
+ export declare const isDemoFile: (fileArg: string) => boolean;
7
+ export declare const isTypeScriptSource: (fileArg: string) => boolean;
8
+ /**
9
+ * True for a path the fixer may write: relative to the repository root, '/' separators, already
10
+ * normalised, and without '.' or '..' segments, so it cannot leave the root lexically.
11
+ */
12
+ export declare const isRepoPath: (pathArg: string) => boolean;
13
+ /**
14
+ * How a relative module specifier spells its target: `exact` names the file itself (`./x.ts`,
15
+ * `./data.json`, `./x.d.ts`), `js` names a TypeScript file by its emitted extension (`./x.js` for
16
+ * `x.ts` or `x.d.ts`), `none` leaves the extension out (`./x`, or `./folder` for its index file).
17
+ */
18
+ type TSpecifierStyle = 'exact' | 'js' | 'none';
19
+ export interface IResolvedSpecifier {
20
+ /** The resolved repository path. */
21
+ target: string;
22
+ style: TSpecifierStyle;
23
+ /** True when the specifier names a folder and resolved to its index file. */
24
+ viaFolder: boolean;
25
+ }
26
+ /**
27
+ * Resolves a relative module specifier against the importing file the way NodeNext resolution
28
+ * does: an emitted `.js` specifier maps back to its `.ts`, `.tsx` or `.d.ts` source, any other
29
+ * specifier that names a known file exactly resolves to it (`.ts`, `.json`, `.css`, `.d.ts`, …), and
30
+ * an extensionless one to a source or a folder's index file. Returns null for package specifiers
31
+ * and for targets that are not among the known files.
32
+ */
33
+ export declare const resolveSpecifier: (fromFileArg: string, specifierArg: string, existsArg: (fileArg: string) => boolean) => IResolvedSpecifier | null;
34
+ /** The relative specifier from a file to a target, spelled in the given style. */
35
+ export declare const specifierFor: (fromFileArg: string, targetArg: string, styleArg: TSpecifierStyle, viaFolderArg?: boolean) => string;
36
+ export {};
@@ -0,0 +1,86 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * Repository paths in the standard are relative to the repository root with '/' separators.
4
+ */
5
+ const posix = plugins.path.posix;
6
+ export const toPosix = (pathArg) => pathArg.split(plugins.path.sep).join('/');
7
+ export const dirOf = (fileArg) => posix.dirname(fileArg);
8
+ export const baseOf = (fileArg) => posix.basename(fileArg);
9
+ export const joinPath = (...partsArg) => posix.normalize(posix.join(...partsArg));
10
+ /** A demo file: `<name>.demo.ts`, `demo.ts`, `<name>.demodata.ts` (and similar), or any file under `ts_web/demos/`. */
11
+ export const isDemoFile = (fileArg) => /(^|[./-])demo(data)?\.ts$/.test(baseOf(fileArg)) || fileArg.startsWith('ts_web/demos/');
12
+ export const isTypeScriptSource = (fileArg) => /\.(ts|tsx|mts|cts)$/.test(fileArg) && !/\.d\.(ts|mts|cts)$/.test(fileArg);
13
+ /**
14
+ * True for a path the fixer may write: relative to the repository root, '/' separators, already
15
+ * normalised, and without '.' or '..' segments, so it cannot leave the root lexically.
16
+ */
17
+ export const isRepoPath = (pathArg) => pathArg.length > 0
18
+ && !pathArg.includes('\\')
19
+ && !pathArg.includes('\0')
20
+ && posix.normalize(pathArg) === pathArg
21
+ && pathArg.split('/').every((segmentArg) => segmentArg !== '' && segmentArg !== '.' && segmentArg !== '..');
22
+ /** The files an emitted extension stands for, in NodeNext resolution order. */
23
+ const sourcesOfEmittedExtension = {
24
+ '.js': ['.ts', '.tsx', '.d.ts'],
25
+ '.jsx': ['.tsx'],
26
+ '.mjs': ['.mts', '.d.mts'],
27
+ '.cjs': ['.cts', '.d.cts'],
28
+ };
29
+ /** The files an extensionless specifier stands for, in resolution order. */
30
+ const extensionlessSuffixes = ['.ts', '.tsx', '.d.ts'];
31
+ const folderIndexSuffixes = ['/index.ts', '/index.tsx', '/index.d.ts'];
32
+ const typeScriptExtension = /(\.d)?\.(ts|tsx|mts|cts)$/;
33
+ /**
34
+ * Resolves a relative module specifier against the importing file the way NodeNext resolution
35
+ * does: an emitted `.js` specifier maps back to its `.ts`, `.tsx` or `.d.ts` source, any other
36
+ * specifier that names a known file exactly resolves to it (`.ts`, `.json`, `.css`, `.d.ts`, …), and
37
+ * an extensionless one to a source or a folder's index file. Returns null for package specifiers
38
+ * and for targets that are not among the known files.
39
+ */
40
+ export const resolveSpecifier = (fromFileArg, specifierArg, existsArg) => {
41
+ if (!specifierArg.startsWith('./') && !specifierArg.startsWith('../')) {
42
+ return null;
43
+ }
44
+ const raw = joinPath(dirOf(fromFileArg), specifierArg);
45
+ const extension = posix.extname(raw);
46
+ for (const sourceExtension of sourcesOfEmittedExtension[extension] ?? []) {
47
+ const target = raw.slice(0, -extension.length) + sourceExtension;
48
+ if (existsArg(target)) {
49
+ return { target, style: 'js', viaFolder: false };
50
+ }
51
+ }
52
+ if (existsArg(raw)) {
53
+ return { target: raw, style: 'exact', viaFolder: false };
54
+ }
55
+ for (const suffix of extensionlessSuffixes) {
56
+ if (existsArg(`${raw}${suffix}`)) {
57
+ return { target: `${raw}${suffix}`, style: 'none', viaFolder: false };
58
+ }
59
+ }
60
+ for (const suffix of folderIndexSuffixes) {
61
+ if (existsArg(`${raw}${suffix}`)) {
62
+ return { target: `${raw}${suffix}`, style: 'none', viaFolder: true };
63
+ }
64
+ }
65
+ return null;
66
+ };
67
+ /** The relative specifier from a file to a target, spelled in the given style. */
68
+ export const specifierFor = (fromFileArg, targetArg, styleArg, viaFolderArg = false) => {
69
+ let target = targetArg;
70
+ if (styleArg === 'none' && viaFolderArg && /^index(\.d)?\.(ts|tsx)$/.test(baseOf(target))) {
71
+ target = dirOf(target);
72
+ }
73
+ else if (styleArg === 'none') {
74
+ target = target.replace(typeScriptExtension, '');
75
+ }
76
+ else if (styleArg === 'js') {
77
+ const emitted = { ts: '.js', tsx: '.jsx', mts: '.mjs', cts: '.cjs' };
78
+ target = target.replace(typeScriptExtension, (_matchArg, _declarationArg, extensionArg) => emitted[extensionArg]);
79
+ }
80
+ let relative = posix.relative(dirOf(fromFileArg), target);
81
+ if (!relative.startsWith('.')) {
82
+ relative = `./${relative}`;
83
+ }
84
+ return relative;
85
+ };
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0YW5kYXJkcy9oZWxwZXJzLnBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDOztHQUVHO0FBRUgsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFlLEVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFrQixFQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBRXBHLHVIQUF1SDtBQUN2SCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFlLEVBQVcsRUFBRSxDQUNyRCwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFLENBQzdELHFCQUFxQixDQUFD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
@@ -0,0 +1,14 @@
1
+ export { initialBaselines, rekeyStandardConfig, updatedBaselines, type IBaselineRaise } from './baselines.js';
2
+ export { checkStandard, describeStandardRules, detectFindings, rulesOfProfile, type IDetectedFinding } from './checker.js';
3
+ export { GitRepo } from './classes.gitrepo.js';
4
+ export { SourceEdits } from './classes.sourceedits.js';
5
+ export { StandardFixer, type IStandardFixOptions } from './classes.standardfixer.js';
6
+ export { StandardProject, loadStandardProject, type IStandardElement, type IStandardProperty } from './classes.standardproject.js';
7
+ export { FixBatch, StandardTree } from './classes.standardtree.js';
8
+ export { SmartconfigStandardConfigWriter, openStandardConfig, validateStandardConfig, wcctoolsConfigKey, type ILoadedStandardConfig, type IOpenedStandardConfig, type IStandardConfigWriter, } from './config.js';
9
+ export { StandardConfigError, StandardUsageError } from './errors.js';
10
+ export { isDemoFile, resolveSpecifier, specifierFor } from './helpers.paths.js';
11
+ export { registerStandardCommands } from './cli.js';
12
+ export { renderFixResult, renderStandardReport } from './output.js';
13
+ export { initBaselines, updateBaselines, type IBaselineRunResult } from './ratchet.js';
14
+ export { allowlistStaleRuleId, fixOrder, standardRules } from './rules/index.js';
@@ -0,0 +1,15 @@
1
+ export { initialBaselines, rekeyStandardConfig, updatedBaselines } from './baselines.js';
2
+ export { checkStandard, describeStandardRules, detectFindings, rulesOfProfile } from './checker.js';
3
+ export { GitRepo } from './classes.gitrepo.js';
4
+ export { SourceEdits } from './classes.sourceedits.js';
5
+ export { StandardFixer } from './classes.standardfixer.js';
6
+ export { StandardProject, loadStandardProject } from './classes.standardproject.js';
7
+ export { FixBatch, StandardTree } from './classes.standardtree.js';
8
+ export { SmartconfigStandardConfigWriter, openStandardConfig, validateStandardConfig, wcctoolsConfigKey, } from './config.js';
9
+ export { StandardConfigError, StandardUsageError } from './errors.js';
10
+ export { isDemoFile, resolveSpecifier, specifierFor } from './helpers.paths.js';
11
+ export { registerStandardCommands } from './cli.js';
12
+ export { renderFixResult, renderStandardReport } from './output.js';
13
+ export { initBaselines, updateBaselines } from './ratchet.js';
14
+ export { allowlistStaleRuleId, fixOrder, standardRules } from './rules/index.js';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdGFuZGFyZHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBeUIsTUFBTSxjQUFjLENBQUM7QUFDM0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUE0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQWlELE1BQU0sOEJBQThCLENBQUM7QUFDbkksT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGtCQUFrQixFQUNsQixzQkFBc0IsRUFDdEIsaUJBQWlCLEdBSWxCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUEyQixNQUFNLGNBQWMsQ0FBQztBQUN2RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDIn0=
@@ -0,0 +1,7 @@
1
+ import * as plugins from '../plugins.js';
2
+ type IStandardReport = plugins.interfaces.IStandardReport;
3
+ /** The text form of a check report: findings grouped by file, then a summary. */
4
+ export declare const renderStandardReport: (reportArg: IStandardReport, verboseArg: boolean) => string[];
5
+ /** The text form of a fix result: the changes, then the check that remains. */
6
+ export declare const renderFixResult: (resultArg: plugins.interfaces.IStandardFixResult, verboseArg: boolean) => string[];
7
+ export {};