@sprucelabs/spruce-cli 24.1.6 → 24.1.8

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/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [24.1.8](https://github.com/sprucelabsai-community/spruce-cli-workspace/compare/v24.1.7...v24.1.8) (2025-03-12)
7
+
8
+ **Note:** Version bump only for package @sprucelabs/spruce-cli
9
+
10
+
11
+
12
+
13
+
14
+ ## [24.1.7](https://github.com/sprucelabsai-community/spruce-cli-workspace/compare/v24.1.6...v24.1.7) (2025-03-11)
15
+
16
+ **Note:** Version bump only for package @sprucelabs/spruce-cli
17
+
18
+
19
+
20
+
21
+
6
22
  ## [24.1.6](https://github.com/sprucelabsai-community/spruce-cli-workspace/compare/v24.1.5...v24.1.6) (2025-03-07)
7
23
 
8
24
  **Note:** Version bump only for package @sprucelabs/spruce-cli
@@ -11,12 +11,14 @@ import AbstractSpruceTest, {
11
11
  @suite()
12
12
  export default class StaticTestFinderTest extends AbstractSpruceTest {
13
13
  private responseBody = generateId()
14
+ private readonly test = generateId()
14
15
 
15
16
  @test()
16
17
  protected async throwsWithMissing() {
17
18
  const finder = StaticTestFinder.Finder()
18
19
  const err = await assert.doesThrowAsync(() => finder.find())
19
20
  console.log(this.responseBody)
21
+ console.log(this.test)
20
22
  errorAssert.assertError(err, 'MISSING_PARAMETERS', {
21
23
  parameters: ['lookupDir'],
22
24
  })
@@ -9,12 +9,14 @@ import AbstractSpruceTest, {
9
9
  @fake.login()
10
10
  export default class StaticTestFinderTest extends AbstractSpruceTest {
11
11
  private static responseBody = generateId()
12
+ private static readonly test = generateId()
12
13
 
13
14
  @test()
14
15
  protected static async throwsWithMissing() {
15
16
  const finder = StaticTestFinder.Finder()
16
17
  const err = await assert.doesThrowAsync(() => finder.find())
17
18
  console.log(this.responseBody)
19
+ console.log(this.test)
18
20
  errorAssert.assertError(err, 'MISSING_PARAMETERS', {
19
21
  parameters: ['lookupDir'],
20
22
  })
@@ -68,15 +68,12 @@ class StaticToInstanceTestFileMigratorImpl {
68
68
  }
69
69
  removeStaticFromDeclaration(contents, name) {
70
70
  /**
71
- * 1) Remove `static` for methods/getters/setters, e.g.:
72
- * private static async doSomething() => private async doSomething()
73
- * private static get value() => private get value()
74
- * private static set value(v) => private set value(v)
71
+ * 1) Remove `static` for methods/getters/setters
75
72
  */
76
- const methodPattern = new RegExp(`((?:public|protected|private)?\\s+)?` + // group 1
77
- `static\\s+` + // literal "static "
78
- `(?:(async)\\s+)?` + // group 2: "async"?
79
- `(?:(get|set)\\s+)?` + // group 3: "get" or "set"?
73
+ const methodPattern = new RegExp(`((?:public|protected|private)?\\s+)?` + // group 1: optional visibility + space
74
+ `static\\s+` + // literal 'static '
75
+ `(?:(async)\\s+)?` + // group 2: 'async'?
76
+ `(?:(get|set)\\s+)?` + // group 3: 'get' or 'set'?
80
77
  `(${name})\\s*\\(`, // group 4: the identifier + '('
81
78
  'g');
82
79
  let updated = contents.replace(methodPattern, (match, g1, g2, g3, g4) => {
@@ -86,20 +83,28 @@ class StaticToInstanceTestFileMigratorImpl {
86
83
  return `${g1 ?? ''}${asyncPart}${accessorPart}${g4}(`;
87
84
  });
88
85
  /**
89
- * 2) Remove `static` from property declarations and add a non-null assertion
90
- * if the property is not optional.
86
+ * 2) Remove `static` from property declarations, including those marked `readonly`.
91
87
  * e.g.
92
- * private static myProp: Type => private myProp!: Type
93
- * private static passedIntervalIdToClear?: string => private passedIntervalIdToClear?: string
88
+ * private static myProp => private myProp!
89
+ * private static readonly myProp => private readonly myProp!
90
+ * private static myProp?: Type => private myProp?: Type
94
91
  */
95
- const propertyPattern = new RegExp(`((?:public|protected|private)?\\s+)?` + // group 1: optional visibility
92
+ const propertyPattern = new RegExp(`((?:public|protected|private)?\\s+)?` + // group 1: optional visibility + space
96
93
  `static\\s+` + // literal "static "
97
- `(${name})(\\?)?` + // group 2: property name, group 3: optional "?"
98
- `(?=[\\s=:\\[;]|$)`, // lookahead: space, '=', ':', '[', ';', or end-of-string
94
+ `(readonly\\s+)?` + // group 2: optional "readonly " (with trailing space)
95
+ `(${name})(\\?)?` + // group 3: property name, group 4: optional "?"
96
+ `(?=[\\s=:\\[;]|$)`, // lookahead
99
97
  'g');
100
- updated = updated.replace(propertyPattern, (match, g1, g2, g3) => {
101
- // If the property is optional (g3 is "?"), leave it. Otherwise, add a non-null assertion.
102
- return `${g1 ?? ''}${g2}${g3 !== undefined ? g3 : '!'}`;
98
+ updated = updated.replace(propertyPattern, (match, g1, g2, g3, g4) => {
99
+ // g1 => "private ", "protected ", or "public " (plus any spacing) or undefined
100
+ // g2 => "readonly " if present, else undefined
101
+ // g3 => property name (e.g. 'test')
102
+ // g4 => "?" if property is optional, else undefined
103
+ // If it's optional, keep the '?' or else add '!'
104
+ // (Adjust if you'd rather remove the '!' in this step. Currently we're adding it if not optional.)
105
+ const optionalChar = g4 ? g4 : '!';
106
+ // Rebuild, dropping 'static' but retaining visibility + optional "readonly " + name + '?' or '!'
107
+ return `${g1 ?? ''}${g2 ?? ''}${g3}${optionalChar}`;
103
108
  });
104
109
  return updated;
105
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StaticToInstanceTestFileMigrator.js","sourceRoot":"","sources":["../../../src/tests/staticToInstanceMigration/StaticToInstanceTestFileMigrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StaticToInstanceTestFileMigrator.js","sourceRoot":"","sources":["../../../src/tests/staticToInstanceMigration/StaticToInstanceTestFileMigrator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "24.1.6",
7
+ "version": "24.1.8",
8
8
  "skill": {
9
9
  "namespace": "spruce-cli",
10
10
  "upgradeIgnoreList": [
@@ -73,18 +73,18 @@
73
73
  },
74
74
  "dependencies": {
75
75
  "@jest/reporters": "^29.7.0",
76
- "@sprucelabs/error": "^6.0.584",
76
+ "@sprucelabs/error": "^6.0.586",
77
77
  "@sprucelabs/globby": "^2.0.502",
78
- "@sprucelabs/heartwood-view-controllers": "^117.2.20",
79
- "@sprucelabs/jest-json-reporter": "^8.0.585",
80
- "@sprucelabs/mercury-client": "^42.0.744",
81
- "@sprucelabs/mercury-event-emitter": "^42.0.744",
82
- "@sprucelabs/mercury-types": "^47.2.43",
83
- "@sprucelabs/schema": "^31.0.59",
84
- "@sprucelabs/spruce-core-schemas": "^40.1.649",
85
- "@sprucelabs/spruce-event-utils": "^40.2.49",
86
- "@sprucelabs/spruce-skill-utils": "^31.2.64",
87
- "@sprucelabs/spruce-templates": "^24.1.6",
78
+ "@sprucelabs/heartwood-view-controllers": "^117.2.26",
79
+ "@sprucelabs/jest-json-reporter": "^8.0.587",
80
+ "@sprucelabs/mercury-client": "^42.0.749",
81
+ "@sprucelabs/mercury-event-emitter": "^42.0.749",
82
+ "@sprucelabs/mercury-types": "^47.2.48",
83
+ "@sprucelabs/schema": "^31.0.63",
84
+ "@sprucelabs/spruce-core-schemas": "^40.1.653",
85
+ "@sprucelabs/spruce-event-utils": "^40.2.54",
86
+ "@sprucelabs/spruce-skill-utils": "^31.2.68",
87
+ "@sprucelabs/spruce-templates": "^24.1.8",
88
88
  "@typescript-eslint/eslint-plugin": "^7.7.1",
89
89
  "@typescript-eslint/parser": "^7.7.1",
90
90
  "cfonts": "^3.3.0",
@@ -110,22 +110,22 @@
110
110
  "uuid": "^11.1.0"
111
111
  },
112
112
  "devDependencies": {
113
- "@sprucelabs/data-stores": "^28.5.74",
114
- "@sprucelabs/mercury-core-events": "^26.0.26",
115
- "@sprucelabs/resolve-path-aliases": "^2.0.536",
116
- "@sprucelabs/spruce-conversation-plugin": "^66.0.33",
117
- "@sprucelabs/spruce-deploy-plugin": "^66.0.33",
118
- "@sprucelabs/spruce-store-plugin": "^66.0.33",
119
- "@sprucelabs/spruce-test-fixtures": "^66.0.33",
120
- "@sprucelabs/test": "^9.0.75",
121
- "@sprucelabs/test-utils": "^5.5.17",
113
+ "@sprucelabs/data-stores": "^28.5.79",
114
+ "@sprucelabs/mercury-core-events": "^26.0.31",
115
+ "@sprucelabs/resolve-path-aliases": "^2.0.537",
116
+ "@sprucelabs/spruce-conversation-plugin": "^66.0.38",
117
+ "@sprucelabs/spruce-deploy-plugin": "^66.0.38",
118
+ "@sprucelabs/spruce-store-plugin": "^66.0.38",
119
+ "@sprucelabs/spruce-test-fixtures": "^66.0.38",
120
+ "@sprucelabs/test": "^9.0.76",
121
+ "@sprucelabs/test-utils": "^5.5.22",
122
122
  "@types/blessed": "^0.1.25",
123
123
  "@types/eslint": "^9.6.1",
124
124
  "@types/fs-extra": "^11.0.4",
125
125
  "@types/inquirer": "^9.0.7",
126
126
  "@types/lodash": "^4.17.16",
127
127
  "@types/md5": "^2.3.5",
128
- "@types/node": "^22.13.9",
128
+ "@types/node": "^22.13.10",
129
129
  "@types/promise.allsettled": "^1.0.6",
130
130
  "@types/ps-node": "^0.1.3",
131
131
  "@types/semver": "^7.5.8",
@@ -138,7 +138,7 @@
138
138
  "concurrently": "^9.1.2",
139
139
  "conventional-changelog-sprucelabs": "2.0.1",
140
140
  "dotenv": "^16.4.7",
141
- "eslint": "^9.21.0",
141
+ "eslint": "^9.22.0",
142
142
  "eslint-config-spruce": "^11.2.26",
143
143
  "find-process": "^1.4.10",
144
144
  "jest": "^29.7.0",
@@ -571,5 +571,5 @@
571
571
  "open"
572
572
  ]
573
573
  },
574
- "gitHead": "b509c322442596b08e096ca352d5907c59a2bfb5"
574
+ "gitHead": "654e0350b7d6f41a8d8e27f8cb1deb93bb67026c"
575
575
  }
@@ -11,12 +11,14 @@ import AbstractSpruceTest, {
11
11
  @suite()
12
12
  export default class StaticTestFinderTest extends AbstractSpruceTest {
13
13
  private responseBody = generateId()
14
+ private readonly test = generateId()
14
15
 
15
16
  @test()
16
17
  protected async throwsWithMissing() {
17
18
  const finder = StaticTestFinder.Finder()
18
19
  const err = await assert.doesThrowAsync(() => finder.find())
19
20
  console.log(this.responseBody)
21
+ console.log(this.test)
20
22
  errorAssert.assertError(err, 'MISSING_PARAMETERS', {
21
23
  parameters: ['lookupDir'],
22
24
  })
@@ -9,12 +9,14 @@ import AbstractSpruceTest, {
9
9
  @fake.login()
10
10
  export default class StaticTestFinderTest extends AbstractSpruceTest {
11
11
  private static responseBody = generateId()
12
+ private static readonly test = generateId()
12
13
 
13
14
  @test()
14
15
  protected static async throwsWithMissing() {
15
16
  const finder = StaticTestFinder.Finder()
16
17
  const err = await assert.doesThrowAsync(() => finder.find())
17
18
  console.log(this.responseBody)
19
+ console.log(this.test)
18
20
  errorAssert.assertError(err, 'MISSING_PARAMETERS', {
19
21
  parameters: ['lookupDir'],
20
22
  })
@@ -99,16 +99,13 @@ export default class StaticToInstanceTestFileMigratorImpl
99
99
  name: string
100
100
  ): string {
101
101
  /**
102
- * 1) Remove `static` for methods/getters/setters, e.g.:
103
- * private static async doSomething() => private async doSomething()
104
- * private static get value() => private get value()
105
- * private static set value(v) => private set value(v)
102
+ * 1) Remove `static` for methods/getters/setters
106
103
  */
107
104
  const methodPattern = new RegExp(
108
- `((?:public|protected|private)?\\s+)?` + // group 1
109
- `static\\s+` + // literal "static "
110
- `(?:(async)\\s+)?` + // group 2: "async"?
111
- `(?:(get|set)\\s+)?` + // group 3: "get" or "set"?
105
+ `((?:public|protected|private)?\\s+)?` + // group 1: optional visibility + space
106
+ `static\\s+` + // literal 'static '
107
+ `(?:(async)\\s+)?` + // group 2: 'async'?
108
+ `(?:(get|set)\\s+)?` + // group 3: 'get' or 'set'?
112
109
  `(${name})\\s*\\(`, // group 4: the identifier + '('
113
110
  'g'
114
111
  )
@@ -123,22 +120,32 @@ export default class StaticToInstanceTestFileMigratorImpl
123
120
  )
124
121
 
125
122
  /**
126
- * 2) Remove `static` from property declarations and add a non-null assertion
127
- * if the property is not optional.
123
+ * 2) Remove `static` from property declarations, including those marked `readonly`.
128
124
  * e.g.
129
- * private static myProp: Type => private myProp!: Type
130
- * private static passedIntervalIdToClear?: string => private passedIntervalIdToClear?: string
125
+ * private static myProp => private myProp!
126
+ * private static readonly myProp => private readonly myProp!
127
+ * private static myProp?: Type => private myProp?: Type
131
128
  */
132
129
  const propertyPattern = new RegExp(
133
- `((?:public|protected|private)?\\s+)?` + // group 1: optional visibility
130
+ `((?:public|protected|private)?\\s+)?` + // group 1: optional visibility + space
134
131
  `static\\s+` + // literal "static "
135
- `(${name})(\\?)?` + // group 2: property name, group 3: optional "?"
136
- `(?=[\\s=:\\[;]|$)`, // lookahead: space, '=', ':', '[', ';', or end-of-string
132
+ `(readonly\\s+)?` + // group 2: optional "readonly " (with trailing space)
133
+ `(${name})(\\?)?` + // group 3: property name, group 4: optional "?"
134
+ `(?=[\\s=:\\[;]|$)`, // lookahead
137
135
  'g'
138
136
  )
139
- updated = updated.replace(propertyPattern, (match, g1, g2, g3) => {
140
- // If the property is optional (g3 is "?"), leave it. Otherwise, add a non-null assertion.
141
- return `${g1 ?? ''}${g2}${g3 !== undefined ? g3 : '!'}`
137
+ updated = updated.replace(propertyPattern, (match, g1, g2, g3, g4) => {
138
+ // g1 => "private ", "protected ", or "public " (plus any spacing) or undefined
139
+ // g2 => "readonly " if present, else undefined
140
+ // g3 => property name (e.g. 'test')
141
+ // g4 => "?" if property is optional, else undefined
142
+
143
+ // If it's optional, keep the '?' or else add '!'
144
+ // (Adjust if you'd rather remove the '!' in this step. Currently we're adding it if not optional.)
145
+ const optionalChar = g4 ? g4 : '!'
146
+
147
+ // Rebuild, dropping 'static' but retaining visibility + optional "readonly " + name + '?' or '!'
148
+ return `${g1 ?? ''}${g2 ?? ''}${g3}${optionalChar}`
142
149
  })
143
150
 
144
151
  return updated