@geekapps/auth-nextjs 0.8.0 → 0.11.0
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/cli/actions.d.ts +1 -0
- package/dist/cli/actions.js +129 -0
- package/dist/cli/actions.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli/actions.ts
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
5
|
+
import { resolve } from "path";
|
|
6
|
+
var DEFAULT_ISSUER = "https://accounts-api.geekapps.com.br";
|
|
7
|
+
var DEFAULT_MANIFEST = "geekapps-actions.json";
|
|
8
|
+
var METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
|
|
9
|
+
function env(name) {
|
|
10
|
+
const value = process.env[name];
|
|
11
|
+
return value && value.trim().length > 0 ? value : void 0;
|
|
12
|
+
}
|
|
13
|
+
function fail(message) {
|
|
14
|
+
console.error(`
|
|
15
|
+
\u2717 ${message}
|
|
16
|
+
`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
var args = process.argv.slice(2);
|
|
20
|
+
var command = args[0];
|
|
21
|
+
function flag(name) {
|
|
22
|
+
const index = args.indexOf(`--${name}`);
|
|
23
|
+
return index !== -1 ? args[index + 1] : void 0;
|
|
24
|
+
}
|
|
25
|
+
function manifestPath() {
|
|
26
|
+
return resolve(process.cwd(), flag("manifest") ?? DEFAULT_MANIFEST);
|
|
27
|
+
}
|
|
28
|
+
function loadManifest() {
|
|
29
|
+
const path = manifestPath();
|
|
30
|
+
if (!existsSync(path)) return { actions: [] };
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
33
|
+
if (!Array.isArray(parsed.actions)) throw new Error('falta o array "actions"');
|
|
34
|
+
return parsed;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
return fail(`manifesto invalido em ${path}: ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function saveManifest(manifest) {
|
|
40
|
+
manifest.actions.sort((a, b) => a.key.localeCompare(b.key));
|
|
41
|
+
writeFileSync(manifestPath(), `${JSON.stringify(manifest, null, 2)}
|
|
42
|
+
`, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
function readSchemaFile(name) {
|
|
45
|
+
const file = flag(name);
|
|
46
|
+
if (!file) return void 0;
|
|
47
|
+
try {
|
|
48
|
+
return JSON.parse(readFileSync(resolve(process.cwd(), file), "utf-8"));
|
|
49
|
+
} catch (error) {
|
|
50
|
+
return fail(`nao consegui ler o schema de --${name} (${file}): ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function syncAction(action) {
|
|
54
|
+
const issuer = (env("GEEKAPPS_AUTH_SERVER_ISSUER") ?? env("GEEKAPPS_AUTH_SERVER_URL") ?? DEFAULT_ISSUER).replace(
|
|
55
|
+
/\/$/,
|
|
56
|
+
""
|
|
57
|
+
);
|
|
58
|
+
const clientId = env("GEEKAPPS_AUTH_CLIENT_ID");
|
|
59
|
+
const clientSecret = env("GEEKAPPS_AUTH_CLIENT_SECRET");
|
|
60
|
+
if (!clientId || !clientSecret) {
|
|
61
|
+
fail("GEEKAPPS_AUTH_CLIENT_ID e GEEKAPPS_AUTH_CLIENT_SECRET precisam estar definidos \u2014 e sao desta app (a que expoe as acoes).");
|
|
62
|
+
}
|
|
63
|
+
const credentials = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
|
|
64
|
+
const response = await fetch(`${issuer}/connections/${encodeURIComponent(clientId)}/actions`, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: { authorization: `Basic ${credentials}`, "content-type": "application/json" },
|
|
67
|
+
body: JSON.stringify(action)
|
|
68
|
+
}).catch((error) => fail(`nao consegui falar com o auth-server em ${issuer}: ${error.message}`));
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const detail = await response.text().catch(() => "");
|
|
71
|
+
const hint = response.status === 409 ? " (a key ja pertence a outra app \u2014 prefixe com o slug da sua: <app>.<acao>)" : "";
|
|
72
|
+
fail(`${action.key}: auth-server respondeu ${response.status}${hint}. ${detail}`);
|
|
73
|
+
}
|
|
74
|
+
console.log(`\u2713 ${action.key} ${action.method} ${action.path}`);
|
|
75
|
+
}
|
|
76
|
+
async function syncAll(manifest) {
|
|
77
|
+
if (manifest.actions.length === 0) {
|
|
78
|
+
console.warn("! Manifesto vazio \u2014 nada a sincronizar.");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
for (const action of manifest.actions) await syncAction(action);
|
|
82
|
+
console.log(`
|
|
83
|
+
\u2192 ${manifest.actions.length} acao(oes) publicada(s). O admin da app consumidora ja pode pedir a conexao.
|
|
84
|
+
`);
|
|
85
|
+
}
|
|
86
|
+
async function add() {
|
|
87
|
+
const key = flag("key");
|
|
88
|
+
const label = flag("label");
|
|
89
|
+
const method = flag("method")?.toUpperCase();
|
|
90
|
+
const path = flag("path");
|
|
91
|
+
if (!key || !label || !method || !path) {
|
|
92
|
+
fail('uso: geekapps-actions add --key <app.acao> --label "<texto do consent>" --method <GET|POST|...> --path </rota>');
|
|
93
|
+
}
|
|
94
|
+
if (!METHODS.includes(method)) fail(`--method deve ser um de ${METHODS.join(", ")}`);
|
|
95
|
+
if (!path.startsWith("/")) fail("--path deve comecar com /");
|
|
96
|
+
const action = { key, label, method, path };
|
|
97
|
+
const icon = flag("icon");
|
|
98
|
+
if (icon) action.icon = icon;
|
|
99
|
+
const payloadSchema = readSchemaFile("payload");
|
|
100
|
+
if (payloadSchema !== void 0) action.payloadSchema = payloadSchema;
|
|
101
|
+
const responseSchema = readSchemaFile("response");
|
|
102
|
+
if (responseSchema !== void 0) action.responseSchema = responseSchema;
|
|
103
|
+
const manifest = loadManifest();
|
|
104
|
+
const index = manifest.actions.findIndex((a) => a.key === key);
|
|
105
|
+
if (index === -1) manifest.actions.push(action);
|
|
106
|
+
else manifest.actions[index] = action;
|
|
107
|
+
saveManifest(manifest);
|
|
108
|
+
console.log(`${index === -1 ? "+" : "~"} ${key} gravada em ${manifestPath()}`);
|
|
109
|
+
if (!args.includes("--no-sync")) await syncAction(action);
|
|
110
|
+
}
|
|
111
|
+
function list() {
|
|
112
|
+
const { actions } = loadManifest();
|
|
113
|
+
if (actions.length === 0) return console.log("Manifesto vazio.");
|
|
114
|
+
for (const a of actions) console.log(`${a.key.padEnd(40)} ${a.method.padEnd(6)} ${a.path} \u2014 ${a.label}`);
|
|
115
|
+
}
|
|
116
|
+
async function main() {
|
|
117
|
+
switch (command) {
|
|
118
|
+
case "add":
|
|
119
|
+
return add();
|
|
120
|
+
case "sync":
|
|
121
|
+
return syncAll(loadManifest());
|
|
122
|
+
case "list":
|
|
123
|
+
return list();
|
|
124
|
+
default:
|
|
125
|
+
return fail("uso: geekapps-actions <add|sync|list> (veja o cabecalho do arquivo para as flags)");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
main().catch((error) => fail(error.message));
|
|
129
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/actions.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * `npx geekapps-actions` — expõe rotas desta app como ações de App Connections.\n *\n * O lado oposto de `geekapps-connections`: aquele CONSOME ações de outras apps,\n * este PUBLICA as ações desta app para que outras possam pedir conexão.\n *\n * As ações vivem num manifesto versionado junto do código\n * (`geekapps-actions.json`), então a rota e sua declaração mudam no mesmo\n * commit. O auth-server é atualizado por upsert (idempotente, por `key`).\n *\n * geekapps-actions add --key billing.charges.create --label \"Criar cobranças\" \\\n * --method POST --path /charges [--icon CreditCard] \\\n * [--payload schema.json] [--response schema.json]\n * geekapps-actions sync # envia todo o manifesto ao auth-server\n * geekapps-actions list # mostra o manifesto\n *\n * `add` grava no manifesto e já sincroniza (use --no-sync para só gravar).\n * Autentica com GEEKAPPS_AUTH_CLIENT_ID / _SECRET: esta app só publica ações\n * em seu próprio nome.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\ntype ActionDefinition = {\n key: string;\n label: string;\n method: string;\n path: string;\n icon?: string;\n payloadSchema?: unknown;\n responseSchema?: unknown;\n};\n\ntype Manifest = { actions: ActionDefinition[] };\n\nconst DEFAULT_ISSUER = \"https://accounts-api.geekapps.com.br\";\nconst DEFAULT_MANIFEST = \"geekapps-actions.json\";\nconst METHODS = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\nfunction env(name: string) {\n const value = process.env[name];\n return value && value.trim().length > 0 ? value : undefined;\n}\n\nfunction fail(message: string): never {\n console.error(`\\n✗ ${message}\\n`);\n process.exit(1);\n}\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction flag(name: string) {\n const index = args.indexOf(`--${name}`);\n return index !== -1 ? args[index + 1] : undefined;\n}\n\nfunction manifestPath() {\n return resolve(process.cwd(), flag(\"manifest\") ?? DEFAULT_MANIFEST);\n}\n\nfunction loadManifest(): Manifest {\n const path = manifestPath();\n if (!existsSync(path)) return { actions: [] };\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\")) as Manifest;\n if (!Array.isArray(parsed.actions)) throw new Error('falta o array \"actions\"');\n return parsed;\n } catch (error) {\n return fail(`manifesto invalido em ${path}: ${(error as Error).message}`);\n }\n}\n\nfunction saveManifest(manifest: Manifest) {\n manifest.actions.sort((a, b) => a.key.localeCompare(b.key));\n writeFileSync(manifestPath(), `${JSON.stringify(manifest, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction readSchemaFile(name: string) {\n const file = flag(name);\n if (!file) return undefined;\n try {\n return JSON.parse(readFileSync(resolve(process.cwd(), file), \"utf-8\"));\n } catch (error) {\n return fail(`nao consegui ler o schema de --${name} (${file}): ${(error as Error).message}`);\n }\n}\n\nasync function syncAction(action: ActionDefinition) {\n const issuer = (env(\"GEEKAPPS_AUTH_SERVER_ISSUER\") ?? env(\"GEEKAPPS_AUTH_SERVER_URL\") ?? DEFAULT_ISSUER).replace(\n /\\/$/,\n \"\",\n );\n const clientId = env(\"GEEKAPPS_AUTH_CLIENT_ID\");\n const clientSecret = env(\"GEEKAPPS_AUTH_CLIENT_SECRET\");\n if (!clientId || !clientSecret) {\n fail(\"GEEKAPPS_AUTH_CLIENT_ID e GEEKAPPS_AUTH_CLIENT_SECRET precisam estar definidos — e sao desta app (a que expoe as acoes).\");\n }\n\n const credentials = Buffer.from(`${clientId}:${clientSecret}`).toString(\"base64\");\n const response = await fetch(`${issuer}/connections/${encodeURIComponent(clientId)}/actions`, {\n method: \"POST\",\n headers: { authorization: `Basic ${credentials}`, \"content-type\": \"application/json\" },\n body: JSON.stringify(action),\n }).catch((error) => fail(`nao consegui falar com o auth-server em ${issuer}: ${(error as Error).message}`));\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n const hint =\n response.status === 409\n ? \" (a key ja pertence a outra app — prefixe com o slug da sua: <app>.<acao>)\"\n : \"\";\n fail(`${action.key}: auth-server respondeu ${response.status}${hint}. ${detail}`);\n }\n\n console.log(`✓ ${action.key} ${action.method} ${action.path}`);\n}\n\nasync function syncAll(manifest: Manifest) {\n if (manifest.actions.length === 0) {\n console.warn(\"! Manifesto vazio — nada a sincronizar.\");\n return;\n }\n for (const action of manifest.actions) await syncAction(action);\n console.log(`\\n→ ${manifest.actions.length} acao(oes) publicada(s). O admin da app consumidora ja pode pedir a conexao.\\n`);\n}\n\nasync function add() {\n const key = flag(\"key\");\n const label = flag(\"label\");\n const method = flag(\"method\")?.toUpperCase();\n const path = flag(\"path\");\n\n if (!key || !label || !method || !path) {\n fail('uso: geekapps-actions add --key <app.acao> --label \"<texto do consent>\" --method <GET|POST|...> --path </rota>');\n }\n if (!METHODS.includes(method)) fail(`--method deve ser um de ${METHODS.join(\", \")}`);\n if (!path.startsWith(\"/\")) fail(\"--path deve comecar com /\");\n\n const action: ActionDefinition = { key, label, method, path };\n const icon = flag(\"icon\");\n if (icon) action.icon = icon;\n const payloadSchema = readSchemaFile(\"payload\");\n if (payloadSchema !== undefined) action.payloadSchema = payloadSchema;\n const responseSchema = readSchemaFile(\"response\");\n if (responseSchema !== undefined) action.responseSchema = responseSchema;\n\n const manifest = loadManifest();\n const index = manifest.actions.findIndex((a) => a.key === key);\n if (index === -1) manifest.actions.push(action);\n else manifest.actions[index] = action;\n saveManifest(manifest);\n console.log(`${index === -1 ? \"+\" : \"~\"} ${key} gravada em ${manifestPath()}`);\n\n if (!args.includes(\"--no-sync\")) await syncAction(action);\n}\n\nfunction list() {\n const { actions } = loadManifest();\n if (actions.length === 0) return console.log(\"Manifesto vazio.\");\n for (const a of actions) console.log(`${a.key.padEnd(40)} ${a.method.padEnd(6)} ${a.path} — ${a.label}`);\n}\n\nasync function main() {\n switch (command) {\n case \"add\":\n return add();\n case \"sync\":\n return syncAll(loadManifest());\n case \"list\":\n return list();\n default:\n return fail(\"uso: geekapps-actions <add|sync|list> (veja o cabecalho do arquivo para as flags)\");\n }\n}\n\nmain().catch((error) => fail((error as Error).message));\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekapps/auth-nextjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"types": "/dist",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"typescript": "^5.0.0"
|
|
50
50
|
},
|
|
51
51
|
"bin": {
|
|
52
|
-
"geekapps-connections": "./dist/cli/generate-connections.js"
|
|
52
|
+
"geekapps-connections": "./dist/cli/generate-connections.js",
|
|
53
|
+
"geekapps-actions": "./dist/cli/actions.js"
|
|
53
54
|
}
|
|
54
55
|
}
|