@rock-js/tools 0.8.13

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 (110) hide show
  1. package/README.md +7 -0
  2. package/dist/src/index.d.ts +19 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +20 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/lib/build-cache/common.d.ts +79 -0
  7. package/dist/src/lib/build-cache/common.d.ts.map +1 -0
  8. package/dist/src/lib/build-cache/common.js +44 -0
  9. package/dist/src/lib/build-cache/common.js.map +1 -0
  10. package/dist/src/lib/build-cache/fetchCachedBuild.d.ts +12 -0
  11. package/dist/src/lib/build-cache/fetchCachedBuild.d.ts.map +1 -0
  12. package/dist/src/lib/build-cache/fetchCachedBuild.js +128 -0
  13. package/dist/src/lib/build-cache/fetchCachedBuild.js.map +1 -0
  14. package/dist/src/lib/build-cache/getBinaryPath.d.ts +10 -0
  15. package/dist/src/lib/build-cache/getBinaryPath.d.ts.map +1 -0
  16. package/dist/src/lib/build-cache/getBinaryPath.js +60 -0
  17. package/dist/src/lib/build-cache/getBinaryPath.js.map +1 -0
  18. package/dist/src/lib/build-cache/localBuildCache.d.ts +8 -0
  19. package/dist/src/lib/build-cache/localBuildCache.d.ts.map +1 -0
  20. package/dist/src/lib/build-cache/localBuildCache.js +50 -0
  21. package/dist/src/lib/build-cache/localBuildCache.js.map +1 -0
  22. package/dist/src/lib/cacheManager.d.ts +15 -0
  23. package/dist/src/lib/cacheManager.d.ts.map +1 -0
  24. package/dist/src/lib/cacheManager.js +63 -0
  25. package/dist/src/lib/cacheManager.js.map +1 -0
  26. package/dist/src/lib/color.d.ts +3 -0
  27. package/dist/src/lib/color.d.ts.map +1 -0
  28. package/dist/src/lib/color.js +6 -0
  29. package/dist/src/lib/color.js.map +1 -0
  30. package/dist/src/lib/dev-server/findDevServerPort.d.ts +4 -0
  31. package/dist/src/lib/dev-server/findDevServerPort.d.ts.map +1 -0
  32. package/dist/src/lib/dev-server/findDevServerPort.js +27 -0
  33. package/dist/src/lib/dev-server/findDevServerPort.js.map +1 -0
  34. package/dist/src/lib/dev-server/getDevMiddleware.d.ts +1 -0
  35. package/dist/src/lib/dev-server/getDevMiddleware.js +10 -0
  36. package/dist/src/lib/dev-server/getDevMiddleware.js.map +1 -0
  37. package/dist/src/lib/dev-server/getNextPort.d.ts +11 -0
  38. package/dist/src/lib/dev-server/getNextPort.d.ts.map +1 -0
  39. package/dist/src/lib/dev-server/getNextPort.js +22 -0
  40. package/dist/src/lib/dev-server/getNextPort.js.map +1 -0
  41. package/dist/src/lib/dev-server/getReactNativeCommunityCliPlugin.d.ts +1 -0
  42. package/dist/src/lib/dev-server/getReactNativeCommunityCliPlugin.js +5 -0
  43. package/dist/src/lib/dev-server/getReactNativeCommunityCliPlugin.js.map +1 -0
  44. package/dist/src/lib/dev-server/getReactNativeCommunityCliServerApi.d.ts +1 -0
  45. package/dist/src/lib/dev-server/getReactNativeCommunityCliServerApi.js +8 -0
  46. package/dist/src/lib/dev-server/getReactNativeCommunityCliServerApi.js.map +1 -0
  47. package/dist/src/lib/dev-server/getReactNativeCommunityDevServerApi.d.ts +1 -0
  48. package/dist/src/lib/dev-server/getReactNativeCommunityDevServerApi.js +8 -0
  49. package/dist/src/lib/dev-server/getReactNativeCommunityDevServerApi.js.map +1 -0
  50. package/dist/src/lib/dev-server/handlePortUnavailable.d.ts +4 -0
  51. package/dist/src/lib/dev-server/handlePortUnavailable.d.ts.map +1 -0
  52. package/dist/src/lib/dev-server/handlePortUnavailable.js +33 -0
  53. package/dist/src/lib/dev-server/handlePortUnavailable.js.map +1 -0
  54. package/dist/src/lib/dev-server/isDevServerRunning.d.ts +13 -0
  55. package/dist/src/lib/dev-server/isDevServerRunning.d.ts.map +1 -0
  56. package/dist/src/lib/dev-server/isDevServerRunning.js +29 -0
  57. package/dist/src/lib/dev-server/isDevServerRunning.js.map +1 -0
  58. package/dist/src/lib/dev-server/logAlreadyRunningBundler.d.ts +1 -0
  59. package/dist/src/lib/dev-server/logAlreadyRunningBundler.d.ts.map +1 -0
  60. package/dist/src/lib/dev-server/logAlreadyRunningBundler.js +5 -0
  61. package/dist/src/lib/dev-server/logAlreadyRunningBundler.js.map +1 -0
  62. package/dist/src/lib/env.d.ts +2 -0
  63. package/dist/src/lib/env.d.ts.map +1 -0
  64. package/dist/src/lib/env.js +11 -0
  65. package/dist/src/lib/env.js.map +1 -0
  66. package/dist/src/lib/error.d.ts +6 -0
  67. package/dist/src/lib/error.d.ts.map +1 -0
  68. package/dist/src/lib/error.js +11 -0
  69. package/dist/src/lib/error.js.map +1 -0
  70. package/dist/src/lib/fingerprint/index.d.ts +20 -0
  71. package/dist/src/lib/fingerprint/index.d.ts.map +1 -0
  72. package/dist/src/lib/fingerprint/index.js +128 -0
  73. package/dist/src/lib/fingerprint/index.js.map +1 -0
  74. package/dist/src/lib/fingerprint/processExtraSources.d.ts +9 -0
  75. package/dist/src/lib/fingerprint/processExtraSources.d.ts.map +1 -0
  76. package/dist/src/lib/fingerprint/processExtraSources.js +76 -0
  77. package/dist/src/lib/fingerprint/processExtraSources.js.map +1 -0
  78. package/dist/src/lib/hermes.d.ts +4 -0
  79. package/dist/src/lib/hermes.d.ts.map +1 -0
  80. package/dist/src/lib/hermes.js +141 -0
  81. package/dist/src/lib/hermes.js.map +1 -0
  82. package/dist/src/lib/isInteractive.d.ts +8 -0
  83. package/dist/src/lib/isInteractive.d.ts.map +1 -0
  84. package/dist/src/lib/isInteractive.js +10 -0
  85. package/dist/src/lib/isInteractive.js.map +1 -0
  86. package/dist/src/lib/logger.d.ts +11 -0
  87. package/dist/src/lib/logger.d.ts.map +1 -0
  88. package/dist/src/lib/logger.js +58 -0
  89. package/dist/src/lib/logger.js.map +1 -0
  90. package/dist/src/lib/parse-args.d.ts +1 -0
  91. package/dist/src/lib/parse-args.d.ts.map +1 -0
  92. package/dist/src/lib/parse-args.js +5 -0
  93. package/dist/src/lib/parse-args.js.map +1 -0
  94. package/dist/src/lib/path.d.ts +4 -0
  95. package/dist/src/lib/path.d.ts.map +1 -0
  96. package/dist/src/lib/path.js +36 -0
  97. package/dist/src/lib/path.js.map +1 -0
  98. package/dist/src/lib/project.d.ts +9 -0
  99. package/dist/src/lib/project.d.ts.map +1 -0
  100. package/dist/src/lib/project.js +33 -0
  101. package/dist/src/lib/project.js.map +1 -0
  102. package/dist/src/lib/prompts.d.ts +25 -0
  103. package/dist/src/lib/prompts.d.ts.map +1 -0
  104. package/dist/src/lib/prompts.js +106 -0
  105. package/dist/src/lib/prompts.js.map +1 -0
  106. package/dist/src/lib/spawn.d.ts +4 -0
  107. package/dist/src/lib/spawn.d.ts.map +1 -0
  108. package/dist/src/lib/spawn.js +43 -0
  109. package/dist/src/lib/spawn.js.map +1 -0
  110. package/package.json +39 -0
@@ -0,0 +1,141 @@
1
+ import fs from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'node:path';
4
+ import { getLocalOS } from './env.js';
5
+ import { RockError } from './error.js';
6
+ import { getProjectRoot } from './project.js';
7
+ import { spawn } from './spawn.js';
8
+ function getReactNativePackagePath() {
9
+ const require = createRequire(import.meta.url);
10
+ const root = getProjectRoot();
11
+ const input = require.resolve('react-native', { paths: [root] });
12
+ return path.dirname(input);
13
+ }
14
+ /**
15
+ * Returns the path to the react-native compose-source-maps.js script.
16
+ */
17
+ function getComposeSourceMapsPath() {
18
+ const rnPackagePath = getReactNativePackagePath();
19
+ const composeSourceMapsPath = path.join(rnPackagePath, 'scripts', 'compose-source-maps.js');
20
+ if (!fs.existsSync(composeSourceMapsPath)) {
21
+ throw new RockError("Could not find react-native's compose-source-maps.js script.");
22
+ }
23
+ return composeSourceMapsPath;
24
+ }
25
+ /**
26
+ * Extracts debugId from sourcemap file.
27
+ * @see https://github.com/tc39/ecma426/blob/main/proposals/debug-id.md
28
+ * @param sourceMapPath - Sourcemap file path
29
+ * @returns debugId value. Returns null if extraction fails
30
+ */
31
+ function extractDebugId(sourceMapPath) {
32
+ try {
33
+ const sourceMapContent = fs.readFileSync(sourceMapPath, 'utf-8');
34
+ const sourceMap = JSON.parse(sourceMapContent);
35
+ return sourceMap.debugId;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Inject debugId into sourcemap file at the top level.
43
+ * @see https://github.com/tc39/ecma426/blob/main/proposals/debug-id.md
44
+ * @param sourceMapPath - Sourcemap file path
45
+ * @param debugId - debugId value to inject
46
+ * @throws {RockError} Throws an error if injection fails
47
+ */
48
+ function injectDebugId(sourceMapPath, debugId) {
49
+ try {
50
+ const sourceMapContent = fs.readFileSync(sourceMapPath, 'utf-8');
51
+ const sourceMap = JSON.parse(sourceMapContent);
52
+ sourceMap.debugId = debugId;
53
+ fs.writeFileSync(sourceMapPath, JSON.stringify(sourceMap));
54
+ }
55
+ catch {
56
+ throw new RockError(`Failed to inject debugId into sourcemap: ${sourceMapPath}`);
57
+ }
58
+ }
59
+ export async function runHermes({ bundleOutputPath, sourcemapOutputPath, }) {
60
+ const hermescPath = getHermescPath();
61
+ if (!hermescPath) {
62
+ throw new RockError('Hermesc binary not found. Use `--no-hermes` flag to disable Hermes.');
63
+ }
64
+ // Output will be .hbc file
65
+ const hbcOutputPath = `${bundleOutputPath}.hbc`;
66
+ const hermescArgs = [
67
+ '-emit-binary',
68
+ '-max-diagnostic-width=80',
69
+ '-O',
70
+ '-w',
71
+ '-out',
72
+ hbcOutputPath,
73
+ bundleOutputPath,
74
+ ];
75
+ // Add sourcemap flag if enabled
76
+ if (sourcemapOutputPath) {
77
+ hermescArgs.push('-output-source-map');
78
+ }
79
+ try {
80
+ await spawn(hermescPath, hermescArgs);
81
+ }
82
+ catch (error) {
83
+ throw new RockError('Compiling JS bundle with Hermes failed. Use `--no-hermes` flag to disable Hermes.', { cause: error.stderr });
84
+ }
85
+ // Handle sourcemap composition if enabled
86
+ if (sourcemapOutputPath) {
87
+ const hermesSourceMapFile = `${hbcOutputPath}.map`;
88
+ const composeSourceMapsPath = getComposeSourceMapsPath();
89
+ try {
90
+ // Extract debugId from original sourcemap
91
+ const debugId = extractDebugId(sourcemapOutputPath);
92
+ await spawn('node', [
93
+ composeSourceMapsPath,
94
+ sourcemapOutputPath,
95
+ hermesSourceMapFile,
96
+ '-o',
97
+ sourcemapOutputPath,
98
+ ]);
99
+ // Inject debugId back into the composed sourcemap
100
+ if (debugId) {
101
+ injectDebugId(sourcemapOutputPath, debugId);
102
+ }
103
+ }
104
+ catch (error) {
105
+ throw new RockError('Failed to run compose-source-maps script', {
106
+ cause: error.stderr,
107
+ });
108
+ }
109
+ }
110
+ // Move .hbc file to overwrite the original bundle file
111
+ try {
112
+ if (fs.existsSync(bundleOutputPath)) {
113
+ fs.unlinkSync(bundleOutputPath);
114
+ }
115
+ fs.renameSync(hbcOutputPath, bundleOutputPath);
116
+ }
117
+ catch (error) {
118
+ throw new RockError(`Failed to move compiled Hermes bytecode to bundle output path: ${error}`);
119
+ }
120
+ }
121
+ /**
122
+ * Get `hermesc` binary path.
123
+ * Based on: https://github.com/facebook/react-native/blob/f2c78af56ae492f49b90d0af61ca9bf4d124fca0/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PathUtils.kt#L48-L55
124
+ */
125
+ function getHermescPath() {
126
+ const reactNativePath = getReactNativePackagePath();
127
+ // Local build from source: node_modules/react-native/sdks/hermes/build/bin/hermesc
128
+ const localBuildPath = path.join(reactNativePath, 'sdks/hermes/build/bin/hermesc');
129
+ if (fs.existsSync(localBuildPath)) {
130
+ return localBuildPath;
131
+ }
132
+ // Precompiled binaries: node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc
133
+ const prebuildPaths = {
134
+ macos: `${reactNativePath}/sdks/hermesc/osx-bin/hermesc`,
135
+ linux: `${reactNativePath}/sdks/hermesc/linux64-bin/hermesc`,
136
+ windows: `${reactNativePath}/sdks/hermesc/win64-bin/hermesc.exe`,
137
+ };
138
+ const os = getLocalOS();
139
+ return prebuildPaths[os];
140
+ }
141
+ //# sourceMappingURL=hermes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../../src/lib/hermes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Source from https://github.com/sindresorhus/is-interactive/blob/main/index.js
3
+ */
4
+ export declare function isInteractive({ stream }?: {
5
+ stream?: (NodeJS.WriteStream & {
6
+ fd: 1;
7
+ }) | undefined;
8
+ }): boolean;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInteractive.d.ts","sourceRoot":"","sources":["../../../src/lib/isInteractive.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAuB,EAAE;;;;CAAK,WAO7D"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Source from https://github.com/sindresorhus/is-interactive/blob/main/index.js
3
+ */
4
+ export function isInteractive({ stream = process.stdout } = {}) {
5
+ return Boolean(stream &&
6
+ stream.isTTY &&
7
+ process.env['TERM'] !== 'dumb' &&
8
+ !('CI' in process.env));
9
+ }
10
+ //# sourceMappingURL=isInteractive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInteractive.js","sourceRoot":"","sources":["../../../src/lib/isInteractive.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE;IAC5D,OAAO,OAAO,CACZ,MAAM;QACJ,MAAM,CAAC,KAAK;QACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM;QAC9B,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ declare const _default: {
2
+ success: (...messages: Array<unknown>) => void;
3
+ info: (...messages: Array<unknown>) => void;
4
+ warn: (...messages: Array<unknown>) => void;
5
+ error: (...messages: Array<unknown>) => void;
6
+ debug: (...messages: Array<unknown>) => void;
7
+ log: (...messages: Array<unknown>) => void;
8
+ setVerbose: (level: boolean) => void;
9
+ isVerbose: () => boolean;
10
+ };
11
+ export default _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/lib/logger.ts"],"names":[],"mappings":";2BAe8B,KAAK,CAAC,OAAO,CAAC;wBAKjB,KAAK,CAAC,OAAO,CAAC;wBAKd,KAAK,CAAC,OAAO,CAAC;yBAKb,KAAK,CAAC,OAAO,CAAC;yBAUd,KAAK,CAAC,OAAO,CAAC;uBALhB,KAAK,CAAC,OAAO,CAAC;wBAcb,OAAO;;;AASlC,wBASE"}
@@ -0,0 +1,58 @@
1
+ import util from 'node:util';
2
+ import { log as clackLog } from '@clack/prompts';
3
+ import isUnicodeSupported from 'is-unicode-supported';
4
+ import { color } from './color.js';
5
+ import { isInteractive } from './isInteractive.js';
6
+ const unicode = isUnicodeSupported();
7
+ const unicodeWithFallback = (c, fallback) => unicode ? c : fallback;
8
+ const SYMBOL_DEBUG = unicodeWithFallback('●', '•');
9
+ let verbose = false;
10
+ const success = (...messages) => {
11
+ const output = util.format(...messages);
12
+ clackLog.success(output);
13
+ };
14
+ const info = (...messages) => {
15
+ const output = util.format(...messages);
16
+ clackLog.info(output);
17
+ };
18
+ const warn = (...messages) => {
19
+ const output = util.format(...messages);
20
+ clackLog.warn(mapLines(output, color.yellow));
21
+ };
22
+ const error = (...messages) => {
23
+ const output = util.format(...messages);
24
+ clackLog.error(mapLines(output, color.red));
25
+ };
26
+ const log = (...messages) => {
27
+ const output = util.format(...messages);
28
+ clackLog.step(output);
29
+ };
30
+ const debug = (...messages) => {
31
+ if (verbose) {
32
+ const output = util.format(...messages);
33
+ clackLog.message(mapLines(output, color.dim), {
34
+ symbol: color.dim(SYMBOL_DEBUG),
35
+ });
36
+ }
37
+ };
38
+ const setVerbose = (level) => {
39
+ verbose = level;
40
+ };
41
+ const isVerbose = () => {
42
+ // For non-interactive environments, always show verbose logs
43
+ return !isInteractive() || verbose;
44
+ };
45
+ export default {
46
+ success,
47
+ info,
48
+ warn,
49
+ error,
50
+ debug,
51
+ log,
52
+ setVerbose,
53
+ isVerbose,
54
+ };
55
+ function mapLines(text, colorFn) {
56
+ return text.split('\n').map(colorFn).join('\n');
57
+ }
58
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function parseArgs(args: string): string[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../../src/lib/parse-args.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,YAErC"}
@@ -0,0 +1,5 @@
1
+ import { parseArgsStringToArgv } from 'string-argv';
2
+ export function parseArgs(args) {
3
+ return parseArgsStringToArgv(args);
4
+ }
5
+ //# sourceMappingURL=parse-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../../src/lib/parse-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function relativeToCwd(path: string): string;
2
+ export declare function resolveAbsolutePath(path: string): string;
3
+ export declare function resolveFilenameUp(path: string, filename: string): string;
4
+ export declare function findDirectoriesWithPattern(path: string, pattern: RegExp): string[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/lib/path.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,UAEzC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,UAE/C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAa/D;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAcvE"}
@@ -0,0 +1,36 @@
1
+ import * as fs from 'node:fs';
2
+ import * as nodePath from 'node:path';
3
+ import { RockError } from './error.js';
4
+ export function relativeToCwd(path) {
5
+ return nodePath.relative(process.cwd(), path);
6
+ }
7
+ export function resolveAbsolutePath(path) {
8
+ return nodePath.isAbsolute(path) ? path : nodePath.join(process.cwd(), path);
9
+ }
10
+ export function resolveFilenameUp(path, filename) {
11
+ const filePath = nodePath.join(path, filename);
12
+ if (fs.existsSync(filePath)) {
13
+ return filePath;
14
+ }
15
+ const parentDir = nodePath.dirname(path);
16
+ if (parentDir === path) {
17
+ throw new RockError(`${filename} not found in any parent directory of ${path}`);
18
+ }
19
+ return resolveFilenameUp(parentDir, filename);
20
+ }
21
+ export function findDirectoriesWithPattern(path, pattern) {
22
+ const files = fs.readdirSync(path);
23
+ const result = [];
24
+ for (const file of files) {
25
+ const filePath = nodePath.join(path, file);
26
+ const stat = fs.statSync(filePath);
27
+ if (stat.isDirectory()) {
28
+ if (file.match(pattern)) {
29
+ result.push(filePath);
30
+ }
31
+ result.push(...findDirectoriesWithPattern(filePath, pattern));
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/lib/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAgB;IAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CACjB,GAAG,QAAQ,yCAAyC,IAAI,EAAE,CAC3D,CAAC;IACJ,CAAC;IAED,OAAO,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,OAAe;IACtE,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function getProjectConfig(dir?: string): string;
2
+ export declare function getProjectRoot(dir?: string): string;
3
+ export declare function getDotRockPath(): string;
4
+ /**
5
+ * Returns path to cache root.
6
+ *
7
+ * Cache is stored in: `.rock/cache` directory in the project root.
8
+ */
9
+ export declare function getCacheRootPath(): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/lib/project.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,UAc3D;AAED,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,UAG1C;AAED,wBAAgB,cAAc,WAE7B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,WAE/B"}
@@ -0,0 +1,33 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const PROJECT_CONFIG_BASE_NAME = 'rock.config';
4
+ const PROJECT_CONFIG_FILE_EXTENSIONS = ['js', 'ts', 'mjs', 'mts', 'cjs', `cts`];
5
+ export function getProjectConfig(dir = process.cwd()) {
6
+ for (const ext of PROJECT_CONFIG_FILE_EXTENSIONS) {
7
+ const configPath = path.join(dir, `${PROJECT_CONFIG_BASE_NAME}.${ext}`);
8
+ if (fs.existsSync(configPath)) {
9
+ return configPath;
10
+ }
11
+ }
12
+ const parentDir = path.dirname(dir);
13
+ if (parentDir === dir) {
14
+ throw new Error(`Project config not found`);
15
+ }
16
+ return getProjectConfig(parentDir);
17
+ }
18
+ export function getProjectRoot(dir) {
19
+ const configPath = getProjectConfig(dir);
20
+ return path.dirname(configPath);
21
+ }
22
+ export function getDotRockPath() {
23
+ return path.join(getProjectRoot(), '.rock');
24
+ }
25
+ /**
26
+ * Returns path to cache root.
27
+ *
28
+ * Cache is stored in: `.rock/cache` directory in the project root.
29
+ */
30
+ export function getCacheRootPath() {
31
+ return path.join(getProjectRoot(), '.rock/cache');
32
+ }
33
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/lib/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAC/C,MAAM,8BAA8B,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAEhF,MAAM,UAAU,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,KAAK,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,wBAAwB,IAAI,GAAG,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import * as clack from '@clack/prompts';
2
+ export declare function intro(title?: string): void;
3
+ export declare function outro(message?: string): void;
4
+ export declare function note(message?: string, title?: string): void;
5
+ export declare function promptText(options: clack.TextOptions): Promise<string>;
6
+ export declare function promptPassword(options: clack.PasswordOptions): Promise<string>;
7
+ export declare function promptSelect<T>(options: clack.SelectOptions<T>): Promise<T>;
8
+ type ConfirmOptions = {
9
+ message: string;
10
+ confirmLabel?: string;
11
+ cancelLabel?: string;
12
+ };
13
+ export declare function promptConfirm(options: ConfirmOptions): Promise<boolean>;
14
+ export declare function promptMultiselect<T>(options: clack.MultiSelectOptions<T>): Promise<T[]>;
15
+ export declare function promptGroup<T>(prompts: clack.PromptGroup<T>, options?: clack.PromptGroupOptions<T> | undefined): Promise<{ [P in keyof clack.PromptGroupAwaitedReturn<T>]: clack.PromptGroupAwaitedReturn<T>[P]; }>;
16
+ export declare function spinner(options?: clack.SpinnerOptions & {
17
+ silent?: boolean;
18
+ }): {
19
+ start: (message?: string) => void;
20
+ stop: (message?: string, code?: number) => void;
21
+ message: (message?: string) => void;
22
+ };
23
+ export declare function formatStartMessage(text: string | undefined): string | undefined;
24
+ export declare function cancelPromptAndExit(message?: string): never;
25
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AAIxC,wBAAgB,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,QAEnC;AAED,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,QAErC;AAED,wBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,QAEpD;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC,eAAe,GAC7B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAc7E;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,GACnC,OAAO,CAAC,CAAC,EAAE,CAAC,CAOd;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,SAAS,sGAQlD;AAED,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,cAAc;sBAG9B,MAAM;qBACP,MAAM;wBAGH,MAAM;EAiB/B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAG3D"}
@@ -0,0 +1,106 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { isInteractive } from './isInteractive.js';
3
+ import logger from './logger.js';
4
+ export function intro(title) {
5
+ return clack.intro(title);
6
+ }
7
+ export function outro(message) {
8
+ return clack.outro(message);
9
+ }
10
+ export function note(message, title) {
11
+ return clack.note(message, title);
12
+ }
13
+ export async function promptText(options) {
14
+ const result = await clack.text(options);
15
+ if (clack.isCancel(result)) {
16
+ cancelPromptAndExit();
17
+ }
18
+ return result;
19
+ }
20
+ export async function promptPassword(options) {
21
+ const result = await clack.password(options);
22
+ if (clack.isCancel(result)) {
23
+ cancelPromptAndExit();
24
+ }
25
+ return result;
26
+ }
27
+ export async function promptSelect(options) {
28
+ // If there is only one option, return it immediately
29
+ if (options.options.length === 1) {
30
+ return options.options[0].value;
31
+ }
32
+ const result = await clack.select(options);
33
+ if (clack.isCancel(result)) {
34
+ cancelPromptAndExit();
35
+ }
36
+ return result;
37
+ }
38
+ export async function promptConfirm(options) {
39
+ const result = await clack.select({
40
+ message: options.message,
41
+ options: [
42
+ { value: true, label: options.confirmLabel ?? 'Confirm' },
43
+ { value: false, label: options.cancelLabel ?? 'Cancel' },
44
+ ],
45
+ });
46
+ if (clack.isCancel(result)) {
47
+ cancelPromptAndExit();
48
+ }
49
+ return result === true;
50
+ }
51
+ export async function promptMultiselect(options) {
52
+ const result = await clack.multiselect(options);
53
+ if (clack.isCancel(result)) {
54
+ cancelPromptAndExit();
55
+ }
56
+ return result;
57
+ }
58
+ export async function promptGroup(prompts, options) {
59
+ const result = await clack.group(prompts, options);
60
+ if (clack.isCancel(result)) {
61
+ cancelPromptAndExit();
62
+ }
63
+ return result;
64
+ }
65
+ export function spinner(options) {
66
+ if (options?.silent) {
67
+ return {
68
+ start: () => { },
69
+ stop: () => { },
70
+ message: () => { },
71
+ };
72
+ }
73
+ if (logger.isVerbose() || !isInteractive()) {
74
+ return {
75
+ start: (message) => logger.log(formatStartMessage(message)),
76
+ stop: (message, code = 0) => {
77
+ return code === 0 ? logger.log(message) : logger.error(message);
78
+ },
79
+ message: (message) => logger.log(formatStartMessage(message)),
80
+ };
81
+ }
82
+ const clackSpinner = clack.spinner(options);
83
+ return {
84
+ start: (message) => {
85
+ clackSpinner.start(message);
86
+ },
87
+ stop: (message, code) => {
88
+ clackSpinner.stop(message, code);
89
+ },
90
+ message: (message) => {
91
+ clackSpinner.message(message);
92
+ },
93
+ };
94
+ }
95
+ export function formatStartMessage(text) {
96
+ if (text === undefined) {
97
+ return undefined;
98
+ }
99
+ const messageWithoutDots = text.replace(/\.+$/, '');
100
+ return `${messageWithoutDots}...`;
101
+ }
102
+ export function cancelPromptAndExit(message) {
103
+ clack.cancel(message ?? 'Operation cancelled by user.');
104
+ process.exit(0);
105
+ }
106
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Options, Subprocess } from 'nano-spawn';
2
+ import { SubprocessError } from 'nano-spawn';
3
+ export declare function spawn(file: string, args?: readonly string[], options?: Options): Subprocess;
4
+ export { SubprocessError };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/lib/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGxD,wBAAgB,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,OAAO,GAChB,UAAU,CAYZ;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,43 @@
1
+ import nanoSpawn, { SubprocessError } from 'nano-spawn';
2
+ import logger from './logger.js';
3
+ export function spawn(file, args, options) {
4
+ const defaultStream = logger.isVerbose() ? 'inherit' : 'pipe';
5
+ const defaultOptions = {
6
+ stdin: defaultStream,
7
+ stdout: defaultStream,
8
+ // Always 'pipe' stderr to handle errors properly down the line
9
+ stderr: 'pipe',
10
+ };
11
+ logger.debug(`Running: ${file}`, ...(args ?? []));
12
+ const childProcess = nanoSpawn(file, args, { ...defaultOptions, ...options });
13
+ setupChildProcessCleanup(childProcess);
14
+ return childProcess;
15
+ }
16
+ export { SubprocessError };
17
+ function setupChildProcessCleanup(childProcess) {
18
+ // https://stackoverflow.com/questions/53049939/node-daemon-wont-start-with-process-stdin-setrawmodetrue/53050098#53050098
19
+ if (process.stdin.isTTY) {
20
+ // overwrite @clack/prompts setting raw mode for spinner and prompts,
21
+ // which prevents listening for SIGINT and SIGTERM
22
+ process.stdin.setRawMode(false);
23
+ }
24
+ const terminate = async () => {
25
+ try {
26
+ (await childProcess.nodeChildProcess).kill();
27
+ process.exit(1);
28
+ }
29
+ catch {
30
+ // ignore
31
+ }
32
+ };
33
+ const sigintHandler = () => terminate();
34
+ const sigtermHandler = () => terminate();
35
+ process.on('SIGINT', sigintHandler);
36
+ process.on('SIGTERM', sigtermHandler);
37
+ const cleanup = () => {
38
+ process.off('SIGINT', sigintHandler);
39
+ process.off('SIGTERM', sigtermHandler);
40
+ };
41
+ childProcess.nodeChildProcess.finally(cleanup);
42
+ }
43
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/lib/spawn.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,KAAK,CACnB,IAAY,EACZ,IAAwB,EACxB,OAAiB;IAEjB,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,cAAc,GAAY;QAC9B,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,aAAa;QACrB,+DAA+D;QAC/D,MAAM,EAAE,MAAM;KACf,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC9E,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,SAAS,wBAAwB,CAAC,YAAwB;IACxD,0HAA0H;IAC1H,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,qEAAqE;QACrE,kDAAkD;QAClD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,IAAI,CAAC;YACH,CAAC,MAAM,YAAY,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;IAEzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@rock-js/tools",
3
+ "version": "0.8.13",
4
+ "type": "module",
5
+ "types": "./dist/src/index.d.ts",
6
+ "exports": {
7
+ "types": "./dist/src/index.d.ts",
8
+ "default": "./dist/src/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.lib.json",
15
+ "dev": "tsc -p tsconfig.lib.json --watch",
16
+ "publish:npm": "npm publish --access public",
17
+ "publish:verdaccio": "npm publish --registry http://localhost:4873 --userconfig ../../.npmrc"
18
+ },
19
+ "dependencies": {
20
+ "@clack/prompts": "^0.11.0",
21
+ "@expo/fingerprint": "^0.11.6",
22
+ "@types/adm-zip": "^0.5.7",
23
+ "adm-zip": "^0.5.16",
24
+ "appdirsjs": "^1.2.7",
25
+ "fast-glob": "^3.3.2",
26
+ "is-unicode-supported": "^2.1.0",
27
+ "nano-spawn": "^0.2.0",
28
+ "picocolors": "^1.1.1",
29
+ "string-argv": "^0.3.2",
30
+ "tar": "^7.4.3",
31
+ "tslib": "^2.3.0"
32
+ },
33
+ "devDependencies": {
34
+ "@rock-js/test-helpers": "^0.8.13"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ }
39
+ }