cognite-create 0.2.32 → 0.2.33

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 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);
@@ -206,7 +220,7 @@ async function ensureDependenciesInstalled(targetRoot) {
206
220
  `\nUnable to read or parse ${path.relative(
207
221
  process.cwd(),
208
222
  packageJsonPath
209
- )}. Install ${formatDependencySummary(REQUIRED_DEPENDENCIES)} manually.`
223
+ )}. Install dependencies manually.`
210
224
  );
211
225
  return false;
212
226
  }
@@ -221,25 +235,49 @@ async function ensureDependenciesInstalled(targetRoot) {
221
235
  )
222
236
  );
223
237
 
224
- if (missingDependencies.length === 0) {
238
+ const missingDevDependencies = REQUIRED_DEV_DEPENDENCIES.filter(
239
+ (dependency) =>
240
+ !(
241
+ (packageJson.dependencies &&
242
+ packageJson.dependencies[dependency.name]) ||
243
+ (packageJson.devDependencies &&
244
+ packageJson.devDependencies[dependency.name])
245
+ )
246
+ );
247
+
248
+ if (missingDependencies.length === 0 && missingDevDependencies.length === 0) {
225
249
  return false;
226
250
  }
227
251
 
228
252
  const packageManager = await detectPackageManager(packageJson, targetRoot);
229
253
 
230
- if (!packageManager) {
231
- console.warn(
232
- `\nCould not determine package manager for ${path.relative(
233
- process.cwd(),
234
- targetRoot
235
- )}. Install ${formatDependencySummary(missingDependencies)} manually.`
254
+ // Install regular dependencies
255
+ if (missingDependencies.length > 0) {
256
+ const dependencySummary = formatDependencySummary(missingDependencies);
257
+ console.log(`\nInstalling ${dependencySummary} using ${packageManager}...`);
258
+ await installDependencies(
259
+ packageManager,
260
+ targetRoot,
261
+ missingDependencies,
262
+ false
236
263
  );
237
- return false;
238
264
  }
239
265
 
240
- const dependencySummary = formatDependencySummary(missingDependencies);
241
- console.log(`\nInstalling ${dependencySummary} using ${packageManager}...`);
242
- await installDependencies(packageManager, targetRoot, missingDependencies);
266
+ // Install dev dependencies
267
+ if (missingDevDependencies.length > 0) {
268
+ const devDependencySummary = formatDependencySummary(
269
+ missingDevDependencies
270
+ );
271
+ console.log(
272
+ `\nInstalling dev dependencies ${devDependencySummary} using ${packageManager}...`
273
+ );
274
+ await installDependencies(
275
+ packageManager,
276
+ targetRoot,
277
+ missingDevDependencies,
278
+ true
279
+ );
280
+ }
243
281
 
244
282
  return true;
245
283
  }
@@ -271,16 +309,26 @@ async function detectPackageManager(packageJson, targetRoot) {
271
309
  }
272
310
  }
273
311
 
274
- return null;
312
+ // Default to npm if no lock file is found
313
+ return "npm";
275
314
  }
276
315
 
277
- async function installDependencies(packageManager, cwd, dependencies) {
316
+ async function installDependencies(
317
+ packageManager,
318
+ cwd,
319
+ dependencies,
320
+ isDev = false
321
+ ) {
278
322
  const dependencySpecs = dependencies.map((dependency) =>
279
323
  dependency.version
280
324
  ? `${dependency.name}@${dependency.version}`
281
325
  : dependency.name
282
326
  );
283
- const { command, args } = getInstallCommand(packageManager, dependencySpecs);
327
+ const { command, args } = getInstallCommand(
328
+ packageManager,
329
+ dependencySpecs,
330
+ isDev
331
+ );
284
332
 
285
333
  if (!command) {
286
334
  throw new Error(`Unsupported package manager: ${packageManager}`);
@@ -306,18 +354,31 @@ async function installDependencies(packageManager, cwd, dependencies) {
306
354
  });
307
355
  }
308
356
 
309
- function getInstallCommand(packageManager, dependencySpecs) {
357
+ function getInstallCommand(packageManager, dependencySpecs, isDev = false) {
310
358
  const normalized = normalizeCommand(packageManager);
359
+ const devFlag = isDev ? ["-D"] : [];
311
360
 
312
361
  switch (packageManager) {
313
362
  case "npm":
314
- return { command: normalized, args: ["install", ...dependencySpecs] };
363
+ return {
364
+ command: normalized,
365
+ args: ["install", ...devFlag, ...dependencySpecs],
366
+ };
315
367
  case "pnpm":
316
- return { command: normalized, args: ["add", ...dependencySpecs] };
368
+ return {
369
+ command: normalized,
370
+ args: ["add", ...devFlag, ...dependencySpecs],
371
+ };
317
372
  case "yarn":
318
- return { command: normalized, args: ["add", ...dependencySpecs] };
373
+ return {
374
+ command: normalized,
375
+ args: ["add", ...devFlag, ...dependencySpecs],
376
+ };
319
377
  case "bun":
320
- return { command: normalized, args: ["add", ...dependencySpecs] };
378
+ return {
379
+ command: normalized,
380
+ args: ["add", ...devFlag, ...dependencySpecs],
381
+ };
321
382
  default:
322
383
  return { command: null, args: [] };
323
384
  }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cognite-create",
3
- "version": "0.2.32",
3
+ "version": "0.2.33",
4
4
  "description": "Create a Next.js app preconfigured with Cognite defaults.",
5
5
  "bin": {
6
6
  "cognite-create": "./bin/index.js"
@@ -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