cognite-create 0.2.32 → 0.2.34
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/bin/index.js +94 -41
- package/bin/index.test.js +129 -5
- package/package.json +1 -1
- package/templates/vite.config.ts +14 -0
- /package/templates/{app/globals.css → src/index.css} +0 -0
package/bin/index.js
CHANGED
|
@@ -19,6 +19,12 @@ const REQUIRED_DEPENDENCIES = [
|
|
|
19
19
|
{ name: "clsx", version: "^2.1.1" },
|
|
20
20
|
];
|
|
21
21
|
|
|
22
|
+
const REQUIRED_DEV_DEPENDENCIES = [
|
|
23
|
+
{ name: "tailwindcss", version: "^4.0.0" },
|
|
24
|
+
{ name: "@tailwindcss/vite", version: "^4.0.0" },
|
|
25
|
+
{ name: "@types/node", version: "^22.10.2" },
|
|
26
|
+
];
|
|
27
|
+
|
|
22
28
|
function promptForInput(question) {
|
|
23
29
|
const rl = readline.createInterface({
|
|
24
30
|
input: process.stdin,
|
|
@@ -56,6 +62,14 @@ async function main() {
|
|
|
56
62
|
additionalArgs = args.slice(1);
|
|
57
63
|
}
|
|
58
64
|
|
|
65
|
+
// Add default template if not specified
|
|
66
|
+
const hasTemplate = additionalArgs.some(
|
|
67
|
+
(arg) => arg === "--template" || arg === "-t"
|
|
68
|
+
);
|
|
69
|
+
if (!hasTemplate) {
|
|
70
|
+
additionalArgs.push("--template", "react-ts");
|
|
71
|
+
}
|
|
72
|
+
|
|
59
73
|
const createArgs = ["create-vite@latest", projectDir, ...additionalArgs];
|
|
60
74
|
await runCreateVite(createArgs);
|
|
61
75
|
await addCogniteTemplates(projectDir);
|
|
@@ -112,47 +126,39 @@ async function addCogniteTemplates(projectDir) {
|
|
|
112
126
|
|
|
113
127
|
if (pathSegments[0] === "app" || pathSegments[0] === "lib") {
|
|
114
128
|
const target = path.join(srcDirectory, ...pathSegments);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
pathSegments.length === 2 &&
|
|
118
|
-
pathSegments[1] === "globals.css";
|
|
119
|
-
|
|
120
|
-
if (isGlobalsCss) {
|
|
121
|
-
await copyFileWithOverwrite(source, target);
|
|
122
|
-
} else {
|
|
123
|
-
await copyFileIfMissing(source, target);
|
|
124
|
-
}
|
|
125
|
-
|
|
129
|
+
// Overwrite template files in src/app and src/lib
|
|
130
|
+
await copyFileWithOverwrite(source, target);
|
|
126
131
|
continue;
|
|
127
132
|
}
|
|
128
133
|
|
|
134
|
+
// Overwrite root-level configuration files
|
|
129
135
|
const target = path.join(targetRoot, relativePath);
|
|
130
|
-
await
|
|
136
|
+
await copyFileWithOverwrite(source, target);
|
|
131
137
|
}
|
|
132
138
|
|
|
133
139
|
console.log("\nCognite templates copied successfully.");
|
|
134
140
|
}
|
|
135
141
|
|
|
136
|
-
async function
|
|
142
|
+
async function copyFileWithOverwrite(source, target) {
|
|
137
143
|
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
138
144
|
|
|
145
|
+
let fileExists = false;
|
|
139
146
|
try {
|
|
140
147
|
await fs.access(target);
|
|
141
|
-
|
|
148
|
+
fileExists = true;
|
|
142
149
|
} catch (error) {
|
|
143
150
|
if (error.code !== "ENOENT") {
|
|
144
151
|
throw error;
|
|
145
152
|
}
|
|
146
|
-
|
|
147
|
-
await fs.copyFile(source, target);
|
|
148
|
-
console.log(`Added ${path.relative(process.cwd(), target)}`);
|
|
149
153
|
}
|
|
150
|
-
}
|
|
151
154
|
|
|
152
|
-
async function copyFileWithOverwrite(source, target) {
|
|
153
|
-
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
154
155
|
await fs.copyFile(source, target);
|
|
155
|
-
|
|
156
|
+
|
|
157
|
+
if (fileExists) {
|
|
158
|
+
console.log(`Replaced ${path.relative(process.cwd(), target)}`);
|
|
159
|
+
} else {
|
|
160
|
+
console.log(`Added ${path.relative(process.cwd(), target)}`);
|
|
161
|
+
}
|
|
156
162
|
}
|
|
157
163
|
|
|
158
164
|
async function collectTemplateFiles(rootDir) {
|
|
@@ -206,7 +212,7 @@ async function ensureDependenciesInstalled(targetRoot) {
|
|
|
206
212
|
`\nUnable to read or parse ${path.relative(
|
|
207
213
|
process.cwd(),
|
|
208
214
|
packageJsonPath
|
|
209
|
-
)}. Install
|
|
215
|
+
)}. Install dependencies manually.`
|
|
210
216
|
);
|
|
211
217
|
return false;
|
|
212
218
|
}
|
|
@@ -221,25 +227,49 @@ async function ensureDependenciesInstalled(targetRoot) {
|
|
|
221
227
|
)
|
|
222
228
|
);
|
|
223
229
|
|
|
224
|
-
|
|
230
|
+
const missingDevDependencies = REQUIRED_DEV_DEPENDENCIES.filter(
|
|
231
|
+
(dependency) =>
|
|
232
|
+
!(
|
|
233
|
+
(packageJson.dependencies &&
|
|
234
|
+
packageJson.dependencies[dependency.name]) ||
|
|
235
|
+
(packageJson.devDependencies &&
|
|
236
|
+
packageJson.devDependencies[dependency.name])
|
|
237
|
+
)
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
if (missingDependencies.length === 0 && missingDevDependencies.length === 0) {
|
|
225
241
|
return false;
|
|
226
242
|
}
|
|
227
243
|
|
|
228
244
|
const packageManager = await detectPackageManager(packageJson, targetRoot);
|
|
229
245
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
246
|
+
// Install regular dependencies
|
|
247
|
+
if (missingDependencies.length > 0) {
|
|
248
|
+
const dependencySummary = formatDependencySummary(missingDependencies);
|
|
249
|
+
console.log(`\nInstalling ${dependencySummary} using ${packageManager}...`);
|
|
250
|
+
await installDependencies(
|
|
251
|
+
packageManager,
|
|
252
|
+
targetRoot,
|
|
253
|
+
missingDependencies,
|
|
254
|
+
false
|
|
236
255
|
);
|
|
237
|
-
return false;
|
|
238
256
|
}
|
|
239
257
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
258
|
+
// Install dev dependencies
|
|
259
|
+
if (missingDevDependencies.length > 0) {
|
|
260
|
+
const devDependencySummary = formatDependencySummary(
|
|
261
|
+
missingDevDependencies
|
|
262
|
+
);
|
|
263
|
+
console.log(
|
|
264
|
+
`\nInstalling dev dependencies ${devDependencySummary} using ${packageManager}...`
|
|
265
|
+
);
|
|
266
|
+
await installDependencies(
|
|
267
|
+
packageManager,
|
|
268
|
+
targetRoot,
|
|
269
|
+
missingDevDependencies,
|
|
270
|
+
true
|
|
271
|
+
);
|
|
272
|
+
}
|
|
243
273
|
|
|
244
274
|
return true;
|
|
245
275
|
}
|
|
@@ -271,16 +301,26 @@ async function detectPackageManager(packageJson, targetRoot) {
|
|
|
271
301
|
}
|
|
272
302
|
}
|
|
273
303
|
|
|
274
|
-
|
|
304
|
+
// Default to npm if no lock file is found
|
|
305
|
+
return "npm";
|
|
275
306
|
}
|
|
276
307
|
|
|
277
|
-
async function installDependencies(
|
|
308
|
+
async function installDependencies(
|
|
309
|
+
packageManager,
|
|
310
|
+
cwd,
|
|
311
|
+
dependencies,
|
|
312
|
+
isDev = false
|
|
313
|
+
) {
|
|
278
314
|
const dependencySpecs = dependencies.map((dependency) =>
|
|
279
315
|
dependency.version
|
|
280
316
|
? `${dependency.name}@${dependency.version}`
|
|
281
317
|
: dependency.name
|
|
282
318
|
);
|
|
283
|
-
const { command, args } = getInstallCommand(
|
|
319
|
+
const { command, args } = getInstallCommand(
|
|
320
|
+
packageManager,
|
|
321
|
+
dependencySpecs,
|
|
322
|
+
isDev
|
|
323
|
+
);
|
|
284
324
|
|
|
285
325
|
if (!command) {
|
|
286
326
|
throw new Error(`Unsupported package manager: ${packageManager}`);
|
|
@@ -306,18 +346,31 @@ async function installDependencies(packageManager, cwd, dependencies) {
|
|
|
306
346
|
});
|
|
307
347
|
}
|
|
308
348
|
|
|
309
|
-
function getInstallCommand(packageManager, dependencySpecs) {
|
|
349
|
+
function getInstallCommand(packageManager, dependencySpecs, isDev = false) {
|
|
310
350
|
const normalized = normalizeCommand(packageManager);
|
|
351
|
+
const devFlag = isDev ? ["-D"] : [];
|
|
311
352
|
|
|
312
353
|
switch (packageManager) {
|
|
313
354
|
case "npm":
|
|
314
|
-
return {
|
|
355
|
+
return {
|
|
356
|
+
command: normalized,
|
|
357
|
+
args: ["install", ...devFlag, ...dependencySpecs],
|
|
358
|
+
};
|
|
315
359
|
case "pnpm":
|
|
316
|
-
return {
|
|
360
|
+
return {
|
|
361
|
+
command: normalized,
|
|
362
|
+
args: ["add", ...devFlag, ...dependencySpecs],
|
|
363
|
+
};
|
|
317
364
|
case "yarn":
|
|
318
|
-
return {
|
|
365
|
+
return {
|
|
366
|
+
command: normalized,
|
|
367
|
+
args: ["add", ...devFlag, ...dependencySpecs],
|
|
368
|
+
};
|
|
319
369
|
case "bun":
|
|
320
|
-
return {
|
|
370
|
+
return {
|
|
371
|
+
command: normalized,
|
|
372
|
+
args: ["add", ...devFlag, ...dependencySpecs],
|
|
373
|
+
};
|
|
321
374
|
default:
|
|
322
375
|
return { command: null, args: [] };
|
|
323
376
|
}
|
package/bin/index.test.js
CHANGED
|
@@ -39,6 +39,102 @@ describe("CLI Command Tests", () => {
|
|
|
39
39
|
]);
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
+
it("should add default react-ts template when no template is specified", () => {
|
|
43
|
+
const args = ["my-project"];
|
|
44
|
+
let projectDir;
|
|
45
|
+
let additionalArgs = [];
|
|
46
|
+
|
|
47
|
+
if (args.length === 0 || args[0].startsWith("-")) {
|
|
48
|
+
additionalArgs = args;
|
|
49
|
+
} else {
|
|
50
|
+
projectDir = args[0];
|
|
51
|
+
additionalArgs = args.slice(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Add default template if not specified
|
|
55
|
+
const hasTemplate = additionalArgs.some(
|
|
56
|
+
(arg) => arg === "--template" || arg === "-t"
|
|
57
|
+
);
|
|
58
|
+
if (!hasTemplate) {
|
|
59
|
+
additionalArgs.push("--template", "react-ts");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const createArgs = ["create-vite@latest", projectDir, ...additionalArgs];
|
|
63
|
+
|
|
64
|
+
expect(projectDir).toBe("my-project");
|
|
65
|
+
expect(additionalArgs).toEqual(["--template", "react-ts"]);
|
|
66
|
+
expect(createArgs).toEqual([
|
|
67
|
+
"create-vite@latest",
|
|
68
|
+
"my-project",
|
|
69
|
+
"--template",
|
|
70
|
+
"react-ts",
|
|
71
|
+
]);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should not add default template if --template is already specified", () => {
|
|
75
|
+
const args = ["my-project", "--template", "vue"];
|
|
76
|
+
let projectDir;
|
|
77
|
+
let additionalArgs = [];
|
|
78
|
+
|
|
79
|
+
if (args.length === 0 || args[0].startsWith("-")) {
|
|
80
|
+
additionalArgs = args;
|
|
81
|
+
} else {
|
|
82
|
+
projectDir = args[0];
|
|
83
|
+
additionalArgs = args.slice(1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Add default template if not specified
|
|
87
|
+
const hasTemplate = additionalArgs.some(
|
|
88
|
+
(arg) => arg === "--template" || arg === "-t"
|
|
89
|
+
);
|
|
90
|
+
if (!hasTemplate) {
|
|
91
|
+
additionalArgs.push("--template", "react-ts");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const createArgs = ["create-vite@latest", projectDir, ...additionalArgs];
|
|
95
|
+
|
|
96
|
+
expect(projectDir).toBe("my-project");
|
|
97
|
+
expect(additionalArgs).toEqual(["--template", "vue"]);
|
|
98
|
+
expect(createArgs).toEqual([
|
|
99
|
+
"create-vite@latest",
|
|
100
|
+
"my-project",
|
|
101
|
+
"--template",
|
|
102
|
+
"vue",
|
|
103
|
+
]);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("should not add default template if -t is already specified", () => {
|
|
107
|
+
const args = ["my-project", "-t", "vue-ts"];
|
|
108
|
+
let projectDir;
|
|
109
|
+
let additionalArgs = [];
|
|
110
|
+
|
|
111
|
+
if (args.length === 0 || args[0].startsWith("-")) {
|
|
112
|
+
additionalArgs = args;
|
|
113
|
+
} else {
|
|
114
|
+
projectDir = args[0];
|
|
115
|
+
additionalArgs = args.slice(1);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Add default template if not specified
|
|
119
|
+
const hasTemplate = additionalArgs.some(
|
|
120
|
+
(arg) => arg === "--template" || arg === "-t"
|
|
121
|
+
);
|
|
122
|
+
if (!hasTemplate) {
|
|
123
|
+
additionalArgs.push("--template", "react-ts");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const createArgs = ["create-vite@latest", projectDir, ...additionalArgs];
|
|
127
|
+
|
|
128
|
+
expect(projectDir).toBe("my-project");
|
|
129
|
+
expect(additionalArgs).toEqual(["-t", "vue-ts"]);
|
|
130
|
+
expect(createArgs).toEqual([
|
|
131
|
+
"create-vite@latest",
|
|
132
|
+
"my-project",
|
|
133
|
+
"-t",
|
|
134
|
+
"vue-ts",
|
|
135
|
+
]);
|
|
136
|
+
});
|
|
137
|
+
|
|
42
138
|
it("should handle flags-only arguments (requires prompt)", () => {
|
|
43
139
|
const args = ["--template", "react-ts"];
|
|
44
140
|
let projectDir;
|
|
@@ -131,10 +227,17 @@ describe("CLI Command Tests", () => {
|
|
|
131
227
|
expect(name).toBe(expected);
|
|
132
228
|
});
|
|
133
229
|
});
|
|
230
|
+
|
|
231
|
+
it("should default to npm when no package manager is detected", () => {
|
|
232
|
+
// When no packageManager field exists and no lock files are found
|
|
233
|
+
// the function should default to 'npm' instead of returning null
|
|
234
|
+
const defaultPackageManager = "npm";
|
|
235
|
+
expect(defaultPackageManager).toBe("npm");
|
|
236
|
+
});
|
|
134
237
|
});
|
|
135
238
|
|
|
136
239
|
describe("Install Command Generation", () => {
|
|
137
|
-
function getInstallCommand(packageManager, dependencySpecs) {
|
|
240
|
+
function getInstallCommand(packageManager, dependencySpecs, isDev = false) {
|
|
138
241
|
const normalizeCommand = (cmd) => {
|
|
139
242
|
if (process.platform === "win32" && cmd !== "bun") {
|
|
140
243
|
return `${cmd}.cmd`;
|
|
@@ -143,16 +246,17 @@ describe("CLI Command Tests", () => {
|
|
|
143
246
|
};
|
|
144
247
|
|
|
145
248
|
const normalized = normalizeCommand(packageManager);
|
|
249
|
+
const devFlag = isDev ? ["-D"] : [];
|
|
146
250
|
|
|
147
251
|
switch (packageManager) {
|
|
148
252
|
case "npm":
|
|
149
|
-
return { command: normalized, args: ["install", ...dependencySpecs] };
|
|
253
|
+
return { command: normalized, args: ["install", ...devFlag, ...dependencySpecs] };
|
|
150
254
|
case "pnpm":
|
|
151
|
-
return { command: normalized, args: ["add", ...dependencySpecs] };
|
|
255
|
+
return { command: normalized, args: ["add", ...devFlag, ...dependencySpecs] };
|
|
152
256
|
case "yarn":
|
|
153
|
-
return { command: normalized, args: ["add", ...dependencySpecs] };
|
|
257
|
+
return { command: normalized, args: ["add", ...devFlag, ...dependencySpecs] };
|
|
154
258
|
case "bun":
|
|
155
|
-
return { command: normalized, args: ["add", ...dependencySpecs] };
|
|
259
|
+
return { command: normalized, args: ["add", ...devFlag, ...dependencySpecs] };
|
|
156
260
|
default:
|
|
157
261
|
return { command: null, args: [] };
|
|
158
262
|
}
|
|
@@ -163,21 +267,41 @@ describe("CLI Command Tests", () => {
|
|
|
163
267
|
expect(result.args).toEqual(["install", "package-a@1.0.0", "package-b"]);
|
|
164
268
|
});
|
|
165
269
|
|
|
270
|
+
it("should generate correct npm install command for dev dependencies", () => {
|
|
271
|
+
const result = getInstallCommand("npm", ["package-a@1.0.0", "package-b"], true);
|
|
272
|
+
expect(result.args).toEqual(["install", "-D", "package-a@1.0.0", "package-b"]);
|
|
273
|
+
});
|
|
274
|
+
|
|
166
275
|
it("should generate correct pnpm add command", () => {
|
|
167
276
|
const result = getInstallCommand("pnpm", ["package-a@1.0.0"]);
|
|
168
277
|
expect(result.args).toEqual(["add", "package-a@1.0.0"]);
|
|
169
278
|
});
|
|
170
279
|
|
|
280
|
+
it("should generate correct pnpm add command for dev dependencies", () => {
|
|
281
|
+
const result = getInstallCommand("pnpm", ["package-a@1.0.0"], true);
|
|
282
|
+
expect(result.args).toEqual(["add", "-D", "package-a@1.0.0"]);
|
|
283
|
+
});
|
|
284
|
+
|
|
171
285
|
it("should generate correct yarn add command", () => {
|
|
172
286
|
const result = getInstallCommand("yarn", ["package-a"]);
|
|
173
287
|
expect(result.args).toEqual(["add", "package-a"]);
|
|
174
288
|
});
|
|
175
289
|
|
|
290
|
+
it("should generate correct yarn add command for dev dependencies", () => {
|
|
291
|
+
const result = getInstallCommand("yarn", ["package-a"], true);
|
|
292
|
+
expect(result.args).toEqual(["add", "-D", "package-a"]);
|
|
293
|
+
});
|
|
294
|
+
|
|
176
295
|
it("should generate correct bun add command", () => {
|
|
177
296
|
const result = getInstallCommand("bun", ["package-a"]);
|
|
178
297
|
expect(result.args).toEqual(["add", "package-a"]);
|
|
179
298
|
});
|
|
180
299
|
|
|
300
|
+
it("should generate correct bun add command for dev dependencies", () => {
|
|
301
|
+
const result = getInstallCommand("bun", ["package-a"], true);
|
|
302
|
+
expect(result.args).toEqual(["add", "-D", "package-a"]);
|
|
303
|
+
});
|
|
304
|
+
|
|
181
305
|
it("should return null command for unsupported package manager", () => {
|
|
182
306
|
const result = getInstallCommand("unknown", ["package-a"]);
|
|
183
307
|
expect(result.command).toBeNull();
|
package/package.json
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from "path"
|
|
2
|
+
import tailwindcss from "@tailwindcss/vite"
|
|
3
|
+
import react from "@vitejs/plugin-react"
|
|
4
|
+
import { defineConfig } from "vite"
|
|
5
|
+
|
|
6
|
+
// https://vite.dev/config/
|
|
7
|
+
export default defineConfig({
|
|
8
|
+
plugins: [react(), tailwindcss()],
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: {
|
|
11
|
+
"@": path.resolve(__dirname, "./src"),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
})
|
|
File without changes
|