hot-updater 0.5.8 → 0.5.9

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.
@@ -0,0 +1 @@
1
+ export declare const getSupabaseEnv: () => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const getPluginEnv: () => Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { SupabaseApi } from "@hot-updater/supabase";
2
+ export declare const selectOrCreateOrganization: () => Promise<void>;
3
+ export declare const selectProject: () => Promise<{
4
+ id: string;
5
+ name: string;
6
+ region: string;
7
+ }>;
8
+ export declare const selectBucket: (api: SupabaseApi) => Promise<string>;
package/dist/index.cjs CHANGED
@@ -15814,13 +15814,7 @@ var __webpack_exports__ = {};
15814
15814
  await databasePlugin.onUnmount?.();
15815
15815
  }
15816
15816
  };
15817
- const getPackageManager = ()=>{
15818
- const [packageManagerWithVersion] = process.env["npm_config_user_agent"]?.split(" ") ?? [];
15819
- if (!packageManagerWithVersion) return "npm";
15820
- const [packageManager] = packageManagerWithVersion.split("/");
15821
- if (!packageManager) return "npm";
15822
- return packageManager;
15823
- };
15817
+ const delay = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
15824
15818
  function isPlainObject(value) {
15825
15819
  if ('object' != typeof value || null === value) return false;
15826
15820
  const prototype = Object.getPrototypeOf(value);
@@ -21841,111 +21835,6 @@ Instead, \`yield\` should either be called with a value, or not be called at all
21841
21835
  createExeca(mapNode);
21842
21836
  createExeca(mapScriptAsync, {}, deepScriptOptions, setScriptSync);
21843
21837
  const { sendMessage: execa_sendMessage, getOneMessage: execa_getOneMessage, getEachMessage: execa_getEachMessage, getCancelSignal: execa_getCancelSignal } = getIpcExport();
21844
- const ensurePackageVersion = (pkg)=>{
21845
- if ("hot-updater" === pkg || pkg.startsWith("@hot-updater/")) return `${pkg}@${packageJson_version}`;
21846
- return pkg;
21847
- };
21848
- const ensureInstallPackages = async (buildPluginPackages)=>{
21849
- const packages = await readPackageUp({
21850
- cwd: (0, plugin_core_namespaceObject.getCwd)()
21851
- });
21852
- const dependenciesToInstall = buildPluginPackages.dependencies.filter((pkg)=>!packages?.packageJson?.dependencies?.[pkg]);
21853
- const devDependenciesToInstall = buildPluginPackages.devDependencies.filter((pkg)=>!packages?.packageJson?.devDependencies?.[pkg]);
21854
- const packageManager = getPackageManager();
21855
- await prompts_namespaceObject.tasks([
21856
- {
21857
- enabled: dependenciesToInstall.length > 0,
21858
- title: "Checking packages",
21859
- task: async (message)=>{
21860
- message(`Installing ${dependenciesToInstall.join(", ")}...`);
21861
- await execa(packageManager, [
21862
- "yarn" === packageManager ? "add" : "install",
21863
- ...dependenciesToInstall.map(ensurePackageVersion)
21864
- ]);
21865
- return `Installed ${dependenciesToInstall.join(", ")}`;
21866
- }
21867
- },
21868
- {
21869
- enabled: devDependenciesToInstall.length > 0,
21870
- title: "Installing dev dependencies",
21871
- task: async (message)=>{
21872
- message(`Installing ${devDependenciesToInstall.join(", ")}...`);
21873
- await execa(packageManager, [
21874
- "yarn" === packageManager ? "add" : "install",
21875
- ...devDependenciesToInstall.map(ensurePackageVersion),
21876
- "yarn" === packageManager ? "--dev" : "--save-dev"
21877
- ]);
21878
- return `Installed ${devDependenciesToInstall.join(", ")}`;
21879
- }
21880
- }
21881
- ]);
21882
- };
21883
- const delay = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
21884
- const makeEnv = async (newEnvVars, filePath = ".env")=>{
21885
- try {
21886
- const existingContent = await promises_default().readFile(filePath, "utf-8").catch(()=>"");
21887
- const lines = existingContent.split("\n");
21888
- const envVars = new Map();
21889
- const updatedLines = [];
21890
- for (const line of lines){
21891
- const trimmedLine = line.trim();
21892
- if (!trimmedLine || trimmedLine.startsWith("#")) updatedLines.push(line);
21893
- else {
21894
- const [key, ...rest] = line.split("=");
21895
- const value = rest.join("=");
21896
- if (key) {
21897
- const trimmedKey = key.trim();
21898
- envVars.set(trimmedKey, value?.trim() ?? "");
21899
- updatedLines.push(`${trimmedKey}=${newEnvVars[trimmedKey] ?? value}`);
21900
- }
21901
- }
21902
- }
21903
- for (const [key, value] of Object.entries(newEnvVars))if (!envVars.has(key)) updatedLines.push(`${key}=${value}`);
21904
- const updatedContent = updatedLines.join("\n");
21905
- await promises_default().writeFile(filePath, updatedContent, "utf-8");
21906
- return updatedContent;
21907
- } catch (error) {
21908
- console.error("Error while updating .env file:", error);
21909
- throw error;
21910
- }
21911
- };
21912
- function transformTemplate(templateString, values) {
21913
- let result = templateString;
21914
- for(const key in values){
21915
- const placeholder = `%%${key}%%`;
21916
- result = result.replace(new RegExp(placeholder, "g"), values[key]);
21917
- }
21918
- return result;
21919
- }
21920
- const CONFIG_TEMPLATE = `
21921
- import { metro } from "@hot-updater/metro";
21922
- import { supabaseDatabase, supabaseStorage } from "@hot-updater/supabase";
21923
- import { defineConfig } from "hot-updater";
21924
- import "dotenv/config";
21925
-
21926
- export default defineConfig({
21927
- build: metro(),
21928
- storage: supabaseStorage({
21929
- supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
21930
- supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
21931
- bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,
21932
- }),
21933
- database: supabaseDatabase({
21934
- supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
21935
- supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
21936
- }),
21937
- });
21938
- `;
21939
- const SOURCE_TEMPLATE = `// add this to your App.tsx
21940
- import { HotUpdater } from "@hot-updater/react-native";
21941
-
21942
- function App() {
21943
- return ...
21944
- }
21945
-
21946
- export default HotUpdater.wrap({
21947
- source: "%%source%%",
21948
- })(App);`;
21949
21838
  const selectOrCreateOrganization = async ()=>{
21950
21839
  const confirmed = await prompts_namespaceObject.confirm({
21951
21840
  message: "Do you already have a Supabase organization?",
@@ -22083,6 +21972,177 @@ export default HotUpdater.wrap({
22083
21972
  }
22084
21973
  return selectedBucketId;
22085
21974
  };
21975
+ function transformTemplate(templateString, values) {
21976
+ let result = templateString;
21977
+ for(const key in values){
21978
+ const placeholder = `%%${key}%%`;
21979
+ result = result.replace(new RegExp(placeholder, "g"), values[key]);
21980
+ }
21981
+ return result;
21982
+ }
21983
+ const CONFIG_TEMPLATE = `
21984
+ HOT_UPDATER_SUPABASE_URL=%%HOT_UPDATER_SUPABASE_URL%%
21985
+ HOT_UPDATER_SUPABASE_ANON_KEY=%%HOT_UPDATER_SUPABASE_ANON_KEY%%
21986
+ HOT_UPDATER_SUPABASE_BUCKET_NAME=%%HOT_UPDATER_SUPABASE_BUCKET_NAME%%
21987
+ `;
21988
+ const getSupabaseEnv = async ()=>{
21989
+ const project = await selectProject();
21990
+ const spinner = prompts_namespaceObject.spinner();
21991
+ spinner.start(`Getting API keys for ${project.name}...`);
21992
+ let apiKeys = [];
21993
+ try {
21994
+ const keysProcess = await execa("npx", [
21995
+ "-y",
21996
+ "supabase",
21997
+ "projects",
21998
+ "api-keys",
21999
+ "--project-ref",
22000
+ project.id,
22001
+ "--output",
22002
+ "json"
22003
+ ]);
22004
+ apiKeys = JSON.parse(keysProcess.stdout ?? "[]");
22005
+ } catch (err) {
22006
+ spinner.stop();
22007
+ console.error("Failed to get API keys:", err);
22008
+ process.exit(1);
22009
+ }
22010
+ spinner.stop();
22011
+ const serviceRoleKey = apiKeys.find((key)=>"service_role" === key.name);
22012
+ if (!serviceRoleKey) throw new Error("Service role key not found");
22013
+ const { supabaseApi } = await Promise.resolve().then(__webpack_require__.bind(__webpack_require__, "@hot-updater/supabase"));
22014
+ const api = supabaseApi(`https://${project.id}.supabase.co`, serviceRoleKey.api_key);
22015
+ const bucketId = await selectBucket(api);
22016
+ prompts_namespaceObject.log.message(transformTemplate(CONFIG_TEMPLATE, {
22017
+ HOT_UPDATER_SUPABASE_ANON_KEY: serviceRoleKey.api_key,
22018
+ HOT_UPDATER_SUPABASE_BUCKET_NAME: bucketId,
22019
+ HOT_UPDATER_SUPABASE_URL: `https://${project.id}.supabase.co`
22020
+ }));
22021
+ prompts_namespaceObject.outro("Please use these values for reference only and manage them through .env file.");
22022
+ };
22023
+ const getPluginEnv = async ()=>{
22024
+ printBanner();
22025
+ const provider = await (0, prompts_namespaceObject.select)({
22026
+ message: "Select a provider",
22027
+ options: [
22028
+ {
22029
+ value: "supabase",
22030
+ label: "Supabase"
22031
+ }
22032
+ ]
22033
+ });
22034
+ if ((0, prompts_namespaceObject.isCancel)(provider)) process.exit(0);
22035
+ switch(provider){
22036
+ case "supabase":
22037
+ await getSupabaseEnv();
22038
+ break;
22039
+ default:
22040
+ throw new Error("Invalid provider");
22041
+ }
22042
+ };
22043
+ const getPackageManager = ()=>{
22044
+ const [packageManagerWithVersion] = process.env["npm_config_user_agent"]?.split(" ") ?? [];
22045
+ if (!packageManagerWithVersion) return "npm";
22046
+ const [packageManager] = packageManagerWithVersion.split("/");
22047
+ if (!packageManager) return "npm";
22048
+ return packageManager;
22049
+ };
22050
+ const ensurePackageVersion = (pkg)=>{
22051
+ if ("hot-updater" === pkg || pkg.startsWith("@hot-updater/")) return `${pkg}@${packageJson_version}`;
22052
+ return pkg;
22053
+ };
22054
+ const ensureInstallPackages = async (buildPluginPackages)=>{
22055
+ const packages = await readPackageUp({
22056
+ cwd: (0, plugin_core_namespaceObject.getCwd)()
22057
+ });
22058
+ const dependenciesToInstall = buildPluginPackages.dependencies.filter((pkg)=>!packages?.packageJson?.dependencies?.[pkg]);
22059
+ const devDependenciesToInstall = buildPluginPackages.devDependencies.filter((pkg)=>!packages?.packageJson?.devDependencies?.[pkg]);
22060
+ const packageManager = getPackageManager();
22061
+ await prompts_namespaceObject.tasks([
22062
+ {
22063
+ enabled: dependenciesToInstall.length > 0,
22064
+ title: "Checking packages",
22065
+ task: async (message)=>{
22066
+ message(`Installing ${dependenciesToInstall.join(", ")}...`);
22067
+ await execa(packageManager, [
22068
+ "yarn" === packageManager ? "add" : "install",
22069
+ ...dependenciesToInstall.map(ensurePackageVersion)
22070
+ ]);
22071
+ return `Installed ${dependenciesToInstall.join(", ")}`;
22072
+ }
22073
+ },
22074
+ {
22075
+ enabled: devDependenciesToInstall.length > 0,
22076
+ title: "Installing dev dependencies",
22077
+ task: async (message)=>{
22078
+ message(`Installing ${devDependenciesToInstall.join(", ")}...`);
22079
+ await execa(packageManager, [
22080
+ "yarn" === packageManager ? "add" : "install",
22081
+ ...devDependenciesToInstall.map(ensurePackageVersion),
22082
+ "yarn" === packageManager ? "--dev" : "--save-dev"
22083
+ ]);
22084
+ return `Installed ${devDependenciesToInstall.join(", ")}`;
22085
+ }
22086
+ }
22087
+ ]);
22088
+ };
22089
+ const makeEnv = async (newEnvVars, filePath = ".env")=>{
22090
+ try {
22091
+ const existingContent = await promises_default().readFile(filePath, "utf-8").catch(()=>"");
22092
+ const lines = existingContent.split("\n");
22093
+ const envVars = new Map();
22094
+ const updatedLines = [];
22095
+ for (const line of lines){
22096
+ const trimmedLine = line.trim();
22097
+ if (!trimmedLine || trimmedLine.startsWith("#")) updatedLines.push(line);
22098
+ else {
22099
+ const [key, ...rest] = line.split("=");
22100
+ const value = rest.join("=");
22101
+ if (key) {
22102
+ const trimmedKey = key.trim();
22103
+ envVars.set(trimmedKey, value?.trim() ?? "");
22104
+ updatedLines.push(`${trimmedKey}=${newEnvVars[trimmedKey] ?? value}`);
22105
+ }
22106
+ }
22107
+ }
22108
+ for (const [key, value] of Object.entries(newEnvVars))if (!envVars.has(key)) updatedLines.push(`${key}=${value}`);
22109
+ const updatedContent = updatedLines.join("\n");
22110
+ await promises_default().writeFile(filePath, updatedContent, "utf-8");
22111
+ return updatedContent;
22112
+ } catch (error) {
22113
+ console.error("Error while updating .env file:", error);
22114
+ throw error;
22115
+ }
22116
+ };
22117
+ const initSupabase_CONFIG_TEMPLATE = `
22118
+ import { metro } from "@hot-updater/metro";
22119
+ import { supabaseDatabase, supabaseStorage } from "@hot-updater/supabase";
22120
+ import { defineConfig } from "hot-updater";
22121
+ import "dotenv/config";
22122
+
22123
+ export default defineConfig({
22124
+ build: metro(),
22125
+ storage: supabaseStorage({
22126
+ supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
22127
+ supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
22128
+ bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,
22129
+ }),
22130
+ database: supabaseDatabase({
22131
+ supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
22132
+ supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
22133
+ }),
22134
+ });
22135
+ `;
22136
+ const SOURCE_TEMPLATE = `// add this to your App.tsx
22137
+ import { HotUpdater } from "@hot-updater/react-native";
22138
+
22139
+ function App() {
22140
+ return ...
22141
+ }
22142
+
22143
+ export default HotUpdater.wrap({
22144
+ source: "%%source%%",
22145
+ })(App);`;
22086
22146
  const linkSupabase = async (supabasePath, projectId)=>{
22087
22147
  const spinner = prompts_namespaceObject.spinner();
22088
22148
  spinner.start("Linking Supabase...");
@@ -22192,7 +22252,7 @@ export default HotUpdater.wrap({
22192
22252
  await linkSupabase(supabasePath, project.id);
22193
22253
  await pushDB(supabasePath);
22194
22254
  await deployEdgeFunction(supabasePath, project.id);
22195
- await promises_default().writeFile("hot-updater.config.ts", CONFIG_TEMPLATE);
22255
+ await promises_default().writeFile("hot-updater.config.ts", initSupabase_CONFIG_TEMPLATE);
22196
22256
  await makeEnv({
22197
22257
  HOT_UPDATER_SUPABASE_ANON_KEY: serviceRoleKey.api_key,
22198
22258
  HOT_UPDATER_SUPABASE_BUCKET_NAME: bucketId,
@@ -22318,6 +22378,7 @@ export default HotUpdater.wrap({
22318
22378
  const program = new external_commander_namespaceObject.Command();
22319
22379
  program.name("hot-updater").description(banner).version(packageJson_version);
22320
22380
  program.command("init").description("Initialize Hot Updater").action(init_init);
22381
+ program.command("get-plugin-env").description("Get the environment variables for the plugin").action(getPluginEnv);
22321
22382
  program.command("deploy").description("deploy a new version").addOption(new external_commander_namespaceObject.Option("-p, --platform <platform>", "specify the platform").choices([
22322
22383
  "ios",
22323
22384
  "android"
package/dist/index.js CHANGED
@@ -15717,13 +15717,7 @@ const deploy = async (options)=>{
15717
15717
  await databasePlugin.onUnmount?.();
15718
15718
  }
15719
15719
  };
15720
- const getPackageManager = ()=>{
15721
- const [packageManagerWithVersion] = process.env["npm_config_user_agent"]?.split(" ") ?? [];
15722
- if (!packageManagerWithVersion) return "npm";
15723
- const [packageManager] = packageManagerWithVersion.split("/");
15724
- if (!packageManager) return "npm";
15725
- return packageManager;
15726
- };
15720
+ const delay = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
15727
15721
  function isPlainObject(value) {
15728
15722
  if ('object' != typeof value || null === value) return false;
15729
15723
  const prototype = Object.getPrototypeOf(value);
@@ -21738,111 +21732,6 @@ createExeca(mapCommandSync);
21738
21732
  createExeca(mapNode);
21739
21733
  createExeca(mapScriptAsync, {}, deepScriptOptions, setScriptSync);
21740
21734
  const { sendMessage: execa_sendMessage, getOneMessage: execa_getOneMessage, getEachMessage: execa_getEachMessage, getCancelSignal: execa_getCancelSignal } = getIpcExport();
21741
- const ensurePackageVersion = (pkg)=>{
21742
- if ("hot-updater" === pkg || pkg.startsWith("@hot-updater/")) return `${pkg}@${packageJson_version}`;
21743
- return pkg;
21744
- };
21745
- const ensureInstallPackages = async (buildPluginPackages)=>{
21746
- const packages = await readPackageUp({
21747
- cwd: (0, __WEBPACK_EXTERNAL_MODULE__hot_updater_plugin_core__.getCwd)()
21748
- });
21749
- const dependenciesToInstall = buildPluginPackages.dependencies.filter((pkg)=>!packages?.packageJson?.dependencies?.[pkg]);
21750
- const devDependenciesToInstall = buildPluginPackages.devDependencies.filter((pkg)=>!packages?.packageJson?.devDependencies?.[pkg]);
21751
- const packageManager = getPackageManager();
21752
- await __WEBPACK_EXTERNAL_MODULE__clack_prompts__.tasks([
21753
- {
21754
- enabled: dependenciesToInstall.length > 0,
21755
- title: "Checking packages",
21756
- task: async (message)=>{
21757
- message(`Installing ${dependenciesToInstall.join(", ")}...`);
21758
- await execa(packageManager, [
21759
- "yarn" === packageManager ? "add" : "install",
21760
- ...dependenciesToInstall.map(ensurePackageVersion)
21761
- ]);
21762
- return `Installed ${dependenciesToInstall.join(", ")}`;
21763
- }
21764
- },
21765
- {
21766
- enabled: devDependenciesToInstall.length > 0,
21767
- title: "Installing dev dependencies",
21768
- task: async (message)=>{
21769
- message(`Installing ${devDependenciesToInstall.join(", ")}...`);
21770
- await execa(packageManager, [
21771
- "yarn" === packageManager ? "add" : "install",
21772
- ...devDependenciesToInstall.map(ensurePackageVersion),
21773
- "yarn" === packageManager ? "--dev" : "--save-dev"
21774
- ]);
21775
- return `Installed ${devDependenciesToInstall.join(", ")}`;
21776
- }
21777
- }
21778
- ]);
21779
- };
21780
- const delay = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
21781
- const makeEnv = async (newEnvVars, filePath = ".env")=>{
21782
- try {
21783
- const existingContent = await __WEBPACK_EXTERNAL_MODULE_fs_promises__["default"].readFile(filePath, "utf-8").catch(()=>"");
21784
- const lines = existingContent.split("\n");
21785
- const envVars = new Map();
21786
- const updatedLines = [];
21787
- for (const line of lines){
21788
- const trimmedLine = line.trim();
21789
- if (!trimmedLine || trimmedLine.startsWith("#")) updatedLines.push(line);
21790
- else {
21791
- const [key, ...rest] = line.split("=");
21792
- const value = rest.join("=");
21793
- if (key) {
21794
- const trimmedKey = key.trim();
21795
- envVars.set(trimmedKey, value?.trim() ?? "");
21796
- updatedLines.push(`${trimmedKey}=${newEnvVars[trimmedKey] ?? value}`);
21797
- }
21798
- }
21799
- }
21800
- for (const [key, value] of Object.entries(newEnvVars))if (!envVars.has(key)) updatedLines.push(`${key}=${value}`);
21801
- const updatedContent = updatedLines.join("\n");
21802
- await __WEBPACK_EXTERNAL_MODULE_fs_promises__["default"].writeFile(filePath, updatedContent, "utf-8");
21803
- return updatedContent;
21804
- } catch (error) {
21805
- console.error("Error while updating .env file:", error);
21806
- throw error;
21807
- }
21808
- };
21809
- function transformTemplate(templateString, values) {
21810
- let result = templateString;
21811
- for(const key in values){
21812
- const placeholder = `%%${key}%%`;
21813
- result = result.replace(new RegExp(placeholder, "g"), values[key]);
21814
- }
21815
- return result;
21816
- }
21817
- const CONFIG_TEMPLATE = `
21818
- import { metro } from "@hot-updater/metro";
21819
- import { supabaseDatabase, supabaseStorage } from "@hot-updater/supabase";
21820
- import { defineConfig } from "hot-updater";
21821
- import "dotenv/config";
21822
-
21823
- export default defineConfig({
21824
- build: metro(),
21825
- storage: supabaseStorage({
21826
- supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
21827
- supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
21828
- bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,
21829
- }),
21830
- database: supabaseDatabase({
21831
- supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
21832
- supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
21833
- }),
21834
- });
21835
- `;
21836
- const SOURCE_TEMPLATE = `// add this to your App.tsx
21837
- import { HotUpdater } from "@hot-updater/react-native";
21838
-
21839
- function App() {
21840
- return ...
21841
- }
21842
-
21843
- export default HotUpdater.wrap({
21844
- source: "%%source%%",
21845
- })(App);`;
21846
21735
  const selectOrCreateOrganization = async ()=>{
21847
21736
  const confirmed = await __WEBPACK_EXTERNAL_MODULE__clack_prompts__.confirm({
21848
21737
  message: "Do you already have a Supabase organization?",
@@ -21980,6 +21869,177 @@ const selectBucket = async (api)=>{
21980
21869
  }
21981
21870
  return selectedBucketId;
21982
21871
  };
21872
+ function transformTemplate(templateString, values) {
21873
+ let result = templateString;
21874
+ for(const key in values){
21875
+ const placeholder = `%%${key}%%`;
21876
+ result = result.replace(new RegExp(placeholder, "g"), values[key]);
21877
+ }
21878
+ return result;
21879
+ }
21880
+ const CONFIG_TEMPLATE = `
21881
+ HOT_UPDATER_SUPABASE_URL=%%HOT_UPDATER_SUPABASE_URL%%
21882
+ HOT_UPDATER_SUPABASE_ANON_KEY=%%HOT_UPDATER_SUPABASE_ANON_KEY%%
21883
+ HOT_UPDATER_SUPABASE_BUCKET_NAME=%%HOT_UPDATER_SUPABASE_BUCKET_NAME%%
21884
+ `;
21885
+ const getSupabaseEnv = async ()=>{
21886
+ const project = await selectProject();
21887
+ const spinner = __WEBPACK_EXTERNAL_MODULE__clack_prompts__.spinner();
21888
+ spinner.start(`Getting API keys for ${project.name}...`);
21889
+ let apiKeys = [];
21890
+ try {
21891
+ const keysProcess = await execa("npx", [
21892
+ "-y",
21893
+ "supabase",
21894
+ "projects",
21895
+ "api-keys",
21896
+ "--project-ref",
21897
+ project.id,
21898
+ "--output",
21899
+ "json"
21900
+ ]);
21901
+ apiKeys = JSON.parse(keysProcess.stdout ?? "[]");
21902
+ } catch (err) {
21903
+ spinner.stop();
21904
+ console.error("Failed to get API keys:", err);
21905
+ process.exit(1);
21906
+ }
21907
+ spinner.stop();
21908
+ const serviceRoleKey = apiKeys.find((key)=>"service_role" === key.name);
21909
+ if (!serviceRoleKey) throw new Error("Service role key not found");
21910
+ const { supabaseApi } = await import("@hot-updater/supabase");
21911
+ const api = supabaseApi(`https://${project.id}.supabase.co`, serviceRoleKey.api_key);
21912
+ const bucketId = await selectBucket(api);
21913
+ __WEBPACK_EXTERNAL_MODULE__clack_prompts__.log.message(transformTemplate(CONFIG_TEMPLATE, {
21914
+ HOT_UPDATER_SUPABASE_ANON_KEY: serviceRoleKey.api_key,
21915
+ HOT_UPDATER_SUPABASE_BUCKET_NAME: bucketId,
21916
+ HOT_UPDATER_SUPABASE_URL: `https://${project.id}.supabase.co`
21917
+ }));
21918
+ __WEBPACK_EXTERNAL_MODULE__clack_prompts__.outro("Please use these values for reference only and manage them through .env file.");
21919
+ };
21920
+ const getPluginEnv = async ()=>{
21921
+ printBanner();
21922
+ const provider = await (0, __WEBPACK_EXTERNAL_MODULE__clack_prompts__.select)({
21923
+ message: "Select a provider",
21924
+ options: [
21925
+ {
21926
+ value: "supabase",
21927
+ label: "Supabase"
21928
+ }
21929
+ ]
21930
+ });
21931
+ if ((0, __WEBPACK_EXTERNAL_MODULE__clack_prompts__.isCancel)(provider)) process.exit(0);
21932
+ switch(provider){
21933
+ case "supabase":
21934
+ await getSupabaseEnv();
21935
+ break;
21936
+ default:
21937
+ throw new Error("Invalid provider");
21938
+ }
21939
+ };
21940
+ const getPackageManager = ()=>{
21941
+ const [packageManagerWithVersion] = process.env["npm_config_user_agent"]?.split(" ") ?? [];
21942
+ if (!packageManagerWithVersion) return "npm";
21943
+ const [packageManager] = packageManagerWithVersion.split("/");
21944
+ if (!packageManager) return "npm";
21945
+ return packageManager;
21946
+ };
21947
+ const ensurePackageVersion = (pkg)=>{
21948
+ if ("hot-updater" === pkg || pkg.startsWith("@hot-updater/")) return `${pkg}@${packageJson_version}`;
21949
+ return pkg;
21950
+ };
21951
+ const ensureInstallPackages = async (buildPluginPackages)=>{
21952
+ const packages = await readPackageUp({
21953
+ cwd: (0, __WEBPACK_EXTERNAL_MODULE__hot_updater_plugin_core__.getCwd)()
21954
+ });
21955
+ const dependenciesToInstall = buildPluginPackages.dependencies.filter((pkg)=>!packages?.packageJson?.dependencies?.[pkg]);
21956
+ const devDependenciesToInstall = buildPluginPackages.devDependencies.filter((pkg)=>!packages?.packageJson?.devDependencies?.[pkg]);
21957
+ const packageManager = getPackageManager();
21958
+ await __WEBPACK_EXTERNAL_MODULE__clack_prompts__.tasks([
21959
+ {
21960
+ enabled: dependenciesToInstall.length > 0,
21961
+ title: "Checking packages",
21962
+ task: async (message)=>{
21963
+ message(`Installing ${dependenciesToInstall.join(", ")}...`);
21964
+ await execa(packageManager, [
21965
+ "yarn" === packageManager ? "add" : "install",
21966
+ ...dependenciesToInstall.map(ensurePackageVersion)
21967
+ ]);
21968
+ return `Installed ${dependenciesToInstall.join(", ")}`;
21969
+ }
21970
+ },
21971
+ {
21972
+ enabled: devDependenciesToInstall.length > 0,
21973
+ title: "Installing dev dependencies",
21974
+ task: async (message)=>{
21975
+ message(`Installing ${devDependenciesToInstall.join(", ")}...`);
21976
+ await execa(packageManager, [
21977
+ "yarn" === packageManager ? "add" : "install",
21978
+ ...devDependenciesToInstall.map(ensurePackageVersion),
21979
+ "yarn" === packageManager ? "--dev" : "--save-dev"
21980
+ ]);
21981
+ return `Installed ${devDependenciesToInstall.join(", ")}`;
21982
+ }
21983
+ }
21984
+ ]);
21985
+ };
21986
+ const makeEnv = async (newEnvVars, filePath = ".env")=>{
21987
+ try {
21988
+ const existingContent = await __WEBPACK_EXTERNAL_MODULE_fs_promises__["default"].readFile(filePath, "utf-8").catch(()=>"");
21989
+ const lines = existingContent.split("\n");
21990
+ const envVars = new Map();
21991
+ const updatedLines = [];
21992
+ for (const line of lines){
21993
+ const trimmedLine = line.trim();
21994
+ if (!trimmedLine || trimmedLine.startsWith("#")) updatedLines.push(line);
21995
+ else {
21996
+ const [key, ...rest] = line.split("=");
21997
+ const value = rest.join("=");
21998
+ if (key) {
21999
+ const trimmedKey = key.trim();
22000
+ envVars.set(trimmedKey, value?.trim() ?? "");
22001
+ updatedLines.push(`${trimmedKey}=${newEnvVars[trimmedKey] ?? value}`);
22002
+ }
22003
+ }
22004
+ }
22005
+ for (const [key, value] of Object.entries(newEnvVars))if (!envVars.has(key)) updatedLines.push(`${key}=${value}`);
22006
+ const updatedContent = updatedLines.join("\n");
22007
+ await __WEBPACK_EXTERNAL_MODULE_fs_promises__["default"].writeFile(filePath, updatedContent, "utf-8");
22008
+ return updatedContent;
22009
+ } catch (error) {
22010
+ console.error("Error while updating .env file:", error);
22011
+ throw error;
22012
+ }
22013
+ };
22014
+ const initSupabase_CONFIG_TEMPLATE = `
22015
+ import { metro } from "@hot-updater/metro";
22016
+ import { supabaseDatabase, supabaseStorage } from "@hot-updater/supabase";
22017
+ import { defineConfig } from "hot-updater";
22018
+ import "dotenv/config";
22019
+
22020
+ export default defineConfig({
22021
+ build: metro(),
22022
+ storage: supabaseStorage({
22023
+ supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
22024
+ supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
22025
+ bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,
22026
+ }),
22027
+ database: supabaseDatabase({
22028
+ supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
22029
+ supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
22030
+ }),
22031
+ });
22032
+ `;
22033
+ const SOURCE_TEMPLATE = `// add this to your App.tsx
22034
+ import { HotUpdater } from "@hot-updater/react-native";
22035
+
22036
+ function App() {
22037
+ return ...
22038
+ }
22039
+
22040
+ export default HotUpdater.wrap({
22041
+ source: "%%source%%",
22042
+ })(App);`;
21983
22043
  const linkSupabase = async (supabasePath, projectId)=>{
21984
22044
  const spinner = __WEBPACK_EXTERNAL_MODULE__clack_prompts__.spinner();
21985
22045
  spinner.start("Linking Supabase...");
@@ -22089,7 +22149,7 @@ const initSupabase = async ()=>{
22089
22149
  await linkSupabase(supabasePath, project.id);
22090
22150
  await pushDB(supabasePath);
22091
22151
  await deployEdgeFunction(supabasePath, project.id);
22092
- await __WEBPACK_EXTERNAL_MODULE_fs_promises__["default"].writeFile("hot-updater.config.ts", CONFIG_TEMPLATE);
22152
+ await __WEBPACK_EXTERNAL_MODULE_fs_promises__["default"].writeFile("hot-updater.config.ts", initSupabase_CONFIG_TEMPLATE);
22093
22153
  await makeEnv({
22094
22154
  HOT_UPDATER_SUPABASE_ANON_KEY: serviceRoleKey.api_key,
22095
22155
  HOT_UPDATER_SUPABASE_BUCKET_NAME: bucketId,
@@ -22214,6 +22274,7 @@ const prune = async ()=>{
22214
22274
  const program = new __WEBPACK_EXTERNAL_MODULE_commander__.Command();
22215
22275
  program.name("hot-updater").description(banner).version(packageJson_version);
22216
22276
  program.command("init").description("Initialize Hot Updater").action(init_init);
22277
+ program.command("get-plugin-env").description("Get the environment variables for the plugin").action(getPluginEnv);
22217
22278
  program.command("deploy").description("deploy a new version").addOption(new __WEBPACK_EXTERNAL_MODULE_commander__.Option("-p, --platform <platform>", "specify the platform").choices([
22218
22279
  "ios",
22219
22280
  "android"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hot-updater",
3
3
  "type": "module",
4
- "version": "0.5.8",
4
+ "version": "0.5.9",
5
5
  "bin": {
6
6
  "hot-updater": "./dist/index.js"
7
7
  },
@@ -39,9 +39,9 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@clack/prompts": "^0.9.0",
42
- "@hot-updater/console": "0.5.8",
43
- "@hot-updater/core": "0.5.8",
44
- "@hot-updater/plugin-core": "0.5.8",
42
+ "@hot-updater/console": "0.5.9",
43
+ "@hot-updater/core": "0.5.9",
44
+ "@hot-updater/plugin-core": "0.5.9",
45
45
  "commander": "^11.1.0",
46
46
  "cosmiconfig": "^9.0.0",
47
47
  "cosmiconfig-typescript-loader": "^5.0.0"