@jackie-chan/jobtrack 0.1.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.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -0
  3. package/dist/commands/company.command.d.ts +3 -0
  4. package/dist/commands/company.command.d.ts.map +1 -0
  5. package/dist/commands/company.command.js +29 -0
  6. package/dist/commands/company.command.js.map +1 -0
  7. package/dist/commands/db.command.d.ts +3 -0
  8. package/dist/commands/db.command.d.ts.map +1 -0
  9. package/dist/commands/db.command.js +17 -0
  10. package/dist/commands/db.command.js.map +1 -0
  11. package/dist/commands/job.command.d.ts +8 -0
  12. package/dist/commands/job.command.d.ts.map +1 -0
  13. package/dist/commands/job.command.js +91 -0
  14. package/dist/commands/job.command.js.map +1 -0
  15. package/dist/commands/location.command.d.ts +3 -0
  16. package/dist/commands/location.command.d.ts.map +1 -0
  17. package/dist/commands/location.command.js +21 -0
  18. package/dist/commands/location.command.js.map +1 -0
  19. package/dist/commands/profile.command.d.ts +3 -0
  20. package/dist/commands/profile.command.d.ts.map +1 -0
  21. package/dist/commands/profile.command.js +29 -0
  22. package/dist/commands/profile.command.js.map +1 -0
  23. package/dist/commands/serve.command.d.ts +3 -0
  24. package/dist/commands/serve.command.d.ts.map +1 -0
  25. package/dist/commands/serve.command.js +9 -0
  26. package/dist/commands/serve.command.js.map +1 -0
  27. package/dist/controllers/cli/companyController.d.ts +11 -0
  28. package/dist/controllers/cli/companyController.d.ts.map +1 -0
  29. package/dist/controllers/cli/companyController.js +57 -0
  30. package/dist/controllers/cli/companyController.js.map +1 -0
  31. package/dist/controllers/cli/db.controller.d.ts +4 -0
  32. package/dist/controllers/cli/db.controller.d.ts.map +1 -0
  33. package/dist/controllers/cli/db.controller.js +71 -0
  34. package/dist/controllers/cli/db.controller.js.map +1 -0
  35. package/dist/controllers/cli/job.controller.d.ts +8 -0
  36. package/dist/controllers/cli/job.controller.d.ts.map +1 -0
  37. package/dist/controllers/cli/job.controller.js +68 -0
  38. package/dist/controllers/cli/job.controller.js.map +1 -0
  39. package/dist/controllers/cli/locationController.d.ts +5 -0
  40. package/dist/controllers/cli/locationController.d.ts.map +1 -0
  41. package/dist/controllers/cli/locationController.js +57 -0
  42. package/dist/controllers/cli/locationController.js.map +1 -0
  43. package/dist/controllers/cli/profile.controller.d.ts +6 -0
  44. package/dist/controllers/cli/profile.controller.d.ts.map +1 -0
  45. package/dist/controllers/cli/profile.controller.js +42 -0
  46. package/dist/controllers/cli/profile.controller.js.map +1 -0
  47. package/dist/controllers/httpController.d.ts +8 -0
  48. package/dist/controllers/httpController.d.ts.map +1 -0
  49. package/dist/controllers/httpController.js +76 -0
  50. package/dist/controllers/httpController.js.map +1 -0
  51. package/dist/database/database.d.ts +4 -0
  52. package/dist/database/database.d.ts.map +1 -0
  53. package/dist/database/database.js +203 -0
  54. package/dist/database/database.js.map +1 -0
  55. package/dist/database/types/companies.type.d.ts +10 -0
  56. package/dist/database/types/companies.type.d.ts.map +1 -0
  57. package/dist/database/types/companies.type.js +2 -0
  58. package/dist/database/types/companies.type.js.map +1 -0
  59. package/dist/database/types/contacts.type.d.ts +13 -0
  60. package/dist/database/types/contacts.type.d.ts.map +1 -0
  61. package/dist/database/types/contacts.type.js +2 -0
  62. package/dist/database/types/contacts.type.js.map +1 -0
  63. package/dist/database/types/interviews.type.d.ts +11 -0
  64. package/dist/database/types/interviews.type.d.ts.map +1 -0
  65. package/dist/database/types/interviews.type.js +2 -0
  66. package/dist/database/types/interviews.type.js.map +1 -0
  67. package/dist/database/types/jobactivity.type.d.ts +7 -0
  68. package/dist/database/types/jobactivity.type.d.ts.map +1 -0
  69. package/dist/database/types/jobactivity.type.js +2 -0
  70. package/dist/database/types/jobactivity.type.js.map +1 -0
  71. package/dist/database/types/jobcontacts.type.d.ts +5 -0
  72. package/dist/database/types/jobcontacts.type.d.ts.map +1 -0
  73. package/dist/database/types/jobcontacts.type.js +2 -0
  74. package/dist/database/types/jobcontacts.type.js.map +1 -0
  75. package/dist/database/types/jobdocs.type.d.ts +9 -0
  76. package/dist/database/types/jobdocs.type.d.ts.map +1 -0
  77. package/dist/database/types/jobdocs.type.js +2 -0
  78. package/dist/database/types/jobdocs.type.js.map +1 -0
  79. package/dist/database/types/joblocation.type.d.ts +5 -0
  80. package/dist/database/types/joblocation.type.d.ts.map +1 -0
  81. package/dist/database/types/joblocation.type.js +2 -0
  82. package/dist/database/types/joblocation.type.js.map +1 -0
  83. package/dist/database/types/jobpriority.type.d.ts +6 -0
  84. package/dist/database/types/jobpriority.type.d.ts.map +1 -0
  85. package/dist/database/types/jobpriority.type.js +2 -0
  86. package/dist/database/types/jobpriority.type.js.map +1 -0
  87. package/dist/database/types/jobs.type.d.ts +37 -0
  88. package/dist/database/types/jobs.type.d.ts.map +1 -0
  89. package/dist/database/types/jobs.type.js +2 -0
  90. package/dist/database/types/jobs.type.js.map +1 -0
  91. package/dist/database/types/jobsource.type.d.ts +5 -0
  92. package/dist/database/types/jobsource.type.d.ts.map +1 -0
  93. package/dist/database/types/jobsource.type.js +2 -0
  94. package/dist/database/types/jobsource.type.js.map +1 -0
  95. package/dist/database/types/jobstatuses.type.d.ts +6 -0
  96. package/dist/database/types/jobstatuses.type.d.ts.map +1 -0
  97. package/dist/database/types/jobstatuses.type.js +2 -0
  98. package/dist/database/types/jobstatuses.type.js.map +1 -0
  99. package/dist/database/types/jobstatushistory.type.d.ts +8 -0
  100. package/dist/database/types/jobstatushistory.type.d.ts.map +1 -0
  101. package/dist/database/types/jobstatushistory.type.js +2 -0
  102. package/dist/database/types/jobstatushistory.type.js.map +1 -0
  103. package/dist/database/types/jobtags.type.d.ts +6 -0
  104. package/dist/database/types/jobtags.type.d.ts.map +1 -0
  105. package/dist/database/types/jobtags.type.js +2 -0
  106. package/dist/database/types/jobtags.type.js.map +1 -0
  107. package/dist/database/types/jobtasks.type.d.ts +10 -0
  108. package/dist/database/types/jobtasks.type.d.ts.map +1 -0
  109. package/dist/database/types/jobtasks.type.js +2 -0
  110. package/dist/database/types/jobtasks.type.js.map +1 -0
  111. package/dist/database/types/profile.type.d.ts +7 -0
  112. package/dist/database/types/profile.type.d.ts.map +1 -0
  113. package/dist/database/types/profile.type.js +2 -0
  114. package/dist/database/types/profile.type.js.map +1 -0
  115. package/dist/database/types/settings.type.d.ts +7 -0
  116. package/dist/database/types/settings.type.d.ts.map +1 -0
  117. package/dist/database/types/settings.type.js +2 -0
  118. package/dist/database/types/settings.type.js.map +1 -0
  119. package/dist/database/types/tags.type.d.ts +7 -0
  120. package/dist/database/types/tags.type.d.ts.map +1 -0
  121. package/dist/database/types/tags.type.js +2 -0
  122. package/dist/database/types/tags.type.js.map +1 -0
  123. package/dist/database/types.d.ts +79 -0
  124. package/dist/database/types.d.ts.map +1 -0
  125. package/dist/database/types.js +18 -0
  126. package/dist/database/types.js.map +1 -0
  127. package/dist/index.d.ts +3 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +23 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/repository/companyRepository.d.ts +8 -0
  132. package/dist/repository/companyRepository.d.ts.map +1 -0
  133. package/dist/repository/companyRepository.js +53 -0
  134. package/dist/repository/companyRepository.js.map +1 -0
  135. package/dist/repository/core.repository.d.ts +16 -0
  136. package/dist/repository/core.repository.d.ts.map +1 -0
  137. package/dist/repository/core.repository.js +57 -0
  138. package/dist/repository/core.repository.js.map +1 -0
  139. package/dist/repository/jobsRepository.d.ts +14 -0
  140. package/dist/repository/jobsRepository.d.ts.map +1 -0
  141. package/dist/repository/jobsRepository.js +186 -0
  142. package/dist/repository/jobsRepository.js.map +1 -0
  143. package/dist/repository/locationRepository.d.ts +11 -0
  144. package/dist/repository/locationRepository.d.ts.map +1 -0
  145. package/dist/repository/locationRepository.js +33 -0
  146. package/dist/repository/locationRepository.js.map +1 -0
  147. package/dist/repository/profileRepository.d.ts +7 -0
  148. package/dist/repository/profileRepository.d.ts.map +1 -0
  149. package/dist/repository/profileRepository.js +25 -0
  150. package/dist/repository/profileRepository.js.map +1 -0
  151. package/dist/server.d.ts +2 -0
  152. package/dist/server.d.ts.map +1 -0
  153. package/dist/server.js +16 -0
  154. package/dist/server.js.map +1 -0
  155. package/dist/service/companyService.d.ts +6 -0
  156. package/dist/service/companyService.d.ts.map +1 -0
  157. package/dist/service/companyService.js +32 -0
  158. package/dist/service/companyService.js.map +1 -0
  159. package/dist/service/jobService.d.ts +18 -0
  160. package/dist/service/jobService.d.ts.map +1 -0
  161. package/dist/service/jobService.js +48 -0
  162. package/dist/service/jobService.js.map +1 -0
  163. package/dist/service/locationService.d.ts +6 -0
  164. package/dist/service/locationService.d.ts.map +1 -0
  165. package/dist/service/locationService.js +31 -0
  166. package/dist/service/locationService.js.map +1 -0
  167. package/dist/service/profileService.d.ts +10 -0
  168. package/dist/service/profileService.d.ts.map +1 -0
  169. package/dist/service/profileService.js +42 -0
  170. package/dist/service/profileService.js.map +1 -0
  171. package/dist/session/session.d.ts +12 -0
  172. package/dist/session/session.d.ts.map +1 -0
  173. package/dist/session/session.js +22 -0
  174. package/dist/session/session.js.map +1 -0
  175. package/dist/transformers/output.d.ts +10 -0
  176. package/dist/transformers/output.d.ts.map +1 -0
  177. package/dist/transformers/output.js +67 -0
  178. package/dist/transformers/output.js.map +1 -0
  179. package/package.json +44 -0
@@ -0,0 +1,68 @@
1
+ import { addJob, listJobs, getJob, updateJobService, updateJobStatusService, deleteJobService, } from "../../service/jobService.js";
2
+ import { printAddedConfirmation, printApplicationsTable, printEmptyState, printError, printJobDetails, printSuccess, } from "../../transformers/output.js";
3
+ function parseId(idStr) {
4
+ const id = Number(idStr);
5
+ if (isNaN(id))
6
+ throw new Error("Job ID must be a valid number.");
7
+ return id;
8
+ }
9
+ export function handleAdd(data) {
10
+ try {
11
+ const result = addJob(data);
12
+ printAddedConfirmation(result.id, result.role, result.company_name);
13
+ }
14
+ catch (err) {
15
+ printError(err.message);
16
+ }
17
+ }
18
+ export function handleList() {
19
+ try {
20
+ const rows = listJobs();
21
+ if (rows.length === 0) {
22
+ printEmptyState("No applications yet. Add one with `jobtrack add`.");
23
+ return;
24
+ }
25
+ printApplicationsTable(rows);
26
+ }
27
+ catch (err) {
28
+ printError(err.message);
29
+ }
30
+ }
31
+ export function handleView(idStr) {
32
+ try {
33
+ const job = getJob(parseId(idStr));
34
+ printJobDetails(job);
35
+ }
36
+ catch (err) {
37
+ printError(err.message);
38
+ }
39
+ }
40
+ export function handleUpdate(idStr, data) {
41
+ try {
42
+ const job = updateJobService(parseId(idStr), data);
43
+ printSuccess(`Updated application #${job.id}: ${job.role} at ${job.company_name}`);
44
+ }
45
+ catch (err) {
46
+ printError(err.message);
47
+ }
48
+ }
49
+ export function handleStatus(idStr, status, note) {
50
+ try {
51
+ const job = updateJobStatusService(parseId(idStr), status, note);
52
+ printSuccess(`Application #${job.id} (${job.role} at ${job.company_name}) is now "${job.status}"`);
53
+ }
54
+ catch (err) {
55
+ printError(err.message);
56
+ }
57
+ }
58
+ export function handleDelete(idStr) {
59
+ try {
60
+ const id = parseId(idStr);
61
+ deleteJobService(id);
62
+ printSuccess(`Deleted application #${id}.`);
63
+ }
64
+ catch (err) {
65
+ printError(err.message);
66
+ }
67
+ }
68
+ //# sourceMappingURL=job.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.controller.js","sourceRoot":"","sources":["../../../src/controllers/cli/job.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,UAAU,EACV,eAAe,EACf,YAAY,GACb,MAAM,8BAA8B,CAAC;AAGtC,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,KAAK,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACjE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,sBAAsB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,eAAe,CAAC,mDAAmD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,eAAe,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAe;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,YAAY,CAAC,wBAAwB,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAc,EAAE,IAAa;IACvE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjE,YAAY,CAAC,gBAAgB,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,YAAY,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrB,YAAY,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function handleLocationList(): void;
2
+ export declare function handleLocationAdd(name: string): void;
3
+ export declare function handleLocationUpdate(idStr: string, name: string): void;
4
+ export declare function handleLocationDelete(idStr: string): void;
5
+ //# sourceMappingURL=locationController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locationController.d.ts","sourceRoot":"","sources":["../../../src/controllers/cli/locationController.ts"],"names":[],"mappings":"AASA,wBAAgB,kBAAkB,SAqBjC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,QAO7C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAU/D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,QAUjD"}
@@ -0,0 +1,57 @@
1
+ import { listLocationsService, addLocationService, updateLocationService, deleteLocationService, } from "../../service/locationService.js";
2
+ import { printSuccess, printError, printEmptyState } from "../../transformers/output.js";
3
+ import Table from "cli-table3";
4
+ export function handleLocationList() {
5
+ try {
6
+ const locations = listLocationsService();
7
+ if (locations.length === 0) {
8
+ printEmptyState("No locations found.");
9
+ return;
10
+ }
11
+ const table = new Table({
12
+ head: ["ID", "Location Name"],
13
+ style: { head: ["cyan"] },
14
+ });
15
+ for (const loc of locations) {
16
+ table.push([loc.id, loc.name]);
17
+ }
18
+ console.log(table.toString());
19
+ }
20
+ catch (err) {
21
+ printError(err.message);
22
+ }
23
+ }
24
+ export function handleLocationAdd(name) {
25
+ try {
26
+ const loc = addLocationService(name);
27
+ printSuccess(`Added location #${loc.id}: ${loc.name}`);
28
+ }
29
+ catch (err) {
30
+ printError(err.message);
31
+ }
32
+ }
33
+ export function handleLocationUpdate(idStr, name) {
34
+ try {
35
+ const id = Number(idStr);
36
+ if (isNaN(id))
37
+ throw new Error("Location ID must be a valid number.");
38
+ const loc = updateLocationService(id, name);
39
+ printSuccess(`Updated location #${loc.id} to "${loc.name}"`);
40
+ }
41
+ catch (err) {
42
+ printError(err.message);
43
+ }
44
+ }
45
+ export function handleLocationDelete(idStr) {
46
+ try {
47
+ const id = Number(idStr);
48
+ if (isNaN(id))
49
+ throw new Error("Location ID must be a valid number.");
50
+ deleteLocationService(id);
51
+ printSuccess(`Deleted location #${id}.`);
52
+ }
53
+ catch (err) {
54
+ printError(err.message);
55
+ }
56
+ }
57
+ //# sourceMappingURL=locationController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locationController.js","sourceRoot":"","sources":["../../../src/controllers/cli/locationController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,eAAe,CAAC,qBAAqB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC;YAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;SAC1B,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrC,YAAY,CAAC,mBAAmB,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,IAAY;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAEtE,MAAM,GAAG,GAAG,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5C,YAAY,CAAC,qBAAqB,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAEtE,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC1B,YAAY,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function handleProfileCreate(username: string, displayName?: string): void;
2
+ export declare function handleProfileSwitch(username: string): void;
3
+ export declare function handleProfileList(): void;
4
+ export declare function handleProfileWhoami(): void;
5
+ export declare function handleProfileUpdate(newName: string): void;
6
+ //# sourceMappingURL=profile.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/cli/profile.controller.ts"],"names":[],"mappings":"AAcA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,QAOzE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,QAOnD;AAED,wBAAgB,iBAAiB,SAGhC;AAED,wBAAgB,mBAAmB,SAOlC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,QAOlD"}
@@ -0,0 +1,42 @@
1
+ import { createProfileService, switchProfileService, listProfilesService, whoamiService, updateProfileService, } from "../../service/profileService.js";
2
+ import { printSuccess, printError, printEmpty, printProfileList, } from "../../transformers/output.js";
3
+ export function handleProfileCreate(username, displayName) {
4
+ try {
5
+ const profile = createProfileService(username, displayName);
6
+ printSuccess(`Created profile "${profile.username}" and set it as active.`);
7
+ }
8
+ catch (err) {
9
+ printError(err.message);
10
+ }
11
+ }
12
+ export function handleProfileSwitch(username) {
13
+ try {
14
+ const profile = switchProfileService(username);
15
+ printSuccess(`Switched to profile "${profile.username}".`);
16
+ }
17
+ catch (err) {
18
+ printError(err.message);
19
+ }
20
+ }
21
+ export function handleProfileList() {
22
+ const { profiles, activeProfileId } = listProfilesService();
23
+ printProfileList(profiles, activeProfileId);
24
+ }
25
+ export function handleProfileWhoami() {
26
+ const username = whoamiService();
27
+ if (!username) {
28
+ printEmpty("No active profile. Run `jobtrack profile create <username>` to get started.");
29
+ return;
30
+ }
31
+ console.log(username);
32
+ }
33
+ export function handleProfileUpdate(newName) {
34
+ try {
35
+ const profile = updateProfileService(newName);
36
+ printSuccess(`Updated active profile "${profile.username}". Display name is now "${profile.display_name}".`);
37
+ }
38
+ catch (err) {
39
+ printError(err.message);
40
+ }
41
+ }
42
+ //# sourceMappingURL=profile.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.controller.js","sourceRoot":"","sources":["../../../src/controllers/cli/profile.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,WAAoB;IACxE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC5D,YAAY,CAAC,oBAAoB,OAAO,CAAC,QAAQ,yBAAyB,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC/C,YAAY,CAAC,wBAAwB,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAC5D,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,UAAU,CAAC,6EAA6E,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9C,YAAY,CAAC,2BAA2B,OAAO,CAAC,QAAQ,2BAA2B,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Request, Response } from "express";
2
+ export declare function getJobs(req: Request, res: Response): void;
3
+ export declare function postJob(req: Request, res: Response): void;
4
+ export declare function getWhoami(req: Request, res: Response): void;
5
+ export declare function getProfiles(req: Request, res: Response): void;
6
+ export declare function postProfile(req: Request, res: Response): void;
7
+ export declare function postProfileSwitch(req: Request, res: Response): void;
8
+ //# sourceMappingURL=httpController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpController.d.ts","sourceRoot":"","sources":["../../src/controllers/httpController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAajD,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAOlD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QA0ClD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAGpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAGtD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAYtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAQ5D"}
@@ -0,0 +1,76 @@
1
+ import { addJob, listJobs } from "../service/jobService.js";
2
+ import { createProfileService, switchProfileService, listProfilesService, whoamiService, } from "../service/profileService.js";
3
+ // Same shape as cliController.ts: call a service, catch what it throws.
4
+ // The only difference is HOW the result is presented -- JSON instead of
5
+ // chalk. The services themselves are completely unaware this exists.
6
+ export function getJobs(req, res) {
7
+ try {
8
+ const jobs = listJobs();
9
+ res.json({ jobs });
10
+ }
11
+ catch (err) {
12
+ res.status(400).json({ error: err.message });
13
+ }
14
+ }
15
+ export function postJob(req, res) {
16
+ try {
17
+ const { company_name, role, status, date_applied, link, notes, source_name, location_name, mode_name, priority_name, salary_min, salary_max, salary_currency, salary_period_name, } = req.body;
18
+ if (!company_name || !role || !date_applied) {
19
+ res.status(422).json({ error: "company_name, role, and date_applied are required." });
20
+ return;
21
+ }
22
+ const result = addJob({
23
+ company_name,
24
+ role,
25
+ status,
26
+ date_applied,
27
+ link,
28
+ notes,
29
+ source_name,
30
+ location_name,
31
+ mode_name,
32
+ priority_name,
33
+ salary_min,
34
+ salary_max,
35
+ salary_currency,
36
+ salary_period_name,
37
+ });
38
+ res.status(201).json(result);
39
+ }
40
+ catch (err) {
41
+ res.status(400).json({ error: err.message });
42
+ }
43
+ }
44
+ export function getWhoami(req, res) {
45
+ const username = whoamiService();
46
+ res.json({ username });
47
+ }
48
+ export function getProfiles(req, res) {
49
+ const { profiles, activeProfileId } = listProfilesService();
50
+ res.json({ profiles, activeProfileId });
51
+ }
52
+ export function postProfile(req, res) {
53
+ try {
54
+ const { username } = req.body;
55
+ if (!username) {
56
+ res.status(422).json({ error: "username is required." });
57
+ return;
58
+ }
59
+ const profile = createProfileService(username);
60
+ res.status(201).json(profile);
61
+ }
62
+ catch (err) {
63
+ res.status(400).json({ error: err.message });
64
+ }
65
+ }
66
+ export function postProfileSwitch(req, res) {
67
+ try {
68
+ const { username } = req.body;
69
+ const profile = switchProfileService(username);
70
+ res.json(profile);
71
+ }
72
+ catch (err) {
73
+ res.status(400).json({ error: err.message });
74
+ }
75
+ }
76
+ //# sourceMappingURL=httpController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpController.js","sourceRoot":"","sources":["../../src/controllers/httpController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import Database from "better-sqlite3";
2
+ export declare const database: Database.Database;
3
+ export declare function getDbPath(): string;
4
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAgBtC,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,QAAgC,CAAC;AA4LjE,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -0,0 +1,203 @@
1
+ import Database from "better-sqlite3";
2
+ import path from "path";
3
+ import os from "os";
4
+ import fs from "fs";
5
+ // Store the database in the user's home directory, e.g. ~/.jobtrack/jobtrack.db
6
+ // This means the data survives even if the project folder is deleted,
7
+ // and works the same no matter where you run the command from.
8
+ const DATA_DIR = path.join(os.homedir(), ".jobtrack");
9
+ const DB_PATH = path.join(DATA_DIR, "jobtrack.db");
10
+ if (!fs.existsSync(DATA_DIR)) {
11
+ fs.mkdirSync(DATA_DIR, { recursive: true });
12
+ }
13
+ // This creates (or opens, if it already exists) the actual .db file on disk.
14
+ export const database = new Database(DB_PATH);
15
+ database.pragma("foreign_keys = ON");
16
+ // Run once on startup: create the table if it doesn't exist yet.
17
+ // This is our schema -- the shape of every job application record.
18
+ database.exec(`
19
+ -- ===== GLOBAL LOOKUP TABLES =====
20
+
21
+ CREATE TABLE IF NOT EXISTS job_sources (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ name TEXT NOT NULL UNIQUE
24
+ );
25
+
26
+ CREATE TABLE IF NOT EXISTS job_locations (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ name TEXT NOT NULL UNIQUE
29
+ );
30
+
31
+ CREATE TABLE IF NOT EXISTS job_modes (
32
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
33
+ name TEXT NOT NULL UNIQUE
34
+ );
35
+
36
+ CREATE TABLE IF NOT EXISTS job_statuses (
37
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
38
+ name TEXT NOT NULL UNIQUE,
39
+ sort_order INTEGER NOT NULL DEFAULT 0
40
+ );
41
+
42
+ CREATE TABLE IF NOT EXISTS job_priorities (
43
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
44
+ name TEXT NOT NULL UNIQUE,
45
+ sort_order INTEGER NOT NULL DEFAULT 0
46
+ );
47
+
48
+ CREATE TABLE IF NOT EXISTS salary_periods (
49
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
50
+ name TEXT NOT NULL UNIQUE
51
+ );
52
+
53
+ -- ===== PROFILE-SCOPED TABLES =====
54
+
55
+ CREATE TABLE IF NOT EXISTS profiles (
56
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
57
+ username TEXT NOT NULL UNIQUE,
58
+ display_name TEXT,
59
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
60
+ );
61
+
62
+ CREATE TABLE IF NOT EXISTS companies (
63
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
64
+ profile_id INTEGER NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
65
+ name TEXT NOT NULL,
66
+ industry TEXT,
67
+ website TEXT,
68
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
69
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
70
+ UNIQUE(profile_id, name)
71
+ );
72
+
73
+ CREATE TABLE IF NOT EXISTS jobs (
74
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
75
+ profile_id INTEGER NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
76
+ company_id INTEGER NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
77
+ role TEXT NOT NULL,
78
+ status_id INTEGER NOT NULL REFERENCES job_statuses(id),
79
+ source_id INTEGER REFERENCES job_sources(id),
80
+ location_id INTEGER REFERENCES job_locations(id),
81
+ mode_id INTEGER REFERENCES job_modes(id),
82
+ priority_id INTEGER REFERENCES job_priorities(id),
83
+ date_applied TEXT NOT NULL,
84
+ link TEXT,
85
+ notes TEXT,
86
+ salary_min INTEGER,
87
+ salary_max INTEGER,
88
+ salary_currency TEXT DEFAULT 'INR',
89
+ salary_period_id INTEGER REFERENCES salary_periods(id),
90
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
91
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
92
+ );
93
+
94
+ CREATE TABLE IF NOT EXISTS job_status_history (
95
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
96
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
97
+ status_id INTEGER NOT NULL REFERENCES job_statuses(id),
98
+ changed_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
99
+ note TEXT
100
+ );
101
+
102
+ CREATE TABLE IF NOT EXISTS job_activity (
103
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
104
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
105
+ description TEXT NOT NULL,
106
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
107
+ );
108
+
109
+ CREATE TABLE IF NOT EXISTS interviews (
110
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
111
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
112
+ round_type TEXT NOT NULL,
113
+ scheduled_at TEXT,
114
+ outcome TEXT,
115
+ notes TEXT,
116
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
117
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
118
+ );
119
+
120
+ CREATE TABLE IF NOT EXISTS job_tasks (
121
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
122
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
123
+ title TEXT NOT NULL,
124
+ due_date TEXT,
125
+ completed INTEGER NOT NULL DEFAULT 0,
126
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
127
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
128
+ );
129
+
130
+ CREATE TABLE IF NOT EXISTS job_docs (
131
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
132
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
133
+ doc_type TEXT NOT NULL,
134
+ file_path TEXT NOT NULL,
135
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
136
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
137
+ );
138
+
139
+ CREATE TABLE IF NOT EXISTS tags (
140
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
141
+ profile_id INTEGER NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
142
+ name TEXT NOT NULL,
143
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
144
+ UNIQUE(profile_id, name)
145
+ );
146
+
147
+ CREATE TABLE IF NOT EXISTS job_tags (
148
+ profile_id INTEGER NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
149
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
150
+ tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
151
+ PRIMARY KEY (job_id, tag_id)
152
+ );
153
+
154
+ CREATE TABLE IF NOT EXISTS contacts (
155
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
156
+ profile_id INTEGER NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
157
+ company_id INTEGER REFERENCES companies(id) ON DELETE SET NULL,
158
+ name TEXT NOT NULL,
159
+ role TEXT,
160
+ email TEXT,
161
+ linkedin_url TEXT,
162
+ notes TEXT,
163
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
164
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
165
+ );
166
+
167
+ CREATE TABLE IF NOT EXISTS job_contacts (
168
+ job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
169
+ contact_id INTEGER NOT NULL REFERENCES contacts(id) ON DELETE CASCADE,
170
+ PRIMARY KEY (job_id, contact_id)
171
+ );
172
+
173
+ CREATE TABLE IF NOT EXISTS settings (
174
+ profile_id INTEGER NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
175
+ setting_key TEXT NOT NULL,
176
+ setting_value TEXT,
177
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
178
+ PRIMARY KEY (profile_id, setting_key)
179
+ );
180
+
181
+ -- ===== SEED DATA =====
182
+
183
+ INSERT OR IGNORE INTO job_statuses (name, sort_order) VALUES
184
+ ('applied', 1), ('screening', 2), ('interview', 3),
185
+ ('offer', 4), ('rejected', 5), ('ghosted', 6), ('withdrawn', 7);
186
+
187
+ INSERT OR IGNORE INTO job_priorities (name, sort_order) VALUES
188
+ ('low', 1), ('medium', 2), ('high', 3);
189
+
190
+ INSERT OR IGNORE INTO job_sources (name) VALUES
191
+ ('LinkedIn'), ('Referral'), ('Company site'), ('Recruiter'), ('Job board'), ('Other');
192
+
193
+ INSERT OR IGNORE INTO job_modes (name) VALUES
194
+ ('Remote'), ('Onsite'), ('Hybrid');
195
+
196
+ INSERT OR IGNORE INTO salary_periods (name) VALUES
197
+ ('per year'), ('per month'), ('per hour');
198
+
199
+ `);
200
+ export function getDbPath() {
201
+ return DB_PATH;
202
+ }
203
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,gFAAgF;AAChF,sEAAsE;AACtE,+DAA+D;AAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,QAAQ,GAAsB,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAErC,iEAAiE;AACjE,mEAAmE;AACnE,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqLb,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface Companies {
2
+ id: number;
3
+ profile_id: number;
4
+ name: string;
5
+ industry: string | null;
6
+ website: string | null;
7
+ created_at: string | null;
8
+ updated_at: string | null;
9
+ }
10
+ //# sourceMappingURL=companies.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companies.type.d.ts","sourceRoot":"","sources":["../../../src/database/types/companies.type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IAEtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAE5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=companies.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companies.type.js","sourceRoot":"","sources":["../../../src/database/types/companies.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ export interface Contacts {
2
+ id: number;
3
+ profile_id: number;
4
+ company_id: number;
5
+ name: string;
6
+ role: string | null;
7
+ email: string | null;
8
+ linkedin_url: string | null;
9
+ notes: string | null;
10
+ created_at: string | null;
11
+ updated_at: string | null;
12
+ }
13
+ //# sourceMappingURL=contacts.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.type.d.ts","sourceRoot":"","sources":["../../../src/database/types/contacts.type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contacts.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.type.js","sourceRoot":"","sources":["../../../src/database/types/contacts.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ export interface Interviews {
2
+ id: number;
3
+ job_id: number;
4
+ round_type: number;
5
+ scheduled_at: number;
6
+ outcome: number;
7
+ notes: number;
8
+ created_at: number;
9
+ updated_at: number;
10
+ }
11
+ //# sourceMappingURL=interviews.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interviews.type.d.ts","sourceRoot":"","sources":["../../../src/database/types/interviews.type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAA;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interviews.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interviews.type.js","sourceRoot":"","sources":["../../../src/database/types/interviews.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export interface JobActivity {
2
+ id: number;
3
+ job_id: number;
4
+ description: string | null;
5
+ created_at: string | null;
6
+ }
7
+ //# sourceMappingURL=jobactivity.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobactivity.type.d.ts","sourceRoot":"","sources":["../../../src/database/types/jobactivity.type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jobactivity.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobactivity.type.js","sourceRoot":"","sources":["../../../src/database/types/jobactivity.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export interface JobContacts {
2
+ job_id: number;
3
+ contact_id: number;
4
+ }
5
+ //# sourceMappingURL=jobcontacts.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobcontacts.type.d.ts","sourceRoot":"","sources":["../../../src/database/types/jobcontacts.type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAA;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jobcontacts.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobcontacts.type.js","sourceRoot":"","sources":["../../../src/database/types/jobcontacts.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export interface JobDocs {
2
+ id: number;
3
+ job_id: number;
4
+ doc_type: string;
5
+ file_path: string;
6
+ created_at: string;
7
+ updated_at: string;
8
+ }
9
+ //# sourceMappingURL=jobdocs.type.d.ts.map