@simplysm/sd-cli 6.4.5 → 7.0.9

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 (185) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/dist/bin/sd-cli.d.ts +1 -0
  3. package/dist/bin/sd-cli.mjs +86 -0
  4. package/dist/build-tool/SdCliCacheCompilerHost.d.ts +10 -0
  5. package/dist/build-tool/SdCliCacheCompilerHost.mjs +44 -0
  6. package/dist/build-tool/SdCliNgCacheCompilerHost.d.ts +11 -0
  7. package/dist/build-tool/SdCliNgCacheCompilerHost.mjs +36 -0
  8. package/dist/build-tool/SdCliPackageLinter.d.ts +8 -0
  9. package/dist/build-tool/SdCliPackageLinter.mjs +41 -0
  10. package/dist/builder/SdCliJsLibBuilder.d.ts +14 -0
  11. package/dist/builder/SdCliJsLibBuilder.mjs +50 -0
  12. package/dist/builder/SdCliTsLibBuilder.d.ts +27 -0
  13. package/dist/builder/SdCliTsLibBuilder.mjs +226 -0
  14. package/dist/commons.d.ts +46 -0
  15. package/dist/commons.mjs +2 -0
  16. package/dist/entry-points/SdCliWorkspace.d.ts +18 -0
  17. package/dist/entry-points/SdCliWorkspace.mjs +193 -0
  18. package/dist/packages/SdCliPackage.d.ts +19 -0
  19. package/dist/packages/SdCliPackage.mjs +89 -0
  20. package/dist/utils/SdCliBuildResultUtil.d.ts +6 -0
  21. package/dist/utils/SdCliBuildResultUtil.mjs +38 -0
  22. package/dist/utils/SdCliConfigUtil.d.ts +7 -0
  23. package/dist/utils/SdCliConfigUtil.mjs +69 -0
  24. package/lib/ts-node-esm-paths.mjs +15 -0
  25. package/package.json +27 -59
  26. package/src/bin/sd-cli.ts +86 -214
  27. package/src/build-tool/SdCliCacheCompilerHost.ts +71 -0
  28. package/src/build-tool/SdCliNgCacheCompilerHost.ts +50 -0
  29. package/src/build-tool/SdCliPackageLinter.ts +54 -0
  30. package/src/builder/SdCliJsLibBuilder.ts +66 -0
  31. package/src/builder/SdCliTsLibBuilder.ts +335 -0
  32. package/src/commons.ts +17 -122
  33. package/src/entry-points/SdCliWorkspace.ts +229 -0
  34. package/src/packages/SdCliPackage.ts +111 -0
  35. package/src/utils/SdCliBuildResultUtil.ts +43 -0
  36. package/src/utils/SdCliConfigUtil.ts +94 -0
  37. package/tsconfig-build.json +9 -0
  38. package/tsconfig.json +7 -18
  39. package/.eslintrc.js +0 -19
  40. package/dist-node/bin/sd-cli.js +0 -197
  41. package/dist-node/bin/sd-cli.js.map +0 -1
  42. package/dist-node/build-tools/SdCliCordova.js +0 -144
  43. package/dist-node/build-tools/SdCliCordova.js.map +0 -1
  44. package/dist-node/build-tools/SdCliIndexFileGenerator.js +0 -51
  45. package/dist-node/build-tools/SdCliIndexFileGenerator.js.map +0 -1
  46. package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js +0 -675
  47. package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js.map +0 -1
  48. package/dist-node/build-tools/metadata/SdAotMetadataReader.js +0 -274
  49. package/dist-node/build-tools/metadata/SdAotMetadataReader.js.map +0 -1
  50. package/dist-node/build-tools/metadata/SdIvyMetadataReader.js +0 -124
  51. package/dist-node/build-tools/metadata/SdIvyMetadataReader.js.map +0 -1
  52. package/dist-node/build-tools/metadata/SdMetadataError.js +0 -13
  53. package/dist-node/build-tools/metadata/SdMetadataError.js.map +0 -1
  54. package/dist-node/build-tools/metadata/SdMyMetadataReader.js +0 -321
  55. package/dist-node/build-tools/metadata/SdMyMetadataReader.js.map +0 -1
  56. package/dist-node/builders/SdCliJavascriptLinter.js +0 -65
  57. package/dist-node/builders/SdCliJavascriptLinter.js.map +0 -1
  58. package/dist-node/builders/SdCliNgClientBuilder.js +0 -636
  59. package/dist-node/builders/SdCliNgClientBuilder.js.map +0 -1
  60. package/dist-node/builders/SdCliNgLibraryBuilder.js +0 -217
  61. package/dist-node/builders/SdCliNgLibraryBuilder.js.map +0 -1
  62. package/dist-node/builders/SdCliPublisher.js +0 -129
  63. package/dist-node/builders/SdCliPublisher.js.map +0 -1
  64. package/dist-node/builders/SdCliServerBuilder.js +0 -452
  65. package/dist-node/builders/SdCliServerBuilder.js.map +0 -1
  66. package/dist-node/builders/SdCliTypescriptBuilder.js +0 -347
  67. package/dist-node/builders/SdCliTypescriptBuilder.js.map +0 -1
  68. package/dist-node/commons.js +0 -3
  69. package/dist-node/commons.js.map +0 -1
  70. package/dist-node/entry-points/SdCliLocalUpdater.js +0 -88
  71. package/dist-node/entry-points/SdCliLocalUpdater.js.map +0 -1
  72. package/dist-node/entry-points/SdCliPrepare.js +0 -56
  73. package/dist-node/entry-points/SdCliPrepare.js.map +0 -1
  74. package/dist-node/entry-points/SdCliProject.js +0 -302
  75. package/dist-node/entry-points/SdCliProject.js.map +0 -1
  76. package/dist-node/packages/SdCliClientPackage.js +0 -91
  77. package/dist-node/packages/SdCliClientPackage.js.map +0 -1
  78. package/dist-node/packages/SdCliLibraryPackage.js +0 -99
  79. package/dist-node/packages/SdCliLibraryPackage.js.map +0 -1
  80. package/dist-node/packages/SdCliPackageBase.js +0 -33
  81. package/dist-node/packages/SdCliPackageBase.js.map +0 -1
  82. package/dist-node/packages/SdCliServerPackage.js +0 -69
  83. package/dist-node/packages/SdCliServerPackage.js.map +0 -1
  84. package/dist-node/packages/SdCliUnknownPackage.js +0 -15
  85. package/dist-node/packages/SdCliUnknownPackage.js.map +0 -1
  86. package/dist-node/utils/SdCliFileCrypto.js +0 -76
  87. package/dist-node/utils/SdCliFileCrypto.js.map +0 -1
  88. package/dist-node/utils/SdProjectConfigUtil.js +0 -62
  89. package/dist-node/utils/SdProjectConfigUtil.js.map +0 -1
  90. package/dist-node/utils/SdTsDiagnosticUtil.js +0 -45
  91. package/dist-node/utils/SdTsDiagnosticUtil.js.map +0 -1
  92. package/dist-node/utils/SdWebpackUtil.js +0 -63
  93. package/dist-node/utils/SdWebpackUtil.js.map +0 -1
  94. package/dist-node/workers/client-ng-gen-worker.js +0 -57
  95. package/dist-node/workers/client-ng-gen-worker.js.map +0 -1
  96. package/dist-node/workers/lib-build-worker.js +0 -88
  97. package/dist-node/workers/lib-build-worker.js.map +0 -1
  98. package/dist-types/bin/sd-cli.d.ts +0 -3
  99. package/dist-types/bin/sd-cli.d.ts.map +0 -1
  100. package/dist-types/build-tools/SdCliCordova.d.ts +0 -15
  101. package/dist-types/build-tools/SdCliCordova.d.ts.map +0 -1
  102. package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts +0 -13
  103. package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts.map +0 -1
  104. package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts +0 -43
  105. package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts.map +0 -1
  106. package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts +0 -58
  107. package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts.map +0 -1
  108. package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts +0 -43
  109. package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts.map +0 -1
  110. package/dist-types/build-tools/metadata/SdMetadataError.d.ts +0 -7
  111. package/dist-types/build-tools/metadata/SdMetadataError.d.ts.map +0 -1
  112. package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts +0 -59
  113. package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts.map +0 -1
  114. package/dist-types/builders/SdCliJavascriptLinter.d.ts +0 -14
  115. package/dist-types/builders/SdCliJavascriptLinter.d.ts.map +0 -1
  116. package/dist-types/builders/SdCliNgClientBuilder.d.ts +0 -29
  117. package/dist-types/builders/SdCliNgClientBuilder.d.ts.map +0 -1
  118. package/dist-types/builders/SdCliNgLibraryBuilder.d.ts +0 -30
  119. package/dist-types/builders/SdCliNgLibraryBuilder.d.ts.map +0 -1
  120. package/dist-types/builders/SdCliPublisher.d.ts +0 -9
  121. package/dist-types/builders/SdCliPublisher.d.ts.map +0 -1
  122. package/dist-types/builders/SdCliServerBuilder.d.ts +0 -31
  123. package/dist-types/builders/SdCliServerBuilder.d.ts.map +0 -1
  124. package/dist-types/builders/SdCliTypescriptBuilder.d.ts +0 -56
  125. package/dist-types/builders/SdCliTypescriptBuilder.d.ts.map +0 -1
  126. package/dist-types/commons.d.ts +0 -134
  127. package/dist-types/commons.d.ts.map +0 -1
  128. package/dist-types/entry-points/SdCliLocalUpdater.d.ts +0 -12
  129. package/dist-types/entry-points/SdCliLocalUpdater.d.ts.map +0 -1
  130. package/dist-types/entry-points/SdCliPrepare.d.ts +0 -6
  131. package/dist-types/entry-points/SdCliPrepare.d.ts.map +0 -1
  132. package/dist-types/entry-points/SdCliProject.d.ts +0 -32
  133. package/dist-types/entry-points/SdCliProject.d.ts.map +0 -1
  134. package/dist-types/packages/SdCliClientPackage.d.ts +0 -17
  135. package/dist-types/packages/SdCliClientPackage.d.ts.map +0 -1
  136. package/dist-types/packages/SdCliLibraryPackage.d.ts +0 -20
  137. package/dist-types/packages/SdCliLibraryPackage.d.ts.map +0 -1
  138. package/dist-types/packages/SdCliPackageBase.d.ts +0 -11
  139. package/dist-types/packages/SdCliPackageBase.d.ts.map +0 -1
  140. package/dist-types/packages/SdCliServerPackage.d.ts +0 -16
  141. package/dist-types/packages/SdCliServerPackage.d.ts.map +0 -1
  142. package/dist-types/packages/SdCliUnknownPackage.d.ts +0 -9
  143. package/dist-types/packages/SdCliUnknownPackage.d.ts.map +0 -1
  144. package/dist-types/utils/SdCliFileCrypto.d.ts +0 -8
  145. package/dist-types/utils/SdCliFileCrypto.d.ts.map +0 -1
  146. package/dist-types/utils/SdProjectConfigUtil.d.ts +0 -7
  147. package/dist-types/utils/SdProjectConfigUtil.d.ts.map +0 -1
  148. package/dist-types/utils/SdTsDiagnosticUtil.d.ts +0 -6
  149. package/dist-types/utils/SdTsDiagnosticUtil.d.ts.map +0 -1
  150. package/dist-types/utils/SdWebpackUtil.d.ts +0 -7
  151. package/dist-types/utils/SdWebpackUtil.d.ts.map +0 -1
  152. package/dist-types/workers/client-ng-gen-worker.d.ts +0 -2
  153. package/dist-types/workers/client-ng-gen-worker.d.ts.map +0 -1
  154. package/dist-types/workers/lib-build-worker.d.ts +0 -2
  155. package/dist-types/workers/lib-build-worker.d.ts.map +0 -1
  156. package/schema/schema.json +0 -447
  157. package/sd-tsconfig.node.json +0 -18
  158. package/src/build-tools/SdCliCordova.ts +0 -240
  159. package/src/build-tools/SdCliIndexFileGenerator.ts +0 -61
  160. package/src/build-tools/SdCliNgModuleFilesGenerator.ts +0 -894
  161. package/src/build-tools/metadata/SdAotMetadataReader.ts +0 -374
  162. package/src/build-tools/metadata/SdIvyMetadataReader.ts +0 -183
  163. package/src/build-tools/metadata/SdMetadataError.ts +0 -7
  164. package/src/build-tools/metadata/SdMyMetadataReader.ts +0 -407
  165. package/src/builders/SdCliJavascriptLinter.ts +0 -81
  166. package/src/builders/SdCliNgClientBuilder.ts +0 -793
  167. package/src/builders/SdCliNgLibraryBuilder.ts +0 -301
  168. package/src/builders/SdCliPublisher.ts +0 -144
  169. package/src/builders/SdCliServerBuilder.ts +0 -555
  170. package/src/builders/SdCliTypescriptBuilder.ts +0 -552
  171. package/src/entry-points/SdCliLocalUpdater.ts +0 -114
  172. package/src/entry-points/SdCliPrepare.ts +0 -104
  173. package/src/entry-points/SdCliProject.ts +0 -405
  174. package/src/packages/SdCliClientPackage.ts +0 -111
  175. package/src/packages/SdCliLibraryPackage.ts +0 -118
  176. package/src/packages/SdCliPackageBase.ts +0 -34
  177. package/src/packages/SdCliServerPackage.ts +0 -85
  178. package/src/packages/SdCliUnknownPackage.ts +0 -14
  179. package/src/utils/SdCliFileCrypto.ts +0 -87
  180. package/src/utils/SdCliUtils.ts +0 -56
  181. package/src/utils/SdProjectConfigUtil.ts +0 -145
  182. package/src/utils/SdTsDiagnosticUtil.ts +0 -46
  183. package/src/utils/SdWebpackUtil.ts +0 -71
  184. package/src/workers/client-ng-gen-worker.ts +0 -63
  185. package/src/workers/lib-build-worker.ts +0 -97
package/.eslintrc.cjs ADDED
@@ -0,0 +1,11 @@
1
+ module.exports = {
2
+ overrides: [
3
+ {
4
+ files: ["*.ts"],
5
+ parserOptions: {
6
+ tsconfigRootDir: __dirname,
7
+ project: "tsconfig.json",
8
+ }
9
+ }
10
+ ]
11
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ import yargs from "yargs";
2
+ import { hideBin } from "yargs/helpers";
3
+ import { Logger, LoggerSeverity } from "@simplysm/sd-core-node";
4
+ import { SdCliWorkspace } from "../entry-points/SdCliWorkspace";
5
+ Error.stackTraceLimit = Infinity;
6
+ const argv = yargs(hideBin(process.argv))
7
+ .version(false)
8
+ .help("help", "도움말")
9
+ .alias("help", "h")
10
+ .options({
11
+ debug: {
12
+ type: "boolean",
13
+ describe: "디버그 로그를 표시할 것인지 여부",
14
+ default: false
15
+ }
16
+ })
17
+ .command("local-update", "로컬 라이브러리 업데이트를 수행합니다.", (cmd) => cmd.version(false)
18
+ .options({
19
+ config: {
20
+ type: "string",
21
+ describe: "simplysm.json 파일 경로"
22
+ }
23
+ }))
24
+ .command("watch", "프로젝트의 각 패키지에 대한 변경감지 빌드를 수행합니다.", (cmd) => cmd.version(false)
25
+ .options({
26
+ config: {
27
+ type: "string",
28
+ describe: "simplysm.json 파일 경로"
29
+ }
30
+ }))
31
+ .command("build", "프로젝트의 각 패키지에 대한 빌드를 수행합니다.", (cmd) => cmd.version(false)
32
+ .options({
33
+ config: {
34
+ type: "string",
35
+ describe: "simplysm.json 파일 경로"
36
+ }
37
+ }))
38
+ .command("publish", "프로젝트의 각 패키지를 배포합니다.", (cmd) => cmd.version(false)
39
+ .options({
40
+ config: {
41
+ type: "string",
42
+ describe: "simplysm.json 파일 경로"
43
+ },
44
+ "noBuild": {
45
+ type: "boolean",
46
+ describe: "빌드를 하지않고 배포합니다.",
47
+ default: false
48
+ }
49
+ }))
50
+ .parseSync();
51
+ if (argv.debug) {
52
+ process.env["SD_CLI_LOGGER_SEVERITY"] = "DEBUG";
53
+ Logger.setConfig({
54
+ console: {
55
+ level: LoggerSeverity.debug
56
+ }
57
+ });
58
+ }
59
+ else {
60
+ Logger.setConfig({
61
+ dot: true
62
+ });
63
+ }
64
+ const logger = Logger.get(["simplysm", "sd-cli", "bin", "sd-cli"]);
65
+ (async () => {
66
+ if (argv._[0] === "watch") {
67
+ await new SdCliWorkspace(process.cwd(), argv.config)
68
+ .watchAsync();
69
+ }
70
+ else if (argv._[0] === "build") {
71
+ await new SdCliWorkspace(process.cwd(), argv.config)
72
+ .buildAsync();
73
+ }
74
+ else if (argv._[0] === "publish") {
75
+ await new SdCliWorkspace(process.cwd(), argv.config)
76
+ .publishAsync({
77
+ noBuild: argv.noBuild
78
+ });
79
+ }
80
+ else {
81
+ throw new Error(`명령어가 잘못 되었습니다.\n\t${argv._[0]}\n`);
82
+ }
83
+ })().catch((err) => {
84
+ logger.error(err);
85
+ });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QtY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9zZC1jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFaEUsS0FBSyxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7QUFFakMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO0tBQ25CLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO0tBQ2xCLE9BQU8sQ0FBQztJQUNQLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxTQUFTO1FBQ2YsUUFBUSxFQUFFLG9CQUFvQjtRQUM5QixPQUFPLEVBQUUsS0FBSztLQUNmO0NBQ0YsQ0FBQztLQUNELE9BQU8sQ0FDTixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUN4QixPQUFPLENBQUM7SUFDUCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsUUFBUTtRQUNkLFFBQVEsRUFBRSxxQkFBcUI7S0FDaEM7Q0FDRixDQUFDLENBQ0w7S0FDQSxPQUFPLENBQ04sT0FBTyxFQUNQLGlDQUFpQyxFQUNqQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7S0FDeEIsT0FBTyxDQUFDO0lBQ1AsTUFBTSxFQUFFO1FBQ04s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
@@ -0,0 +1,10 @@
1
+ import ts from "typescript";
2
+ export declare class SdCliCacheCompilerHost {
3
+ static create(parsedTsconfig: ts.ParsedCommandLine, moduleResolutionCache: ts.ModuleResolutionCache, sourceFileCache: Map<string, IFileCache>, outputFileCache: Map<string, string>): ts.CompilerHost;
4
+ }
5
+ interface IFileCache {
6
+ exists?: boolean;
7
+ sourceFile?: ts.SourceFile;
8
+ content?: string;
9
+ }
10
+ export {};
@@ -0,0 +1,44 @@
1
+ import ts from "typescript";
2
+ import { PathUtil } from "@simplysm/sd-core-node";
3
+ export class SdCliCacheCompilerHost {
4
+ static create(parsedTsconfig, moduleResolutionCache, sourceFileCache, outputFileCache) {
5
+ const compilerHost = ts.createIncrementalCompilerHost(parsedTsconfig.options);
6
+ const cacheCompilerHost = { ...compilerHost };
7
+ cacheCompilerHost.fileExists = (fileName) => {
8
+ const cache = sourceFileCache.getOrCreate(PathUtil.posix(fileName), {});
9
+ if (cache.exists === undefined) {
10
+ cache.exists = compilerHost.fileExists.call(cacheCompilerHost, fileName);
11
+ }
12
+ return cache.exists;
13
+ };
14
+ cacheCompilerHost.getSourceFile = (fileName, languageVersion) => {
15
+ const cache = sourceFileCache.getOrCreate(PathUtil.posix(fileName), {});
16
+ if (!cache.sourceFile) {
17
+ cache.sourceFile = compilerHost.getSourceFile.call(cacheCompilerHost, fileName, languageVersion);
18
+ }
19
+ return cache.sourceFile;
20
+ };
21
+ cacheCompilerHost.writeFile = (fileName, data, writeByteOrderMark, onError, sourceFiles) => {
22
+ fileName = fileName.replace(/\.js(\.map)?$/, ".mjs$1");
23
+ const writeCache = outputFileCache.get(PathUtil.posix(fileName));
24
+ if (writeCache !== data) {
25
+ outputFileCache.set(PathUtil.posix(fileName), data);
26
+ compilerHost.writeFile.call(cacheCompilerHost, fileName, data, writeByteOrderMark, onError, sourceFiles);
27
+ }
28
+ };
29
+ cacheCompilerHost.readFile = (fileName) => {
30
+ const cache = sourceFileCache.getOrCreate(PathUtil.posix(fileName), {});
31
+ if (cache.content === undefined) {
32
+ cache.content = compilerHost.readFile.call(cacheCompilerHost, fileName);
33
+ }
34
+ return cache.content;
35
+ };
36
+ cacheCompilerHost.resolveModuleNames = (moduleNames, containingFile) => {
37
+ return moduleNames.map((moduleName) => {
38
+ return ts.resolveModuleName(moduleName, PathUtil.posix(containingFile), parsedTsconfig.options, compilerHost, moduleResolutionCache).resolvedModule;
39
+ });
40
+ };
41
+ return cacheCompilerHost;
42
+ }
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlDYWNoZUNvbXBpbGVySG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZC10b29sL1NkQ2xpQ2FjaGVDb21waWxlckhvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLE9BQU8sc0JBQXNCO0lBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBb0MsRUFDcEMscUJBQStDLEVBQy9DLGVBQXdDLEVBQ3hDLGVBQW9DO1FBQ3ZELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFOUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQ2xELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM5QixLQUFLLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3RCLENBQUMsQ0FBQztRQUVGLGlCQUFpQixDQUFDLGFBQWEsR0FBRyxDQUFDLFFBQWdCLEVBQUUsZUFBZ0MsRUFBRSxFQUFFO1lBQ3ZGLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDckIsS0FBSyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7YUFDbEc7WUFDRCxPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDO1FBRUYsaUJBQWlCLENBQUMsU0FBUyxHQUFHLENBQUMsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLGtCQUEyQixFQUMzQixPQUFtQyxFQUNuQyxXQUFzQyxFQUFFLEVBQUU7WUFDdkUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXZELE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtnQkFDdkIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwRCxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQzthQUMxRztRQUNILENBQUMsQ0FBQztRQUVGLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRTtZQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEUsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN6RTtZQUNELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN2QixDQUFDLENBQUM7UUFFRixpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLFdBQXFCLEVBQUUsY0FBc0IsRUFBRSxFQUFFO1lBQ3ZGLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FDekIsVUFBVSxFQUNWLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQzlCLGNBQWMsQ0FBQyxPQUFPLEVBQ3RCLFlBQVksRUFDWixxQkFBcUIsQ0FDdEIsQ0FBQyxjQUFjLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
@@ -0,0 +1,11 @@
1
+ import ts from "typescript";
2
+ export declare class SdCliNgCacheCompilerHost {
3
+ static wrap(compilerHost: ts.CompilerHost, sourceFileCache: Map<string, IFileCache>): ts.CompilerHost;
4
+ }
5
+ interface IFileCache {
6
+ exists?: boolean;
7
+ sourceFile?: ts.SourceFile;
8
+ content?: string;
9
+ styleContent?: string;
10
+ }
11
+ export {};
@@ -0,0 +1,36 @@
1
+ import { PathUtil } from "@simplysm/sd-core-node";
2
+ import sass from "sass";
3
+ import { pathToFileURL, URL } from "url";
4
+ export class SdCliNgCacheCompilerHost {
5
+ static wrap(compilerHost, sourceFileCache) {
6
+ const cacheCompilerHost = { ...compilerHost };
7
+ cacheCompilerHost["readResource"] = (fileName) => {
8
+ const cache = sourceFileCache.getOrCreate(PathUtil.posix(fileName), {});
9
+ if (cache.content === undefined) {
10
+ cache.content = compilerHost.readFile.call(cacheCompilerHost, fileName);
11
+ }
12
+ return cache.content;
13
+ };
14
+ cacheCompilerHost["transformResource"] = async (data, context) => {
15
+ if (context.resourceFile || context.type !== "style") {
16
+ return null;
17
+ }
18
+ const cache = sourceFileCache.getOrCreate(PathUtil.posix(context.containingFile), {});
19
+ if (cache.styleContent === undefined) {
20
+ cache.styleContent = (await sass.compileStringAsync(data, {
21
+ url: new URL(context.containingFile + ".sd.scss"),
22
+ importer: {
23
+ findFileUrl: (url) => {
24
+ if (!url.startsWith("~"))
25
+ return undefined;
26
+ return new URL(url.substring(1), pathToFileURL("node_modules"));
27
+ }
28
+ }
29
+ })).css.toString();
30
+ }
31
+ return { content: cache.styleContent };
32
+ };
33
+ return cacheCompilerHost;
34
+ }
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlOZ0NhY2hlQ29tcGlsZXJIb3N0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkLXRvb2wvU2RDbGlOZ0NhY2hlQ29tcGlsZXJIb3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFekMsTUFBTSxPQUFPLHdCQUF3QjtJQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQTZCLEVBQzdCLGVBQXdDO1FBQ3pELE1BQU0saUJBQWlCLEdBQUcsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBRTlDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUMvQixLQUFLLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3pFO1lBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMvRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQ3BELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQ3BDLEtBQUssQ0FBQyxZQUFZLEdBQUcsQ0FDbkIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO29CQUNsQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7b0JBQ2pELFFBQVEsRUFBRTt3QkFDUixXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTs0QkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dDQUFFLE9BQU8sU0FBUyxDQUFDOzRCQUMzQyxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xFLENBQUM7cUJBQ0Y7aUJBQ0YsQ0FBQyxDQUNILENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ2xCO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsQ0FBQyxDQUFDO1FBRUYsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,8 @@
1
+ import { ISdCliPackageBuildResult } from "../commons";
2
+ import ts from "typescript";
3
+ export declare class SdCliPackageLinter {
4
+ private readonly _rootPath;
5
+ private readonly _lintResultCache;
6
+ constructor(_rootPath: string);
7
+ lintAsync(filePaths: string[], program?: ts.Program): Promise<ISdCliPackageBuildResult[]>;
8
+ }
@@ -0,0 +1,41 @@
1
+ import { FsUtil } from "@simplysm/sd-core-node";
2
+ import path from "path";
3
+ import { ESLint } from "eslint";
4
+ export class SdCliPackageLinter {
5
+ constructor(_rootPath) {
6
+ this._rootPath = _rootPath;
7
+ this._lintResultCache = new Map();
8
+ }
9
+ async lintAsync(filePaths, program) {
10
+ if (!FsUtil.exists(path.resolve(this._rootPath, ".eslintrc.cjs")))
11
+ return [];
12
+ const linter = new ESLint(program && filePaths.some((item) => item.endsWith(".ts")) ? {
13
+ overrideConfig: {
14
+ parserOptions: { program }
15
+ }
16
+ } : {});
17
+ const lintFilePaths = await filePaths
18
+ .filterAsync(async (filePath) => (!filePath.endsWith(".d.ts") &&
19
+ !(await linter.isPathIgnored(filePath))));
20
+ for (const lintFilePath of lintFilePaths) {
21
+ this._lintResultCache.delete(lintFilePath);
22
+ }
23
+ const lintResults = await linter.lintFiles(lintFilePaths);
24
+ const result = lintResults.map((lintResult) => ({
25
+ filePath: lintResult.filePath,
26
+ results: lintResult.messages.map((msg) => ({
27
+ filePath: lintResult.filePath,
28
+ line: msg.line,
29
+ char: msg.column,
30
+ code: msg.ruleId ?? undefined,
31
+ severity: msg.severity === 1 ? "warning" : "error",
32
+ message: msg.message
33
+ }))
34
+ }));
35
+ for (const resultItem of result) {
36
+ this._lintResultCache.set(resultItem.filePath, resultItem.results);
37
+ }
38
+ return Array.from(this._lintResultCache.values()).mapMany();
39
+ }
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlQYWNrYWdlTGludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkLXRvb2wvU2RDbGlQYWNrYWdlTGludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLFlBQW9DLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFGcEMscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7SUFHbEYsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBbUIsRUFBRSxPQUFvQjtRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUU3RSxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FDdkIsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsY0FBYyxFQUFFO2dCQUNkLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRTthQUMzQjtTQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDUCxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTO2FBQ2xDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUMvQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDeEMsQ0FBQyxDQUFDO1FBQ0wsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1QztRQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUcxRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM3QixPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtnQkFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTTtnQkFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUksU0FBUztnQkFDN0IsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFnQjtnQkFDcEUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2FBQ3JCLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUosS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwRTtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,14 @@
1
+ /// <reference types="node" />
2
+ import { ISdCliPackageBuildResult } from "../commons";
3
+ import { EventEmitter } from "events";
4
+ export declare class SdCliJsLibBuilder extends EventEmitter {
5
+ private readonly _rootPath;
6
+ private readonly _logger;
7
+ private readonly _linter;
8
+ constructor(_rootPath: string);
9
+ on(event: "change", listener: () => void): this;
10
+ on(event: "complete", listener: (results: ISdCliPackageBuildResult[]) => void): this;
11
+ watchAsync(): Promise<void>;
12
+ buildAsync(): Promise<ISdCliPackageBuildResult[]>;
13
+ private getRelatedPathsAsync;
14
+ }
@@ -0,0 +1,50 @@
1
+ import { EventEmitter } from "events";
2
+ import { FsUtil, Logger, SdFsWatcher } from "@simplysm/sd-core-node";
3
+ import * as path from "path";
4
+ import { SdCliPackageLinter } from "../build-tool/SdCliPackageLinter";
5
+ export class SdCliJsLibBuilder extends EventEmitter {
6
+ constructor(_rootPath) {
7
+ super();
8
+ this._rootPath = _rootPath;
9
+ this._logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
10
+ this._linter = new SdCliPackageLinter(this._rootPath);
11
+ }
12
+ on(event, listener) {
13
+ return super.on(event, listener);
14
+ }
15
+ async watchAsync() {
16
+ this.emit("change");
17
+ const relatedPaths = await this.getRelatedPathsAsync();
18
+ const watcher = SdFsWatcher.watch(relatedPaths);
19
+ watcher.onChange(async (changeInfos) => {
20
+ const changeFilePaths = changeInfos.filter((item) => ["add", "change", "unlink"].includes(item.event)).map((item) => item.path);
21
+ if (changeFilePaths.length === 0)
22
+ return;
23
+ this._logger.debug("파일 변경 감지", changeInfos);
24
+ this.emit("change");
25
+ const watchBuildResults = await this._linter.lintAsync(changeFilePaths);
26
+ const watchRelatedPaths = await this.getRelatedPathsAsync();
27
+ watcher.add(watchRelatedPaths);
28
+ this.emit("complete", watchBuildResults);
29
+ });
30
+ // 빌드
31
+ const buildResults = await this._linter.lintAsync(relatedPaths);
32
+ this.emit("complete", buildResults);
33
+ }
34
+ async buildAsync() {
35
+ const relatedPaths = await this.getRelatedPathsAsync();
36
+ return await this._linter.lintAsync(relatedPaths);
37
+ }
38
+ async getRelatedPathsAsync() {
39
+ const mySourceGlobPath = path.resolve(this._rootPath, "**", "+(*.js|*.cjs|*.mjs|*.ts)");
40
+ const mySourceFilePaths = await FsUtil.globAsync(mySourceGlobPath, {
41
+ ignore: [
42
+ "**/node_modules/**",
43
+ "**/dist/**",
44
+ "**/.*/**"
45
+ ]
46
+ });
47
+ return [...mySourceFilePaths, path.resolve(this._rootPath, ".eslintrc.cjs")].distinct();
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlKc0xpYkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbGRlci9TZENsaUpzTGliQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JFLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXRFLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBS2pELFlBQW9DLFNBQWlCO1FBQ25ELEtBQUssRUFBRSxDQUFDO1FBRDBCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFKcEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQU1uRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFJZSxFQUFFLENBQUMsS0FBc0IsRUFBRSxRQUFrQztRQUMzRSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUNyQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hJLElBQUcsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFFeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFcEIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRXhFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUs7UUFDTCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQjtRQUNoQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUN4RixNQUFNLGlCQUFpQixHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNqRSxNQUFNLEVBQUU7Z0JBQ04sb0JBQW9CO2dCQUNwQixZQUFZO2dCQUNaLFVBQVU7YUFDWDtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLGlCQUFpQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFGLENBQUM7Q0FDRiJ9
@@ -0,0 +1,27 @@
1
+ /// <reference types="node" />
2
+ import { ISdCliPackageBuildResult } from "../commons";
3
+ import { EventEmitter } from "events";
4
+ export declare class SdCliTsLibBuilder extends EventEmitter {
5
+ private readonly _rootPath;
6
+ private readonly _isAngular;
7
+ private readonly _logger;
8
+ private _moduleResolutionCache?;
9
+ private readonly _linter;
10
+ private readonly _fileCache;
11
+ private readonly _writeFileCache;
12
+ private _program?;
13
+ private _ngProgram?;
14
+ private _builder?;
15
+ constructor(_rootPath: any, _isAngular: boolean);
16
+ on(event: "change", listener: () => void): this;
17
+ on(event: "complete", listener: (results: ISdCliPackageBuildResult[]) => void): this;
18
+ watchAsync(): Promise<void>;
19
+ buildAsync(): Promise<ISdCliPackageBuildResult[]>;
20
+ private getAllRelatedPathsAsync;
21
+ private _runBuilderAsync;
22
+ private _createSdBuildPack;
23
+ private _createProgram;
24
+ private _configProgramSourceFileVersions;
25
+ private _createCacheCompilerHost;
26
+ private _getParsedTsconfigAsync;
27
+ }
@@ -0,0 +1,226 @@
1
+ import { EventEmitter } from "events";
2
+ import ts from "typescript";
3
+ import { FsUtil, Logger, PathUtil, SdFsWatcher } from "@simplysm/sd-core-node";
4
+ import * as path from "path";
5
+ import { createHash } from "crypto";
6
+ import { SdCliBuildResultUtil } from "../utils/SdCliBuildResultUtil";
7
+ import { NgtscProgram } from "@angular/compiler-cli";
8
+ import sass from "sass";
9
+ import { SdCliPackageLinter } from "../build-tool/SdCliPackageLinter";
10
+ import { SdCliCacheCompilerHost } from "../build-tool/SdCliCacheCompilerHost";
11
+ import { SdCliNgCacheCompilerHost } from "../build-tool/SdCliNgCacheCompilerHost";
12
+ export class SdCliTsLibBuilder extends EventEmitter {
13
+ constructor(_rootPath, _isAngular) {
14
+ super();
15
+ this._rootPath = _rootPath;
16
+ this._isAngular = _isAngular;
17
+ this._logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
18
+ this._fileCache = new Map();
19
+ this._writeFileCache = new Map();
20
+ this._linter = new SdCliPackageLinter(this._rootPath);
21
+ }
22
+ on(event, listener) {
23
+ return super.on(event, listener);
24
+ }
25
+ async watchAsync() {
26
+ this.emit("change");
27
+ // TSCONFIG 읽기
28
+ const parsedTsconfig = await this._getParsedTsconfigAsync();
29
+ // DIST 비우기
30
+ await FsUtil.removeAsync(parsedTsconfig.options.outDir);
31
+ // 프로그램 리로드
32
+ const buildPack = this._createSdBuildPack(parsedTsconfig);
33
+ const relatedPaths = await this.getAllRelatedPathsAsync();
34
+ const watcher = SdFsWatcher.watch(relatedPaths);
35
+ watcher.onChange(async (changeInfos) => {
36
+ const changeFilePaths = changeInfos.filter((item) => ["add", "change", "unlink"].includes(item.event)).map((item) => item.path);
37
+ if (changeFilePaths.length === 0)
38
+ return;
39
+ this._logger.debug("파일 변경 감지", changeInfos);
40
+ this.emit("change");
41
+ // 캐쉬 삭제
42
+ for (const changeFilePath of changeFilePaths) {
43
+ this._fileCache.delete(PathUtil.posix(changeFilePath));
44
+ }
45
+ // 빌드
46
+ const watchBuildPack = this._createSdBuildPack(parsedTsconfig);
47
+ // 린트
48
+ const watchBuildResults = await this._runBuilderAsync(watchBuildPack.builder, watchBuildPack.ngCompiler);
49
+ watchBuildResults.push(...await this._linter.lintAsync([
50
+ ...watchBuildPack.affectedSourceFiles.map((item) => item.fileName),
51
+ ...changeFilePaths
52
+ ], watchBuildPack.program));
53
+ const watchRelatedPaths = await this.getAllRelatedPathsAsync();
54
+ watcher.add(watchRelatedPaths);
55
+ this.emit("complete", watchBuildResults);
56
+ });
57
+ // 빌드
58
+ const buildResults = await this._runBuilderAsync(buildPack.builder, buildPack.ngCompiler);
59
+ // 린트
60
+ buildResults.push(...await this._linter.lintAsync(relatedPaths, buildPack.program));
61
+ this.emit("complete", buildResults);
62
+ }
63
+ async buildAsync() {
64
+ // TSCONFIG 읽기
65
+ const parsedTsconfig = await this._getParsedTsconfigAsync();
66
+ // DIST 비우기
67
+ await FsUtil.removeAsync(parsedTsconfig.options.outDir);
68
+ // 프로그램 리로드
69
+ const buildPack = this._createSdBuildPack(parsedTsconfig);
70
+ // 빌드
71
+ const buildResults = await this._runBuilderAsync(buildPack.builder, buildPack.ngCompiler);
72
+ // 린트
73
+ const relatedPaths = await this.getAllRelatedPathsAsync();
74
+ buildResults.push(...await this._linter.lintAsync(relatedPaths, buildPack.program));
75
+ return buildResults;
76
+ }
77
+ async getAllRelatedPathsAsync() {
78
+ const fileCachePaths = Array.from(this._fileCache.keys());
79
+ const mySourceGlobPath = path.resolve(this._rootPath, "**", "+(*.js|*.cjs|*.mjs|*.ts)");
80
+ const mySourceFilePaths = await FsUtil.globAsync(mySourceGlobPath, {
81
+ ignore: [
82
+ "**/node_modules/**",
83
+ "**/dist/**",
84
+ "**/.*/**"
85
+ ]
86
+ });
87
+ return [...fileCachePaths, ...mySourceFilePaths, path.resolve(this._rootPath, ".eslintrc.cjs")].distinct();
88
+ }
89
+ async _runBuilderAsync(builder, ngCompiler) {
90
+ try {
91
+ const results = [];
92
+ const diagnostics = [];
93
+ if (ngCompiler) {
94
+ diagnostics.push(...ngCompiler.getOptionDiagnostics());
95
+ }
96
+ diagnostics.push(...builder.getOptionsDiagnostics(), ...builder.getGlobalDiagnostics());
97
+ if (ngCompiler) {
98
+ await ngCompiler.analyzeAsync();
99
+ }
100
+ for (const sourceFile of builder.getSourceFiles()) {
101
+ if (ngCompiler?.ignoreForDiagnostics.has(sourceFile))
102
+ continue;
103
+ diagnostics.push(...builder.getSyntacticDiagnostics(sourceFile), ...builder.getSemanticDiagnostics(sourceFile));
104
+ if (ngCompiler &&
105
+ !sourceFile.isDeclarationFile &&
106
+ !ngCompiler.ignoreForEmit.has(sourceFile) &&
107
+ !ngCompiler.incrementalDriver.safeToSkipEmit(sourceFile)) {
108
+ diagnostics.push(...ngCompiler.getDiagnosticsForFile(sourceFile, 1));
109
+ }
110
+ }
111
+ results.push(...diagnostics
112
+ .filter((item) => [ts.DiagnosticCategory.Error, ts.DiagnosticCategory.Warning].includes(item.category))
113
+ .map((item) => SdCliBuildResultUtil.convertDiagsToResult(item))
114
+ .filterExists());
115
+ if (results.some((item) => item.severity === "error")) {
116
+ return results;
117
+ }
118
+ const transformers = ngCompiler?.prepareEmit().transformers;
119
+ for (const sourceFile of builder.getSourceFiles()) {
120
+ if (ngCompiler?.ignoreForEmit.has(sourceFile))
121
+ continue;
122
+ builder.emit(sourceFile, undefined, undefined, undefined, transformers);
123
+ }
124
+ return results;
125
+ }
126
+ catch (err) {
127
+ if (err instanceof sass.Exception) {
128
+ const matches = err.sassStack.match(/^(.*\.sd\.scss) ([0-9]*):([0-9]*)/);
129
+ const filePath = path.resolve(matches[1].replace(/\.sd\.scss/, "").replace(/^\.:/, item => item.toUpperCase()));
130
+ const scssLine = matches[2];
131
+ const scssChar = matches[3];
132
+ const message = err.sassMessage;
133
+ return [{
134
+ filePath,
135
+ line: undefined,
136
+ char: undefined,
137
+ code: undefined,
138
+ severity: "error",
139
+ message: `스타일(${scssLine}:${scssChar}): ${message}`
140
+ }];
141
+ }
142
+ return [{
143
+ filePath: undefined,
144
+ line: undefined,
145
+ char: undefined,
146
+ code: undefined,
147
+ severity: "error",
148
+ message: err.message
149
+ }];
150
+ }
151
+ }
152
+ _createSdBuildPack(parsedTsconfig) {
153
+ const compilerHost = this._createCacheCompilerHost(parsedTsconfig);
154
+ const { program, ngCompiler } = this._createProgram(parsedTsconfig, compilerHost);
155
+ this._builder = ts.createEmitAndSemanticDiagnosticsBuilderProgram(program, compilerHost, this._builder);
156
+ const affectedSourceFileSet = new Set();
157
+ while (true) {
158
+ const result = this._builder.getSemanticDiagnosticsOfNextAffectedFile(undefined, (sourceFile) => {
159
+ if (ngCompiler && ngCompiler.ignoreForDiagnostics.has(sourceFile) && sourceFile.fileName.endsWith(".ngtypecheck.ts")) {
160
+ const orgFileName = sourceFile.fileName.slice(0, -15) + ".ts";
161
+ const orgSourceFile = this._builder.getSourceFile(orgFileName);
162
+ if (orgSourceFile) {
163
+ affectedSourceFileSet.add(orgSourceFile);
164
+ }
165
+ return true;
166
+ }
167
+ return false;
168
+ });
169
+ if (!result)
170
+ break;
171
+ affectedSourceFileSet.add(result.affected);
172
+ }
173
+ return {
174
+ program,
175
+ ngCompiler,
176
+ builder: this._builder,
177
+ affectedSourceFiles: Array.from(affectedSourceFileSet.values())
178
+ };
179
+ }
180
+ _createProgram(parsedTsconfig, compilerHost) {
181
+ if (this._isAngular) {
182
+ this._ngProgram = new NgtscProgram(parsedTsconfig.fileNames, parsedTsconfig.options, compilerHost, this._ngProgram);
183
+ this._program = this._ngProgram.getTsProgram();
184
+ this._configProgramSourceFileVersions(this._program);
185
+ return {
186
+ program: this._program,
187
+ ngCompiler: this._ngProgram.compiler
188
+ };
189
+ }
190
+ else {
191
+ this._program = ts.createProgram(parsedTsconfig.fileNames, parsedTsconfig.options, compilerHost, this._program);
192
+ this._configProgramSourceFileVersions(this._program);
193
+ return { program: this._program };
194
+ }
195
+ }
196
+ _configProgramSourceFileVersions(program) {
197
+ const baseGetSourceFiles = program.getSourceFiles;
198
+ program.getSourceFiles = function (...parameters) {
199
+ const files = baseGetSourceFiles(...parameters);
200
+ for (const file of files) {
201
+ if (file.version === undefined) {
202
+ file.version = createHash("sha256").update(file.text).digest("hex");
203
+ }
204
+ }
205
+ return files;
206
+ };
207
+ }
208
+ _createCacheCompilerHost(parsedTsconfig) {
209
+ if (!this._moduleResolutionCache) {
210
+ this._moduleResolutionCache = ts.createModuleResolutionCache(this._rootPath, (s) => s, parsedTsconfig.options);
211
+ }
212
+ const compilerHost = SdCliCacheCompilerHost.create(parsedTsconfig, this._moduleResolutionCache, this._fileCache, this._writeFileCache);
213
+ if (this._isAngular) {
214
+ return SdCliNgCacheCompilerHost.wrap(compilerHost, this._fileCache);
215
+ }
216
+ else {
217
+ return compilerHost;
218
+ }
219
+ }
220
+ async _getParsedTsconfigAsync() {
221
+ const tsconfigFilePath = path.resolve(this._rootPath, "tsconfig-build.json");
222
+ const tsconfig = await FsUtil.readJsonAsync(tsconfigFilePath);
223
+ return ts.parseJsonConfigFileContent(tsconfig, ts.sys, this._rootPath);
224
+ }
225
+ }
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlUc0xpYkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbGRlci9TZENsaVRzTGliQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0UsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBR2xGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBY2pELFlBQW9DLFNBQVMsRUFDVCxVQUFtQjtRQUNyRCxLQUFLLEVBQUUsQ0FBQztRQUYwQixjQUFTLEdBQVQsU0FBUyxDQUFBO1FBQ1QsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQWR0QyxZQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBTXBFLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUMzQyxvQkFBZSxHQUFHLElB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