Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

get-db

Package Overview
Dependencies
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

get-db - npm Package Compare versions

Comparing version
0.9.2
to
0.9.3
+44
dist/lib/instant-postgres.d.ts
import { InstantPostgresParams } from "./types.js";
//#region src/lib/instant-postgres.d.ts
/**
* Creates an instant Postgres connection string from Instagres by Neon
* if not already set in the specified .env file.
* Prompts the user to optionally generate a connection string,
* saves it to the .env file, and returns the connection string.
*/
declare const instantPostgres: ({
dotEnvFile,
dotEnvKey,
referrer,
seed,
envPrefix
}?: InstantPostgresParams) => Promise<{
databaseUrl: string;
poolerUrl: string;
claimUrl: string;
claimExpiresAt: Date;
}>;
/**
* @deprecated Use `instantPostgres` instead
*/
declare const instantNeon: ({
dotEnvFile,
dotEnvKey,
referrer,
seed,
envPrefix
}?: InstantPostgresParams) => Promise<{
databaseUrl: string;
poolerUrl: string;
claimUrl: string;
claimExpiresAt: Date;
}>;
/**
* @deprecated Use `InstantPostgresParams` instead
*/
type InstantNeonParams = InstantPostgresParams;
//#endregion
export { InstantNeonParams, type InstantPostgresParams, instantNeon, instantPostgres };
//# sourceMappingURL=instant-postgres.d.ts.map
{"version":3,"file":"instant-postgres.d.ts","names":[],"sources":["../../src/lib/instant-postgres.ts"],"sourcesContent":[],"mappings":";;;;;;AAgBA;;;;AAAsC,cAAzB,eAAyB,EAAA,CAAA;EAAA,UAAA;EAAA,SAAA;EAAA,QAAA;EAAA,IAAA;EAAA;AAAA,CAAA,CAAA,EAMnC,qBANmC,EAAA,GAMN,OANM,CAAA;aAAA,EAAA,MAAA;WAAA,EAAA,MAAA;UAMnC,EAAA,MAAA;gBAIc,EAAA,IAAA;;;AA6CjB;;AAAwB,cAAX,WAAW,EAAA,CAAA;EAAA,UAAA;EAAA,SAAA;EAAA,QAAA;EAAA,IAAA;EAAA;AAAA,CAAA,CAAA,EAjDrB,qBAiDqB,EAAA,GAjDQ,OAiDR,CAAA;aAAA,EAAA,MAAA;WAAA,EAAA,MAAA;UAAA,EAAA,MAAA;gBAAA,EA7CP,IA6CO;;;;AAOxB;KAAY,iBAAA,GAAoB"}
import { messages } from "./texts.js";
import { writeToEnv } from "./utils/fs.js";
import { seedDatabase } from "./seed-database.js";
import { LAUNCHPAD_URLS } from "./utils/urls.js";
import { createClaimableDatabase } from "./utils/create-db.js";
import { getPoolerString } from "./utils/format.js";
import { log } from "@clack/prompts";
import { randomUUID } from "node:crypto";
//#region src/lib/instant-postgres.ts
/**
* Creates an instant Postgres connection string from Instagres by Neon
* if not already set in the specified .env file.
* Prompts the user to optionally generate a connection string,
* saves it to the .env file, and returns the connection string.
*/
const instantPostgres = async ({ dotEnvFile = ".env", dotEnvKey = "DATABASE_URL", referrer = "unknown", seed = void 0, envPrefix = "PUBLIC_" } = {}) => {
const dbId = randomUUID();
const claimExpiresAt = new Date(Date.now() + 4320 * 60 * 1e3);
const claimUrl = new URL(LAUNCHPAD_URLS.CLAIM_DATABASE(dbId));
const connString = await createClaimableDatabase(dbId, `npm:get-db|${referrer}`);
const poolerString = getPoolerString(connString);
log.step(messages.connectionString(connString));
log.step(messages.poolerString(poolerString));
await writeToEnv(dotEnvFile, dotEnvKey, claimExpiresAt, claimUrl, connString, poolerString, envPrefix);
log.success(messages.envSuccess(dotEnvFile, dotEnvKey));
log.info(messages.databaseGenerated(claimUrl.href));
if (seed) {
log.step("Pushing schema to database");
await seedDatabase(seed.path, connString);
log.success("Schema pushed to database");
}
return {
databaseUrl: connString,
poolerUrl: poolerString,
claimUrl: claimUrl.href,
claimExpiresAt
};
};
/**
* @deprecated Use `instantPostgres` instead
*/
const instantNeon = instantPostgres;
//#endregion
export { instantNeon, instantPostgres };
//# sourceMappingURL=instant-postgres.js.map
{"version":3,"file":"instant-postgres.js","names":[],"sources":["../../src/lib/instant-postgres.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { log } from \"@clack/prompts\";\nimport { seedDatabase } from \"./seed-database.js\";\nimport { messages } from \"./texts.js\";\nimport type { InstantPostgresParams } from \"./types.js\";\nimport { createClaimableDatabase } from \"./utils/create-db.js\";\nimport { getPoolerString } from \"./utils/format.js\";\nimport { writeToEnv } from \"./utils/fs.js\";\nimport { LAUNCHPAD_URLS } from \"./utils/urls.js\";\n\n/**\n * Creates an instant Postgres connection string from Instagres by Neon\n * if not already set in the specified .env file.\n * Prompts the user to optionally generate a connection string,\n * saves it to the .env file, and returns the connection string.\n */\nexport const instantPostgres = async ({\n\tdotEnvFile = \".env\",\n\tdotEnvKey = \"DATABASE_URL\",\n\treferrer = \"unknown\",\n\tseed = undefined,\n\tenvPrefix = \"PUBLIC_\",\n}: InstantPostgresParams = {}): Promise<{\n\tdatabaseUrl: string;\n\tpoolerUrl: string;\n\tclaimUrl: string;\n\tclaimExpiresAt: Date;\n}> => {\n\tconst dbId = randomUUID();\n\tconst claimExpiresAt = new Date(Date.now() + 3 * 24 * 60 * 60 * 1000);\n\tconst claimUrl = new URL(LAUNCHPAD_URLS.CLAIM_DATABASE(dbId));\n\n\tconst connString = await createClaimableDatabase(\n\t\tdbId,\n\t\t`npm:get-db|${referrer}`,\n\t);\n\tconst poolerString = getPoolerString(connString);\n\n\tlog.step(messages.connectionString(connString));\n\tlog.step(messages.poolerString(poolerString));\n\n\tawait writeToEnv(\n\t\tdotEnvFile,\n\t\tdotEnvKey,\n\t\tclaimExpiresAt,\n\t\tclaimUrl,\n\t\tconnString,\n\t\tpoolerString,\n\t\tenvPrefix,\n\t);\n\n\tlog.success(messages.envSuccess(dotEnvFile, dotEnvKey));\n\tlog.info(messages.databaseGenerated(claimUrl.href));\n\n\tif (seed) {\n\t\tlog.step(\"Pushing schema to database\");\n\t\tawait seedDatabase(seed.path, connString);\n\t\tlog.success(\"Schema pushed to database\");\n\t}\n\n\treturn {\n\t\tdatabaseUrl: connString,\n\t\tpoolerUrl: poolerString,\n\t\tclaimUrl: claimUrl.href,\n\t\tclaimExpiresAt,\n\t} as const;\n};\n\n/**\n * @deprecated Use `instantPostgres` instead\n */\nexport const instantNeon = instantPostgres;\n\nexport type { InstantPostgresParams };\n\n/**\n * @deprecated Use `InstantPostgresParams` instead\n */\nexport type InstantNeonParams = InstantPostgresParams;\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAa,kBAAkB,OAAO,EACrC,aAAa,QACb,YAAY,gBACZ,WAAW,WACX,OAAO,QACP,YAAY,cACc,EAAE,KAKvB;CACL,MAAM,OAAO,YAAY;CACzB,MAAM,iBAAiB,IAAI,KAAK,KAAK,KAAK,GAAG,OAAc,KAAK,IAAK;CACrE,MAAM,WAAW,IAAI,IAAI,eAAe,eAAe,KAAK,CAAC;CAE7D,MAAM,aAAa,MAAM,wBACxB,MACA,cAAc,WACd;CACD,MAAM,eAAe,gBAAgB,WAAW;AAEhD,KAAI,KAAK,SAAS,iBAAiB,WAAW,CAAC;AAC/C,KAAI,KAAK,SAAS,aAAa,aAAa,CAAC;AAE7C,OAAM,WACL,YACA,WACA,gBACA,UACA,YACA,cACA,UACA;AAED,KAAI,QAAQ,SAAS,WAAW,YAAY,UAAU,CAAC;AACvD,KAAI,KAAK,SAAS,kBAAkB,SAAS,KAAK,CAAC;AAEnD,KAAI,MAAM;AACT,MAAI,KAAK,6BAA6B;AACtC,QAAM,aAAa,KAAK,MAAM,WAAW;AACzC,MAAI,QAAQ,4BAA4B;;AAGzC,QAAO;EACN,aAAa;EACb,WAAW;EACX,UAAU,SAAS;EACnB;EACA;;;;;AAMF,MAAa,cAAc"}
+3
-3

@@ -6,3 +6,3 @@ #!/usr/bin/env node

import { claim } from "./lib/claim-command.js";
import { instantNeon } from "./lib/instant-neon.js";
import { instantPostgres } from "./lib/instant-postgres.js";
import { validateEnvKey, validateEnvPath } from "./lib/utils/validate.js";

@@ -30,3 +30,3 @@ import { intro, isCancel, log, outro, spinner, text } from "@clack/prompts";

s.start(messages.generating);
await instantNeon({
await instantPostgres({
dotEnvFile: envPath,

@@ -117,3 +117,3 @@ dotEnvKey: envKey,

s.start(messages.generating);
await instantNeon({
await instantPostgres({
dotEnvFile: userInput.dotEnvPath,

@@ -120,0 +120,0 @@ dotEnvKey: userInput.dotEnvKey,

@@ -1,1 +0,1 @@

{"version":3,"file":"cli.js","names":["userInput: Partial<Defaults>"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { intro, isCancel, log, outro, spinner, text } from \"@clack/prompts\";\nimport { cristal } from \"gradient-string\";\nimport { claim } from \"./lib/claim-command.js\";\nimport { instantNeon } from \"./lib/instant-neon.js\";\nimport { INTRO_ART, messages } from \"./lib/texts.js\";\nimport type { Defaults } from \"./lib/types.js\";\nimport { DEFAULTS, getArgs } from \"./lib/utils/args.js\";\nimport { prepEnv } from \"./lib/utils/fs.js\";\nimport { validateEnvKey, validateEnvPath } from \"./lib/utils/validate.js\";\n\nasync function main() {\n\tconst { command, yes: shouldUseDefaults, ...flags } = getArgs();\n\n\t// Handle claim command\n\tif (command === \"claim\") {\n\t\tconst envPath = flags.env || DEFAULTS.dotEnvPath;\n\t\tawait claim(envPath, flags.prefix);\n\t\treturn;\n\t}\n\n\tconsole.log(cristal(INTRO_ART));\n\tconst s = spinner();\n\n\tintro(messages.welcome);\n\tlog.info(messages.nonInteractive);\n\tconst userInput: Partial<Defaults> = {};\n\n\tif (shouldUseDefaults) {\n\t\tconst envPath = flags.env || DEFAULTS.dotEnvPath;\n\t\tconst envKey = flags.key || DEFAULTS.dotEnvKey;\n\t\tconst envPrefix = flags.prefix || DEFAULTS.envPrefix;\n\n\t\tprepEnv(envPath, envKey);\n\t\ts.start(messages.generating);\n\n\t\tconst seedConfig = flags.seed\n\t\t\t? { type: \"sql-script\" as const, path: flags.seed }\n\t\t\t: DEFAULTS.seed;\n\n\t\tawait instantNeon({\n\t\t\tdotEnvFile: envPath,\n\t\t\tdotEnvKey: envKey,\n\t\t\treferrer: \"npm:get-db/cli\",\n\t\t\tseed: seedConfig,\n\t\t\tenvPrefix: envPrefix,\n\t\t});\n\t} else {\n\t\t/**\n\t\t * Get Env file path (e.g.: .env)\n\t\t */\n\t\tif (flags.env) {\n\t\t\tconst isEnvPathInvalid = validateEnvPath(flags.env);\n\n\t\t\tif (isEnvPathInvalid) {\n\t\t\t\tlog.error(isEnvPathInvalid.message);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tlog.step(messages.info.defaultEnvFilePath(flags.env));\n\t\t\tuserInput.dotEnvPath = flags.env;\n\t\t} else {\n\t\t\tuserInput.dotEnvPath = (await text({\n\t\t\t\tmessage: messages.questions.dotEnvFilePath,\n\t\t\t\tvalidate: validateEnvPath,\n\t\t\t})) as Defaults[\"dotEnvPath\"];\n\n\t\t\t// user cancelled with CTRL+C\n\t\t\tif (isCancel(userInput.dotEnvPath)) {\n\t\t\t\toutro(messages.info.userCancelled);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// user entered an empty string -- opted for default value.\n\t\t\tif (!userInput.dotEnvPath) {\n\t\t\t\tuserInput.dotEnvPath = DEFAULTS.dotEnvPath;\n\t\t\t\tlog.step(\n\t\t\t\t\tmessages.info.defaultEnvFilePath(userInput.dotEnvPath),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Always set dotEnvKey from flag if present\n\t\tif (flags.key) {\n\t\t\tconst isEnvKeyInvalid = validateEnvKey(flags.key);\n\t\t\tif (isEnvKeyInvalid) {\n\t\t\t\tlog.error(isEnvKeyInvalid.message);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tlog.step(messages.info.defaultEnvKey(flags.key));\n\t\t\tuserInput.dotEnvKey = flags.key;\n\t\t}\n\n\t\t// Prompt for dotEnvKey if not set by flag\n\t\tif (!userInput.dotEnvKey) {\n\t\t\tuserInput.dotEnvKey = (await text({\n\t\t\t\tmessage: messages.questions.dotEnvKey,\n\t\t\t\tvalidate: validateEnvKey,\n\t\t\t})) as Defaults[\"dotEnvKey\"];\n\n\t\t\t// user cancelled with CTRL+C\n\t\t\tif (isCancel(userInput.dotEnvKey)) {\n\t\t\t\toutro(messages.info.userCancelled);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// User accepted default value.\n\t\t\tif (!userInput.dotEnvKey) {\n\t\t\t\tuserInput.dotEnvKey = DEFAULTS.dotEnvKey;\n\t\t\t\tlog.step(messages.info.defaultEnvKey(userInput.dotEnvKey));\n\t\t\t}\n\t\t}\n\n\t\tif (!flags.seed) {\n\t\t\tuserInput.seed = {\n\t\t\t\ttype: \"sql-script\",\n\t\t\t\tpath: await text({\n\t\t\t\t\tmessage: messages.questions.seedPath,\n\t\t\t\t}),\n\t\t\t} as Defaults[\"seed\"];\n\n\t\t\tif (!userInput.seed?.path) {\n\t\t\t\tuserInput.seed = DEFAULTS.seed;\n\t\t\t}\n\t\t} else {\n\t\t\tuserInput.seed = {\n\t\t\t\ttype: \"sql-script\",\n\t\t\t\tpath: flags.seed,\n\t\t\t};\n\t\t}\n\n\t\t// Always set envPrefix from flag if present\n\t\tif (flags.prefix) {\n\t\t\tlog.step(messages.info.defaultPrefix(flags.prefix));\n\t\t\tuserInput.envPrefix = flags.prefix;\n\t\t}\n\n\t\t// Prompt for envPrefix if not set by flag\n\t\tif (!userInput.envPrefix) {\n\t\t\tuserInput.envPrefix = (await text({\n\t\t\t\tmessage: messages.questions.prefix,\n\t\t\t})) as Defaults[\"envPrefix\"];\n\n\t\t\t// user cancelled with CTRL+C\n\t\t\tif (isCancel(userInput.envPrefix)) {\n\t\t\t\toutro(messages.info.userCancelled);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// User accepted default value.\n\t\t\tif (!userInput.envPrefix) {\n\t\t\t\tuserInput.envPrefix = DEFAULTS.envPrefix;\n\t\t\t\tlog.step(messages.info.defaultPrefix(userInput.envPrefix));\n\t\t\t}\n\t\t}\n\n\t\tprepEnv(userInput.dotEnvPath, userInput.dotEnvKey);\n\n\t\ts.start(messages.generating);\n\n\t\tawait instantNeon({\n\t\t\tdotEnvFile: userInput.dotEnvPath,\n\t\t\tdotEnvKey: userInput.dotEnvKey,\n\t\t\treferrer: \"npm:get-db/cli\",\n\t\t\tseed: userInput.seed,\n\t\t\tenvPrefix: userInput.envPrefix,\n\t\t});\n\t}\n\ts.stop(\"Database generated!\");\n\n\toutro(messages.happyCoding);\n}\n\nawait main();\n\nexport default main;\n"],"mappings":"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"}
{"version":3,"file":"cli.js","names":["userInput: Partial<Defaults>"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { intro, isCancel, log, outro, spinner, text } from \"@clack/prompts\";\nimport { cristal } from \"gradient-string\";\nimport { claim } from \"./lib/claim-command.js\";\nimport { instantPostgres } from \"./lib/instant-postgres.js\";\nimport { INTRO_ART, messages } from \"./lib/texts.js\";\nimport type { Defaults } from \"./lib/types.js\";\nimport { DEFAULTS, getArgs } from \"./lib/utils/args.js\";\nimport { prepEnv } from \"./lib/utils/fs.js\";\nimport { validateEnvKey, validateEnvPath } from \"./lib/utils/validate.js\";\n\nasync function main() {\n\tconst { command, yes: shouldUseDefaults, ...flags } = getArgs();\n\n\t// Handle claim command\n\tif (command === \"claim\") {\n\t\tconst envPath = flags.env || DEFAULTS.dotEnvPath;\n\t\tawait claim(envPath, flags.prefix);\n\t\treturn;\n\t}\n\n\tconsole.log(cristal(INTRO_ART));\n\tconst s = spinner();\n\n\tintro(messages.welcome);\n\tlog.info(messages.nonInteractive);\n\tconst userInput: Partial<Defaults> = {};\n\n\tif (shouldUseDefaults) {\n\t\tconst envPath = flags.env || DEFAULTS.dotEnvPath;\n\t\tconst envKey = flags.key || DEFAULTS.dotEnvKey;\n\t\tconst envPrefix = flags.prefix || DEFAULTS.envPrefix;\n\n\t\tprepEnv(envPath, envKey);\n\t\ts.start(messages.generating);\n\n\t\tconst seedConfig = flags.seed\n\t\t\t? { type: \"sql-script\" as const, path: flags.seed }\n\t\t\t: DEFAULTS.seed;\n\n\t\tawait instantPostgres({\n\t\t\tdotEnvFile: envPath,\n\t\t\tdotEnvKey: envKey,\n\t\t\treferrer: \"npm:get-db/cli\",\n\t\t\tseed: seedConfig,\n\t\t\tenvPrefix: envPrefix,\n\t\t});\n\t} else {\n\t\t/**\n\t\t * Get Env file path (e.g.: .env)\n\t\t */\n\t\tif (flags.env) {\n\t\t\tconst isEnvPathInvalid = validateEnvPath(flags.env);\n\n\t\t\tif (isEnvPathInvalid) {\n\t\t\t\tlog.error(isEnvPathInvalid.message);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tlog.step(messages.info.defaultEnvFilePath(flags.env));\n\t\t\tuserInput.dotEnvPath = flags.env;\n\t\t} else {\n\t\t\tuserInput.dotEnvPath = (await text({\n\t\t\t\tmessage: messages.questions.dotEnvFilePath,\n\t\t\t\tvalidate: validateEnvPath,\n\t\t\t})) as Defaults[\"dotEnvPath\"];\n\n\t\t\t// user cancelled with CTRL+C\n\t\t\tif (isCancel(userInput.dotEnvPath)) {\n\t\t\t\toutro(messages.info.userCancelled);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// user entered an empty string -- opted for default value.\n\t\t\tif (!userInput.dotEnvPath) {\n\t\t\t\tuserInput.dotEnvPath = DEFAULTS.dotEnvPath;\n\t\t\t\tlog.step(\n\t\t\t\t\tmessages.info.defaultEnvFilePath(userInput.dotEnvPath),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Always set dotEnvKey from flag if present\n\t\tif (flags.key) {\n\t\t\tconst isEnvKeyInvalid = validateEnvKey(flags.key);\n\t\t\tif (isEnvKeyInvalid) {\n\t\t\t\tlog.error(isEnvKeyInvalid.message);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tlog.step(messages.info.defaultEnvKey(flags.key));\n\t\t\tuserInput.dotEnvKey = flags.key;\n\t\t}\n\n\t\t// Prompt for dotEnvKey if not set by flag\n\t\tif (!userInput.dotEnvKey) {\n\t\t\tuserInput.dotEnvKey = (await text({\n\t\t\t\tmessage: messages.questions.dotEnvKey,\n\t\t\t\tvalidate: validateEnvKey,\n\t\t\t})) as Defaults[\"dotEnvKey\"];\n\n\t\t\t// user cancelled with CTRL+C\n\t\t\tif (isCancel(userInput.dotEnvKey)) {\n\t\t\t\toutro(messages.info.userCancelled);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// User accepted default value.\n\t\t\tif (!userInput.dotEnvKey) {\n\t\t\t\tuserInput.dotEnvKey = DEFAULTS.dotEnvKey;\n\t\t\t\tlog.step(messages.info.defaultEnvKey(userInput.dotEnvKey));\n\t\t\t}\n\t\t}\n\n\t\tif (!flags.seed) {\n\t\t\tuserInput.seed = {\n\t\t\t\ttype: \"sql-script\",\n\t\t\t\tpath: await text({\n\t\t\t\t\tmessage: messages.questions.seedPath,\n\t\t\t\t}),\n\t\t\t} as Defaults[\"seed\"];\n\n\t\t\tif (!userInput.seed?.path) {\n\t\t\t\tuserInput.seed = DEFAULTS.seed;\n\t\t\t}\n\t\t} else {\n\t\t\tuserInput.seed = {\n\t\t\t\ttype: \"sql-script\",\n\t\t\t\tpath: flags.seed,\n\t\t\t};\n\t\t}\n\n\t\t// Always set envPrefix from flag if present\n\t\tif (flags.prefix) {\n\t\t\tlog.step(messages.info.defaultPrefix(flags.prefix));\n\t\t\tuserInput.envPrefix = flags.prefix;\n\t\t}\n\n\t\t// Prompt for envPrefix if not set by flag\n\t\tif (!userInput.envPrefix) {\n\t\t\tuserInput.envPrefix = (await text({\n\t\t\t\tmessage: messages.questions.prefix,\n\t\t\t})) as Defaults[\"envPrefix\"];\n\n\t\t\t// user cancelled with CTRL+C\n\t\t\tif (isCancel(userInput.envPrefix)) {\n\t\t\t\toutro(messages.info.userCancelled);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// User accepted default value.\n\t\t\tif (!userInput.envPrefix) {\n\t\t\t\tuserInput.envPrefix = DEFAULTS.envPrefix;\n\t\t\t\tlog.step(messages.info.defaultPrefix(userInput.envPrefix));\n\t\t\t}\n\t\t}\n\n\t\tprepEnv(userInput.dotEnvPath, userInput.dotEnvKey);\n\n\t\ts.start(messages.generating);\n\n\t\tawait instantPostgres({\n\t\t\tdotEnvFile: userInput.dotEnvPath,\n\t\t\tdotEnvKey: userInput.dotEnvKey,\n\t\t\treferrer: \"npm:get-db/cli\",\n\t\t\tseed: userInput.seed,\n\t\t\tenvPrefix: userInput.envPrefix,\n\t\t});\n\t}\n\ts.stop(\"Database generated!\");\n\n\toutro(messages.happyCoding);\n}\n\nawait main();\n\nexport default main;\n"],"mappings":"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"}

@@ -14,3 +14,3 @@ //#region src/lib/types.d.ts

*/
interface InstantNeonParams {
interface InstantPostgresParams {
dotEnvFile?: string;

@@ -29,3 +29,3 @@ dotEnvKey?: string;

//#endregion
export { Defaults, InstantNeonParams, SqlScript };
export { Defaults, InstantPostgresParams, SqlScript };
//# sourceMappingURL=types.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/lib/types.ts"],"sourcesContent":[],"mappings":";KAAY,SAAA;EAAA,IAAA,EAAA,YAAS;EAaJ,IAAA,EAAA,MAAA;AAQjB,CAAA;;;;;;;;;UARiB,iBAAA;;;;SAIT;;;UAIS,QAAA;;;SAGT"}
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/lib/types.ts"],"sourcesContent":[],"mappings":";KAAY,SAAA;EAAA,IAAA,EAAA,YAAS;EAaJ,IAAA,EAAA,MAAA;AAQjB,CAAA;;;;;;;;;UARiB,qBAAA;;;;SAIT;;;UAIS,QAAA;;;SAGT"}
{
"name": "get-db",
"version": "0.9.2",
"version": "0.9.3",
"description": "create a claimable Neon database in seconds!",

@@ -27,8 +27,12 @@ "keywords": [

"./sdk": {
"import": "./dist/lib/instant-neon.js",
"types": "./dist/lib/instant-neon.d.ts"
"import": "./dist/lib/instant-postgres.js",
"types": "./dist/lib/instant-postgres.d.ts"
},
"./launchpad": {
"import": "./dist/lib/instant-neon.js",
"types": "./dist/lib/instant-neon.d.ts"
"import": "./dist/lib/instant-postgres.js",
"types": "./dist/lib/instant-postgres.d.ts"
},
".": {
"import": "./dist/lib/instant-postgres.js",
"types": "./dist/lib/instant-postgres.d.ts"
}

@@ -35,0 +39,0 @@ },

import { InstantNeonParams } from "./types.js";
//#region src/lib/instant-neon.d.ts
/**
* Creates an instant Postgres connection string from Instagres by Neon
* if not already set in the specified .env file.
* Prompts the user to optionally generate a connection string,
* saves it to the .env file, and returns the connection string.
*/
declare const instantNeon: ({
dotEnvFile,
dotEnvKey,
referrer,
seed,
envPrefix
}: InstantNeonParams) => Promise<{
readonly databaseUrl: string;
readonly poolerUrl: string;
readonly claimUrl: string;
readonly claimExpiresAt: Date;
}>;
//#endregion
export { type InstantNeonParams, instantNeon };
//# sourceMappingURL=instant-neon.d.ts.map
{"version":3,"file":"instant-neon.d.ts","names":[],"sources":["../../src/lib/instant-neon.ts"],"sourcesContent":[],"mappings":";;;;;;AAgBA;;;;AAAkC,cAArB,WAAqB,EAAA,CAAA;EAAA,UAAA;EAAA,SAAA;EAAA,QAAA;EAAA,IAAA;EAAA;AAAA,CAAA,EAM/B,iBAN+B,EAAA,GAMd,OANc,CAAA;WAAA,WAAA,EAAA,MAAA;WAAA,SAAA,EAAA,MAAA;WAM/B,QAAA,EAAA,MAAA"}
import { messages } from "./texts.js";
import { writeToEnv } from "./utils/fs.js";
import { seedDatabase } from "./seed-database.js";
import { LAUNCHPAD_URLS } from "./utils/urls.js";
import { createClaimableDatabase } from "./utils/create-db.js";
import { getPoolerString } from "./utils/format.js";
import { log } from "@clack/prompts";
import { randomUUID } from "node:crypto";
//#region src/lib/instant-neon.ts
/**
* Creates an instant Postgres connection string from Instagres by Neon
* if not already set in the specified .env file.
* Prompts the user to optionally generate a connection string,
* saves it to the .env file, and returns the connection string.
*/
const instantNeon = async ({ dotEnvFile = ".env", dotEnvKey = "DATABASE_URL", referrer = "unknown", seed = void 0, envPrefix = "PUBLIC_" }) => {
const dbId = randomUUID();
const claimExpiresAt = new Date(Date.now() + 4320 * 60 * 1e3);
const claimUrl = new URL(LAUNCHPAD_URLS.CLAIM_DATABASE(dbId));
const connString = await createClaimableDatabase(dbId, `npm:get-db|${referrer}`);
const poolerString = getPoolerString(connString);
log.step(messages.connectionString(connString));
log.step(messages.poolerString(poolerString));
await writeToEnv(dotEnvFile, dotEnvKey, claimExpiresAt, claimUrl, connString, poolerString, envPrefix);
log.success(messages.envSuccess(dotEnvFile, dotEnvKey));
log.info(messages.databaseGenerated(claimUrl.href));
if (seed) {
log.step("Pushing schema to database");
await seedDatabase(seed.path, connString);
log.success("Schema pushed to database");
}
return {
databaseUrl: connString,
poolerUrl: poolerString,
claimUrl: claimUrl.href,
claimExpiresAt
};
};
//#endregion
export { instantNeon };
//# sourceMappingURL=instant-neon.js.map
{"version":3,"file":"instant-neon.js","names":[],"sources":["../../src/lib/instant-neon.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { log } from \"@clack/prompts\";\nimport { seedDatabase } from \"./seed-database.js\";\nimport { messages } from \"./texts.js\";\nimport type { InstantNeonParams } from \"./types.js\";\nimport { createClaimableDatabase } from \"./utils/create-db.js\";\nimport { getPoolerString } from \"./utils/format.js\";\nimport { writeToEnv } from \"./utils/fs.js\";\nimport { LAUNCHPAD_URLS } from \"./utils/urls.js\";\n\n/**\n * Creates an instant Postgres connection string from Instagres by Neon\n * if not already set in the specified .env file.\n * Prompts the user to optionally generate a connection string,\n * saves it to the .env file, and returns the connection string.\n */\nexport const instantNeon = async ({\n\tdotEnvFile = \".env\",\n\tdotEnvKey = \"DATABASE_URL\",\n\treferrer = \"unknown\",\n\tseed = undefined,\n\tenvPrefix = \"PUBLIC_\",\n}: InstantNeonParams) => {\n\tconst dbId = randomUUID();\n\tconst claimExpiresAt = new Date(Date.now() + 3 * 24 * 60 * 60 * 1000);\n\tconst claimUrl = new URL(LAUNCHPAD_URLS.CLAIM_DATABASE(dbId));\n\n\tconst connString = await createClaimableDatabase(\n\t\tdbId,\n\t\t`npm:get-db|${referrer}`,\n\t);\n\tconst poolerString = getPoolerString(connString);\n\n\tlog.step(messages.connectionString(connString));\n\tlog.step(messages.poolerString(poolerString));\n\n\tawait writeToEnv(\n\t\tdotEnvFile,\n\t\tdotEnvKey,\n\t\tclaimExpiresAt,\n\t\tclaimUrl,\n\t\tconnString,\n\t\tpoolerString,\n\t\tenvPrefix,\n\t);\n\n\tlog.success(messages.envSuccess(dotEnvFile, dotEnvKey));\n\tlog.info(messages.databaseGenerated(claimUrl.href));\n\n\tif (seed) {\n\t\tlog.step(\"Pushing schema to database\");\n\t\tawait seedDatabase(seed.path, connString);\n\t\tlog.success(\"Schema pushed to database\");\n\t}\n\n\treturn {\n\t\tdatabaseUrl: connString,\n\t\tpoolerUrl: poolerString,\n\t\tclaimUrl: claimUrl.href,\n\t\tclaimExpiresAt,\n\t} as const;\n};\n\nexport type { InstantNeonParams };\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAa,cAAc,OAAO,EACjC,aAAa,QACb,YAAY,gBACZ,WAAW,WACX,OAAO,QACP,YAAY,gBACY;CACxB,MAAM,OAAO,YAAY;CACzB,MAAM,iBAAiB,IAAI,KAAK,KAAK,KAAK,GAAG,OAAc,KAAK,IAAK;CACrE,MAAM,WAAW,IAAI,IAAI,eAAe,eAAe,KAAK,CAAC;CAE7D,MAAM,aAAa,MAAM,wBACxB,MACA,cAAc,WACd;CACD,MAAM,eAAe,gBAAgB,WAAW;AAEhD,KAAI,KAAK,SAAS,iBAAiB,WAAW,CAAC;AAC/C,KAAI,KAAK,SAAS,aAAa,aAAa,CAAC;AAE7C,OAAM,WACL,YACA,WACA,gBACA,UACA,YACA,cACA,UACA;AAED,KAAI,QAAQ,SAAS,WAAW,YAAY,UAAU,CAAC;AACvD,KAAI,KAAK,SAAS,kBAAkB,SAAS,KAAK,CAAC;AAEnD,KAAI,MAAM;AACT,MAAI,KAAK,6BAA6B;AACtC,QAAM,aAAa,KAAK,MAAM,WAAW;AACzC,MAAI,QAAQ,4BAA4B;;AAGzC,QAAO;EACN,aAAa;EACb,WAAW;EACX,UAAU,SAAS;EACnB;EACA"}