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 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
- const isGlobalsCss =
116
- pathSegments[0] === "app" &&
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 copyFileIfMissing(source, target);
136
+ await copyFileWithOverwrite(source, target);
131
137
  }
132
138
 
133
139
  console.log("\nCognite templates copied successfully.");
134
140
  }
135
141
 
136
- async function copyFileIfMissing(source, target) {
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
- console.warn(`Skipped existing ${path.relative(process.cwd(), target)}`);
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
- console.log(`Replaced ${path.relative(process.cwd(), target)}`);
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 ${formatDependencySummary(REQUIRED_DEPENDENCIES)} manually.`
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
- if (missingDependencies.length === 0) {
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
- if (!packageManager) {
231
- console.warn(
232
- `\nCould not determine package manager for ${path.relative(
233
- process.cwd(),
234
- targetRoot
235
- )}. Install ${formatDependencySummary(missingDependencies)} manually.`
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
- const dependencySummary = formatDependencySummary(missingDependencies);
241
- console.log(`\nInstalling ${dependencySummary} using ${packageManager}...`);
242
- await installDependencies(packageManager, targetRoot, missingDependencies);
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
- return null;
304
+ // Default to npm if no lock file is found
305
+ return "npm";
275
306
  }
276
307
 
277
- async function installDependencies(packageManager, cwd, dependencies) {
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(packageManager, dependencySpecs);
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 { command: normalized, args: ["install", ...dependencySpecs] };
355
+ return {
356
+ command: normalized,
357
+ args: ["install", ...devFlag, ...dependencySpecs],
358
+ };
315
359
  case "pnpm":
316
- return { command: normalized, args: ["add", ...dependencySpecs] };
360
+ return {
361
+ command: normalized,
362
+ args: ["add", ...devFlag, ...dependencySpecs],
363
+ };
317
364
  case "yarn":
318
- return { command: normalized, args: ["add", ...dependencySpecs] };
365
+ return {
366
+ command: normalized,
367
+ args: ["add", ...devFlag, ...dependencySpecs],
368
+ };
319
369
  case "bun":
320
- return { command: normalized, args: ["add", ...dependencySpecs] };
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cognite-create",
3
- "version": "0.2.32",
3
+ "version": "0.2.34",
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