create-unisphere-project 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/_templates/unisphere-project/.changeset/README.md +8 -0
- package/_templates/unisphere-project/.changeset/config.json +12 -0
- package/_templates/unisphere-project/.editorconfig +13 -0
- package/_templates/unisphere-project/.eslintignore +1 -0
- package/_templates/unisphere-project/.eslintrc.json +46 -0
- package/_templates/unisphere-project/.github/workflows/_publish-artifacts.yml +195 -0
- package/_templates/unisphere-project/.github/workflows/cicd.yml +55 -0
- package/_templates/unisphere-project/.nvmrc +1 -0
- package/_templates/unisphere-project/.prettierignore +5 -0
- package/_templates/unisphere-project/.prettierrc +3 -0
- package/_templates/unisphere-project/.unisphere +11 -0
- package/_templates/unisphere-project/README.md +1 -0
- package/_templates/unisphere-project/jest.config.ts +5 -0
- package/_templates/unisphere-project/jest.preset.js +3 -0
- package/_templates/unisphere-project/nx.json +76 -0
- package/_templates/unisphere-project/package-lock.json +26338 -0
- package/_templates/unisphere-project/package.json +107 -0
- package/_templates/unisphere-project/patches/@changesets+cli+2.27.11.patch +58 -0
- package/_templates/unisphere-project/patches/@nx+rollup+19.2.2.patch +29 -0
- package/_templates/unisphere-project/tsconfig.base.json +22 -0
- package/_templates/unisphere-project/unisphere/applications/.gitkeep +0 -0
- package/_templates/unisphere-project/unisphere/packages/.gitkeep +0 -0
- package/_templates/unisphere-project/unisphere/runtimes/.gitkeep +0 -0
- package/_templates/unisphere-project/vitest.workspace.ts +1 -0
- package/package.json +44 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +8 -0
- package/src/index.js.map +1 -0
- package/src/lib/create-unisphere-repo-command.d.ts +2 -0
- package/src/lib/create-unisphere-repo-command.js +242 -0
- package/src/lib/create-unisphere-repo-command.js.map +1 -0
- package/src/lib/overwrite-placeholders.d.ts +4 -0
- package/src/lib/overwrite-placeholders.js +119 -0
- package/src/lib/overwrite-placeholders.js.map +1 -0
- package/src/lib/utils.d.ts +6 -0
- package/src/lib/utils.js +31 -0
- package/src/lib/utils.js.map +1 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.overwritePlaceholders = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs_extra_1 = require("fs-extra");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const debug_1 = require("debug");
|
|
8
|
+
const debug = (0, debug_1.default)('unisphere:utils:overwrite-placeholders');
|
|
9
|
+
// Transformation functions
|
|
10
|
+
const transformations = {
|
|
11
|
+
'lower-dash-case': (str) => str.toLowerCase().replace(/[^a-z0-9]/g, '-'),
|
|
12
|
+
'lower-kebab-case': (str) => str.toLowerCase().replace(/[^a-z0-9]/g, '-'),
|
|
13
|
+
'camelCase': (str) => str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : ''),
|
|
14
|
+
'PascalCase': (str) => {
|
|
15
|
+
const camelCase = str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '');
|
|
16
|
+
return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
|
|
17
|
+
},
|
|
18
|
+
'UPPER_SNAKE_CASE': (str) => str.toUpperCase().replace(/[^A-Z0-9]/g, '_'),
|
|
19
|
+
'lowercase': (str) => str.toLowerCase(),
|
|
20
|
+
'uppercase': (str) => str.toUpperCase(),
|
|
21
|
+
'human-readable': (str) => {
|
|
22
|
+
// Convert camelCase, PascalCase, snake_case, kebab-case to human readable
|
|
23
|
+
return str
|
|
24
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase/PascalCase
|
|
25
|
+
.replace(/[-_]/g, ' ') // kebab-case and snake_case
|
|
26
|
+
.replace(/\s+/g, ' ') // multiple spaces
|
|
27
|
+
.trim()
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.replace(/\b\w/g, l => l.toUpperCase()); // Title case
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
// Apply transformation to a value
|
|
33
|
+
const applyTransformation = (value, transformation) => {
|
|
34
|
+
if (!transformation || !transformations[transformation]) {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
return transformations[transformation](value);
|
|
38
|
+
};
|
|
39
|
+
// Replace placeholders in text
|
|
40
|
+
const replacePlaceholders = (content, replacements) => {
|
|
41
|
+
let result = content;
|
|
42
|
+
// Match patterns like {{variable|transformation}} or {{variable}}
|
|
43
|
+
const placeholderRegex = /\{\{([^}|]+)(\|([^}]+))?\}\}/g;
|
|
44
|
+
result = result.replace(placeholderRegex, (match, variable, _, transformation) => {
|
|
45
|
+
const value = replacements[variable];
|
|
46
|
+
if (value === undefined) {
|
|
47
|
+
debug(`Warning: No replacement found for placeholder: ${match}`);
|
|
48
|
+
return match; // Keep original if no replacement found
|
|
49
|
+
}
|
|
50
|
+
return applyTransformation(value, transformation);
|
|
51
|
+
});
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
// Process a single file
|
|
55
|
+
const processFile = (filePath, replacements) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
+
try {
|
|
57
|
+
const content = yield (0, fs_extra_1.readFile)(filePath, 'utf-8');
|
|
58
|
+
const newContent = replacePlaceholders(content, replacements);
|
|
59
|
+
if (newContent !== content) {
|
|
60
|
+
yield (0, fs_extra_1.writeFile)(filePath, newContent, 'utf-8');
|
|
61
|
+
debug(`Processed placeholders in: ${filePath}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// Skip binary files or files that can't be read as text
|
|
66
|
+
debug(`Skipping file (likely binary): ${filePath}`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// Rename file or directory if it contains placeholders
|
|
70
|
+
const renameIfNeeded = (itemPath, replacements) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
71
|
+
const itemName = (0, path_1.basename)(itemPath);
|
|
72
|
+
const newItemName = replacePlaceholders(itemName, replacements);
|
|
73
|
+
if (newItemName !== itemName) {
|
|
74
|
+
const newItemPath = (0, path_1.join)((0, path_1.dirname)(itemPath), newItemName);
|
|
75
|
+
yield (0, fs_extra_1.rename)(itemPath, newItemPath);
|
|
76
|
+
debug(`Renamed: ${itemName} → ${newItemName}`);
|
|
77
|
+
return newItemPath;
|
|
78
|
+
}
|
|
79
|
+
return itemPath;
|
|
80
|
+
});
|
|
81
|
+
// Recursively process directory
|
|
82
|
+
const processDirectory = (dirPath, replacements) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
83
|
+
const items = yield (0, fs_extra_1.readdir)(dirPath);
|
|
84
|
+
for (const item of items) {
|
|
85
|
+
const itemPath = (0, path_1.join)(dirPath, item);
|
|
86
|
+
const itemStat = yield (0, fs_extra_1.stat)(itemPath);
|
|
87
|
+
if (itemStat.isDirectory()) {
|
|
88
|
+
// Recursively process subdirectories first
|
|
89
|
+
yield processDirectory(itemPath, replacements);
|
|
90
|
+
// Then rename directory if needed
|
|
91
|
+
yield renameIfNeeded(itemPath, replacements);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Process file content
|
|
95
|
+
yield processFile(itemPath, replacements);
|
|
96
|
+
// Rename file if needed
|
|
97
|
+
yield renameIfNeeded(itemPath, replacements);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const overwritePlaceholders = (folderPath_1, _a) => tslib_1.__awaiter(void 0, [folderPath_1, _a], void 0, function* (folderPath, { companyName, experienceName, }) {
|
|
102
|
+
debug(`Processing placeholders in: ${folderPath}`);
|
|
103
|
+
// Create replacement map
|
|
104
|
+
const replacements = {
|
|
105
|
+
'company-name': companyName,
|
|
106
|
+
'project-name': experienceName,
|
|
107
|
+
};
|
|
108
|
+
debug(`Placeholder replacements:`, replacements);
|
|
109
|
+
try {
|
|
110
|
+
yield processDirectory(folderPath, replacements);
|
|
111
|
+
debug(`Successfully processed all placeholders in: ${folderPath}`);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
debug(`Error processing placeholders: ${error.message}`);
|
|
115
|
+
throw new Error(`Failed to process placeholders: ${error.message}`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
exports.overwritePlaceholders = overwritePlaceholders;
|
|
119
|
+
//# sourceMappingURL=overwrite-placeholders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overwrite-placeholders.js","sourceRoot":"","sources":["../../../../../packages/create-unisphere-project/src/lib/overwrite-placeholders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { ListrBaseClassOptions } from 'listr2';
|
|
3
|
+
export declare const printVerboseHook: (thisCommand: Command) => void;
|
|
4
|
+
export declare const getDefaultListrOptions: ({ collapseSubtasks, }?: {
|
|
5
|
+
collapseSubtasks?: boolean;
|
|
6
|
+
}) => ListrBaseClassOptions<any, any, any>;
|
package/src/lib/utils.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultListrOptions = exports.printVerboseHook = void 0;
|
|
4
|
+
const debug_1 = require("debug");
|
|
5
|
+
const debug = (0, debug_1.default)('create-unisphere-project');
|
|
6
|
+
const printVerboseHook = (thisCommand) => {
|
|
7
|
+
const options = thisCommand.opts();
|
|
8
|
+
if (options.verbose) {
|
|
9
|
+
debug.enable('create-unisphere-project*');
|
|
10
|
+
debug('CLI arguments');
|
|
11
|
+
debug(options);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
exports.printVerboseHook = printVerboseHook;
|
|
15
|
+
const getDefaultListrOptions = ({ collapseSubtasks = false, } = {}) => {
|
|
16
|
+
return {
|
|
17
|
+
exitOnError: true,
|
|
18
|
+
concurrent: false,
|
|
19
|
+
rendererOptions: {
|
|
20
|
+
outputBar: Infinity,
|
|
21
|
+
persistentOutput: true,
|
|
22
|
+
showSubtasks: true,
|
|
23
|
+
collapseErrors: false,
|
|
24
|
+
collapseSubtasks,
|
|
25
|
+
showErrorMessage: false,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
// }
|
|
29
|
+
};
|
|
30
|
+
exports.getDefaultListrOptions = getDefaultListrOptions;
|
|
31
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../packages/create-unisphere-project/src/lib/utils.ts"],"names":[],"mappings":";;;AACA,iCAA0B;AAG1B,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,0BAA0B,CAAC,CAAC;AACzC,MAAM,gBAAgB,GAAG,CAAC,WAAoB,EAAQ,EAAE;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC1C,KAAK,CAAC,eAAe,CAAC,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;AACH,CAAC,CAAC;AARW,QAAA,gBAAgB,oBAQ3B;AAEK,MAAM,sBAAsB,GAAG,CAAC,EACrC,gBAAgB,GAAG,KAAK,MAGtB,EAAE,EAAwC,EAAE;IAC9C,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE;YACf,SAAS,EAAE,QAAQ;YACnB,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,IAAI;YAElB,cAAc,EAAE,KAAK;YACrB,gBAAgB;YAChB,gBAAgB,EAAE,KAAK;SACxB;KACF,CAAC;IACF,IAAI;AACN,CAAC,CAAC;AAnBW,QAAA,sBAAsB,0BAmBjC"}
|