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.
- package/dist/commands/getPluginEnv/getSupabaseEnv.d.ts +1 -0
- package/dist/commands/getPluginEnv/index.d.ts +1 -0
- package/dist/commands/init/index.d.ts +1 -0
- package/dist/commands/supabase/select.d.ts +8 -0
- package/dist/index.cjs +174 -113
- package/dist/index.js +174 -113
- package/package.json +4 -4
- /package/dist/commands/init/{supabase.d.ts → initSupabase.d.ts} +0 -0
|
@@ -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
|
|
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",
|
|
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
|
|
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",
|
|
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.
|
|
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.
|
|
43
|
-
"@hot-updater/core": "0.5.
|
|
44
|
-
"@hot-updater/plugin-core": "0.5.
|
|
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"
|
|
File without changes
|