@mauroandre/weave-sdk 0.0.3 → 0.0.4

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.d.ts CHANGED
@@ -23,6 +23,8 @@ interface ParsedArgs {
23
23
  command: string;
24
24
  config: string;
25
25
  confirm: Record<string, string[]>;
26
+ /** `--confirm all`: aceita TODAS as remoções (risco confirm) de uma vez. */
27
+ confirmAll: boolean;
26
28
  fill: Record<string, Record<string, unknown>>;
27
29
  renames: Record<string, Record<string, string>>;
28
30
  /** `--no-gen`: após o push, NÃO re-sincroniza os arquivos locais (CI, read-only). */
package/dist/cli.js CHANGED
@@ -72,14 +72,18 @@ function splitEntity(s) {
72
72
  return i < 0 ? [s, ""] : [s.slice(0, i), s.slice(i + 1)];
73
73
  }
74
74
  function parseArgs(argv) {
75
- const out = { command: argv[0] ?? "", config: "weave.config.ts", confirm: {}, fill: {}, renames: {}, noGen: false };
75
+ const out = { command: argv[0] ?? "", config: "weave.config.ts", confirm: {}, confirmAll: false, fill: {}, renames: {}, noGen: false };
76
76
  for (let i = 1; i < argv.length; i++) {
77
77
  const a = argv[i];
78
78
  if (a === "--config") out.config = argv[++i] ?? out.config;
79
79
  else if (a === "--no-gen") out.noGen = true;
80
80
  else if (a === "--confirm") {
81
- const [e, p] = splitEntity(argv[++i]);
82
- if (e && p) (out.confirm[e] ??= []).push(p);
81
+ const val = argv[++i];
82
+ if (val === "all") out.confirmAll = true;
83
+ else {
84
+ const [e, p] = splitEntity(val);
85
+ if (e && p) (out.confirm[e] ??= []).push(p);
86
+ }
83
87
  } else if (a === "--fill") {
84
88
  const [ep, v = ""] = (argv[++i] ?? "").split(/=(.*)/s);
85
89
  const [e, p] = splitEntity(ep);
@@ -143,19 +147,54 @@ async function runCli(argv, deps = {}) {
143
147
  log(`No entities found in ${dirRel}/entities.`);
144
148
  return 1;
145
149
  }
146
- const res = await pushEntities(entities, {
150
+ let res = await pushEntities(entities, {
147
151
  ...net,
148
152
  confirm: args.confirm,
149
153
  fill: args.fill,
150
154
  renames: args.renames
151
155
  });
156
+ if (args.confirmAll && res.review.some((r) => r.plan.changes.some((c) => c.risk === "confirm"))) {
157
+ const confirm = { ...args.confirm };
158
+ for (const r of res.review) {
159
+ for (const c of r.plan.changes) {
160
+ if (c.risk === "confirm") (confirm[r.name] ??= []).push(c.path);
161
+ }
162
+ }
163
+ res = await pushEntities(entities, { ...net, confirm, fill: args.fill, renames: args.renames });
164
+ }
152
165
  for (const n of res.applied) log(` \u{1F7E2} ${n} applied`);
166
+ const cmds = [];
167
+ let hasBlocked = false;
168
+ let hasRemove = false;
153
169
  for (const r of res.review) {
154
170
  log(` \u26A0 ${r.name} \u2014 needs review:`);
155
- for (const c of r.plan.changes) log(` ${riskIcon(c.risk)} ${c.op} ${c.path} (${c.risk})`);
171
+ for (const c of r.plan.changes) {
172
+ const target = `${r.name}.${c.path}`;
173
+ const flag = c.risk === "confirm" ? `--confirm ${target}` : c.risk === "needsValue" ? `--fill ${target}=<value>` : "";
174
+ if (flag) cmds.push(flag);
175
+ if (c.op === "removeField") hasRemove = true;
176
+ if (c.risk === "blocked") hasBlocked = true;
177
+ const hint = c.risk === "confirm" ? `deletes its data \u2014 allow with ${flag}` : c.risk === "needsValue" ? `needs a value \u2014 provide with ${flag}` : c.risk === "blocked" ? "not supported by push \u2014 revert it, or fix the data in the browser" : "";
178
+ log(` ${riskIcon(c.risk)} ${c.op} ${target}${hint ? ` \u2014 ${hint}` : ""}`);
179
+ }
156
180
  }
157
181
  if (res.review.length > 0) {
158
- log("Run again with --confirm / --fill / --rename to apply the gated changes.");
182
+ if (cmds.length) {
183
+ log("");
184
+ log("Re-run with the flag(s) above to apply \u2014 the target is always `entity.field`, e.g.:");
185
+ log(` weave push ${cmds.join(" ")}`);
186
+ if (cmds.filter((f) => f.startsWith("--confirm")).length > 1) {
187
+ log(" (or weave push --confirm all to accept every drop at once)");
188
+ }
189
+ }
190
+ if (hasRemove) {
191
+ log("");
192
+ log("Renamed, not removed? Use --rename entity.oldField=newField to keep the data.");
193
+ }
194
+ if (hasBlocked) {
195
+ log("");
196
+ log("\u26D4 Blocked changes can't be forced \u2014 they hold the whole entity. Revert them or fix the data first.");
197
+ }
159
198
  return 1;
160
199
  }
161
200
  log(`\u2713 pushed ${res.applied.length} ${res.applied.length === 1 ? "entity" : "entities"}.`);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/discover.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { createJiti } from \"jiti\";\nimport { discoverEntities, discoverScopes, type ModuleLoader } from \"./discover.js\";\nimport { pushEntities } from \"./push.js\";\nimport { pushScopes } from \"./scope.js\";\nimport { pullEntities, genProject } from \"./gen.js\";\nimport { DEFAULT_DIR, type WeaveConfig } from \"./config.js\";\n\n// Barrel node-only (`@mauroandre/weave-sdk/cli`): a descoberta usa `node:fs`, então\n// fica fora do barrel principal (que é portável p/ browser).\nexport { discoverEntities, discoverScopes, type ModuleLoader } from \"./discover.js\";\n\n/** Escreve um arquivo (criando dirs). Injetável pra teste. */\nasync function defaultWrite(file: string, content: string): Promise<void> {\n const fs = await import(\"node:fs/promises\");\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, \"utf8\");\n}\n\n/** Apaga uma pasta recursivamente (idempotente). Injetável pra teste. */\nasync function defaultClean(dir: string): Promise<void> {\n const fs = await import(\"node:fs/promises\");\n await fs.rm(dir, { recursive: true, force: true });\n}\n\n// Loader padrão: jiti carrega os `.ts` do dev (weave.config.ts + entidades) em\n// runtime — resolve type-stripping e o `import \"./x.js\"` → `x.ts` que o Node puro\n// não faz. Criado uma vez, sob demanda. Injetável (os testes passam o próprio load).\nlet jiti: ReturnType<typeof createJiti> | null = null;\nconst defaultLoad: ModuleLoader = (p) => {\n jiti ??= createJiti(import.meta.url);\n return jiti.import(p) as Promise<{ default?: unknown }>;\n};\n\n/** Carrega o `.env` do projeto pro process.env (built-in do Node). Silencioso se não houver. */\nfunction loadEnv(cwd: string): Record<string, string | undefined> {\n try {\n process.loadEnvFile(path.resolve(cwd, \".env\"));\n } catch {\n /* sem .env — segue com o ambiente atual */\n }\n return process.env;\n}\nimport type { FetchLike } from \"./client.js\";\n\n// CLI `weave`. Comandos: `gen` (server → pasta weave/: entidades com $id, scopes,\n// barrels e client — overwrite cego), `push` (código → server, plan/apply em ordem\n// de dep), `pull` (legado: só entidades). url/key vêm do ambiente (WEAVE_URL/\n// WEAVE_KEY); a pasta de destino do `weave.config.ts` (`dir`, default \"weave\").\n// Flags: --config, --confirm, --fill, --rename. Carrega TS via runtime TS-capaz\n// (Node 22.6+ com --experimental-strip-types, ou tsx/jiti).\n\nexport interface ParsedArgs {\n command: string;\n config: string;\n confirm: Record<string, string[]>;\n fill: Record<string, Record<string, unknown>>;\n renames: Record<string, Record<string, string>>;\n /** `--no-gen`: após o push, NÃO re-sincroniza os arquivos locais (CI, read-only). */\n noGen: boolean;\n}\n\n/** \"product.legacy\" → [\"product\", \"legacy\"]; \"product.items.qty\" → [\"product\",\"items.qty\"]. */\nfunction splitEntity(s: string | undefined): [string, string] {\n if (!s) return [\"\", \"\"];\n const i = s.indexOf(\".\");\n return i < 0 ? [s, \"\"] : [s.slice(0, i), s.slice(i + 1)];\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { command: argv[0] ?? \"\", config: \"weave.config.ts\", confirm: {}, fill: {}, renames: {}, noGen: false };\n for (let i = 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--config\") out.config = argv[++i] ?? out.config;\n else if (a === \"--no-gen\") out.noGen = true;\n else if (a === \"--confirm\") {\n const [e, p] = splitEntity(argv[++i]);\n if (e && p) (out.confirm[e] ??= []).push(p);\n } else if (a === \"--fill\") {\n const [ep, v = \"\"] = (argv[++i] ?? \"\").split(/=(.*)/s);\n const [e, p] = splitEntity(ep);\n if (e && p) (out.fill[e] ??= {})[p] = v;\n } else if (a === \"--rename\") {\n const [ep, to = \"\"] = (argv[++i] ?? \"\").split(/=(.*)/s);\n const [e, p] = splitEntity(ep);\n if (e && p && to) (out.renames[e] ??= {})[p] = to;\n }\n }\n return out;\n}\n\nexport interface CliDeps {\n /** Importador de módulo (config + entidades). Default: dynamic import. */\n load?: ModuleLoader;\n /** Transporte HTTP. Default: globalThis.fetch. */\n fetch?: FetchLike;\n /** Escreve arquivo (pull/gen). Default: fs. */\n write?: (file: string, content: string) => Promise<void>;\n /** Apaga pasta (gen, antes de reescrever). Default: fs.rm. */\n clean?: (dir: string) => Promise<void>;\n /** Variáveis de ambiente (WEAVE_URL/WEAVE_KEY). Default: process.env. */\n env?: Record<string, string | undefined>;\n cwd?: string;\n log?: (msg: string) => void;\n}\n\nconst riskIcon = (r: string): string =>\n r === \"auto\" ? \"🟢\" : r === \"confirm\" ? \"🔴\" : r === \"needsValue\" ? \"🟡\" : \"⛔\";\n\n/** Roda o CLI. Devolve o exit code (0 ok; 1 erro / precisa de revisão). */\nexport async function runCli(argv: string[], deps: CliDeps = {}): Promise<number> {\n const args = parseArgs(argv);\n const log = deps.log ?? ((m: string) => console.log(m));\n const cwd = deps.cwd ?? process.cwd();\n const load: ModuleLoader = deps.load ?? defaultLoad;\n const env = deps.env ?? loadEnv(cwd);\n\n if (![\"push\", \"pull\", \"gen\"].includes(args.command)) {\n log(`Unknown command '${args.command}'. Try: weave push | pull | gen`);\n return 1;\n }\n\n const url = env[\"WEAVE_URL\"];\n const key = env[\"WEAVE_KEY\"];\n if (!url || !key) {\n log(\"Set WEAVE_URL and WEAVE_KEY in the environment.\");\n return 1;\n }\n\n // Config é opcional (só `dir`, default \"weave\"); ausente/ilegível → defaults.\n const configPath = path.resolve(cwd, args.config);\n let config: WeaveConfig = {};\n try {\n config = ((await load(configPath)).default ?? {}) as WeaveConfig;\n } catch {\n /* sem weave.config.ts — usa defaults */\n }\n const dirRel = config.dir ?? DEFAULT_DIR;\n const dir = path.resolve(cwd, dirRel);\n const entitiesDir = path.join(dir, \"entities\");\n const net = { url, key, ...(deps.fetch ? { fetch: deps.fetch } : {}) };\n const write = deps.write ?? defaultWrite;\n const clean = deps.clean ?? defaultClean;\n\n // Regenera a pasta weave/ a partir do server (overwrite cego). Usado pelo `gen`\n // e ao fim do `push` (re-sincroniza os $id recém-cunhados), salvo `--no-gen`.\n const regen = async (): Promise<void> => {\n const { files, entities, scopes } = await genProject(net);\n await clean(path.join(dir, \"entities\"));\n await clean(path.join(dir, \"scopes\"));\n for (const [rel, content] of Object.entries(files)) await write(path.join(dir, rel), content);\n log(`✓ generated ${entities.length} ${entities.length === 1 ? \"entity\" : \"entities\"}, ${scopes.length} ${scopes.length === 1 ? \"scope\" : \"scopes\"} → ${dirRel}/`);\n };\n\n // gen: server → pasta weave/ inteira (arquivos com $id, scopes resolvidos, barrels, client).\n if (args.command === \"gen\") {\n await regen();\n return 0;\n }\n\n // pull (legado): puxa os IRs remotos → escreve os arquivos de entidade (sem $id).\n if (args.command === \"pull\") {\n const { files, names } = await pullEntities(net);\n for (const [file, content] of Object.entries(files)) await write(path.join(entitiesDir, file), content);\n log(`✓ pulled ${names.length} ${names.length === 1 ? \"entity\" : \"entities\"} → ${dirRel}/entities`);\n return 0;\n }\n\n // push: tudo vai — entidades primeiro (cunham/fixam ids), depois scopes (resolvem\n // nome→id contra o server), e por fim o gen re-sincroniza os arquivos locais.\n const entities = await discoverEntities(entitiesDir, load);\n if (Object.keys(entities).length === 0) {\n log(`No entities found in ${dirRel}/entities.`);\n return 1;\n }\n\n const res = await pushEntities(entities, {\n ...net,\n confirm: args.confirm,\n fill: args.fill,\n renames: args.renames,\n });\n\n for (const n of res.applied) log(` 🟢 ${n} applied`);\n for (const r of res.review) {\n log(` ⚠ ${r.name} — needs review:`);\n for (const c of r.plan.changes) log(` ${riskIcon(c.risk)} ${c.op} ${c.path} (${c.risk})`);\n }\n // Mudanças bloqueadas no gate → para aqui; scopes/gen ficam pra quando aplicar.\n if (res.review.length > 0) {\n log(\"Run again with --confirm / --fill / --rename to apply the gated changes.\");\n return 1;\n }\n log(`✓ pushed ${res.applied.length} ${res.applied.length === 1 ? \"entity\" : \"entities\"}.`);\n\n // Scopes (só depois das entidades aplicadas — o push resolve nome→id no server).\n const scopes = await discoverScopes(path.join(dir, \"scopes\"), load);\n if (Object.keys(scopes).length > 0) {\n const { pushed } = await pushScopes(scopes, net);\n log(`✓ pushed ${pushed.length} ${pushed.length === 1 ? \"scope\" : \"scopes\"}.`);\n }\n\n // Re-sincroniza os arquivos locais (ids recém-cunhados), salvo --no-gen.\n if (!args.noGen) await regen();\n return 0;\n}\n\nexport async function main(): Promise<void> {\n process.exit(await runCli(process.argv.slice(2)));\n}\n\n// Executado direto (bin) → roda o main. `realpathSync` resolve o symlink do bin\n// (node_modules/.bin/weave → dist/cli.js); sem isso, rodar via o symlink não bate\n// com `import.meta.url` (caminho real) e o main nunca rodava.\nif (process.argv[1]) {\n try {\n const invoked = pathToFileURL(realpathSync(process.argv[1])).href;\n if (invoked === import.meta.url) void main();\n } catch {\n /* não foi possível resolver o caminho — não é uma invocação direta */\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Entity, ShapeRecord } from \"@mauroandre/weave-core\";\nimport type { ScopeDef } from \"./scope.js\";\n\n// Descoberta por pasta (file-based, igual o VeloJS acha rotas): cada arquivo é uma\n// entidade, exportada como `default`. Node-only (usa fs) — fora do barrel do SDK.\n\n/** Importa um módulo por caminho absoluto. Injetável (a CLI usa um loader de TS). */\nexport type ModuleLoader = (absPath: string) => Promise<{ default?: unknown }>;\n\nconst isEntity = (v: unknown): v is Entity<string, ShapeRecord> =>\n !!v && typeof v === \"object\" && \"name\" in v && \"columns\" in v;\n\n/**\n * Lê a pasta de entidades, importa o `default` de cada arquivo, e monta o objeto\n * `entities` chaveado pelo nome da entidade — o mesmo que o `pushEntities`/`createClient`\n * consomem. Ignora arquivos sem `export default defineEntity(...)`.\n */\nexport async function discoverEntities(\n entitiesDir: string,\n load: ModuleLoader = (p) => import(pathToFileURL(p).href),\n): Promise<Record<string, Entity<string, ShapeRecord>>> {\n const files = (await fs.readdir(entitiesDir))\n .filter((f) => /\\.(ts|tsx|mts|js|mjs)$/.test(f) && !f.endsWith(\".d.ts\"))\n .sort();\n\n const entities: Record<string, Entity<string, ShapeRecord>> = {};\n for (const f of files) {\n const mod = await load(path.resolve(entitiesDir, f));\n if (isEntity(mod.default)) entities[mod.default.name] = mod.default;\n }\n return entities;\n}\n\nconst isScope = (v: unknown): v is ScopeDef =>\n !!v && typeof v === \"object\" && \"name\" in v && \"entities\" in v && !(\"columns\" in v);\n\n/**\n * Lê a pasta de scopes (1 arquivo = 1 scope, `export default defineScope(...)`),\n * chaveando pelo nome do scope. Pasta ausente → `{}` (scopes são opcionais). O\n * barrel `index.ts` não tem default export, então é ignorado naturalmente.\n */\nexport async function discoverScopes(\n scopesDir: string,\n load: ModuleLoader = (p) => import(pathToFileURL(p).href),\n): Promise<Record<string, ScopeDef>> {\n let names: string[];\n try {\n names = await fs.readdir(scopesDir);\n } catch {\n return {}; // sem pasta de scopes\n }\n const files = names.filter((f) => /\\.(ts|tsx|mts|js|mjs)$/.test(f) && !f.endsWith(\".d.ts\")).sort();\n\n const scopes: Record<string, ScopeDef> = {};\n for (const f of files) {\n const mod = await load(path.resolve(scopesDir, f));\n if (isScope(mod.default)) scopes[mod.default.name] = mod.default;\n }\n return scopes;\n}\n"],"mappings":"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","names":["path","pathToFileURL","fs","path","entities","scopes","pathToFileURL"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/discover.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { createJiti } from \"jiti\";\nimport { discoverEntities, discoverScopes, type ModuleLoader } from \"./discover.js\";\nimport { pushEntities } from \"./push.js\";\nimport { pushScopes } from \"./scope.js\";\nimport { pullEntities, genProject } from \"./gen.js\";\nimport { DEFAULT_DIR, type WeaveConfig } from \"./config.js\";\n\n// Barrel node-only (`@mauroandre/weave-sdk/cli`): a descoberta usa `node:fs`, então\n// fica fora do barrel principal (que é portável p/ browser).\nexport { discoverEntities, discoverScopes, type ModuleLoader } from \"./discover.js\";\n\n/** Escreve um arquivo (criando dirs). Injetável pra teste. */\nasync function defaultWrite(file: string, content: string): Promise<void> {\n const fs = await import(\"node:fs/promises\");\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, \"utf8\");\n}\n\n/** Apaga uma pasta recursivamente (idempotente). Injetável pra teste. */\nasync function defaultClean(dir: string): Promise<void> {\n const fs = await import(\"node:fs/promises\");\n await fs.rm(dir, { recursive: true, force: true });\n}\n\n// Loader padrão: jiti carrega os `.ts` do dev (weave.config.ts + entidades) em\n// runtime — resolve type-stripping e o `import \"./x.js\"` → `x.ts` que o Node puro\n// não faz. Criado uma vez, sob demanda. Injetável (os testes passam o próprio load).\nlet jiti: ReturnType<typeof createJiti> | null = null;\nconst defaultLoad: ModuleLoader = (p) => {\n jiti ??= createJiti(import.meta.url);\n return jiti.import(p) as Promise<{ default?: unknown }>;\n};\n\n/** Carrega o `.env` do projeto pro process.env (built-in do Node). Silencioso se não houver. */\nfunction loadEnv(cwd: string): Record<string, string | undefined> {\n try {\n process.loadEnvFile(path.resolve(cwd, \".env\"));\n } catch {\n /* sem .env — segue com o ambiente atual */\n }\n return process.env;\n}\nimport type { FetchLike } from \"./client.js\";\n\n// CLI `weave`. Comandos: `gen` (server → pasta weave/: entidades com $id, scopes,\n// barrels e client — overwrite cego), `push` (código → server, plan/apply em ordem\n// de dep), `pull` (legado: só entidades). url/key vêm do ambiente (WEAVE_URL/\n// WEAVE_KEY); a pasta de destino do `weave.config.ts` (`dir`, default \"weave\").\n// Flags: --config, --confirm, --fill, --rename. Carrega TS via runtime TS-capaz\n// (Node 22.6+ com --experimental-strip-types, ou tsx/jiti).\n\nexport interface ParsedArgs {\n command: string;\n config: string;\n confirm: Record<string, string[]>;\n /** `--confirm all`: aceita TODAS as remoções (risco confirm) de uma vez. */\n confirmAll: boolean;\n fill: Record<string, Record<string, unknown>>;\n renames: Record<string, Record<string, string>>;\n /** `--no-gen`: após o push, NÃO re-sincroniza os arquivos locais (CI, read-only). */\n noGen: boolean;\n}\n\n/** \"product.legacy\" → [\"product\", \"legacy\"]; \"product.items.qty\" → [\"product\",\"items.qty\"]. */\nfunction splitEntity(s: string | undefined): [string, string] {\n if (!s) return [\"\", \"\"];\n const i = s.indexOf(\".\");\n return i < 0 ? [s, \"\"] : [s.slice(0, i), s.slice(i + 1)];\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { command: argv[0] ?? \"\", config: \"weave.config.ts\", confirm: {}, confirmAll: false, fill: {}, renames: {}, noGen: false };\n for (let i = 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--config\") out.config = argv[++i] ?? out.config;\n else if (a === \"--no-gen\") out.noGen = true;\n else if (a === \"--confirm\") {\n const val = argv[++i];\n if (val === \"all\") out.confirmAll = true; // aceita todas as remoções\n else {\n const [e, p] = splitEntity(val);\n if (e && p) (out.confirm[e] ??= []).push(p);\n }\n } else if (a === \"--fill\") {\n const [ep, v = \"\"] = (argv[++i] ?? \"\").split(/=(.*)/s);\n const [e, p] = splitEntity(ep);\n if (e && p) (out.fill[e] ??= {})[p] = v;\n } else if (a === \"--rename\") {\n const [ep, to = \"\"] = (argv[++i] ?? \"\").split(/=(.*)/s);\n const [e, p] = splitEntity(ep);\n if (e && p && to) (out.renames[e] ??= {})[p] = to;\n }\n }\n return out;\n}\n\nexport interface CliDeps {\n /** Importador de módulo (config + entidades). Default: dynamic import. */\n load?: ModuleLoader;\n /** Transporte HTTP. Default: globalThis.fetch. */\n fetch?: FetchLike;\n /** Escreve arquivo (pull/gen). Default: fs. */\n write?: (file: string, content: string) => Promise<void>;\n /** Apaga pasta (gen, antes de reescrever). Default: fs.rm. */\n clean?: (dir: string) => Promise<void>;\n /** Variáveis de ambiente (WEAVE_URL/WEAVE_KEY). Default: process.env. */\n env?: Record<string, string | undefined>;\n cwd?: string;\n log?: (msg: string) => void;\n}\n\nconst riskIcon = (r: string): string =>\n r === \"auto\" ? \"🟢\" : r === \"confirm\" ? \"🔴\" : r === \"needsValue\" ? \"🟡\" : \"⛔\";\n\n/** Roda o CLI. Devolve o exit code (0 ok; 1 erro / precisa de revisão). */\nexport async function runCli(argv: string[], deps: CliDeps = {}): Promise<number> {\n const args = parseArgs(argv);\n const log = deps.log ?? ((m: string) => console.log(m));\n const cwd = deps.cwd ?? process.cwd();\n const load: ModuleLoader = deps.load ?? defaultLoad;\n const env = deps.env ?? loadEnv(cwd);\n\n if (![\"push\", \"pull\", \"gen\"].includes(args.command)) {\n log(`Unknown command '${args.command}'. Try: weave push | pull | gen`);\n return 1;\n }\n\n const url = env[\"WEAVE_URL\"];\n const key = env[\"WEAVE_KEY\"];\n if (!url || !key) {\n log(\"Set WEAVE_URL and WEAVE_KEY in the environment.\");\n return 1;\n }\n\n // Config é opcional (só `dir`, default \"weave\"); ausente/ilegível → defaults.\n const configPath = path.resolve(cwd, args.config);\n let config: WeaveConfig = {};\n try {\n config = ((await load(configPath)).default ?? {}) as WeaveConfig;\n } catch {\n /* sem weave.config.ts — usa defaults */\n }\n const dirRel = config.dir ?? DEFAULT_DIR;\n const dir = path.resolve(cwd, dirRel);\n const entitiesDir = path.join(dir, \"entities\");\n const net = { url, key, ...(deps.fetch ? { fetch: deps.fetch } : {}) };\n const write = deps.write ?? defaultWrite;\n const clean = deps.clean ?? defaultClean;\n\n // Regenera a pasta weave/ a partir do server (overwrite cego). Usado pelo `gen`\n // e ao fim do `push` (re-sincroniza os $id recém-cunhados), salvo `--no-gen`.\n const regen = async (): Promise<void> => {\n const { files, entities, scopes } = await genProject(net);\n await clean(path.join(dir, \"entities\"));\n await clean(path.join(dir, \"scopes\"));\n for (const [rel, content] of Object.entries(files)) await write(path.join(dir, rel), content);\n log(`✓ generated ${entities.length} ${entities.length === 1 ? \"entity\" : \"entities\"}, ${scopes.length} ${scopes.length === 1 ? \"scope\" : \"scopes\"} → ${dirRel}/`);\n };\n\n // gen: server → pasta weave/ inteira (arquivos com $id, scopes resolvidos, barrels, client).\n if (args.command === \"gen\") {\n await regen();\n return 0;\n }\n\n // pull (legado): puxa os IRs remotos → escreve os arquivos de entidade (sem $id).\n if (args.command === \"pull\") {\n const { files, names } = await pullEntities(net);\n for (const [file, content] of Object.entries(files)) await write(path.join(entitiesDir, file), content);\n log(`✓ pulled ${names.length} ${names.length === 1 ? \"entity\" : \"entities\"} → ${dirRel}/entities`);\n return 0;\n }\n\n // push: tudo vai — entidades primeiro (cunham/fixam ids), depois scopes (resolvem\n // nome→id contra o server), e por fim o gen re-sincroniza os arquivos locais.\n const entities = await discoverEntities(entitiesDir, load);\n if (Object.keys(entities).length === 0) {\n log(`No entities found in ${dirRel}/entities.`);\n return 1;\n }\n\n let res = await pushEntities(entities, {\n ...net,\n confirm: args.confirm,\n fill: args.fill,\n renames: args.renames,\n });\n\n // `--confirm all`: coleta TODAS as remoções (risco confirm) do plano e re-empurra\n // já confirmadas. Não força ⛔ blocked nem preenche 🟡 needsValue (esse quer valor).\n if (args.confirmAll && res.review.some((r) => r.plan.changes.some((c) => c.risk === \"confirm\"))) {\n const confirm: Record<string, string[]> = { ...args.confirm };\n for (const r of res.review) {\n for (const c of r.plan.changes) {\n if (c.risk === \"confirm\") (confirm[r.name] ??= []).push(c.path);\n }\n }\n res = await pushEntities(entities, { ...net, confirm, fill: args.fill, renames: args.renames });\n }\n\n for (const n of res.applied) log(` 🟢 ${n} applied`);\n\n // Mostra CADA mudança gated com o caminho `entity.field` e a FLAG EXATA a usar.\n const cmds: string[] = [];\n let hasBlocked = false;\n let hasRemove = false;\n for (const r of res.review) {\n log(` ⚠ ${r.name} — needs review:`);\n for (const c of r.plan.changes) {\n const target = `${r.name}.${c.path}`;\n const flag =\n c.risk === \"confirm\" ? `--confirm ${target}` : c.risk === \"needsValue\" ? `--fill ${target}=<value>` : \"\";\n if (flag) cmds.push(flag);\n if (c.op === \"removeField\") hasRemove = true;\n if (c.risk === \"blocked\") hasBlocked = true;\n const hint =\n c.risk === \"confirm\"\n ? `deletes its data — allow with ${flag}`\n : c.risk === \"needsValue\"\n ? `needs a value — provide with ${flag}`\n : c.risk === \"blocked\"\n ? \"not supported by push — revert it, or fix the data in the browser\"\n : \"\";\n log(` ${riskIcon(c.risk)} ${c.op} ${target}${hint ? ` — ${hint}` : \"\"}`);\n }\n }\n if (res.review.length > 0) {\n if (cmds.length) {\n log(\"\");\n log(\"Re-run with the flag(s) above to apply — the target is always `entity.field`, e.g.:\");\n log(` weave push ${cmds.join(\" \")}`);\n if (cmds.filter((f) => f.startsWith(\"--confirm\")).length > 1) {\n log(\" (or weave push --confirm all to accept every drop at once)\");\n }\n }\n if (hasRemove) {\n log(\"\");\n log(\"Renamed, not removed? Use --rename entity.oldField=newField to keep the data.\");\n }\n if (hasBlocked) {\n log(\"\");\n log(\"⛔ Blocked changes can't be forced — they hold the whole entity. Revert them or fix the data first.\");\n }\n return 1;\n }\n log(`✓ pushed ${res.applied.length} ${res.applied.length === 1 ? \"entity\" : \"entities\"}.`);\n\n // Scopes (só depois das entidades aplicadas — o push resolve nome→id no server).\n const scopes = await discoverScopes(path.join(dir, \"scopes\"), load);\n if (Object.keys(scopes).length > 0) {\n const { pushed } = await pushScopes(scopes, net);\n log(`✓ pushed ${pushed.length} ${pushed.length === 1 ? \"scope\" : \"scopes\"}.`);\n }\n\n // Re-sincroniza os arquivos locais (ids recém-cunhados), salvo --no-gen.\n if (!args.noGen) await regen();\n return 0;\n}\n\nexport async function main(): Promise<void> {\n process.exit(await runCli(process.argv.slice(2)));\n}\n\n// Executado direto (bin) → roda o main. `realpathSync` resolve o symlink do bin\n// (node_modules/.bin/weave → dist/cli.js); sem isso, rodar via o symlink não bate\n// com `import.meta.url` (caminho real) e o main nunca rodava.\nif (process.argv[1]) {\n try {\n const invoked = pathToFileURL(realpathSync(process.argv[1])).href;\n if (invoked === import.meta.url) void main();\n } catch {\n /* não foi possível resolver o caminho — não é uma invocação direta */\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Entity, ShapeRecord } from \"@mauroandre/weave-core\";\nimport type { ScopeDef } from \"./scope.js\";\n\n// Descoberta por pasta (file-based, igual o VeloJS acha rotas): cada arquivo é uma\n// entidade, exportada como `default`. Node-only (usa fs) — fora do barrel do SDK.\n\n/** Importa um módulo por caminho absoluto. Injetável (a CLI usa um loader de TS). */\nexport type ModuleLoader = (absPath: string) => Promise<{ default?: unknown }>;\n\nconst isEntity = (v: unknown): v is Entity<string, ShapeRecord> =>\n !!v && typeof v === \"object\" && \"name\" in v && \"columns\" in v;\n\n/**\n * Lê a pasta de entidades, importa o `default` de cada arquivo, e monta o objeto\n * `entities` chaveado pelo nome da entidade — o mesmo que o `pushEntities`/`createClient`\n * consomem. Ignora arquivos sem `export default defineEntity(...)`.\n */\nexport async function discoverEntities(\n entitiesDir: string,\n load: ModuleLoader = (p) => import(pathToFileURL(p).href),\n): Promise<Record<string, Entity<string, ShapeRecord>>> {\n const files = (await fs.readdir(entitiesDir))\n .filter((f) => /\\.(ts|tsx|mts|js|mjs)$/.test(f) && !f.endsWith(\".d.ts\"))\n .sort();\n\n const entities: Record<string, Entity<string, ShapeRecord>> = {};\n for (const f of files) {\n const mod = await load(path.resolve(entitiesDir, f));\n if (isEntity(mod.default)) entities[mod.default.name] = mod.default;\n }\n return entities;\n}\n\nconst isScope = (v: unknown): v is ScopeDef =>\n !!v && typeof v === \"object\" && \"name\" in v && \"entities\" in v && !(\"columns\" in v);\n\n/**\n * Lê a pasta de scopes (1 arquivo = 1 scope, `export default defineScope(...)`),\n * chaveando pelo nome do scope. Pasta ausente → `{}` (scopes são opcionais). O\n * barrel `index.ts` não tem default export, então é ignorado naturalmente.\n */\nexport async function discoverScopes(\n scopesDir: string,\n load: ModuleLoader = (p) => import(pathToFileURL(p).href),\n): Promise<Record<string, ScopeDef>> {\n let names: string[];\n try {\n names = await fs.readdir(scopesDir);\n } catch {\n return {}; // sem pasta de scopes\n }\n const files = names.filter((f) => /\\.(ts|tsx|mts|js|mjs)$/.test(f) && !f.endsWith(\".d.ts\")).sort();\n\n const scopes: Record<string, ScopeDef> = {};\n for (const f of files) {\n const mod = await load(path.resolve(scopesDir, f));\n if (isScope(mod.default)) scopes[mod.default.name] = mod.default;\n }\n return scopes;\n}\n"],"mappings":"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","names":["path","pathToFileURL","fs","path","entities","scopes","pathToFileURL"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mauroandre/weave-sdk",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Weave SDK — typed object client over the Weave HTTP API. The glue: entities-as-code in, objects out, HTTP/JSON invisible.",
5
5
  "type": "module",
6
6
  "license": "MIT",