@neurodevs/meta-node 0.5.0 → 0.6.1

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 (46) hide show
  1. package/build/__tests__/AbstractPackageTest.d.ts +5 -0
  2. package/build/__tests__/AbstractPackageTest.js +16 -0
  3. package/build/__tests__/AbstractPackageTest.js.map +1 -0
  4. package/build/__tests__/modules/GitAutocloner.test.d.ts +2 -3
  5. package/build/__tests__/modules/GitAutocloner.test.js +3 -38
  6. package/build/__tests__/modules/GitAutocloner.test.js.map +1 -1
  7. package/build/__tests__/modules/ImplAutomodule.test.d.ts +13 -4
  8. package/build/__tests__/modules/ImplAutomodule.test.js +96 -4
  9. package/build/__tests__/modules/ImplAutomodule.test.js.map +1 -1
  10. package/build/__tests__/modules/NpmAutopackage.test.d.ts +2 -2
  11. package/build/__tests__/modules/NpmAutopackage.test.js +3 -35
  12. package/build/__tests__/modules/NpmAutopackage.test.js.map +1 -1
  13. package/build/__tests__/modules/PackageAutodocumenter.test.d.ts +7 -0
  14. package/build/__tests__/modules/PackageAutodocumenter.test.js +31 -0
  15. package/build/__tests__/modules/PackageAutodocumenter.test.js.map +1 -0
  16. package/build/index.d.ts +6 -0
  17. package/build/index.js +11 -1
  18. package/build/index.js.map +1 -1
  19. package/build/modules/ImplAutomodule.d.ts +16 -1
  20. package/build/modules/ImplAutomodule.js +76 -3
  21. package/build/modules/ImplAutomodule.js.map +1 -1
  22. package/build/modules/PackageAutodocumenter.d.ts +8 -0
  23. package/build/modules/PackageAutodocumenter.js +10 -0
  24. package/build/modules/PackageAutodocumenter.js.map +1 -0
  25. package/build/scripts/runAutomodule.js +3 -2
  26. package/build/scripts/runAutomodule.js.map +1 -1
  27. package/build/testDoubles/Autodocumenter/FakeAutodocumenter.d.ts +6 -0
  28. package/build/testDoubles/Autodocumenter/FakeAutodocumenter.js +13 -0
  29. package/build/testDoubles/Autodocumenter/FakeAutodocumenter.js.map +1 -0
  30. package/build/testDoubles/fs/fakeReadFile.d.ts +5 -0
  31. package/build/testDoubles/fs/fakeReadFile.js +20 -0
  32. package/build/testDoubles/fs/fakeReadFile.js.map +1 -0
  33. package/build/testDoubles/fs/fakeWriteFile.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/__tests__/AbstractPackageTest.ts +11 -0
  36. package/src/__tests__/modules/GitAutocloner.test.ts +3 -10
  37. package/src/__tests__/modules/ImplAutomodule.test.ts +123 -9
  38. package/src/__tests__/modules/NpmAutopackage.test.ts +3 -6
  39. package/src/__tests__/modules/PackageAutodocumenter.test.ts +24 -0
  40. package/src/index.ts +11 -0
  41. package/src/modules/ImplAutomodule.ts +102 -6
  42. package/src/modules/PackageAutodocumenter.ts +13 -0
  43. package/src/scripts/runAutomodule.ts +4 -2
  44. package/src/testDoubles/Autodocumenter/FakeAutodocumenter.ts +13 -0
  45. package/src/testDoubles/fs/fakeReadFile.ts +18 -0
  46. package/src/testDoubles/fs/fakeWriteFile.ts +4 -1
@@ -8,9 +8,11 @@ const path_1 = __importDefault(require("path"));
8
8
  const pathExists_1 = __importDefault(require("./pathExists"));
9
9
  class ImplAutomodule {
10
10
  constructor(options) {
11
- const { testSaveDir, moduleSaveDir, interfaceName, implName } = options;
11
+ this.indexFilePath = './src/index.ts';
12
+ const { testSaveDir, moduleSaveDir, fakeSaveDir, interfaceName, implName, } = options;
12
13
  this.testSaveDir = testSaveDir;
13
14
  this.moduleSaveDir = moduleSaveDir;
15
+ this.fakeSaveDir = fakeSaveDir;
14
16
  this.interfaceName = interfaceName;
15
17
  this.implName = implName;
16
18
  }
@@ -20,21 +22,33 @@ class ImplAutomodule {
20
22
  async run() {
21
23
  await this.throwIfTestDirDoesNotExist();
22
24
  await this.throwIfModuleDirDoesNotExist();
25
+ await this.throwIfFakeDirDoesNotExist();
23
26
  await this.createTestFile();
24
27
  await this.createModuleFile();
28
+ await this.createFakeFile();
29
+ await this.updateIndexFileExports();
25
30
  }
26
31
  async throwIfTestDirDoesNotExist() {
27
32
  const testDirExists = await this.pathExists(this.testSaveDir);
28
33
  if (!testDirExists) {
29
- throw new Error(`testSaveDir does not exist: ${this.testSaveDir}!`);
34
+ this.throw(`testSaveDir does not exist: ${this.testSaveDir}!`);
30
35
  }
31
36
  }
32
37
  async throwIfModuleDirDoesNotExist() {
33
38
  const moduleDirExists = await this.pathExists(this.moduleSaveDir);
34
39
  if (!moduleDirExists) {
35
- throw new Error(`moduleSaveDir does not exist: ${this.moduleSaveDir}!`);
40
+ this.throw(`moduleSaveDir does not exist: ${this.moduleSaveDir}!`);
36
41
  }
37
42
  }
43
+ async throwIfFakeDirDoesNotExist() {
44
+ const fakeDirExists = await this.pathExists(this.fakeSaveDir);
45
+ if (!fakeDirExists) {
46
+ this.throw(`fakeSaveDir does not exist: ${this.fakeSaveDir}!`);
47
+ }
48
+ }
49
+ throw(err) {
50
+ throw new Error(err);
51
+ }
38
52
  async createTestFile() {
39
53
  await this.writeFile(this.testFileName, this.testFilePattern);
40
54
  }
@@ -47,9 +61,25 @@ class ImplAutomodule {
47
61
  get moduleFileName() {
48
62
  return path_1.default.join(this.moduleSaveDir, `${this.implName}.ts`);
49
63
  }
64
+ async createFakeFile() {
65
+ await this.writeFile(this.fakeFileName, this.fakeFilePattern);
66
+ }
67
+ get fakeFileName() {
68
+ return path_1.default.join(this.fakeSaveDir, `Fake${this.interfaceName}.ts`);
69
+ }
70
+ async updateIndexFileExports() {
71
+ this.originalIndexFile = await this.loadOriginalIndexFile();
72
+ await this.writeFile(this.indexFilePath, this.sortedIndexFile);
73
+ }
74
+ async loadOriginalIndexFile() {
75
+ return await this.readFile(this.indexFilePath, 'utf-8');
76
+ }
50
77
  get pathExists() {
51
78
  return ImplAutomodule.pathExists;
52
79
  }
80
+ get readFile() {
81
+ return ImplAutomodule.readFile;
82
+ }
53
83
  get writeFile() {
54
84
  return ImplAutomodule.writeFile;
55
85
  }
@@ -95,8 +125,51 @@ class ImplAutomodule {
95
125
  export type ${this.interfaceName}Constructor = new () => ${this.interfaceName}
96
126
  `;
97
127
  }
128
+ get fakeFilePattern() {
129
+ return `
130
+ import { ${this.interfaceName} } from '../../modules/${this.implName}'
131
+
132
+ export default class Fake${this.interfaceName} implements ${this.interfaceName} {
133
+ public static numCallsToConstructor = 0
134
+
135
+ public constructor() {
136
+ Fake${this.interfaceName}.numCallsToConstructor++
137
+ }
138
+
139
+ public static resetTestDouble() {
140
+ Fake${this.interfaceName}.numCallsToConstructor = 0
141
+ }
142
+ }
143
+ `;
144
+ }
145
+ get indexFilePattern() {
146
+ return `
147
+ ${this.originalIndexFile}
148
+
149
+ // ${this.interfaceName}
150
+
151
+ export { default as ${this.implName} } from './modules/${this.implName}'
152
+ export * from './modules/${this.implName}'
153
+
154
+ export { default as Fake${this.interfaceName} } from './testDoubles/${this.interfaceName}/Fake${this.interfaceName}'
155
+ export * from './testDoubles/${this.interfaceName}/Fake${this.interfaceName}'
156
+ `;
157
+ }
158
+ get sortedIndexFile() {
159
+ const blocks = this.indexFilePattern
160
+ .split(/(?=\/\/)/)
161
+ .map((s) => s.trim())
162
+ .filter(Boolean);
163
+ blocks.sort((a, b) => {
164
+ const aKey = a.match(/^\/\/\s*([^\n]*)/)?.[1]?.trim() ?? '';
165
+ const bKey = b.match(/^\/\/\s*([^\n]*)/)?.[1]?.trim() ?? '';
166
+ return aKey.localeCompare(bKey);
167
+ });
168
+ return blocks.join('\n\n');
169
+ }
98
170
  }
99
171
  ImplAutomodule.pathExists = pathExists_1.default;
172
+ ImplAutomodule.readFile = promises_1.readFile;
100
173
  ImplAutomodule.writeFile = promises_1.writeFile;
101
174
  exports.default = ImplAutomodule;
102
175
  //# sourceMappingURL=ImplAutomodule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImplAutomodule.js","sourceRoot":"","sources":["../../src/modules/ImplAutomodule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImplAutomodule.js","sourceRoot":"","sources":["../../src/modules/ImplAutomodule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export default class PackageAutodocumenter implements Autodocumenter {
2
+ static Class?: AutodocumenterConstructor;
3
+ protected constructor();
4
+ static Create(): PackageAutodocumenter;
5
+ }
6
+ export interface Autodocumenter {
7
+ }
8
+ export type AutodocumenterConstructor = new () => Autodocumenter;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class PackageAutodocumenter {
4
+ constructor() { }
5
+ static Create() {
6
+ return new (this.Class ?? this)();
7
+ }
8
+ }
9
+ exports.default = PackageAutodocumenter;
10
+ //# sourceMappingURL=PackageAutodocumenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageAutodocumenter.js","sourceRoot":"","sources":["../../src/modules/PackageAutodocumenter.ts"],"names":[],"mappings":";;AAAA,MAAqB,qBAAqB;IAGtC,gBAAyB,CAAC;IAEnB,MAAM,CAAC,MAAM;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAA;IACrC,CAAC;CACJ;AARD,wCAQC"}
@@ -9,8 +9,9 @@ async function main() {
9
9
  const instance = ImplAutomodule_1.default.Create({
10
10
  testSaveDir: '/Users/ericthecurious/dev/meta-node/src/__tests__/modules',
11
11
  moduleSaveDir: '/Users/ericthecurious/dev/meta-node/src/modules',
12
- interfaceName: 'Autocomponent',
13
- implName: 'ReactAutocomponent',
12
+ fakeSaveDir: '/Users/ericthecurious/dev/meta-node/src/testDoubles/Autodocumenter',
13
+ interfaceName: 'Autodocumenter',
14
+ implName: 'PackageAutodocumenter',
14
15
  });
15
16
  await instance.run();
16
17
  console.log('Finished running automodule!\n');
@@ -1 +1 @@
1
- {"version":3,"file":"runAutomodule.js","sourceRoot":"","sources":["../../src/scripts/runAutomodule.ts"],"names":[],"mappings":";;;;;AAAA,+EAAsD;AAEtD,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAEtC,MAAM,QAAQ,GAAG,wBAAc,CAAC,MAAM,CAAC;QACnC,WAAW,EACP,2DAA2D;QAC/D,aAAa,EAAE,iDAAiD;QAChE,aAAa,EAAE,eAAe;QAC9B,QAAQ,EAAE,oBAAoB;KACjC,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAA;IAEpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"runAutomodule.js","sourceRoot":"","sources":["../../src/scripts/runAutomodule.ts"],"names":[],"mappings":";;;;;AAAA,+EAAsD;AAEtD,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAEtC,MAAM,QAAQ,GAAG,wBAAc,CAAC,MAAM,CAAC;QACnC,WAAW,EACP,2DAA2D;QAC/D,aAAa,EAAE,iDAAiD;QAChE,WAAW,EACP,oEAAoE;QACxE,aAAa,EAAE,gBAAgB;QAC/B,QAAQ,EAAE,uBAAuB;KACpC,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAA;IAEpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { Autodocumenter } from '../../modules/PackageAutodocumenter';
2
+ export default class FakeAutodocumenter implements Autodocumenter {
3
+ static numCallsToConstructor: number;
4
+ constructor();
5
+ static resetTestDouble(): void;
6
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class FakeAutodocumenter {
4
+ constructor() {
5
+ FakeAutodocumenter.numCallsToConstructor++;
6
+ }
7
+ static resetTestDouble() {
8
+ FakeAutodocumenter.numCallsToConstructor = 0;
9
+ }
10
+ }
11
+ FakeAutodocumenter.numCallsToConstructor = 0;
12
+ exports.default = FakeAutodocumenter;
13
+ //# sourceMappingURL=FakeAutodocumenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeAutodocumenter.js","sourceRoot":"","sources":["../../../src/testDoubles/Autodocumenter/FakeAutodocumenter.ts"],"names":[],"mappings":";;AAEA,MAAqB,kBAAkB;IAGnC;QACI,kBAAkB,CAAC,qBAAqB,EAAE,CAAA;IAC9C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,kBAAkB,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAChD,CAAC;;AARa,wCAAqB,GAAG,CAAC,CAAA;kBADtB,kBAAkB"}
@@ -0,0 +1,5 @@
1
+ export declare let callsToReadFile: string[];
2
+ export declare function resetCallsToReadFile(): void;
3
+ export declare let fakeReadFileResult: string;
4
+ export declare function setFakeReadFileResult(result: string): void;
5
+ export default function fakeReadFile(file: string): Promise<string>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fakeReadFileResult = exports.callsToReadFile = void 0;
4
+ exports.resetCallsToReadFile = resetCallsToReadFile;
5
+ exports.setFakeReadFileResult = setFakeReadFileResult;
6
+ exports.default = fakeReadFile;
7
+ const test_utils_1 = require("@sprucelabs/test-utils");
8
+ exports.callsToReadFile = [];
9
+ function resetCallsToReadFile() {
10
+ exports.callsToReadFile = [];
11
+ }
12
+ exports.fakeReadFileResult = (0, test_utils_1.generateId)();
13
+ function setFakeReadFileResult(result) {
14
+ exports.fakeReadFileResult = result;
15
+ }
16
+ async function fakeReadFile(file) {
17
+ exports.callsToReadFile.push(file);
18
+ return exports.fakeReadFileResult;
19
+ }
20
+ //# sourceMappingURL=fakeReadFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fakeReadFile.js","sourceRoot":"","sources":["../../../src/testDoubles/fs/fakeReadFile.ts"],"names":[],"mappings":";;;AAIA,oDAEC;AAID,sDAEC;AAED,+BAGC;AAjBD,uDAAmD;AAExC,QAAA,eAAe,GAAa,EAAE,CAAA;AAEzC,SAAgB,oBAAoB;IAChC,uBAAe,GAAG,EAAE,CAAA;AACxB,CAAC;AAEU,QAAA,kBAAkB,GAAG,IAAA,uBAAU,GAAE,CAAA;AAE5C,SAAgB,qBAAqB,CAAC,MAAc;IAChD,0BAAkB,GAAG,MAAM,CAAA;AAC/B,CAAC;AAEc,KAAK,UAAU,YAAY,CAAC,IAAY;IACnD,uBAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,OAAO,0BAAkB,CAAA;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fakeWriteFile.js","sourceRoot":"","sources":["../../../src/testDoubles/fs/fakeWriteFile.ts"],"names":[],"mappings":";;;AAEA,sDAEC;AAED,gCAEC;AARU,QAAA,gBAAgB,GAAqC,EAAE,CAAA;AAElE,SAAgB,qBAAqB;IACjC,wBAAgB,GAAG,EAAE,CAAA;AACzB,CAAC;AAEc,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IAClE,wBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC"}
1
+ {"version":3,"file":"fakeWriteFile.js","sourceRoot":"","sources":["../../../src/testDoubles/fs/fakeWriteFile.ts"],"names":[],"mappings":";;;AAKA,sDAEC;AAED,gCAEC;AAXU,QAAA,gBAAgB,GAGrB,EAAE,CAAA;AAER,SAAgB,qBAAqB;IACjC,wBAAgB,GAAG,EAAE,CAAA;AACzB,CAAC;AAEc,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IAClE,wBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurodevs/meta-node",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "Meta-layer utilities for maintaining Node.js package ecosystems.",
5
5
  "keywords": [
6
6
  "nodejs",
@@ -0,0 +1,11 @@
1
+ import AbstractSpruceTest from '@sprucelabs/test-utils'
2
+
3
+ export default class AbstractPackageTest extends AbstractSpruceTest {
4
+ protected static async beforeEach() {
5
+ await super.beforeEach()
6
+ }
7
+
8
+ protected static normalize(input: string) {
9
+ return input.replace(/\s+/g, ' ').trim()
10
+ }
11
+ }
@@ -1,15 +1,12 @@
1
1
  import { chdir } from 'process'
2
- import AbstractSpruceTest, {
3
- test,
4
- assert,
5
- generateId,
6
- } from '@sprucelabs/test-utils'
2
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
7
3
  import GitAutocloner, {
8
4
  Autocloner,
9
5
  AutoclonerOptions,
10
6
  } from '../../modules/GitAutocloner'
7
+ import AbstractPackageTest from '../AbstractPackageTest'
11
8
 
12
- export default class AutoclonerTest extends AbstractSpruceTest {
9
+ export default class AutoclonerTest extends AbstractPackageTest {
13
10
  private static instance: Autocloner
14
11
  private static originalDir = process.cwd()
15
12
  private static originalExecSync = GitAutocloner.execSync
@@ -128,10 +125,6 @@ export default class AutoclonerTest extends AbstractSpruceTest {
128
125
  return `https://github.com/${generateId()}.git`
129
126
  }
130
127
 
131
- private static normalize(input: string) {
132
- return input.replace(/\s+/g, ' ').trim()
133
- }
134
-
135
128
  private static get gitCloneFailedMessage() {
136
129
  return `Git clone failed for repo: ${this.urls[0]}! Error: \n\n${this.gitCloneFailedError}\n\n`
137
130
  }
@@ -1,25 +1,28 @@
1
- import { writeFile } from 'fs/promises'
2
- import AbstractSpruceTest, {
3
- test,
4
- assert,
5
- generateId,
6
- } from '@sprucelabs/test-utils'
1
+ import { readFile, writeFile } from 'fs/promises'
2
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
7
3
  import ImplAutomodule, { Automodule } from '../../modules/ImplAutomodule'
8
4
  import fakePathExists, {
9
5
  setPathShouldExist,
10
6
  } from '../../testDoubles/fs/fakePathExists'
7
+ import fakeReadFile, {
8
+ fakeReadFileResult,
9
+ resetCallsToReadFile,
10
+ setFakeReadFileResult,
11
+ } from '../../testDoubles/fs/fakeReadFile'
11
12
  import fakeWriteFile, {
12
13
  callsToWriteFile,
13
14
  resetCallsToWriteFile,
14
15
  } from '../../testDoubles/fs/fakeWriteFile'
16
+ import AbstractPackageTest from '../AbstractPackageTest'
15
17
 
16
- export default class ImplAutomoduleTest extends AbstractSpruceTest {
18
+ export default class ImplAutomoduleTest extends AbstractPackageTest {
17
19
  private static instance: Automodule
18
20
 
19
21
  protected static async beforeEach() {
20
22
  await super.beforeEach()
21
23
 
22
24
  this.setFakePathExists()
25
+ this.setFakeReadFile()
23
26
  this.setFakeWriteFile()
24
27
 
25
28
  this.instance = this.ImplAutomodule()
@@ -56,6 +59,19 @@ export default class ImplAutomoduleTest extends AbstractSpruceTest {
56
59
  )
57
60
  }
58
61
 
62
+ @test()
63
+ protected static async runThrowsIfFakeSaveDirMissing() {
64
+ setPathShouldExist(this.fakeSaveDir, false)
65
+
66
+ const err = await assert.doesThrowAsync(async () => await this.run())
67
+
68
+ assert.isEqual(
69
+ err.message,
70
+ `fakeSaveDir does not exist: ${this.fakeSaveDir}!`,
71
+ 'Did not receive the expected error!'
72
+ )
73
+ }
74
+
59
75
  @test()
60
76
  protected static async createsTestFileAsExpected() {
61
77
  await this.run()
@@ -84,6 +100,45 @@ export default class ImplAutomoduleTest extends AbstractSpruceTest {
84
100
  )
85
101
  }
86
102
 
103
+ @test()
104
+ protected static async createsFakeFileAsExpected() {
105
+ await this.run()
106
+
107
+ assert.isEqualDeep(
108
+ callsToWriteFile[2],
109
+ {
110
+ file: `${this.fakeSaveDir}/Fake${this.interfaceName}.ts`,
111
+ data: this.fakeFilePattern,
112
+ },
113
+ 'Did not write expected fake file!'
114
+ )
115
+ }
116
+
117
+ @test()
118
+ protected static async sortsIndexFileExportsAlphabetically() {
119
+ setFakeReadFileResult(`
120
+ // A-${fakeReadFileResult}
121
+
122
+ // C-${fakeReadFileResult}
123
+ `)
124
+
125
+ await this.run()
126
+
127
+ const call = callsToWriteFile[3]
128
+
129
+ assert.isEqualDeep(
130
+ {
131
+ file: call.file,
132
+ data: this.normalize(call.data),
133
+ },
134
+ {
135
+ file: this.indexFilePath,
136
+ data: this.normalize(this.sortedIndexFile),
137
+ },
138
+ 'Did not update index file as expected!'
139
+ )
140
+ }
141
+
87
142
  private static async run() {
88
143
  return await this.instance.run()
89
144
  }
@@ -93,17 +148,25 @@ export default class ImplAutomoduleTest extends AbstractSpruceTest {
93
148
 
94
149
  setPathShouldExist(this.testSaveDir, true)
95
150
  setPathShouldExist(this.moduleSaveDir, true)
151
+ setPathShouldExist(this.fakeSaveDir, true)
152
+ setPathShouldExist(this.indexFilePath, true)
153
+ }
154
+
155
+ private static setFakeReadFile() {
156
+ ImplAutomodule.readFile = fakeReadFile as unknown as typeof readFile
157
+ resetCallsToReadFile()
96
158
  }
97
159
 
98
160
  private static setFakeWriteFile() {
99
161
  ImplAutomodule.writeFile = fakeWriteFile as typeof writeFile
100
162
  resetCallsToWriteFile()
101
163
  }
164
+ private static readonly interfaceName = `B-${generateId()}`
165
+ private static readonly implName = generateId()
102
166
 
103
167
  private static readonly testSaveDir = generateId()
104
168
  private static readonly moduleSaveDir = generateId()
105
- private static readonly interfaceName = generateId()
106
- private static readonly implName = generateId()
169
+ private static readonly fakeSaveDir = generateId()
107
170
 
108
171
  private static get testFilePattern() {
109
172
  return `
@@ -149,10 +212,61 @@ export default class ImplAutomoduleTest extends AbstractSpruceTest {
149
212
  `
150
213
  }
151
214
 
215
+ private static get fakeFilePattern() {
216
+ return `
217
+ import { ${this.interfaceName} } from '../../modules/${this.implName}'
218
+
219
+ export default class Fake${this.interfaceName} implements ${this.interfaceName} {
220
+ public static numCallsToConstructor = 0
221
+
222
+ public constructor() {
223
+ Fake${this.interfaceName}.numCallsToConstructor++
224
+ }
225
+
226
+ public static resetTestDouble() {
227
+ Fake${this.interfaceName}.numCallsToConstructor = 0
228
+ }
229
+ }
230
+ `
231
+ }
232
+
233
+ private static readonly indexFilePath = './src/index.ts'
234
+
235
+ private static get indexFilePattern() {
236
+ return `
237
+ ${fakeReadFileResult}
238
+
239
+ // ${this.interfaceName}
240
+
241
+ export { default as ${this.implName} } from './modules/${this.implName}'
242
+ export * from './modules/${this.implName}'
243
+
244
+ export { default as Fake${this.interfaceName} } from './testDoubles/${this.interfaceName}/Fake${this.interfaceName}'
245
+ export * from './testDoubles/${this.interfaceName}/Fake${this.interfaceName}'
246
+
247
+ `
248
+ }
249
+
250
+ private static get sortedIndexFile() {
251
+ const blocks = this.indexFilePattern
252
+ .split(/(?=\/\/)/)
253
+ .map((s) => s.trim())
254
+ .filter(Boolean)
255
+
256
+ blocks.sort((a, b) => {
257
+ const aKey = a.match(/^\/\/\s*([^\n]*)/)?.[1]?.trim() ?? ''
258
+ const bKey = b.match(/^\/\/\s*([^\n]*)/)?.[1]?.trim() ?? ''
259
+ return aKey.localeCompare(bKey)
260
+ })
261
+
262
+ return blocks.join('\n\n')
263
+ }
264
+
152
265
  private static ImplAutomodule() {
153
266
  return ImplAutomodule.Create({
154
267
  testSaveDir: this.testSaveDir,
155
268
  moduleSaveDir: this.moduleSaveDir,
269
+ fakeSaveDir: this.fakeSaveDir,
156
270
  interfaceName: this.interfaceName,
157
271
  implName: this.implName,
158
272
  })
@@ -1,14 +1,11 @@
1
- import AbstractSpruceTest, {
2
- test,
3
- assert,
4
- generateId,
5
- } from '@sprucelabs/test-utils'
1
+ import { test, assert, generateId } from '@sprucelabs/test-utils'
6
2
  import NpmAutopackage, {
7
3
  Autopackage,
8
4
  AutopackageOptions,
9
5
  } from '../../modules/NpmAutopackage'
6
+ import AbstractPackageTest from '../AbstractPackageTest'
10
7
 
11
- export default class NpmAutopackageTest extends AbstractSpruceTest {
8
+ export default class NpmAutopackageTest extends AbstractPackageTest {
12
9
  private static instance: Autopackage
13
10
 
14
11
  private static callsToChdir: string[] = []
@@ -0,0 +1,24 @@
1
+ import { test, assert } from '@sprucelabs/test-utils'
2
+ import PackageAutodocumenter, {
3
+ Autodocumenter,
4
+ } from '../../modules/PackageAutodocumenter'
5
+ import AbstractPackageTest from '../AbstractPackageTest'
6
+
7
+ export default class PackageAutodocumenterTest extends AbstractPackageTest {
8
+ private static instance: Autodocumenter
9
+
10
+ protected static async beforeEach() {
11
+ await super.beforeEach()
12
+
13
+ this.instance = this.PackageAutodocumenter()
14
+ }
15
+
16
+ @test()
17
+ protected static async createsInstance() {
18
+ assert.isTruthy(this.instance, 'Failed to create instance!')
19
+ }
20
+
21
+ private static PackageAutodocumenter() {
22
+ return PackageAutodocumenter.Create()
23
+ }
24
+ }
package/src/index.ts CHANGED
@@ -6,6 +6,14 @@ export * from './modules/GitAutocloner'
6
6
  export { default as FakeAutocloner } from './testDoubles/Autocloner/FakeAutocloner'
7
7
  export * from './testDoubles/Autocloner/FakeAutocloner'
8
8
 
9
+ // Autodocumenter
10
+
11
+ export { default as PackageAutodocumenter } from './modules/PackageAutodocumenter'
12
+ export * from './modules/PackageAutodocumenter'
13
+
14
+ export { default as FakeAutodocumenter } from './testDoubles/Autodocumenter/FakeAutodocumenter'
15
+ export * from './testDoubles/Autodocumenter/FakeAutodocumenter'
16
+
9
17
  // Automodule
10
18
 
11
19
  export { default as ImplAutomodule } from './modules/ImplAutomodule'
@@ -27,5 +35,8 @@ export * from './testDoubles/Autopackage/FakeAutopackage'
27
35
  export { default as fakePathExists } from './testDoubles/fs/fakePathExists'
28
36
  export * from './testDoubles/fs/fakePathExists'
29
37
 
38
+ export { default as fakeReadFile } from './testDoubles/fs/fakeReadFile'
39
+ export * from './testDoubles/fs/fakeReadFile'
40
+
30
41
  export { default as fakeWriteFile } from './testDoubles/fs/fakeWriteFile'
31
42
  export * from './testDoubles/fs/fakeWriteFile'