Эх сурвалжийг харах

Fix Prettier inconsistencies between generated scripts and JS client

Loris Leiva 1 жил өмнө
parent
commit
a270f1f286

+ 11 - 11
scripts/build.mjs

@@ -1,27 +1,27 @@
 #!/usr/bin/env zx
-import * as esbuild from "esbuild";
+import * as esbuild from 'esbuild';
 
 await esbuild.build({
   bundle: true,
-  entryPoints: ["index.ts"],
-  external: ["locales/*"],
-  outfile: "outfile.cjs",
-  format: "cjs",
-  platform: "node",
-  target: "node14",
+  entryPoints: ['index.ts'],
+  external: ['locales/*'],
+  outfile: 'outfile.cjs',
+  format: 'cjs',
+  platform: 'node',
+  target: 'node14',
 
   plugins: [
     {
-      name: "alias",
+      name: 'alias',
       setup({ onResolve, resolve }) {
         onResolve(
-          { filter: /^prompts$/, namespace: "file" },
+          { filter: /^prompts$/, namespace: 'file' },
           async ({ importer, resolveDir }) => {
             // we can always use non-transpiled code since we support 14.16.0+
-            const result = await resolve("prompts/lib/index.js", {
+            const result = await resolve('prompts/lib/index.js', {
               importer,
               resolveDir,
-              kind: "import-statement",
+              kind: 'import-statement',
             });
             return result;
           }

+ 6 - 6
scripts/prepublish.mjs

@@ -1,14 +1,14 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { PROJECTS } from "./utils.mjs";
+import 'zx/globals';
+import { PROJECTS } from './utils.mjs';
 
 await $`pnpm snapshot`;
 
-const { version } = await fs.readJSON("./package.json");
+const { version } = await fs.readJSON('./package.json');
 const projects = Object.keys(PROJECTS);
 
-const rootDirectory = path.resolve(__dirname, "..");
-const projectsDirectory = path.resolve(rootDirectory, "projects");
+const rootDirectory = path.resolve(__dirname, '..');
+const projectsDirectory = path.resolve(rootDirectory, 'projects');
 
 for (const projectName of projects) {
   const projectDirectory = path.resolve(projectsDirectory, projectName);
@@ -19,7 +19,7 @@ for (const projectName of projects) {
   try {
     await $`git commit -m "version ${version} snapshot"`;
   } catch (e) {
-    if (!e.stdout.includes("nothing to commit")) {
+    if (!e.stdout.includes('nothing to commit')) {
       throw e;
     }
   }

+ 19 - 19
scripts/snapshot.mjs

@@ -1,6 +1,6 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { CLIENTS, PROJECTS, executeStep } from "./utils.mjs";
+import 'zx/globals';
+import { CLIENTS, PROJECTS, executeStep } from './utils.mjs';
 
 $.verbose = false;
 
@@ -13,11 +13,11 @@ const projects =
       )
     : Object.keys(PROJECTS);
 const runTests = !!argv.test;
-const scaffoldOnly = !!argv["scaffold-only"];
+const scaffoldOnly = !!argv['scaffold-only'];
 
 // Resolve paths.
-const bin = path.resolve(__dirname, "../outfile.cjs");
-const projectsDirectory = path.resolve(__dirname, "../projects/");
+const bin = path.resolve(__dirname, '../outfile.cjs');
+const projectsDirectory = path.resolve(__dirname, '../projects/');
 
 if (!fs.existsSync(projectsDirectory)) {
   fs.mkdirSync(projectsDirectory);
@@ -33,8 +33,8 @@ for (const projectName of projects) {
   // Scaffold the project.
   const args = [projectName, ...PROJECTS[projectName]];
   await executeStep(
-    "scaffold the project",
-    () => $`node ${[bin, ...args, "--force", "--default"]}`
+    'scaffold the project',
+    () => $`node ${[bin, ...args, '--force', '--default']}`
   );
 
   if (scaffoldOnly) continue;
@@ -42,30 +42,30 @@ for (const projectName of projects) {
   // Go inside the created project.
   const projectDirectory = path.resolve(projectsDirectory, projectName);
   cd(projectDirectory);
-  const pkg = await fs.readJSON(path.resolve(projectDirectory, "package.json"));
+  const pkg = await fs.readJSON(path.resolve(projectDirectory, 'package.json'));
 
   // Install project's dependencies.
-  await executeStep("install NPM dependencies", async () => {
+  await executeStep('install NPM dependencies', async () => {
     await $`pnpm install`;
   });
 
   // Generate IDLs.
-  if ("generate:idls" in pkg.scripts) {
-    await executeStep("generate IDLs", async () => {
+  if ('generate:idls' in pkg.scripts) {
+    await executeStep('generate IDLs', async () => {
       await $`pnpm generate:idls`;
     });
   }
 
   // Generate clients.
-  if ("generate:clients" in pkg.scripts) {
-    await executeStep("generate clients", async () => {
+  if ('generate:clients' in pkg.scripts) {
+    await executeStep('generate clients', async () => {
       await $`pnpm generate:clients`;
     });
   }
 
   // Build programs.
-  if ("programs:build" in pkg.scripts) {
-    await executeStep("build programs", async () => {
+  if ('programs:build' in pkg.scripts) {
+    await executeStep('build programs', async () => {
       await $`pnpm programs:build`;
     });
   }
@@ -73,8 +73,8 @@ for (const projectName of projects) {
   if (!runTests) continue;
 
   // Test programs.
-  if ("programs:test" in pkg.scripts) {
-    await executeStep("test programs", async () => {
+  if ('programs:test' in pkg.scripts) {
+    await executeStep('test programs', async () => {
       await $`pnpm programs:test`;
     });
   }
@@ -92,7 +92,7 @@ for (const projectName of projects) {
   }
 
   // Add line break between projects.
-  echo("");
+  echo('');
 }
 
-echo(chalk.green("All projects were created successfully!"));
+echo(chalk.green('All projects were created successfully!'));

+ 7 - 7
scripts/utils.mjs

@@ -1,22 +1,22 @@
-export const COUNTER_ADDRESS = "CounterProgram111111111111111111111111111111";
-export const CLIENTS = ["js", "rust"];
+export const COUNTER_ADDRESS = 'CounterProgram111111111111111111111111111111';
+export const CLIENTS = ['js', 'rust'];
 export const PROJECTS = {
-  "counter-anchor": ["counter", "--anchor", "--address", COUNTER_ADDRESS],
-  "counter-shank": ["counter", "--shank", "--address", COUNTER_ADDRESS],
+  'counter-anchor': ['counter', '--anchor', '--address', COUNTER_ADDRESS],
+  'counter-shank': ['counter', '--shank', '--address', COUNTER_ADDRESS],
 };
 
 export async function executeStep(title, fn) {
   try {
     const capitalizedTitle = title.charAt(0).toUpperCase() + title.slice(1);
     if (process.env.CI) {
-      echo(chalk.blue("⠋") + ` ${capitalizedTitle}...`);
+      echo(chalk.blue('⠋') + ` ${capitalizedTitle}...`);
       await fn();
     } else {
       await spinner(`${capitalizedTitle}...`, fn);
     }
-    echo(chalk.green("✔︎") + ` ${capitalizedTitle}.`);
+    echo(chalk.green('✔︎') + ` ${capitalizedTitle}.`);
   } catch (e) {
-    echo(chalk.red("✘") + ` Failed to ${title}.\n`);
+    echo(chalk.red('✘') + ` Failed to ${title}.\n`);
     echo(e);
     process.exit(1);
   }

+ 9 - 0
template/base/.prettierrc

@@ -0,0 +1,9 @@
+{
+  "semi": true,
+  "singleQuote": true,
+  "trailingComma": "es5",
+  "useTabs": false,
+  "tabWidth": 2,
+  "arrowParens": "always",
+  "printWidth": 80
+}

+ 10 - 10
template/base/scripts/generate-idls.mjs

@@ -1,21 +1,21 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { generateIdl } from "@metaplex-foundation/shank-js";
-import { getCargo, getProgramFolders } from "./utils.mjs";
+import 'zx/globals';
+import { generateIdl } from '@metaplex-foundation/shank-js';
+import { getCargo, getProgramFolders } from './utils.mjs';
 
-const binaryInstallDir = path.join(__dirname, "..", ".cargo");
+const binaryInstallDir = path.join(__dirname, '..', '.cargo');
 
 getProgramFolders().forEach((folder) => {
   const cargo = getCargo(folder);
-  const isShank = Object.keys(cargo.dependencies).includes("shank");
-  const programDir = path.join(__dirname, "..", folder);
+  const isShank = Object.keys(cargo.dependencies).includes('shank');
+  const programDir = path.join(__dirname, '..', folder);
 
   generateIdl({
-    generator: isShank ? "shank" : "anchor",
-    programName: cargo.package.name.replace(/-/g, "_"),
-    programId: cargo.package.metadata.solana["program-id"],
+    generator: isShank ? 'shank' : 'anchor',
+    programName: cargo.package.name.replace(/-/g, '_'),
+    programId: cargo.package.metadata.solana['program-id'],
     idlDir: programDir,
-    idlName: "idl",
+    idlName: 'idl',
     programDir,
     binaryInstallDir,
   });

+ 3 - 3
template/base/scripts/program/build.mjs

@@ -1,9 +1,9 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { workingDirectory, getProgramFolders } from "../utils.mjs";
+import 'zx/globals';
+import { workingDirectory, getProgramFolders } from '../utils.mjs';
 
 // Save external programs binaries to the output directory.
-import "./dump.mjs";
+import './dump.mjs';
 
 // Build the programs.
 for (const folder of getProgramFolders()) {

+ 2 - 2
template/base/scripts/program/clean.mjs

@@ -1,6 +1,6 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { getExternalProgramOutputDir } from "../utils.mjs";
+import 'zx/globals';
+import { getExternalProgramOutputDir } from '../utils.mjs';
 
 // Remove the programs output directories.
 const externalProgramOutput = getExternalProgramOutputDir();

+ 18 - 18
template/base/scripts/program/dump.mjs

@@ -1,13 +1,13 @@
 #!/usr/bin/env zx
-import "zx/globals";
+import 'zx/globals';
 import {
   getExternalAccountAddresses,
   getExternalProgramAddresses,
   getExternalProgramOutputDir,
-} from "../utils.mjs";
+} from '../utils.mjs';
 
 // Get input from environment variables.
-const rpc = process.env.RPC ?? "https://api.mainnet-beta.solana.com";
+const rpc = process.env.RPC ?? 'https://api.mainnet-beta.solana.com';
 const outputDir = getExternalProgramOutputDir();
 await dump();
 
@@ -17,8 +17,8 @@ async function dump() {
   const programs = getExternalProgramAddresses();
   const accounts = getExternalAccountAddresses();
   const external = [
-    ...programs.map((program) => [program, "so"]),
-    ...accounts.map((account) => [account, "json"]),
+    ...programs.map((program) => [program, 'so']),
+    ...accounts.map((account) => [account, 'json']),
   ];
 
   if (external.length === 0) return;
@@ -39,23 +39,23 @@ async function dump() {
         return;
       }
 
-      let sha = "sha256sum";
+      let sha = 'sha256sum';
       let options = [];
-      let hasShaChecksum = await which("sha256sum", { nothrow: true });
+      let hasShaChecksum = await which('sha256sum', { nothrow: true });
 
       // We might not have sha256sum on some systems, so we try shasum as well.
       if (!hasShaChecksum) {
-        hasShaChecksum = await which("shasum", { nothrow: true });
+        hasShaChecksum = await which('shasum', { nothrow: true });
 
         if (hasShaChecksum) {
-          sha = "shasum";
-          options = ["-a", "256"];
+          sha = 'shasum';
+          options = ['-a', '256'];
         }
       }
 
       if (hasShaChecksum) {
         try {
-          await copyFromChain(address, extension, "onchain-");
+          await copyFromChain(address, extension, 'onchain-');
           const [onChainHash, localHash] = await Promise.all([
             $`${sha} ${options} -b ${outputDir}/onchain-${binary} | cut -d ' ' -f 1`.quiet(),
             $`${sha} ${options} -b ${outputDir}/${binary} | cut -d ' ' -f 1`.quiet(),
@@ -63,12 +63,12 @@ async function dump() {
 
           if (onChainHash.toString() !== localHash.toString()) {
             echo(
-              chalk.yellow("[ WARNING ]"),
+              chalk.yellow('[ WARNING ]'),
               `on-chain and local binaries are different for '${address}'`
             );
           } else {
             echo(
-              chalk.green("[ SKIPPED ]"),
+              chalk.green('[ SKIPPED ]'),
               `on-chain and local binaries are the same for '${address}'`
             );
           }
@@ -76,13 +76,13 @@ async function dump() {
           await $`rm ${outputDir}/onchain-${binary}`.quiet();
         } catch (error) {
           echo(
-            chalk.yellow("[ WARNING ]"),
+            chalk.yellow('[ WARNING ]'),
             `skipped check for '${address}' (error copying data from '${rpc}')`
           );
         }
       } else {
         echo(
-          chalk.yellow("[ WARNING ]"),
+          chalk.yellow('[ WARNING ]'),
           `skipped check for '${address}' (missing 'sha256sum' command)`
         );
       }
@@ -91,12 +91,12 @@ async function dump() {
 }
 
 /** Helper function to copy external programs or accounts binaries from the chain. */
-async function copyFromChain(address, extension, prefix = "") {
+async function copyFromChain(address, extension, prefix = '') {
   const binary = `${prefix}${address}.${extension}`;
   switch (extension) {
-    case "json":
+    case 'json':
       return $`solana account -u ${rpc} ${address} -o ${outputDir}/${binary} --output json >/dev/null`.quiet();
-    case "so":
+    case 'so':
       return $`solana program dump -u ${rpc} ${address} ${outputDir}/${binary} >/dev/null`.quiet();
     default:
       echo(chalk.red(`[  ERROR  ] unknown account type for '${binary}'`));

+ 2 - 2
template/base/scripts/program/format.mjs

@@ -1,6 +1,6 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { workingDirectory, getProgramFolders } from "../utils.mjs";
+import 'zx/globals';
+import { workingDirectory, getProgramFolders } from '../utils.mjs';
 
 // Format the programs.
 for (const folder of getProgramFolders()) {

+ 2 - 2
template/base/scripts/program/lint.mjs

@@ -1,6 +1,6 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { workingDirectory, getProgramFolders } from "../utils.mjs";
+import 'zx/globals';
+import { workingDirectory, getProgramFolders } from '../utils.mjs';
 
 // Lint the programs using clippy.
 for (const folder of getProgramFolders()) {

+ 4 - 4
template/base/scripts/program/test.mjs

@@ -1,11 +1,11 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { workingDirectory, getProgramFolders } from "../utils.mjs";
+import 'zx/globals';
+import { workingDirectory, getProgramFolders } from '../utils.mjs';
 
 // Save external programs binaries to the output directory.
-import "./dump.mjs";
+import './dump.mjs';
 
-const hasSolfmt = await which("solfmt", { nothrow: true });
+const hasSolfmt = await which('solfmt', { nothrow: true });
 // Test the programs.
 for (const folder of getProgramFolders()) {
   cd(`${path.join(workingDirectory, folder)}`);

+ 11 - 11
template/base/scripts/utils.mjs

@@ -1,27 +1,27 @@
-import "zx/globals";
-import { parse as parseToml } from "@iarna/toml";
+import 'zx/globals';
+import { parse as parseToml } from '@iarna/toml';
 
 process.env.FORCE_COLOR = 3;
-process.env.CARGO_TERM_COLOR = "always";
+process.env.CARGO_TERM_COLOR = 'always';
 
 export const workingDirectory = (await $`pwd`.quiet()).toString().trim();
 
 export function getAllProgramIdls() {
   return getAllProgramFolders().map((folder) =>
-    path.join(workingDirectory, folder, "idl.json")
+    path.join(workingDirectory, folder, 'idl.json')
   );
 }
 
 export function getExternalProgramOutputDir() {
   const config =
-    getCargo().workspace?.metadata?.solana?.["external-programs-output"];
-  return path.join(workingDirectory, config ?? "target/deploy");
+    getCargo().workspace?.metadata?.solana?.['external-programs-output'];
+  return path.join(workingDirectory, config ?? 'target/deploy');
 }
 
 export function getExternalProgramAddresses() {
   const addresses = getProgramFolders().flatMap(
     (folder) =>
-      getCargo(folder).package?.metadata?.solana?.["program-dependencies"] ?? []
+      getCargo(folder).package?.metadata?.solana?.['program-dependencies'] ?? []
   );
   return Array.from(new Set(addresses));
 }
@@ -29,7 +29,7 @@ export function getExternalProgramAddresses() {
 export function getExternalAccountAddresses() {
   const addresses = getProgramFolders().flatMap(
     (folder) =>
-      getCargo(folder).package?.metadata?.solana?.["account-dependencies"] ?? []
+      getCargo(folder).package?.metadata?.solana?.['account-dependencies'] ?? []
   );
   return Array.from(new Set(addresses));
 }
@@ -69,15 +69,15 @@ export function getProgramFolders() {
 
 export function getAllProgramFolders() {
   return getCargo().workspace.members.filter((member) =>
-    (getCargo(member).lib?.["crate-type"] ?? []).includes("cdylib")
+    (getCargo(member).lib?.['crate-type'] ?? []).includes('cdylib')
   );
 }
 
 export function getCargo(folder) {
   return parseToml(
     fs.readFileSync(
-      path.join(workingDirectory, folder ? folder : ".", "Cargo.toml"),
-      "utf8"
+      path.join(workingDirectory, folder ? folder : '.', 'Cargo.toml'),
+      'utf8'
     )
   );
 }

+ 26 - 26
template/clients/base/scripts/start-validator.mjs

@@ -1,33 +1,33 @@
 #!/usr/bin/env zx
-import { spawn } from "node:child_process";
-import fs from "node:fs";
-import "zx/globals";
+import { spawn } from 'node:child_process';
+import fs from 'node:fs';
+import 'zx/globals';
 import {
   getCargo,
   getExternalAccountAddresses,
   getExternalProgramAddresses,
   getExternalProgramOutputDir,
   getProgramFolders,
-} from "./utils.mjs";
+} from './utils.mjs';
 
 // Options and arguments.
-const restart = argv["restart"];
+const restart = argv['restart'];
 
 // Keep the validator running when not using the restart flag.
 const isValidatorRunning = (await $`lsof -t -i:8899`.quiet().exitCode) === 0;
 if (!restart && isValidatorRunning) {
-  echo(chalk.yellow("Local validator is already running."));
+  echo(chalk.yellow('Local validator is already running.'));
   process.exit();
 }
 
 // Initial message.
-const verb = isValidatorRunning ? "Restarting" : "Starting";
+const verb = isValidatorRunning ? 'Restarting' : 'Starting';
 
 // Get programs and accounts.
 const programs = [...getPrograms(), ...getExternalPrograms()];
-const programPluralized = programs.length === 1 ? "program" : "programs";
+const programPluralized = programs.length === 1 ? 'program' : 'programs';
 const accounts = [...getExternalAccounts()];
-const accountsPluralized = accounts.length === 1 ? "account" : "accounts";
+const accountsPluralized = accounts.length === 1 ? 'account' : 'accounts';
 
 echo(
   `${verb} local validator with ${programs.length} custom ${programPluralized}` +
@@ -43,39 +43,39 @@ if (isValidatorRunning) {
 }
 
 // Global validator arguments.
-const args = [/* Reset ledger */ "-r"];
+const args = [/* Reset ledger */ '-r'];
 
 // Load programs.
 programs.forEach(({ programId, deployPath }) => {
-  args.push(/* Load BPF program */ "--bpf-program", programId, deployPath);
+  args.push(/* Load BPF program */ '--bpf-program', programId, deployPath);
 });
 
 // Load accounts.
 accounts.forEach(({ account, deployPath }) => {
-  args.push(/* Load account */ "--account", account, deployPath);
+  args.push(/* Load account */ '--account', account, deployPath);
 });
 
 // Start the validator in detached mode.
-const cliLogs = path.join(os.tmpdir(), "validator-cli.log");
-fs.writeFileSync(cliLogs, "", () => {});
-const out = fs.openSync(cliLogs, "a");
-const err = fs.openSync(cliLogs, "a");
-const validator = spawn("solana-test-validator", args, {
+const cliLogs = path.join(os.tmpdir(), 'validator-cli.log');
+fs.writeFileSync(cliLogs, '', () => {});
+const out = fs.openSync(cliLogs, 'a');
+const err = fs.openSync(cliLogs, 'a');
+const validator = spawn('solana-test-validator', args, {
   detached: true,
-  stdio: ["ignore", out, err],
+  stdio: ['ignore', out, err],
 });
 validator.unref();
 
 // Wait for the validator to stabilize.
 const waitForValidator = spinner(
-  "Waiting for local validator to stabilize...",
+  'Waiting for local validator to stabilize...',
   () =>
     new Promise((resolve, reject) => {
       setInterval(() => {
-        const logs = fs.readFileSync(cliLogs, "utf8");
+        const logs = fs.readFileSync(cliLogs, 'utf8');
         if (validator.exitCode !== null) {
           reject(logs);
-        } else if (logs.includes("Confirmed Slot: 1")) {
+        } else if (logs.includes('Confirmed Slot: 1')) {
           resolve();
         }
       }, 1000);
@@ -84,22 +84,22 @@ const waitForValidator = spinner(
 
 try {
   await waitForValidator;
-  echo(chalk.green("Local validator is up and running!"));
+  echo(chalk.green('Local validator is up and running!'));
 } catch (error) {
   echo(error);
-  echo(chalk.red("Could not start local validator."));
+  echo(chalk.red('Could not start local validator.'));
 } finally {
   fs.rmSync(cliLogs);
   process.exit();
 }
 
 function getPrograms() {
-  const binaryDir = path.join(__dirname, "..", "target", "deploy");
+  const binaryDir = path.join(__dirname, '..', 'target', 'deploy');
   return getProgramFolders().map((folder) => {
     const cargo = getCargo(folder);
-    const name = cargo.package.name.replace(/-/g, "_");
+    const name = cargo.package.name.replace(/-/g, '_');
     return {
-      programId: cargo.package.metadata.solana["program-id"],
+      programId: cargo.package.metadata.solana['program-id'],
       deployPath: path.join(binaryDir, `${name}.so`),
     };
   });

+ 3 - 3
template/clients/base/scripts/stop-validator.mjs

@@ -1,5 +1,5 @@
 #!/usr/bin/env zx
-import "zx/globals";
+import 'zx/globals';
 
 const isValidatorRunning = (await $`lsof -t -i:8899`.quiet().exitCode) === 0;
 
@@ -7,7 +7,7 @@ if (isValidatorRunning) {
   // Kill the validator if it's already running.
   await $`pkill -f solana-test-validator`.quiet();
   await sleep(1000);
-  echo(chalk.green("Local validator terminated!"));
+  echo(chalk.green('Local validator terminated!'));
 } else {
-  echo(chalk.yellow("Local validator is not running."));
+  echo(chalk.yellow('Local validator is not running.'));
 }

+ 3 - 3
template/clients/js/scripts/client/lint-js.mjs

@@ -1,9 +1,9 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { workingDirectory } from "../utils.mjs";
+import 'zx/globals';
+import { workingDirectory } from '../utils.mjs';
 
 // Check the client using ESLint and Prettier.
-cd(path.join(workingDirectory, "clients", "js"));
+cd(path.join(workingDirectory, 'clients', 'js'));
 await $`pnpm install`;
 await $`pnpm lint`;
 await $`pnpm format`;

+ 3 - 3
template/clients/js/scripts/client/test-js.mjs

@@ -1,12 +1,12 @@
 #!/usr/bin/env zx
-import "zx/globals";
-import { workingDirectory } from "../utils.mjs";
+import 'zx/globals';
+import { workingDirectory } from '../utils.mjs';
 
 // Start the local validator if it's not already running.
 await $`pnpm validator:restart`;
 
 // Build the client and run the tests.
-cd(path.join(workingDirectory, "clients", "js"));
+cd(path.join(workingDirectory, 'clients', 'js'));
 await $`pnpm install`;
 await $`pnpm build`;
 await $`pnpm test ${process.argv.slice(3)}`;