@rock-js/tools 0.12.10 → 0.12.11

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.
@@ -10,6 +10,11 @@ export * from './lib/project.js';
10
10
  export * from './lib/types.js';
11
11
  export * from './lib/build-cache/common.js';
12
12
  export * from './lib/build-cache/localBuildCache.js';
13
+ export * from './lib/fs.js';
14
+ export * from './lib/package-json.js';
15
+ export * from './lib/project-name.js';
16
+ export * from './lib/edit-template.js';
17
+ export * from './lib/git.js';
13
18
  export { getBinaryPath } from './lib/build-cache/getBinaryPath.js';
14
19
  export { findDevServerPort } from './lib/dev-server/findDevServerPort.js';
15
20
  export { isDevServerRunning } from './lib/dev-server/isDevServerRunning.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/src/index.js CHANGED
@@ -10,6 +10,11 @@ export * from './lib/project.js';
10
10
  export * from './lib/types.js';
11
11
  export * from './lib/build-cache/common.js';
12
12
  export * from './lib/build-cache/localBuildCache.js';
13
+ export * from './lib/fs.js';
14
+ export * from './lib/package-json.js';
15
+ export * from './lib/project-name.js';
16
+ export * from './lib/edit-template.js';
17
+ export * from './lib/git.js';
13
18
  export { getBinaryPath } from './lib/build-cache/getBinaryPath.js';
14
19
  export { findDevServerPort } from './lib/dev-server/findDevServerPort.js';
15
20
  export { isDevServerRunning } from './lib/dev-server/isDevServerRunning.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Rename common files that cannot be put into template literaly, e.g. .gitignore.
3
+ */
4
+ export declare function renameCommonFiles(projectPath: string): void;
5
+ /**
6
+ * Replace placeholder with project nae in whole template:
7
+ * - Rename paths containing placeholder
8
+ * - Replace placeholder in text files
9
+ */
10
+ export declare function replacePlaceholder(projectPath: string, normalizedName: string): void;
11
+ //# sourceMappingURL=edit-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-template.d.ts","sourceRoot":"","sources":["../../../src/lib/edit-template.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,QAcpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,QA4BvB"}
@@ -0,0 +1,56 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { renameFile, walkDirectory } from './fs.js';
4
+ /**
5
+ * Placeholder name used in template, that should be replaced with normalized project name.
6
+ */
7
+ const PLACEHOLDER_NAME = 'HelloWorld';
8
+ /**
9
+ * Rename common files that cannot be put into template literaly, e.g. .gitignore.
10
+ */
11
+ export function renameCommonFiles(projectPath) {
12
+ const sourceGitIgnorePath = path.join(projectPath, 'gitignore');
13
+ if (fs.existsSync(sourceGitIgnorePath)) {
14
+ fs.renameSync(sourceGitIgnorePath, path.join(projectPath, '.gitignore'));
15
+ }
16
+ // Harmony platform has a separate gitignore file.
17
+ const harmonyGitIgnorePath = path.join(projectPath, 'harmony', 'gitignore');
18
+ if (fs.existsSync(harmonyGitIgnorePath)) {
19
+ fs.renameSync(harmonyGitIgnorePath, path.join(projectPath, 'harmony', '.gitignore'));
20
+ }
21
+ }
22
+ /**
23
+ * Replace placeholder with project nae in whole template:
24
+ * - Rename paths containing placeholder
25
+ * - Replace placeholder in text files
26
+ */
27
+ export function replacePlaceholder(projectPath, normalizedName) {
28
+ if (normalizedName === PLACEHOLDER_NAME) {
29
+ return;
30
+ }
31
+ for (const filePath of walkDirectory(projectPath).reverse()) {
32
+ // Skip anything inside node_modules
33
+ if (filePath.split(path.sep).includes('node_modules')) {
34
+ continue;
35
+ }
36
+ if (!fs.statSync(filePath).isDirectory()) {
37
+ replacePlaceholderInTextFile(filePath, normalizedName);
38
+ }
39
+ if (path.basename(filePath).includes(PLACEHOLDER_NAME)) {
40
+ renameFile(filePath, PLACEHOLDER_NAME, normalizedName);
41
+ }
42
+ else if (path.basename(filePath).includes(PLACEHOLDER_NAME.toLowerCase())) {
43
+ renameFile(filePath, PLACEHOLDER_NAME.toLowerCase(), normalizedName.toLowerCase());
44
+ }
45
+ }
46
+ }
47
+ function replacePlaceholderInTextFile(filePath, normalizedName) {
48
+ const fileContent = fs.readFileSync(filePath, 'utf8');
49
+ const replacedFileContent = fileContent
50
+ .replaceAll(PLACEHOLDER_NAME, normalizedName)
51
+ .replaceAll(PLACEHOLDER_NAME.toLowerCase(), normalizedName.toLowerCase());
52
+ if (fileContent !== replacedFileContent) {
53
+ fs.writeFileSync(filePath, replacedFileContent, 'utf8');
54
+ }
55
+ }
56
+ //# sourceMappingURL=edit-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-template.js","sourceRoot":"","sources":["../../../src/lib/edit-template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpD;;GAEG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,kDAAkD;IAClD,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5E,IAAI,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,UAAU,CACX,oBAAoB,EACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAChD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,cAAsB;IAEtB,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,oCAAoC;QACpC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACzC,4BAA4B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvD,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC;aAAM,IACL,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAChE,CAAC;YACD,UAAU,CACR,QAAQ,EACR,gBAAgB,CAAC,WAAW,EAAE,EAC9B,cAAc,CAAC,WAAW,EAAE,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAgB,EAChB,cAAsB;IAEtB,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,WAAW;SACpC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC;SAC5C,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAE5E,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;QACxC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function isEmptyDirSync(path: string): boolean;
2
+ type CopyDirOptions = {
3
+ skipFiles?: string[];
4
+ };
5
+ export declare function copyDirSync(from: string, to: string, { skipFiles }?: CopyDirOptions): void;
6
+ export declare function removeDirSync(path: string): void;
7
+ export declare function removeDirs(paths: string[]): Promise<void[]>;
8
+ export declare function walkDirectory(currentPath: string): string[];
9
+ export declare function renameFile(filePath: string, oldName: string, newName: string): void;
10
+ export declare function getNameWithoutExtension(filePath: string): string;
11
+ export {};
12
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/lib/fs.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,WAG1C;AAED,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,EAAE,SAAc,EAAE,GAAE,cAAmB,QAmBxC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,QAIzC;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,mBAM/C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAS3D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAO5E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,UAEvD"}
@@ -0,0 +1,53 @@
1
+ import fs from 'node:fs';
2
+ import fsPromises from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import nodePath from 'node:path';
5
+ import { mergePackageJsons } from './package-json.js';
6
+ export function isEmptyDirSync(path) {
7
+ const files = fs.readdirSync(path);
8
+ return files.length === 0 || (files.length === 1 && files[0] === '.git');
9
+ }
10
+ export function copyDirSync(from, to, { skipFiles = [] } = {}) {
11
+ fs.mkdirSync(to, { recursive: true });
12
+ for (const file of fs.readdirSync(from)) {
13
+ const srcFile = nodePath.resolve(from, file);
14
+ const stat = fs.statSync(srcFile);
15
+ const distFile = nodePath.resolve(to, file);
16
+ if (stat.isDirectory()) {
17
+ copyDirSync(srcFile, distFile, { skipFiles });
18
+ }
19
+ else {
20
+ if (nodePath.basename(srcFile) === 'package.json') {
21
+ mergePackageJsons(srcFile, distFile);
22
+ }
23
+ else if (!skipFiles?.includes(nodePath.basename(srcFile))) {
24
+ fs.copyFileSync(srcFile, distFile);
25
+ }
26
+ }
27
+ }
28
+ }
29
+ export function removeDirSync(path) {
30
+ if (fs.existsSync(path)) {
31
+ fs.rmSync(path, { recursive: true });
32
+ }
33
+ }
34
+ export async function removeDirs(paths) {
35
+ return await Promise.all(paths.map((dirPath) => fsPromises.rm(dirPath, { recursive: true, force: true })));
36
+ }
37
+ export function walkDirectory(currentPath) {
38
+ if (!fs.lstatSync(currentPath).isDirectory()) {
39
+ return [currentPath];
40
+ }
41
+ const childPaths = fs
42
+ .readdirSync(currentPath)
43
+ .flatMap((childName) => walkDirectory(path.join(currentPath, childName)));
44
+ return [currentPath, ...childPaths];
45
+ }
46
+ export function renameFile(filePath, oldName, newName) {
47
+ const newFileName = nodePath.join(nodePath.dirname(filePath), nodePath.basename(filePath).replaceAll(oldName, newName));
48
+ fs.renameSync(filePath, newFileName);
49
+ }
50
+ export function getNameWithoutExtension(filePath) {
51
+ return path.basename(filePath, path.extname(filePath));
52
+ }
53
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/lib/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function gitInitStep(path: string, version: string | null): Promise<void>;
2
+ export declare function hasGitClient(): Promise<boolean>;
3
+ export declare function isGitRepo(path: string): Promise<boolean>;
4
+ export declare function isGitDirty(dir: string): Promise<boolean>;
5
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/lib/git.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,iBAoBrE;AAeD,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAOrD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU9D;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,oBAM3C"}
@@ -0,0 +1,59 @@
1
+ import logger from './logger.js';
2
+ import { spinner } from './prompts.js';
3
+ import { spawn } from './spawn.js';
4
+ export async function gitInitStep(path, version) {
5
+ if (!(await hasGitClient())) {
6
+ logger.info('Git client not found, skipping git initialization');
7
+ return;
8
+ }
9
+ if (await isGitRepo(path)) {
10
+ logger.debug('Git repo already initialized, skipping git initialization');
11
+ return;
12
+ }
13
+ const loader = spinner();
14
+ loader.start('Initializing git repo');
15
+ const message = `Initial commit\n\nGenerated by rock${version ? `@${version}` : ''}.`;
16
+ await initGitRepo(path, message);
17
+ loader.stop('Git repo initialized.');
18
+ }
19
+ async function initGitRepo(path, message) {
20
+ try {
21
+ await spawn('git', ['init'], { cwd: path });
22
+ await spawn('git', ['branch', '-M', 'main'], { cwd: path });
23
+ await spawn('git', ['add', '.'], { cwd: path });
24
+ await spawn('git', ['commit', '-m', message], {
25
+ cwd: path,
26
+ });
27
+ }
28
+ catch (error) {
29
+ logger.warn('Failed to initialize git repository', error);
30
+ }
31
+ }
32
+ export async function hasGitClient() {
33
+ try {
34
+ await spawn('git', ['--version'], { stdio: 'ignore' });
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ export async function isGitRepo(path) {
42
+ try {
43
+ await spawn('git', ['rev-parse', '--is-inside-work-tree'], {
44
+ stdio: 'ignore',
45
+ cwd: path,
46
+ });
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ export async function isGitDirty(dir) {
54
+ const { output } = await spawn('git', ['status', '--porcelain'], {
55
+ cwd: dir,
56
+ });
57
+ return output.trim() !== '';
58
+ }
59
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/lib/git.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAsB;IACpE,IAAI,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,sCACd,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAC5B,GAAG,CAAC;IACJ,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;YAC5C,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;YACzD,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;QAC/D,GAAG,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function mergePackageJsons(from: string, to: string): void;
2
+ export declare function rewritePackageJson(projectPath: string, packageName: string): void;
3
+ //# sourceMappingURL=package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/package-json.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAczD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAoC1E"}
@@ -0,0 +1,65 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ export function mergePackageJsons(from, to) {
4
+ const src = JSON.parse(fs.readFileSync(from, 'utf-8'));
5
+ if (!fs.existsSync(to)) {
6
+ fs.copyFileSync(from, to);
7
+ }
8
+ const dist = JSON.parse(fs.readFileSync(to, 'utf-8'));
9
+ // @todo consider adding a warning when src keys are different from dist keys
10
+ dist.scripts = { ...dist.scripts, ...src.scripts };
11
+ dist.dependencies = { ...dist.dependencies, ...src.dependencies };
12
+ dist.devDependencies = { ...dist.devDependencies, ...src.devDependencies };
13
+ dist.peerDependencies = { ...dist.peerDependencies, ...src.peerDependencies };
14
+ fs.writeFileSync(to, JSON.stringify(dist, null, 2));
15
+ }
16
+ export function rewritePackageJson(projectPath, packageName) {
17
+ const packageJsonPath = path.join(projectPath, 'package.json');
18
+ if (!fs.existsSync(packageJsonPath)) {
19
+ return;
20
+ }
21
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
22
+ // Override fields from template
23
+ packageJson.name = packageName;
24
+ packageJson.version = '1.0.0';
25
+ packageJson.private = true;
26
+ delete packageJson.publishConfig;
27
+ if (packageJson.dependencies) {
28
+ packageJson.dependencies = Object.fromEntries(Object.entries(packageJson.dependencies).sort());
29
+ }
30
+ if (packageJson.devDependencies) {
31
+ packageJson.devDependencies = Object.fromEntries(Object.entries(packageJson.devDependencies).sort());
32
+ }
33
+ if (packageJson.peerDependencies) {
34
+ packageJson.peerDependencies = Object.fromEntries(Object.entries(packageJson.peerDependencies).sort());
35
+ }
36
+ fs.writeFileSync(packageJsonPath, JSON.stringify(sortPackageJson(packageJson), null, 2));
37
+ }
38
+ /**
39
+ * Sort fields in package.json to make it cleaner.
40
+ * @param packageJson
41
+ * @returns
42
+ */
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ function sortPackageJson(packageJson) {
45
+ const { name, version, private: privateValue, scripts, dependencies, devDependencies, peerDependencies, ...rest } = packageJson;
46
+ const result = {};
47
+ setField(result, 'name', name);
48
+ setField(result, 'version', version);
49
+ setField(result, 'private', privateValue);
50
+ setField(result, 'scripts', scripts);
51
+ setField(result, 'dependencies', dependencies);
52
+ setField(result, 'devDependencies', devDependencies);
53
+ setField(result, 'peerDependencies', peerDependencies);
54
+ for (const key in rest) {
55
+ result[key] = rest[key];
56
+ }
57
+ return result;
58
+ }
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ function setField(packageJson, key, value) {
61
+ if (value !== undefined) {
62
+ packageJson[key] = value;
63
+ }
64
+ }
65
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/lib/package-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function validateProjectName(name: string): string | undefined;
2
+ /**
3
+ * Transform project name to PascalCase. The input name can be in either kebab-case or PascalCase.
4
+ *
5
+ * @param name - Project name
6
+ * @returns PascalCase project name
7
+ */
8
+ export declare function normalizeProjectName(name: string): string;
9
+ //# sourceMappingURL=project-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-name.d.ts","sourceRoot":"","sources":["../../../src/lib/project-name.ts"],"names":[],"mappings":"AA8DA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,sBAe/C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,UAQhD"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Allow for alphanumeric, hyphen (kebab-case), and underscore (_).
3
+ * Has to start with a letter.
4
+ */
5
+ const NAME_REGEX = /^[A-Z][0-9A-Z_-]*$/i;
6
+ // ref: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
7
+ const javaKeywords = [
8
+ 'abstract',
9
+ 'continue',
10
+ 'for',
11
+ 'new',
12
+ 'switch',
13
+ 'assert',
14
+ 'default',
15
+ 'goto',
16
+ 'package',
17
+ 'synchronized',
18
+ 'boolean',
19
+ 'do',
20
+ 'if',
21
+ 'private',
22
+ 'this',
23
+ 'break',
24
+ 'double',
25
+ 'implements',
26
+ 'protected',
27
+ 'throw',
28
+ 'byte',
29
+ 'else',
30
+ 'import',
31
+ 'public',
32
+ 'throws',
33
+ 'case',
34
+ 'enum',
35
+ 'instanceof',
36
+ 'return',
37
+ 'transient',
38
+ 'catch',
39
+ 'extends',
40
+ 'int',
41
+ 'short',
42
+ 'try',
43
+ 'char',
44
+ 'final',
45
+ 'interface',
46
+ 'static',
47
+ 'void',
48
+ 'class',
49
+ 'finally',
50
+ 'long',
51
+ 'strictfp',
52
+ 'volatile',
53
+ 'const',
54
+ 'float',
55
+ 'native',
56
+ 'super',
57
+ 'while',
58
+ ];
59
+ const reservedNames = ['react', 'react-native', ...javaKeywords];
60
+ export function validateProjectName(name) {
61
+ if (name.length === 0) {
62
+ return 'Project name cannot be empty.';
63
+ }
64
+ if (!name.match(NAME_REGEX)) {
65
+ return `Invalid project name: "${name}". Please use a valid identifier name (alphanumeric, hyphen, underscore).`;
66
+ }
67
+ const lowerCaseName = name.toLowerCase();
68
+ if (reservedNames.includes(lowerCaseName)) {
69
+ return `Invalid project name: "${name}". Can't use reserved name. Please use another name.`;
70
+ }
71
+ return undefined;
72
+ }
73
+ /**
74
+ * Transform project name to PascalCase. The input name can be in either kebab-case or PascalCase.
75
+ *
76
+ * @param name - Project name
77
+ * @returns PascalCase project name
78
+ */
79
+ export function normalizeProjectName(name) {
80
+ if (!name)
81
+ return '';
82
+ return name
83
+ .split('-')
84
+ .filter(Boolean)
85
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
86
+ .join('');
87
+ }
88
+ //# sourceMappingURL=project-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-name.js","sourceRoot":"","sources":["../../../src/lib/project-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC,gFAAgF;AAChF,MAAM,YAAY,GAAG;IACnB,UAAU;IACV,UAAU;IACV,KAAK;IACL,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,SAAS;IACT,cAAc;IACd,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,OAAO;IACP,SAAS;IACT,KAAK;IACL,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,WAAW;IACX,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;CACR,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,CAAC;AAEjE,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,0BAA0B,IAAI,2EAA2E,CAAC;IACnH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1C,OAAO,0BAA0B,IAAI,sDAAsD,CAAC;IAC9F,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rock-js/tools",
3
- "version": "0.12.10",
3
+ "version": "0.12.11",
4
4
  "description": "Internal core utilities for Rock",
5
5
  "type": "module",
6
6
  "types": "./dist/src/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "tslib": "^2.3.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@rock-js/test-helpers": "^0.12.10",
33
+ "@rock-js/test-helpers": "^0.12.11",
34
34
  "@types/adm-zip": "^0.5.7"
35
35
  },
36
36
  "publishConfig": {