create-z3 0.0.6 → 0.0.8

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 (2) hide show
  1. package/dist/index.js +62 -59
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1786,24 +1786,32 @@ async function replacePlaceholder(filePath, placeholder, content, options) {
1786
1786
  function generateAuthProvidersBlock(oauthProviders, emailPasswordEnabled) {
1787
1787
  const parts = [];
1788
1788
  if (emailPasswordEnabled) {
1789
- parts.push("emailAndPassword({ enabled: true }),");
1789
+ parts.push(`emailAndPassword: {
1790
+ enabled: true
1791
+ },`);
1790
1792
  }
1791
1793
  if (oauthProviders.length > 0) {
1792
- const oauthConfigs = oauthProviders.map((providerId) => {
1794
+ const providersObject = oauthProviders.map((providerId) => {
1793
1795
  const provider = getProvider(providerId);
1794
1796
  if (!provider) {
1795
1797
  throw new Error(`Unknown OAuth provider: ${providerId}`);
1796
1798
  }
1797
- if (!provider.betterAuthConfig?.socialProvider) {
1798
- throw new Error(
1799
- `Provider ${providerId} missing betterAuthConfig.socialProvider`
1800
- );
1799
+ const configLines = [
1800
+ `clientId: process.env.${provider.envPrefix}_CLIENT_ID as string,`,
1801
+ `clientSecret: process.env.${provider.envPrefix}_CLIENT_SECRET as string,`
1802
+ ];
1803
+ if (providerId === "figma") {
1804
+ configLines.push(`clientKey: process.env.FIGMA_CLIENT_KEY as string,`);
1801
1805
  }
1802
- return provider.betterAuthConfig.socialProvider;
1803
- }).join(",\n");
1804
- parts.push(oauthConfigs);
1806
+ return `${providerId}: {
1807
+ ${configLines.join("\n ")}
1808
+ }`;
1809
+ }).join(",\n ");
1810
+ parts.push(`socialProviders: {
1811
+ ${providersObject}
1812
+ },`);
1805
1813
  }
1806
- return parts.join("\n");
1814
+ return parts.join("\n ");
1807
1815
  }
1808
1816
  function generateOAuthUIProvidersBlock(providers) {
1809
1817
  if (providers.length === 0) {
@@ -1936,6 +1944,23 @@ var FrameworkInstaller = class {
1936
1944
  );
1937
1945
  }
1938
1946
  }
1947
+ /**
1948
+ * Format generated files using the project's format command
1949
+ * Runs after all file modifications to ensure consistent code style
1950
+ */
1951
+ async formatCode() {
1952
+ const packageManager = this.detectPackageManager();
1953
+ const spinner = ora("Formatting generated files...").start();
1954
+ try {
1955
+ await execa(packageManager, ["run", "format"], {
1956
+ cwd: this.targetPath,
1957
+ stdio: "pipe"
1958
+ });
1959
+ spinner.succeed("Code formatted successfully");
1960
+ } catch (error) {
1961
+ spinner.warn("Failed to format code (you may need to run `npm run format` manually)");
1962
+ }
1963
+ }
1939
1964
  /**
1940
1965
  * Initialize Git repository in target directory
1941
1966
  * Creates initial commit with all files
@@ -2113,6 +2138,7 @@ Please check the URL and your internet connection, then try again.`
2113
2138
  }
2114
2139
  if (options.installDependencies) {
2115
2140
  await this.installDependencies();
2141
+ await this.formatCode();
2116
2142
  }
2117
2143
  }
2118
2144
  };
@@ -2233,57 +2259,34 @@ var program = new Command();
2233
2259
  async function promptOAuthProviders() {
2234
2260
  const popularProviders = getPopularProviders();
2235
2261
  const additionalProviders = getAdditionalProviders();
2236
- const initialChoices = [
2262
+ const allOAuthProviders = [...popularProviders, ...additionalProviders].sort(
2263
+ (a, b) => a.name.localeCompare(b.name)
2264
+ );
2265
+ const choices = [
2237
2266
  {
2238
2267
  name: "Email & Password",
2239
2268
  value: "__email_password__",
2240
2269
  checked: true
2241
2270
  // Default enabled
2242
2271
  },
2243
- new Separator("Popular OAuth Providers:"),
2244
- ...popularProviders.map((provider) => ({
2272
+ new Separator("OAuth Providers (A-Z):"),
2273
+ ...allOAuthProviders.map((provider) => ({
2245
2274
  name: provider.name,
2246
- value: provider.id
2247
- })),
2248
- new Separator(),
2249
- {
2250
- name: `> Show more providers (${additionalProviders.length} additional)`,
2251
- value: "__show_more__"
2252
- }
2275
+ value: provider.id,
2276
+ checked: false
2277
+ }))
2253
2278
  ];
2254
- let selectedProviders = await checkbox({
2255
- message: "Select authentication providers:",
2256
- choices: initialChoices
2279
+ const selectedProviders = await checkbox({
2280
+ message: "Select authentication providers (space to select, enter to confirm):",
2281
+ choices,
2282
+ pageSize: 15,
2283
+ // Show more items at once
2284
+ loop: false
2285
+ // Don't wrap around
2257
2286
  });
2258
- if (selectedProviders.includes("__show_more__")) {
2259
- const alreadySelected = selectedProviders.filter((id) => id !== "__show_more__");
2260
- const expandedChoices = [
2261
- {
2262
- name: "Email & Password",
2263
- value: "__email_password__",
2264
- checked: alreadySelected.includes("__email_password__")
2265
- },
2266
- new Separator("Popular OAuth Providers:"),
2267
- ...popularProviders.map((provider) => ({
2268
- name: provider.name,
2269
- value: provider.id,
2270
- checked: alreadySelected.includes(provider.id)
2271
- })),
2272
- new Separator("Additional OAuth Providers:"),
2273
- ...additionalProviders.map((provider) => ({
2274
- name: provider.name,
2275
- value: provider.id,
2276
- checked: alreadySelected.includes(provider.id)
2277
- }))
2278
- ];
2279
- selectedProviders = await checkbox({
2280
- message: "Select authentication providers:",
2281
- choices: expandedChoices
2282
- });
2283
- }
2284
2287
  const emailPassword = selectedProviders.includes("__email_password__");
2285
2288
  const oauthProviders = selectedProviders.filter(
2286
- (id) => id !== "__email_password__" && id !== "__show_more__"
2289
+ (id) => id !== "__email_password__"
2287
2290
  );
2288
2291
  if (oauthProviders.length > 0) {
2289
2292
  const providersNeedingExtraConfig = getProvidersRequiringExtraConfig(oauthProviders);
@@ -2349,15 +2352,6 @@ program.name("create-z3").version(packageJson.version).description("CLI for scaf
2349
2352
  displayDirectoryExistsError(projectName);
2350
2353
  }
2351
2354
  }
2352
- let createdPath;
2353
- try {
2354
- createdPath = await createProjectDirectory(projectName, cwd);
2355
- } catch (error) {
2356
- if (error instanceof Error && "code" in error && error.code === "EACCES") {
2357
- displayPermissionError(targetDir);
2358
- }
2359
- throw error;
2360
- }
2361
2355
  const framework = await select({
2362
2356
  message: "Which framework would you like to use?",
2363
2357
  choices: [
@@ -2402,6 +2396,15 @@ program.name("create-z3").version(packageJson.version).description("CLI for scaf
2402
2396
  initGit,
2403
2397
  installDependencies
2404
2398
  };
2399
+ let createdPath;
2400
+ try {
2401
+ createdPath = await createProjectDirectory(projectName, cwd);
2402
+ } catch (error) {
2403
+ if (error instanceof Error && "code" in error && error.code === "EACCES") {
2404
+ displayPermissionError(targetDir);
2405
+ }
2406
+ throw error;
2407
+ }
2405
2408
  let installer;
2406
2409
  if (framework === "tanstack") {
2407
2410
  installer = new TanStackInstaller(createdPath, projectName);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-z3",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "type": "module",
5
5
  "description": "CLI for scaffolding Z3 Stack applications (TanStack/Next.js + Convex + Better Auth)",
6
6
  "bin": {