| 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
@@ -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"} |
+9
-5
| { | ||
| "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"} |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
71239
1.9%652
3.66%