ekwo-os 0.4.1

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.
Files changed (361) hide show
  1. package/README.md +873 -0
  2. package/dist/args.d.ts +57 -0
  3. package/dist/args.d.ts.map +1 -0
  4. package/dist/args.js +134 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/assets/expected-objects.json +9432 -0
  7. package/dist/assets/migrations/20260911120000_core_companies.sql +260 -0
  8. package/dist/assets/migrations/20260911120100_accounts_journals.sql +211 -0
  9. package/dist/assets/migrations/20260911120200_contacts.sql +90 -0
  10. package/dist/assets/migrations/20260911120300_taxes.sql +146 -0
  11. package/dist/assets/migrations/20260911120400_entries.sql +338 -0
  12. package/dist/assets/migrations/20260911120500_documents.sql +279 -0
  13. package/dist/assets/migrations/20260911120600_payments_reconciliation.sql +251 -0
  14. package/dist/assets/migrations/20260911120700_bank.sql +178 -0
  15. package/dist/assets/migrations/20260911120800_analytics_attachments.sql +128 -0
  16. package/dist/assets/migrations/20260911120900_post_document.sql +279 -0
  17. package/dist/assets/migrations/20260911121000_reporting.sql +235 -0
  18. package/dist/assets/migrations/20260911121100_country_templates.sql +226 -0
  19. package/dist/assets/migrations/20260911121200_fec.sql +71 -0
  20. package/dist/assets/migrations/20260911130000_instance.sql +77 -0
  21. package/dist/assets/migrations/20260911130100_instance_members.sql +224 -0
  22. package/dist/assets/migrations/20260911140000_instance_admins.sql +112 -0
  23. package/dist/assets/migrations/20260911160000_tax_posting_templates_unique.sql +17 -0
  24. package/dist/assets/migrations/20260911170000_document_amount_paid.sql +82 -0
  25. package/dist/assets/migrations/20260911173000_post_payment.sql +122 -0
  26. package/dist/assets/migrations/20260911173100_sequence_counters_under_rls.sql +84 -0
  27. package/dist/assets/migrations/20260911183000_country_journal_defaults.sql +143 -0
  28. package/dist/assets/migrations/20260911193853_line_account_defaults.sql +274 -0
  29. package/dist/assets/migrations/20260911195054_products.sql +221 -0
  30. package/dist/assets/migrations/20260911210131_anon_surface.sql +85 -0
  31. package/dist/assets/migrations/20260912074712_country_packs.sql +318 -0
  32. package/dist/assets/migrations/20260912080311_report_code_and_region.sql +198 -0
  33. package/dist/assets/migrations/20260912081014_pack_certification_maintained.sql +31 -0
  34. package/dist/assets/migrations/20260912081015_pack_certification_backfill.sql +16 -0
  35. package/dist/assets/migrations/20260912090407_tax_report_boxes.sql +329 -0
  36. package/dist/assets/migrations/20260912091917_tax_on_base_value.sql +25 -0
  37. package/dist/assets/migrations/20260912091918_tax_engine_columns.sql +776 -0
  38. package/dist/assets/migrations/20260912094412_opening_and_closing.sql +759 -0
  39. package/dist/assets/migrations/20260912095825_charts_of_accounts.sql +326 -0
  40. package/dist/assets/migrations/20260912100412_financial_statements.sql +632 -0
  41. package/dist/assets/migrations/20260912104719_one_formula_evaluator.sql +209 -0
  42. package/dist/assets/migrations/20260912105720_entry_kind_appropriation.sql +26 -0
  43. package/dist/assets/migrations/20260912105721_appropriation_entry_kind.sql +444 -0
  44. package/dist/assets/migrations/20260912111751_document_rules.sql +274 -0
  45. package/dist/assets/migrations/20260912112132_cash_basis_vat_and_fx.sql +1189 -0
  46. package/dist/assets/migrations/20260913074512_modules.sql +493 -0
  47. package/dist/assets/migrations/20260913075903_asset_disposal_roles.sql +47 -0
  48. package/dist/assets/migrations/20260913083216_capabilities.sql +637 -0
  49. package/dist/assets/migrations/20260913083901_company_invitations.sql +262 -0
  50. package/dist/assets/migrations/20260913084402_user_preferences.sql +376 -0
  51. package/dist/assets/migrations/20260913084847_company_profile.sql +261 -0
  52. package/dist/assets/migrations/20260913085436_numbering_reads_the_pack.sql +235 -0
  53. package/dist/assets/migrations/20260913085932_api_keys.sql +303 -0
  54. package/dist/assets/migrations/20260913090216_fiscal_year_bounds.sql +159 -0
  55. package/dist/assets/migrations/20260913092527_entries_import.sql +219 -0
  56. package/dist/assets/migrations/20260913101536_null_safe_guards.sql +188 -0
  57. package/dist/assets/migrations/20260913102115_installer_is_named.sql +462 -0
  58. package/dist/assets/migrations/20260913102758_no_currency_default.sql +138 -0
  59. package/dist/assets/migrations/20260913103355_cash_basis_needs_a_box.sql +453 -0
  60. package/dist/assets/migrations/20260913104014_aged_balance_named_group.sql +79 -0
  61. package/dist/assets/migrations/20260913104232_foreign_key_indexes.sql +144 -0
  62. package/dist/assets/migrations/20260913105120_declared_no_reader.sql +41 -0
  63. package/dist/assets/migrations/20260913111407_pack_languages.sql +223 -0
  64. package/dist/assets/migrations/20260913112233_schema_comments_for_a_reader.sql +27 -0
  65. package/dist/assets/migrations/20260913114535_fec_opening_balances.sql +307 -0
  66. package/dist/assets/migrations/20260914103412_audit_log.sql +509 -0
  67. package/dist/assets/migrations/20260914111907_pack_upgrade.sql +428 -0
  68. package/dist/assets/migrations/20260914120500_rounding_reads_the_currency.sql +206 -0
  69. package/dist/assets/migrations/20260914121200_amounts_round_at_the_currency.sql +2403 -0
  70. package/dist/assets/migrations/20260914134325_schema_version_0_2_0.sql +36 -0
  71. package/dist/assets/migrations/20260914143915_accounts_in_use.sql +428 -0
  72. package/dist/assets/migrations/20260914144731_account_code_frozen.sql +99 -0
  73. package/dist/assets/migrations/20260914151207_schema_grants_its_own_rights.sql +284 -0
  74. package/dist/assets/migrations/20260914152840_pack_upgrade_records_its_own_line.sql +237 -0
  75. package/dist/assets/migrations/20260914163943_declaration_periodicity.sql +349 -0
  76. package/dist/assets/migrations/20260915094000_foreign_services_received.sql +37 -0
  77. package/dist/assets/migrations/20260915094500_mentions_read_a_foreign_service.sql +72 -0
  78. package/dist/assets/migrations/20260915153000_document_shares.sql +568 -0
  79. package/dist/assets/migrations/20260915160000_ec_sales_list.sql +181 -0
  80. package/dist/assets/migrations/20260915161842_pack_sources.sql +56 -0
  81. package/dist/assets/migrations/20260915170500_schema_version_0_3_0.sql +45 -0
  82. package/dist/assets/migrations/20260915174500_a_vat_category_is_a_code.sql +177 -0
  83. package/dist/assets/migrations/20260915180000_document_rule_references.sql +85 -0
  84. package/dist/assets/migrations/20260915181000_territories.sql +342 -0
  85. package/dist/assets/migrations/20260915181500_ec_sales_list_reads_the_territories.sql +222 -0
  86. package/dist/assets/migrations/20260915182000_intracom_triangular.sql +53 -0
  87. package/dist/assets/migrations/20260915182500_a_triangular_supply_says_reverse_charge.sql +99 -0
  88. package/dist/assets/migrations/20260915191200_a_document_knows_its_language.sql +633 -0
  89. package/dist/assets/migrations/20260915195000_a_price_that_holds_its_tax.sql +649 -0
  90. package/dist/assets/migrations/20260915200000_a_posting_names_its_boxes.sql +1004 -0
  91. package/dist/assets/migrations/20260916094500_a_company_files_more_than_one_declaration.sql +795 -0
  92. package/dist/assets/migrations/20260916103000_a_ledger_line_names_its_posting.sql +902 -0
  93. package/dist/assets/migrations/20260916123000_a_vocabulary_for_a_tax_that_is_not_a_vat.sql +144 -0
  94. package/dist/assets/migrations/20260916124000_a_box_can_be_a_rate_of_a_box.sql +525 -0
  95. package/dist/assets/migrations/20260916125000_a_tax_follows_the_territory.sql +1318 -0
  96. package/dist/assets/migrations/20260916126000_a_tax_point_and_its_exception.sql +1211 -0
  97. package/dist/assets/migrations/20260917090000_a_counterparty_that_learns.sql +561 -0
  98. package/dist/assets/migrations/20260917120000_what_the_money_pays.sql +545 -0
  99. package/dist/assets/migrations/20260917150000_a_filing_is_a_row.sql +488 -0
  100. package/dist/assets/migrations/20260917170000_when_it_is_due.sql +194 -0
  101. package/dist/assets/migrations/20260917180000_a_box_is_a_number_and_a_kind.sql +213 -0
  102. package/dist/assets/migrations/20260917190000_what_a_declaration_owes.sql +486 -0
  103. package/dist/assets/migrations/20260917200000_what_moved_after_it_went.sql +227 -0
  104. package/dist/assets/migrations/20260918090000_a_form_names_its_file.sql +27 -0
  105. package/dist/assets/migrations/20260918110000_a_deposit_and_what_came_back.sql +286 -0
  106. package/dist/assets/migrations/20260918113741_a_fourth_preset_is_named.sql +9 -0
  107. package/dist/assets/migrations/20260918113807_a_client_reads_and_hands_over.sql +96 -0
  108. package/dist/assets/migrations/20260918114322_two_definer_functions_check_their_caller.sql +75 -0
  109. package/dist/assets/migrations/20260918130000_every_company_somebody_keeps.sql +177 -0
  110. package/dist/assets/migrations/20260918140000_a_session_nobody_prepared.sql +40 -0
  111. package/dist/assets/migrations/20260918141107_a_line_keeps_the_tax_it_was_posted_with.sql +256 -0
  112. package/dist/assets/migrations/20260918141342_a_company_has_an_electronic_address.sql +66 -0
  113. package/dist/assets/migrations/20260918141605_an_invoice_reads_whole_from_the_views.sql +313 -0
  114. package/dist/assets/migrations/20260918141627_a_policy_asks_once.sql +132 -0
  115. package/dist/assets/migrations/20260918143352_a_suggestion_reads_the_words_once.sql +204 -0
  116. package/dist/assets/migrations/20260918143417_a_reference_of_the_caller_and_a_rehearsal.sql +115 -0
  117. package/dist/assets/migrations/20260918150712_a_company_leaves_with_its_books.sql +1119 -0
  118. package/dist/assets/migrations/20260918150931_a_statement_is_imported_once.sql +654 -0
  119. package/dist/assets/migrations/20260918161204_a_posted_document_does_not_move.sql +437 -0
  120. package/dist/assets/migrations/20260918161538_a_posted_entry_does_not_move.sql +252 -0
  121. package/dist/assets/migrations/20260918171946_an_entry_is_posted_by_post_entry.sql +289 -0
  122. package/dist/assets/migrations/20260918174312_schema_version_0_4_0.sql +53 -0
  123. package/dist/assets/modules/assets/module.json +13 -0
  124. package/dist/assets/modules/assets/supabase/migrations/20260913081447_assets.sql +1190 -0
  125. package/dist/assets/modules/assets/supabase/migrations/20260913104234_foreign_key_indexes.sql +47 -0
  126. package/dist/assets/modules/assets/supabase/migrations/20260913104500_assets_capabilities.sql +145 -0
  127. package/dist/assets/modules/assets/supabase/migrations/20260914122100_assets_round_at_the_currency.sql +564 -0
  128. package/dist/assets/modules/assets/supabase/migrations/20260914145012_assets_accounts_in_use.sql +37 -0
  129. package/dist/assets/modules/assets/supabase/migrations/20260914151530_assets_grants_its_own_rights.sql +63 -0
  130. package/dist/assets/modules/assets/supabase/migrations/20260918113912_assets_client_reads.sql +20 -0
  131. package/dist/assets/modules/assets/supabase/migrations/20260918150801_assets_leave_with_the_company.sql +41 -0
  132. package/dist/assets/modules/budgets/module.json +12 -0
  133. package/dist/assets/modules/budgets/supabase/migrations/20260913083012_budgets.sql +210 -0
  134. package/dist/assets/modules/budgets/supabase/migrations/20260913104233_foreign_key_indexes.sql +37 -0
  135. package/dist/assets/modules/budgets/supabase/migrations/20260913104501_budgets_capabilities.sql +72 -0
  136. package/dist/assets/modules/budgets/supabase/migrations/20260914122400_budgets_round_at_the_currency.sql +68 -0
  137. package/dist/assets/modules/budgets/supabase/migrations/20260914145048_budgets_accounts_in_use.sql +30 -0
  138. package/dist/assets/modules/budgets/supabase/migrations/20260914151812_budgets_grants_its_own_rights.sql +31 -0
  139. package/dist/assets/modules/budgets/supabase/migrations/20260918113954_budgets_client_reads.sql +20 -0
  140. package/dist/assets/modules/budgets/supabase/migrations/20260918150823_budgets_leave_with_the_company.sql +37 -0
  141. package/dist/assets/modules/schema/module.1.json +69 -0
  142. package/dist/assets/seed/00_currencies.sql +15 -0
  143. package/dist/assets/seed/00_territories.sql +280 -0
  144. package/dist/assets/seed/05_framework_generic.sql +110 -0
  145. package/dist/assets/seed/10_pack_be.sql +1284 -0
  146. package/dist/assets/seed/11_pack_fr.sql +1112 -0
  147. package/dist/assets/seed/12_pack_lu.sql +2484 -0
  148. package/dist/assets/seed/13_pack_ee.sql +733 -0
  149. package/dist/assets/seed/14_pack_gb.sql +796 -0
  150. package/dist/assets/seed/15_pack_us.sql +751 -0
  151. package/dist/assets/seed/90_demo_company.sql +368 -0
  152. package/dist/assets/seed/modules/assets/10_pack_be.sql +58 -0
  153. package/dist/assets/seed/modules/assets/11_pack_fr.sql +57 -0
  154. package/dist/assets/seed/modules/assets/14_pack_gb.sql +58 -0
  155. package/dist/assets/seed/modules/assets/15_pack_us.sql +60 -0
  156. package/dist/auth.d.ts +59 -0
  157. package/dist/auth.d.ts.map +1 -0
  158. package/dist/auth.js +134 -0
  159. package/dist/auth.js.map +1 -0
  160. package/dist/bin.d.ts +6 -0
  161. package/dist/bin.d.ts.map +1 -0
  162. package/dist/bin.js +8 -0
  163. package/dist/bin.js.map +1 -0
  164. package/dist/books.d.ts +60 -0
  165. package/dist/books.d.ts.map +1 -0
  166. package/dist/books.js +168 -0
  167. package/dist/books.js.map +1 -0
  168. package/dist/bootstrap.d.ts +236 -0
  169. package/dist/bootstrap.d.ts.map +1 -0
  170. package/dist/bootstrap.js +459 -0
  171. package/dist/bootstrap.js.map +1 -0
  172. package/dist/bundle.d.ts +27 -0
  173. package/dist/bundle.d.ts.map +1 -0
  174. package/dist/bundle.js +47 -0
  175. package/dist/bundle.js.map +1 -0
  176. package/dist/checklist.d.ts +35 -0
  177. package/dist/checklist.d.ts.map +1 -0
  178. package/dist/checklist.js +64 -0
  179. package/dist/checklist.js.map +1 -0
  180. package/dist/cli.d.ts +14 -0
  181. package/dist/cli.d.ts.map +1 -0
  182. package/dist/cli.js +318 -0
  183. package/dist/cli.js.map +1 -0
  184. package/dist/commands/company.d.ts +59 -0
  185. package/dist/commands/company.d.ts.map +1 -0
  186. package/dist/commands/company.js +287 -0
  187. package/dist/commands/company.js.map +1 -0
  188. package/dist/commands/contact.d.ts +9 -0
  189. package/dist/commands/contact.d.ts.map +1 -0
  190. package/dist/commands/contact.js +82 -0
  191. package/dist/commands/contact.js.map +1 -0
  192. package/dist/commands/demo.d.ts +19 -0
  193. package/dist/commands/demo.d.ts.map +1 -0
  194. package/dist/commands/demo.js +72 -0
  195. package/dist/commands/demo.js.map +1 -0
  196. package/dist/commands/doctor.d.ts +12 -0
  197. package/dist/commands/doctor.d.ts.map +1 -0
  198. package/dist/commands/doctor.js +68 -0
  199. package/dist/commands/doctor.js.map +1 -0
  200. package/dist/commands/document.d.ts +17 -0
  201. package/dist/commands/document.d.ts.map +1 -0
  202. package/dist/commands/document.js +217 -0
  203. package/dist/commands/document.js.map +1 -0
  204. package/dist/commands/init.d.ts +31 -0
  205. package/dist/commands/init.d.ts.map +1 -0
  206. package/dist/commands/init.js +535 -0
  207. package/dist/commands/init.js.map +1 -0
  208. package/dist/commands/login.d.ts +24 -0
  209. package/dist/commands/login.d.ts.map +1 -0
  210. package/dist/commands/login.js +128 -0
  211. package/dist/commands/login.js.map +1 -0
  212. package/dist/commands/migrate.d.ts +30 -0
  213. package/dist/commands/migrate.d.ts.map +1 -0
  214. package/dist/commands/migrate.js +115 -0
  215. package/dist/commands/migrate.js.map +1 -0
  216. package/dist/commands/module.d.ts +32 -0
  217. package/dist/commands/module.d.ts.map +1 -0
  218. package/dist/commands/module.js +285 -0
  219. package/dist/commands/module.js.map +1 -0
  220. package/dist/commands/pack.d.ts +22 -0
  221. package/dist/commands/pack.d.ts.map +1 -0
  222. package/dist/commands/pack.js +481 -0
  223. package/dist/commands/pack.js.map +1 -0
  224. package/dist/commands/payment.d.ts +15 -0
  225. package/dist/commands/payment.d.ts.map +1 -0
  226. package/dist/commands/payment.js +97 -0
  227. package/dist/commands/payment.js.map +1 -0
  228. package/dist/commands/register.d.ts +20 -0
  229. package/dist/commands/register.d.ts.map +1 -0
  230. package/dist/commands/register.js +134 -0
  231. package/dist/commands/register.js.map +1 -0
  232. package/dist/commands/status.d.ts +8 -0
  233. package/dist/commands/status.d.ts.map +1 -0
  234. package/dist/commands/status.js +134 -0
  235. package/dist/commands/status.js.map +1 -0
  236. package/dist/commands/whoami.d.ts +21 -0
  237. package/dist/commands/whoami.d.ts.map +1 -0
  238. package/dist/commands/whoami.js +133 -0
  239. package/dist/commands/whoami.js.map +1 -0
  240. package/dist/company.d.ts +16 -0
  241. package/dist/company.d.ts.map +1 -0
  242. package/dist/company.js +26 -0
  243. package/dist/company.js.map +1 -0
  244. package/dist/config.d.ts +24 -0
  245. package/dist/config.d.ts.map +1 -0
  246. package/dist/config.js +50 -0
  247. package/dist/config.js.map +1 -0
  248. package/dist/connection.d.ts +79 -0
  249. package/dist/connection.d.ts.map +1 -0
  250. package/dist/connection.js +116 -0
  251. package/dist/connection.js.map +1 -0
  252. package/dist/context.d.ts +47 -0
  253. package/dist/context.d.ts.map +1 -0
  254. package/dist/context.js +93 -0
  255. package/dist/context.js.map +1 -0
  256. package/dist/doctor.d.ts +45 -0
  257. package/dist/doctor.d.ts.map +1 -0
  258. package/dist/doctor.js +448 -0
  259. package/dist/doctor.js.map +1 -0
  260. package/dist/grants.d.ts +88 -0
  261. package/dist/grants.d.ts.map +1 -0
  262. package/dist/grants.js +174 -0
  263. package/dist/grants.js.map +1 -0
  264. package/dist/identity.d.ts +54 -0
  265. package/dist/identity.d.ts.map +1 -0
  266. package/dist/identity.js +132 -0
  267. package/dist/identity.js.map +1 -0
  268. package/dist/index.d.ts +44 -0
  269. package/dist/index.d.ts.map +1 -0
  270. package/dist/index.js +43 -0
  271. package/dist/index.js.map +1 -0
  272. package/dist/inventory.d.ts +155 -0
  273. package/dist/inventory.d.ts.map +1 -0
  274. package/dist/inventory.js +303 -0
  275. package/dist/inventory.js.map +1 -0
  276. package/dist/migrations.d.ts +76 -0
  277. package/dist/migrations.d.ts.map +1 -0
  278. package/dist/migrations.js +226 -0
  279. package/dist/migrations.js.map +1 -0
  280. package/dist/module/read.d.ts +91 -0
  281. package/dist/module/read.d.ts.map +1 -0
  282. package/dist/module/read.js +172 -0
  283. package/dist/module/read.js.map +1 -0
  284. package/dist/output.d.ts +110 -0
  285. package/dist/output.d.ts.map +1 -0
  286. package/dist/output.js +173 -0
  287. package/dist/output.js.map +1 -0
  288. package/dist/pack/certification.d.ts +27 -0
  289. package/dist/pack/certification.d.ts.map +1 -0
  290. package/dist/pack/certification.js +38 -0
  291. package/dist/pack/certification.js.map +1 -0
  292. package/dist/pack/compile.d.ts +75 -0
  293. package/dist/pack/compile.d.ts.map +1 -0
  294. package/dist/pack/compile.js +801 -0
  295. package/dist/pack/compile.js.map +1 -0
  296. package/dist/pack/filing.d.ts +48 -0
  297. package/dist/pack/filing.d.ts.map +1 -0
  298. package/dist/pack/filing.js +56 -0
  299. package/dist/pack/filing.js.map +1 -0
  300. package/dist/pack/read.d.ts +766 -0
  301. package/dist/pack/read.d.ts.map +1 -0
  302. package/dist/pack/read.js +2336 -0
  303. package/dist/pack/read.js.map +1 -0
  304. package/dist/pack/schema.d.ts +26 -0
  305. package/dist/pack/schema.d.ts.map +1 -0
  306. package/dist/pack/schema.js +181 -0
  307. package/dist/pack/schema.js.map +1 -0
  308. package/dist/pack/territories.d.ts +98 -0
  309. package/dist/pack/territories.d.ts.map +1 -0
  310. package/dist/pack/territories.js +0 -0
  311. package/dist/pack/territories.js.map +1 -0
  312. package/dist/pack/upgrade.d.ts +86 -0
  313. package/dist/pack/upgrade.d.ts.map +1 -0
  314. package/dist/pack/upgrade.js +76 -0
  315. package/dist/pack/upgrade.js.map +1 -0
  316. package/dist/pack/vat-codes.d.ts +273 -0
  317. package/dist/pack/vat-codes.d.ts.map +1 -0
  318. package/dist/pack/vat-codes.js +513 -0
  319. package/dist/pack/vat-codes.js.map +1 -0
  320. package/dist/profiles.d.ts +67 -0
  321. package/dist/profiles.d.ts.map +1 -0
  322. package/dist/profiles.js +187 -0
  323. package/dist/profiles.js.map +1 -0
  324. package/dist/prompt.d.ts +40 -0
  325. package/dist/prompt.d.ts.map +1 -0
  326. package/dist/prompt.js +120 -0
  327. package/dist/prompt.js.map +1 -0
  328. package/dist/registry.d.ts +84 -0
  329. package/dist/registry.d.ts.map +1 -0
  330. package/dist/registry.js +104 -0
  331. package/dist/registry.js.map +1 -0
  332. package/dist/rest.d.ts +81 -0
  333. package/dist/rest.d.ts.map +1 -0
  334. package/dist/rest.js +245 -0
  335. package/dist/rest.js.map +1 -0
  336. package/dist/schema.d.ts +15 -0
  337. package/dist/schema.d.ts.map +1 -0
  338. package/dist/schema.js +15 -0
  339. package/dist/schema.js.map +1 -0
  340. package/dist/seeds.d.ts +27 -0
  341. package/dist/seeds.d.ts.map +1 -0
  342. package/dist/seeds.js +47 -0
  343. package/dist/seeds.js.map +1 -0
  344. package/dist/session.d.ts +39 -0
  345. package/dist/session.d.ts.map +1 -0
  346. package/dist/session.js +92 -0
  347. package/dist/session.js.map +1 -0
  348. package/dist/sql.d.ts +48 -0
  349. package/dist/sql.d.ts.map +1 -0
  350. package/dist/sql.js +112 -0
  351. package/dist/sql.js.map +1 -0
  352. package/dist/status.d.ts +94 -0
  353. package/dist/status.d.ts.map +1 -0
  354. package/dist/status.js +120 -0
  355. package/dist/status.js.map +1 -0
  356. package/dist/ui.d.ts +55 -0
  357. package/dist/ui.d.ts.map +1 -0
  358. package/dist/ui.js +114 -0
  359. package/dist/ui.js.map +1 -0
  360. package/package.json +29 -0
  361. package/schema/output.1.json +613 -0
@@ -0,0 +1,535 @@
1
+ /**
2
+ * `ekwo init` — a Supabase project you own, turned into a set of books.
3
+ *
4
+ * Six things happen, in this order:
5
+ *
6
+ * 1. the migrations are applied, and recorded the way `supabase db push`
7
+ * records them;
8
+ * 2. the reference seeds are applied — currencies, the charts of accounts,
9
+ * the VAT codes;
10
+ * 3. the first administrator is created in *your* Supabase Auth, because a
11
+ * superuser connection cannot be a signed-in user (see `../auth.ts`);
12
+ * 4. the installation sequence runs: instance, administrator, company,
13
+ * ownership, country template, first financial year;
14
+ * 5. `ekwo.json` is written, with nothing secret in it;
15
+ * 6. registering with Ekwo is offered, and the default answer is no.
16
+ *
17
+ * Every step is safe to run twice. Running `ekwo init` again on a set-up
18
+ * project reports what was already there and creates nothing a second time.
19
+ */
20
+ import { boolFlag, numberFlag, rejectUnknownFlags, stringFlag, stringFlags, UsageError, } from '../args.js';
21
+ import { createAuthUser } from '../auth.js';
22
+ import { bootstrap, countryCharts, countryCurrency, countryFiscalYearOpening, countryLanguage, countryLanguages, countryFilingForms, countryPack, installedPacks, } from '../bootstrap.js';
23
+ import { printOperatorChecklist } from '../checklist.js';
24
+ import { describeCertification, needsWarning } from '../pack/certification.js';
25
+ import { DEMO_SEED, migrationsDir, seedDir } from '../bundle.js';
26
+ import { writeConfig } from '../config.js';
27
+ import { CONNECTION_FLAGS, openDatabase } from '../context.js';
28
+ import { setResult } from '../output.js';
29
+ import { listMigrations } from '../migrations.js';
30
+ import { applyMigrations } from '../migrations.js';
31
+ import { ask as askText, askRequired, askSecret, choose, confirm, isInteractive, NotInteractiveError } from '../prompt.js';
32
+ import { register, registryUrl } from '../registry.js';
33
+ import { applyDemoSeed, applySeeds } from '../seeds.js';
34
+ import { asUser, scalar } from '../sql.js';
35
+ import { syncSchemaVersion } from '../status.js';
36
+ import { bold, cyan, dim, heading, line, note, pairs, skipped, step, warn } from '../ui.js';
37
+ export const INIT_FLAGS = [
38
+ ...CONNECTION_FLAGS,
39
+ 'country',
40
+ 'chart',
41
+ 'org',
42
+ 'company',
43
+ 'admin-email',
44
+ 'admin-password',
45
+ 'admin-user-id',
46
+ 'fiscal-year',
47
+ 'fiscal-year-start',
48
+ 'currency',
49
+ 'language',
50
+ 'vat-period',
51
+ 'filing-period',
52
+ 'iban',
53
+ 'bic',
54
+ 'bank-name',
55
+ 'demo',
56
+ 'register',
57
+ 'register-email',
58
+ 'registry-url',
59
+ 'yes',
60
+ ];
61
+ export async function initCommand(args, deps = {}) {
62
+ rejectUnknownFlags(args, INIT_FLAGS);
63
+ const yes = boolFlag(args, 'yes');
64
+ const interactive = !yes && isInteractive();
65
+ const makeUser = deps.createAuthUser ?? createAuthUser;
66
+ const { db, connection } = await openDatabase(args, { interactive, connect: deps.connect });
67
+ try {
68
+ heading('Schema');
69
+ const migrations = await listMigrations(migrationsDir());
70
+ const result = await applyMigrations(db, migrations, (migration) => {
71
+ step(migration.file);
72
+ });
73
+ if (result.applied.length === 0) {
74
+ skipped(`${result.alreadyApplied} migration(s) already applied, nothing to do`);
75
+ }
76
+ else {
77
+ note(dim(`${result.applied.length} applied, ${result.alreadyApplied} were already there`));
78
+ }
79
+ heading('Reference data');
80
+ await applySeeds(db, seedDir(), (seed) => {
81
+ step(seed.file);
82
+ });
83
+ skipped(`${DEMO_SEED} is sample data and is not applied here`);
84
+ // ---- What this installation is -----------------------------------------
85
+ //
86
+ // There is no default country, and there is no list of countries in this
87
+ // file: both come from the packs this installation holds, named as the
88
+ // pack names itself. A preselected country would be a choice nobody made,
89
+ // and the one question whose wrong answer is a chart of accounts.
90
+ const packs = await installedPacks(db);
91
+ if (packs.length === 0) {
92
+ throw new Error('no_country_pack: this database holds no country pack, so there is no chart of ' +
93
+ 'accounts to install. Apply the reference seeds first.');
94
+ }
95
+ const country = (stringFlag(args, 'country') ??
96
+ (interactive
97
+ ? await choose('Country whose accounting rules apply?', packs.map((p) => ({ value: p.country, label: p.name })))
98
+ : requiredCountry(packs))).toUpperCase();
99
+ const organization = stringFlag(args, 'org') ??
100
+ (interactive
101
+ ? await askRequired('Name of your organisation?')
102
+ : required('--org', 'the organisation name'));
103
+ const company = stringFlag(args, 'company') ??
104
+ (interactive ? await askRequired('Name of the first company?', organization) : organization);
105
+ const fiscalYear = numberFlag(args, 'fiscal-year') ?? new Date().getUTCFullYear();
106
+ // When the first financial year opens. The country model names a month —
107
+ // `calendar`, `april`, `july`, `october` — and the flag names a day. A
108
+ // pack that declares neither is asked about when there is a terminal, and
109
+ // refused when there is not: opening somebody's books on a date nobody
110
+ // chose is found out a year later, in a closing.
111
+ const packOpening = await countryFiscalYearOpening(db, country);
112
+ const askedStart = stringFlag(args, 'fiscal-year-start');
113
+ if (askedStart !== undefined && !/^\d{4}-\d{2}-\d{2}$/.test(askedStart)) {
114
+ throw new UsageError(`bad_date: --fiscal-year-start takes a day as YYYY-MM-DD, not "${askedStart}".`);
115
+ }
116
+ const fiscalYearStart = askedStart ??
117
+ (packOpening !== undefined
118
+ ? undefined
119
+ : interactive
120
+ ? await askRequired(`First day of the financial year ${fiscalYear}? (YYYY-MM-DD)`)
121
+ : requiredFiscalYearStart(country));
122
+ // The currency has to be settled before the company row exists:
123
+ // `companies.currency_code` is `not null`, so there is no later moment at
124
+ // which it is empty and the country model could fill it. The pack answers
125
+ // it; a pack that does not is asked about, never guessed at.
126
+ const packCurrency = await countryCurrency(db, country);
127
+ const currencyCode = (stringFlag(args, 'currency') ??
128
+ (interactive
129
+ ? await askRequired('Currency of the company?', packCurrency)
130
+ : (packCurrency ?? required('--currency', 'the currency')))).toUpperCase();
131
+ // Which chart of accounts. A country with one chart is not a question:
132
+ // there is nothing to choose. A country with two is asked about, with
133
+ // nothing preselected beyond the default the pack itself declares — the
134
+ // wrong answer here is a whole plan of accounts.
135
+ const charts = await countryCharts(db, country);
136
+ const askedChart = stringFlag(args, 'chart');
137
+ if (askedChart !== undefined && !charts.some((c) => c.code === askedChart)) {
138
+ throw new UsageError(`unknown_chart: ${country} has no chart ${askedChart}. ` +
139
+ `It has: ${charts.map((c) => c.code).join(', ') || 'none'}.`);
140
+ }
141
+ const chartCode = askedChart ??
142
+ (charts.length > 1 && interactive
143
+ ? await choose('Which chart of accounts?', charts.map((c) => ({
144
+ value: c.code,
145
+ label: `${c.name}${c.audience === null ? '' : ` — ${c.audience}`}` +
146
+ ` (${c.accounts} accounts${c.certificationStatus === null ? '' : `, ${c.certificationStatus}`})`,
147
+ })))
148
+ : charts.length > 1
149
+ ? requiredChart(country, charts)
150
+ : undefined);
151
+ // The language of the books, for the same reason as the currency: it is
152
+ // written on the company row, which does not exist yet, and it decides
153
+ // which label of the pack lands in `accounts.name`.
154
+ //
155
+ // The pack says which languages it publishes, and the question lists them
156
+ // with nothing pre-selected. A Belgian company keeps its books in French,
157
+ // Dutch or German, and offering the first of the three as the answer to
158
+ // press Enter on is how two of the three end up installed in the wrong
159
+ // one. Outside an interactive session `--language` is required whenever
160
+ // there is a choice to make.
161
+ const packLanguage = await countryLanguage(db, country);
162
+ const languages = await countryLanguages(db, country);
163
+ const askedLanguage = stringFlag(args, 'language');
164
+ if (askedLanguage !== undefined &&
165
+ languages.length > 0 &&
166
+ !languages.some((l) => l.code === askedLanguage.toLowerCase())) {
167
+ warn(`${country} publishes its labels in ${languages.map((l) => l.code).join(', ')}; ` +
168
+ `the books will be kept in ${askedLanguage.toLowerCase()} and the chart of accounts ` +
169
+ `will carry the pack's own wording.`);
170
+ }
171
+ const language = (askedLanguage ??
172
+ (interactive && languages.length > 1
173
+ ? await choose('Language of the books?', languages.map((l) => ({
174
+ value: l.code,
175
+ label: l.isPackLanguage ? `${l.label}, the language the pack is written in` : l.label,
176
+ })))
177
+ : interactive
178
+ ? await askRequired('Language of the books?', packLanguage)
179
+ : languages.length > 1
180
+ ? required('--language', `the language of the books (${languages.map((l) => l.code).join(', ')})`)
181
+ : (packLanguage ?? required('--language', 'the language of the books')))).toLowerCase();
182
+ // How often the company files each declaration it is subject to. The third
183
+ // question of the same family as the currency and the language, and the one
184
+ // with the sharpest consequence when it is wrong: a quarterly filer handed
185
+ // a monthly return misses a deadline.
186
+ //
187
+ // It is asked **once per form**, because a company is subject to several
188
+ // declarations and the cadence of one says nothing about the cadence of
189
+ // another. Where a form offers one cadence there is nothing to ask. Where
190
+ // it offers several, the pack proposes one only if the law of that country
191
+ // gives one answer to everybody — `period_default` on the form — and where
192
+ // it does not, the question is asked with nothing preselected and "later"
193
+ // among the answers: a company that has not decided is recorded as not
194
+ // having decided rather than as filing monthly.
195
+ const forms = await countryFilingForms(db, country);
196
+ const periodicReturn = forms.find((form) => form.isPeriodicReturn);
197
+ const askedPeriods = new Map();
198
+ for (const pair of stringFlags(args, 'filing-period')) {
199
+ const equals = pair.indexOf('=');
200
+ if (equals <= 0 || equals === pair.length - 1) {
201
+ throw new UsageError(`--filing-period takes <report_code>=<cadence>, one per declaration (got "${pair}")`);
202
+ }
203
+ askedPeriods.set(pair.slice(0, equals), pair.slice(equals + 1).toLowerCase());
204
+ }
205
+ const askedVatPeriod = stringFlag(args, 'vat-period')?.toLowerCase();
206
+ if (askedVatPeriod !== undefined) {
207
+ if (periodicReturn === undefined) {
208
+ throw new UsageError(`no_periodic_return: this installation carries no periodic return for ${country}, ` +
209
+ 'so there is no declaration --vat-period could be about.');
210
+ }
211
+ askedPeriods.set(periodicReturn.code, askedVatPeriod);
212
+ }
213
+ for (const code of askedPeriods.keys()) {
214
+ if (forms.some((form) => form.code === code))
215
+ continue;
216
+ throw new UsageError(`unknown_tax_report: ${code} is not a declaration form of ${country} in this ` +
217
+ `installation (${forms.map((form) => form.code).join(', ') || 'it carries none'}).`);
218
+ }
219
+ const filingPeriods = {};
220
+ for (const form of forms) {
221
+ const flagged = askedPeriods.get(form.code);
222
+ if (flagged !== undefined && form.periods.length > 0 && !form.periods.includes(flagged)) {
223
+ throw new UsageError(`unknown_vat_period: ${form.code} is filed ${form.periods.join(' or ')}, not ${flagged}.`);
224
+ }
225
+ const chosen = flagged ??
226
+ (form.periods.length === 1
227
+ ? form.periods[0]
228
+ : form.periods.length > 1 && interactive
229
+ ? await choose(`How often does this company file ${form.name}?`, [
230
+ ...form.periods.map((code) => ({
231
+ value: code,
232
+ label: code === form.periodDefault
233
+ ? `every ${code} — what the law of this country gives everybody`
234
+ : `every ${code}`,
235
+ })),
236
+ { value: 'later', label: 'not decided yet; ekwo status will say so' },
237
+ ])
238
+ : form.periodDefault);
239
+ if (chosen === undefined && form.periods.length > 1) {
240
+ // Outside an interactive session there is nobody to ask and nothing
241
+ // lawful to assume: the cadence of this form is a fact about the
242
+ // company, and the pack said so by proposing none.
243
+ throw new UsageError(`no_filing_period: ${form.code} is filed ${form.periods.join(' or ')} and the ` +
244
+ `${country} pack proposes none, because the law makes it depend on the company. ` +
245
+ `Pass --filing-period ${form.code}=<cadence>` +
246
+ (form.isPeriodicReturn ? ', or --vat-period <cadence>' : '') +
247
+ '.');
248
+ }
249
+ if (chosen !== undefined && chosen !== 'later')
250
+ filingPeriods[form.code] = chosen;
251
+ }
252
+ // What the operator is about to install, and how much anyone has read it.
253
+ const pack = await countryPack(db, country);
254
+ if (pack === undefined) {
255
+ warn(`no country pack is recorded for ${country}; the seeds of this release declare one.`);
256
+ }
257
+ else {
258
+ const said = `${pack.name} pack ${pack.version}: ${describeCertification({
259
+ status: pack.certificationStatus,
260
+ by: pack.certifiedBy,
261
+ on: pack.certifiedAt,
262
+ })}.`;
263
+ if (needsWarning(pack.certificationStatus)) {
264
+ warn(`${said} Check the boxes against your own situation before you file anything.`);
265
+ }
266
+ else {
267
+ note(dim(said));
268
+ }
269
+ }
270
+ // The main bank account. Optional everywhere: a company can be installed
271
+ // and book sales without one, and `ekwo doctor` is what notices later.
272
+ const iban = stringFlag(args, 'iban') ??
273
+ (interactive
274
+ ? emptyToUndefined(await askText('IBAN of the main bank account? (optional, Enter to skip)'))
275
+ : undefined);
276
+ const bankAccount = iban === undefined || iban.length === 0
277
+ ? undefined
278
+ : {
279
+ iban,
280
+ bic: stringFlag(args, 'bic') ??
281
+ (interactive ? emptyToUndefined(await askText('BIC? (optional)')) : undefined),
282
+ bankName: stringFlag(args, 'bank-name') ??
283
+ (interactive ? emptyToUndefined(await askText('Name of the bank? (optional)')) : undefined),
284
+ };
285
+ // ---- The first administrator -------------------------------------------
286
+ heading('First administrator');
287
+ const adminUserId = await resolveAdminUser(db, args, {
288
+ interactive,
289
+ connection,
290
+ makeUser,
291
+ });
292
+ // ---- The installation sequence -----------------------------------------
293
+ heading('Installation');
294
+ const outcome = await bootstrap(db, {
295
+ organization,
296
+ country,
297
+ company,
298
+ fiscalYear,
299
+ ...(fiscalYearStart === undefined ? {} : { fiscalYearStart }),
300
+ adminUserId,
301
+ currencyCode,
302
+ language,
303
+ ...(chartCode === undefined ? {} : { chartCode }),
304
+ filingPeriods,
305
+ bankAccount,
306
+ });
307
+ for (const s of outcome.steps) {
308
+ const text = s.detail === undefined ? s.name : `${s.name} — ${s.detail}`;
309
+ if (s.outcome === 'created')
310
+ step(text);
311
+ else
312
+ skipped(`${text} (already there)`);
313
+ }
314
+ const schemaVersion = await syncSchemaVersion(db);
315
+ // ---- The demo company, only when asked ---------------------------------
316
+ if (boolFlag(args, 'demo')) {
317
+ heading('Demo company');
318
+ await asUser(db, adminUserId, () => applyDemoSeed(db, seedDir()));
319
+ step('Exemple Conseil SRL, its contacts, invoices, a payment and a statement');
320
+ warn('Fictional data, including a fictional administrator. Do not leave it on real books.');
321
+ }
322
+ // ---- ekwo.json ----------------------------------------------------------
323
+ const configFile = await writeConfig({
324
+ ...(connection.supabaseUrl !== undefined ? { project_url: connection.supabaseUrl } : {}),
325
+ country,
326
+ ...(schemaVersion !== undefined ? { schema_version: schemaVersion } : {}),
327
+ }, deps.cwd);
328
+ setResult({
329
+ organization,
330
+ instanceId: outcome.instanceId,
331
+ adminUserId,
332
+ company: {
333
+ id: outcome.companyId,
334
+ name: company,
335
+ country,
336
+ currency: outcome.currencyCode,
337
+ language: outcome.language,
338
+ chart: outcome.chartCode ?? null,
339
+ packVersion: outcome.packVersion ?? null,
340
+ },
341
+ fiscalYear: {
342
+ name: outcome.fiscalYearName,
343
+ start: outcome.fiscalYearStart,
344
+ end: outcome.fiscalYearEnd,
345
+ },
346
+ filingPeriods: outcome.filingPeriods,
347
+ bankAccountId: outcome.bankAccountId ?? null,
348
+ migrations: { applied: result.applied.map((m) => m.file), alreadyApplied: result.alreadyApplied },
349
+ steps: outcome.steps,
350
+ schemaVersion: schemaVersion ?? null,
351
+ demo: boolFlag(args, 'demo'),
352
+ configFile,
353
+ });
354
+ // ---- Registration, offered, never required ------------------------------
355
+ await offerRegistration(db, args, { interactive, adminUserId, deps });
356
+ heading('Done');
357
+ pairs([
358
+ ['organisation', organization],
359
+ ['company', `${company} (${country}, ${outcome.currencyCode}, ${outcome.language})`],
360
+ [
361
+ 'chart of accounts',
362
+ `${outcome.chartCode ?? 'unknown'}${charts.find((c) => c.code === outcome.chartCode)?.name === undefined
363
+ ? ''
364
+ : ` — ${charts.find((c) => c.code === outcome.chartCode)?.name}`}`,
365
+ ],
366
+ ...forms.map((form) => [
367
+ `files ${form.name}`,
368
+ outcome.filingPeriods[form.code] === undefined
369
+ ? 'not recorded'
370
+ : `every ${outcome.filingPeriods[form.code]}`,
371
+ ]),
372
+ [
373
+ 'country pack',
374
+ pack === undefined
375
+ ? 'none recorded'
376
+ : `${pack.version} — ${describeCertification({ status: pack.certificationStatus, by: pack.certifiedBy, on: pack.certifiedAt })}`,
377
+ ],
378
+ ['financial year', `${outcome.fiscalYearName} — ${outcome.fiscalYearStart} to ${outcome.fiscalYearEnd}`],
379
+ ['bank account', bankAccount === undefined ? 'none — ekwo doctor will say so' : bankAccount.iban],
380
+ ['schema version', schemaVersion ?? 'unknown'],
381
+ ['config', configFile],
382
+ ]);
383
+ line();
384
+ line(` ${bold('Next:')} sign in to your Supabase project as the administrator you just created,`);
385
+ line(` then ${cyan('ekwo status')} to see what is there and ${cyan('ekwo doctor')} to check it.`);
386
+ // The last thing on the screen, because it is the part nobody can do for
387
+ // the operator: three settings of their own project and one piece of
388
+ // reading. `packages/cli/README.md` carries the same four, and a test
389
+ // reads both so the two cannot drift.
390
+ printOperatorChecklist();
391
+ line();
392
+ return 0;
393
+ }
394
+ finally {
395
+ await db.close();
396
+ }
397
+ }
398
+ function required(flag, what) {
399
+ throw new NotInteractiveError(what, flag);
400
+ }
401
+ /**
402
+ * The refusal when `--country` is missing and nobody can be asked. It names
403
+ * the packs this installation holds rather than a country it prefers, because
404
+ * it has no reason to prefer one.
405
+ */
406
+ function requiredCountry(packs) {
407
+ throw new UsageError('missing_input: the country was not given and this is not a terminal. Pass --country, ' +
408
+ `one of: ${packs.map((p) => `${p.country} (${p.name})`).join(', ')}.`);
409
+ }
410
+ /**
411
+ * The refusal when the pack names no opening month, `--fiscal-year-start` is
412
+ * missing and nobody can be asked. It names the field the pack should carry
413
+ * as well as the flag, because one of the two is the real fix.
414
+ */
415
+ function requiredFiscalYearStart(country) {
416
+ throw new UsageError(`missing_input: the ${country} pack declares no defaults.fiscal_year_default and this is not a ` +
417
+ 'terminal. Pass --fiscal-year-start YYYY-MM-DD, or add the field to the pack.');
418
+ }
419
+ /**
420
+ * The refusal when a country offers several charts, `--chart` is missing and
421
+ * nobody can be asked. It lists them rather than picking the default: a
422
+ * non-interactive install that meant the other one would find out a year later.
423
+ */
424
+ function requiredChart(country, charts) {
425
+ throw new UsageError(`missing_input: ${country} offers several charts of accounts and this is not a terminal. ` +
426
+ `Pass --chart, one of: ${charts
427
+ .map((c) => `${c.code} (${c.name}${c.isDefault ? ', the default' : ''})`)
428
+ .join(', ')}.`);
429
+ }
430
+ /** An unanswered optional question is not an empty string. */
431
+ function emptyToUndefined(value) {
432
+ return value.length === 0 ? undefined : value;
433
+ }
434
+ /**
435
+ * The id that will be written into `instance_admins` and `company_members`.
436
+ *
437
+ * Either an account already exists and its id was given, or one is created
438
+ * through the Supabase Auth admin API. There is no third way: the id has to
439
+ * be one that `auth.uid()` will return for a real signed-in user, and only
440
+ * GoTrue can mint that.
441
+ */
442
+ async function resolveAdminUser(db, args, options) {
443
+ const given = stringFlag(args, 'admin-user-id');
444
+ if (given !== undefined) {
445
+ const exists = await scalar(db, 'select exists (select 1 from auth.users where id = $1)', [given]);
446
+ if (exists !== true) {
447
+ throw new UsageError(`unknown_user: ${given} is not a user of this Supabase project. ` +
448
+ 'Create the account first, or drop --admin-user-id and let the CLI create one.');
449
+ }
450
+ skipped(`using the existing account ${given}`);
451
+ return given;
452
+ }
453
+ const email = stringFlag(args, 'admin-email') ??
454
+ (options.interactive
455
+ ? await askRequired('E-mail address of the first administrator?')
456
+ : required('--admin-email', "the administrator's address"));
457
+ const { supabaseUrl, serviceRoleKey } = options.connection;
458
+ if (supabaseUrl === undefined) {
459
+ throw new UsageError('missing_supabase_url: creating the first user needs the project URL. ' +
460
+ 'Pass --supabase-url, or set SUPABASE_URL.');
461
+ }
462
+ const key = serviceRoleKey ??
463
+ (options.interactive
464
+ ? await askSecret('service_role key (Project Settings → API). It is never written to disk:')
465
+ : required('--service-role-key', 'the service_role key'));
466
+ const password = stringFlag(args, 'admin-password') ??
467
+ (options.interactive
468
+ ? await askSecret('Password for that administrator (blank to send an invite link instead):')
469
+ : undefined);
470
+ const user = await options.makeUser({
471
+ supabaseUrl,
472
+ serviceRoleKey: key,
473
+ email,
474
+ password: password !== undefined && password.length > 0 ? password : undefined,
475
+ });
476
+ if (user.created)
477
+ step(`created ${email} in your Supabase Auth`);
478
+ else
479
+ skipped(`${email} already had an account here`);
480
+ if (user.actionLink !== undefined) {
481
+ note(dim('No password was set. Send them this link to choose one:'));
482
+ note(user.actionLink);
483
+ }
484
+ // The foreign key on instance_admins will refuse an id GoTrue has not
485
+ // written yet; say so here rather than three steps later.
486
+ const visible = await scalar(db, 'select exists (select 1 from auth.users where id = $1)', [user.id]);
487
+ if (visible !== true) {
488
+ throw new Error(`auth_user_not_visible: Supabase Auth reported user ${user.id}, but the database does not ` +
489
+ 'see it. Check that --db-url and --supabase-url point at the same project.');
490
+ }
491
+ return user.id;
492
+ }
493
+ async function offerRegistration(db, args, options) {
494
+ const asked = boolFlag(args, 'register');
495
+ const wanted = asked
496
+ ? true
497
+ : options.interactive
498
+ ? await ask('Register this installation with Ekwo to receive security advisories and release notes?')
499
+ : false;
500
+ if (!wanted) {
501
+ heading('Registration');
502
+ skipped('not registered — Community works unregistered, forever');
503
+ note(dim('Change your mind later with `ekwo register --email you@example.com`.'));
504
+ return;
505
+ }
506
+ const email = stringFlag(args, 'register-email') ??
507
+ stringFlag(args, 'admin-email') ??
508
+ (options.interactive ? await askRequired('Contact address?') : undefined);
509
+ if (email === undefined) {
510
+ warn('--register needs an address: pass --register-email or --admin-email. Skipped.');
511
+ return;
512
+ }
513
+ heading('Registration');
514
+ const url = stringFlag(args, 'registry-url') ?? registryUrl();
515
+ const result = await register(db, {
516
+ adminUserId: options.adminUserId,
517
+ email,
518
+ url,
519
+ ...(options.deps.fetchImpl !== undefined ? { fetchImpl: options.deps.fetchImpl } : {}),
520
+ });
521
+ step(`recorded on the instance row: ${email}`);
522
+ if (result.announced) {
523
+ step(`announced to ${url}`);
524
+ }
525
+ else {
526
+ warn(`could not reach ${url} (${result.reason ?? 'unknown'}).`);
527
+ note(dim('The local registration stands. `ekwo register` will try again.'));
528
+ }
529
+ note(dim(`Sent: ${JSON.stringify(result.payload)}`));
530
+ }
531
+ /** Yes/no with no as the default, kept separate so the wording stays fixed. */
532
+ async function ask(question) {
533
+ return confirm(question, false);
534
+ }
535
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `ekwo login` and `ekwo logout`.
3
+ *
4
+ * Signing in is what turns "every command takes a connection string" into
5
+ * something a person can use twenty times a day. It asks the instance for a
6
+ * session with an address and a password, keeps the session in the person's
7
+ * own configuration directory, and keeps the password nowhere.
8
+ *
9
+ * What it needs comes from a flag, then the environment, then a profile that
10
+ * already exists — so signing in again after a session ended is `ekwo login`
11
+ * and a password — then `ekwo.json` for the instance URL, and a question last,
12
+ * when there is somebody to ask.
13
+ */
14
+ import { type ParsedArgs } from '../args.js';
15
+ import { type UserDeps } from '../identity.js';
16
+ export declare const LOGIN_FLAGS: readonly ["profile", "supabase-url", "anon-key", "email", "password", "yes"];
17
+ export declare const LOGOUT_FLAGS: readonly ["profile"];
18
+ export interface LoginDeps extends UserDeps {
19
+ /** Where `ekwo.json` is looked for. The working directory, unless a test says otherwise. */
20
+ cwd?: string | undefined;
21
+ }
22
+ export declare function loginCommand(args: ParsedArgs, deps?: LoginDeps): Promise<number>;
23
+ export declare function logoutCommand(args: ParsedArgs, deps?: UserDeps): Promise<number>;
24
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAA4C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,EAA+D,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB5G,eAAO,MAAM,WAAW,8EAA+E,CAAC;AACxG,eAAO,MAAM,YAAY,sBAAuB,CAAC;AAEjD,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,4FAA4F;IAC5F,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoF1F;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B1F"}