@foxtware/mineral 0.1.8 → 0.1.10

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 (186) hide show
  1. package/.creds.yml.sample +43 -1
  2. package/AGENTS.md +6 -1
  3. package/README.md +1 -1
  4. package/api/bleckmann/.gitkeep +0 -0
  5. package/api/bleckmann/bleckmann.constants.js +8 -0
  6. package/api/bleckmann/bleckmann.utils.js +32 -0
  7. package/api/bleckmann/bleckmannAsnGet.js +52 -0
  8. package/api/bleckmann/bleckmannAsnsGet.js +65 -0
  9. package/api/constants.js +2 -1
  10. package/api/github/github.constants.js +11 -0
  11. package/api/github/github.utils.js +65 -0
  12. package/api/github/githubGet.js +144 -0
  13. package/api/github/githubIssueCreate.js +71 -0
  14. package/api/github/githubIssueGet.js +65 -0
  15. package/api/github/githubIssueUpdate.js +71 -0
  16. package/api/github/githubIssuesGet.js +74 -0
  17. package/api/github/githubPullRequestCreate.js +74 -0
  18. package/api/github/githubPullRequestGet.js +65 -0
  19. package/api/github/githubPullRequestMerge.js +77 -0
  20. package/api/github/githubPullRequestUpdate.js +72 -0
  21. package/api/github/githubPullRequestsGet.js +74 -0
  22. package/api/github/githubRepoCreate.js +80 -0
  23. package/api/github/githubRepoDelete.js +60 -0
  24. package/api/github/githubRepoGet.js +61 -0
  25. package/api/github/githubRepoUpdate.js +68 -0
  26. package/api/github/githubReposGet.js +69 -0
  27. package/api/github/githubUserGet.js +64 -0
  28. package/api/linear/linear.utils.js +9 -14
  29. package/api/linear/linearIssuesGet.js +9 -9
  30. package/api/logiwa/logiwa.utils.js +27 -25
  31. package/api/logiwa/logiwaInventoriesGet.js +5 -3
  32. package/api/logiwa/logiwaOrderGet.js +4 -2
  33. package/api/logiwa/logiwaOrdersGet.js +5 -3
  34. package/api/logiwa/logiwaProductGet.js +4 -2
  35. package/api/logiwa/logiwaProductsGet.js +5 -3
  36. package/api/logiwa/logiwaReportGetAvailableToPromise.js +5 -3
  37. package/api/logiwa/logiwaReportGetInventoryCalculation.js +5 -3
  38. package/api/logiwa/logiwaReportGetInventorySnapshot.js +5 -3
  39. package/api/logiwa/logiwaReportGetTotalInventory.js +5 -3
  40. package/api/logiwa/logiwaWebhookStatusGet.js +4 -2
  41. package/api/logiwa/logiwaWebhookSubscribe.js +8 -6
  42. package/api/logiwa/logiwaWebhookUnsubscribe.js +4 -2
  43. package/api/logiwa/logiwaWebhooksGet.js +4 -2
  44. package/api/loop/loop.constants.js +7 -0
  45. package/api/loop/loop.utils.js +37 -0
  46. package/api/loop/loopAllowlistItemsGet.js +42 -0
  47. package/api/loop/loopBlocklistItemsGet.js +46 -0
  48. package/api/loop/loopDestinationsGet.js +42 -0
  49. package/api/loop/loopGet.js +139 -0
  50. package/api/loop/loopReturnGet.js +73 -0
  51. package/api/loop/loopReturnsGet.js +46 -0
  52. package/api/peoplevox/peoplevox.constants.js +1 -1
  53. package/api/peoplevox/peoplevox.sessions.js +54 -0
  54. package/api/peoplevox/peoplevox.utils.js +67 -31
  55. package/api/peoplevox/peoplevoxGetSingle.js +7 -5
  56. package/api/peoplevox/peoplevoxOrderEdit.js +7 -5
  57. package/api/peoplevox/peoplevoxReportGet.js +11 -9
  58. package/api/pipelineSteps.js +49 -0
  59. package/api/shopify/shopify.utils.js +18 -24
  60. package/api/shopify/shopifyBulkMutationDo.js +211 -0
  61. package/api/shopify/shopifyBulkOperationGet.js +86 -0
  62. package/api/shopify/shopifyBulkOperationRunMutation.js +83 -0
  63. package/api/shopify/shopifyCheckoutAndAccountsConfigurationUpdate.js +79 -0
  64. package/api/shopify/shopifyCollectionGet.js +7 -7
  65. package/api/shopify/shopifyCustomerGet.js +6 -6
  66. package/api/shopify/shopifyGet.js +18 -13
  67. package/api/shopify/shopifyGetSingle.js +9 -9
  68. package/api/shopify/shopifyMutationDo.js +6 -6
  69. package/api/shopify/shopifyOrdersGet.js +11 -11
  70. package/api/shopify/shopifyStagedUploadCreate.js +96 -0
  71. package/api/shopify/shopifyTagsAdd.js +1 -1
  72. package/api/shopify/shopifyTagsAddBulk.js +90 -0
  73. package/api/shopify/shopifyTagsRemove.js +1 -1
  74. package/api/slack/slack.utils.js +10 -19
  75. package/api/slack/slackMessagePost.js +11 -11
  76. package/api/starshipit/starshipit.constants.js +8 -0
  77. package/api/starshipit/starshipit.utils.js +71 -0
  78. package/api/starshipit/starshipitAddressCreate.js +77 -0
  79. package/api/starshipit/starshipitAddressDelete.js +55 -0
  80. package/api/starshipit/starshipitAddressUpdate.js +69 -0
  81. package/api/starshipit/starshipitAddressesGet.js +52 -0
  82. package/api/starshipit/starshipitGet.js +146 -0
  83. package/api/starshipit/starshipitOrderDelete.js +102 -0
  84. package/api/starshipit/starshipitOrderGet.js +74 -0
  85. package/api/starshipit/starshipitOrderUpdate.js +109 -0
  86. package/api/starshipit/starshipitOrdersListShipped.js +64 -0
  87. package/api/starshipit/starshipitProductAdd.js +100 -0
  88. package/api/starshipit/starshipitProductsDelete.js +57 -0
  89. package/api/starshipit/starshipitProductsGet.js +49 -0
  90. package/api/starshipit/starshipitTrackingGet.js +69 -0
  91. package/api/stripe/_example.js +48 -0
  92. package/api/stripe/stripe.constants.js +5 -0
  93. package/api/stripe/stripe.utils.js +42 -0
  94. package/api/stripe/stripeCardCharge.js +98 -0
  95. package/api/stripe/stripeCardTokenCreate.js +70 -0
  96. package/api/stripe/stripeChargeCapture.js +63 -0
  97. package/api/stripe/stripeChargeCreate.js +70 -0
  98. package/api/stripe/stripeChargeGet.js +51 -0
  99. package/api/stripe/stripeChargesGet.js +52 -0
  100. package/api/stripe/stripeRefundCreate.js +64 -0
  101. package/api/stripe/stripeRefundGet.js +51 -0
  102. package/api/stripe/stripeRefundsGet.js +52 -0
  103. package/api/stripe/stripeTokenGet.js +51 -0
  104. package/api/stylearcade/stylearcade.constants.js +5 -0
  105. package/api/stylearcade/stylearcade.utils.js +40 -0
  106. package/api/stylearcade/stylearcadeDataGet.js +62 -0
  107. package/api/stylearcade/stylearcadeGet.js +133 -0
  108. package/api/stylearcade/stylearcadeMetadataGet.js +47 -0
  109. package/api/supabase/supabase.utils.js +52 -0
  110. package/api/supabase/supabaseRowDelete.js +95 -0
  111. package/api/supabase/supabaseRowGet.js +58 -0
  112. package/api/supabase/supabaseRowInsert.js +56 -0
  113. package/api/supabase/supabaseRowUpdate.js +58 -0
  114. package/api/supabase/supabaseRpc.js +61 -0
  115. package/api/supabase/supabaseTableGet.js +44 -0
  116. package/api/supabase/supabaseTableGetAll.js +86 -0
  117. package/api/threeclicks/threeclicks.constants.js +8 -0
  118. package/api/threeclicks/threeclicks.utils.js +119 -0
  119. package/api/threeclicks/threeclicksCollectionsGet.js +40 -0
  120. package/api/threeclicks/threeclicksGet.js +138 -0
  121. package/api/threeclicks/threeclicksKeycodeCreate.js +55 -0
  122. package/api/threeclicks/threeclicksKeycodeGet.js +47 -0
  123. package/api/threeclicks/threeclicksPurchaseOrderCreate.js +34 -0
  124. package/api/threeclicks/threeclicksPurchaseOrderCreateBulk.js +34 -0
  125. package/api/threeclicks/threeclicksPurchaseOrderGet.js +33 -0
  126. package/api/threeclicks/threeclicksPurchaseOrderQuantitiesGet.js +33 -0
  127. package/api/threeclicks/threeclicksPurchaseOrderQuantityCreate.js +34 -0
  128. package/api/threeclicks/threeclicksPurchaseOrderQuantityCreateBulk.js +34 -0
  129. package/api/threeclicks/threeclicksPurchaseOrderQuantityUpdate.js +46 -0
  130. package/api/threeclicks/threeclicksPurchaseOrderQuantityUpdateBulk.js +46 -0
  131. package/api/threeclicks/threeclicksPurchaseOrderUpdate.js +35 -0
  132. package/api/threeclicks/threeclicksPurchaseOrdersGet.js +30 -0
  133. package/api/threeclicks/threeclicksShipmentCreate.js +34 -0
  134. package/api/threeclicks/threeclicksShipmentGet.js +33 -0
  135. package/api/threeclicks/threeclicksShipmentOrderAdd.js +38 -0
  136. package/api/threeclicks/threeclicksShipmentOrderQuantityCreate.js +35 -0
  137. package/api/threeclicks/threeclicksShipmentQuantityUpdate.js +35 -0
  138. package/api/threeclicks/threeclicksShipmentStatusUpdate.js +45 -0
  139. package/api/threeclicks/threeclicksShipmentsGet.js +52 -0
  140. package/api/threeclicks/threeclicksSignatureCalculate.js +73 -0
  141. package/api/threeclicks/threeclicksStyleCodesGet.js +46 -0
  142. package/api/threeclicks/threeclicksStyleColourCreate.js +47 -0
  143. package/api/threeclicks/threeclicksStyleColourDelete.js +34 -0
  144. package/api/threeclicks/threeclicksStyleCreate.js +44 -0
  145. package/api/threeclicks/threeclicksStyleDelete.js +33 -0
  146. package/api/threeclicks/threeclicksStyleGet.js +43 -0
  147. package/api/threeclicks/threeclicksStylePriceUpdate.js +70 -0
  148. package/api/threeclicks/threeclicksStyleUpdate.js +47 -0
  149. package/api/threeclicks/threeclicksStylesGet.js +45 -0
  150. package/api/upstash/upstash.utils.js +36 -0
  151. package/api/upstash/upstashDel.js +46 -0
  152. package/api/upstash/upstashExists.js +46 -0
  153. package/api/upstash/upstashGet.js +46 -0
  154. package/api/upstash/upstashSet.js +64 -0
  155. package/api/utils.js +90 -76
  156. package/api/validators.js +1 -1
  157. package/api/workable/workable.constants.js +3 -0
  158. package/api/workable/workable.utils.js +41 -0
  159. package/api/workable/workableGet.js +151 -0
  160. package/api/workable/workableJobCandidateCreate.js +87 -0
  161. package/api/workable/workableJobGet.js +52 -0
  162. package/api/workable/workableJobMembersGet.js +52 -0
  163. package/api/workable/workableJobStagesGet.js +52 -0
  164. package/api/workable/workableJobsGet.js +78 -0
  165. package/api/yotpo/yotpo.utils.js +17 -22
  166. package/api/yotpo/yotpoCampaignsGet.js +6 -6
  167. package/api/yotpo/yotpoCustomerActionRecord.js +7 -7
  168. package/api/yotpo/yotpoCustomerAnniversaryGet.js +7 -7
  169. package/api/yotpo/yotpoCustomerAnniversarySet.js +7 -7
  170. package/api/yotpo/yotpoCustomerBirthdaySet.js +7 -7
  171. package/api/yotpo/yotpoCustomerGet.js +6 -6
  172. package/api/yotpo/yotpoCustomerPointsAdjust.js +7 -7
  173. package/api/yotpo/yotpoCustomerUpsert.js +7 -7
  174. package/api/yotpo/yotpoCustomersRecentGet.js +6 -6
  175. package/api/yotpo/yotpoRedemptionCreate.js +7 -7
  176. package/api/yotpo/yotpoRedemptionOptionsGet.js +6 -6
  177. package/api/yotpo/yotpoVipTiersGet.js +5 -5
  178. package/api/youtube/youtube.constants.js +5 -0
  179. package/api/youtube/youtube.utils.js +77 -0
  180. package/api/youtube/youtubeChannelVideosGet.js +25 -70
  181. package/hosting/.hosting.yml.sample +9 -11
  182. package/hosting/copyCredsToEnv.js +58 -2
  183. package/hosting/deployFromHostingYml.js +9 -2
  184. package/hosting/hosting.utils.js +3 -2
  185. package/package.json +3 -1
  186. package/server.utils.js +1 -0
package/.creds.yml.sample CHANGED
@@ -25,5 +25,47 @@ yotpo:
25
25
  linear:
26
26
  API_KEY: _______________________________
27
27
 
28
+ github:
29
+ ACCESS_TOKEN: ghp_______________________
30
+
28
31
  slack:
29
- BOT_TOKEN: xoxb________________________________
32
+ BOT_TOKEN: xoxb_________________________
33
+
34
+ workable:
35
+ BASE_URL: https://__.workable.com/spi/v3
36
+ ACCESS_TOKEN: __________________________
37
+
38
+ loop:
39
+ au:
40
+ API_KEY: _____________________________
41
+
42
+ upstash:
43
+ BASE_URL: https://___________.upstash.io
44
+ TOKEN: _________________________________
45
+
46
+ supabase:
47
+ project:
48
+ BASE_URL: https://________.supabase.co
49
+ API_KEY: _____________________________
50
+
51
+ stripe:
52
+ API_KEY: sk_____________________________
53
+
54
+ starshipit:
55
+ acc:
56
+ API_KEY: _____________________________
57
+ SUB_KEY: _____________________________
58
+ WEBHOOK_SECRET: ______________________
59
+
60
+ bleckmann:
61
+ PRIMARY_KEY: ___________________________
62
+ SECONDARY_KEY: _________________________
63
+
64
+ stylearcade:
65
+ BASE_URL: https://api.stylearcade.com/range-plan/v1/tenants/________
66
+ API_KEY: _______________________________
67
+
68
+ threeclicks:
69
+ API_KEY: _______________________________
70
+ API_SECRET: ____________________________
71
+ API_DOMAIN: g40-server.instance.3clickscloud.com
package/AGENTS.md CHANGED
@@ -10,4 +10,9 @@ Notes for AI assistants working in this directory. **Read this file at the start
10
10
  - Use snake_case for package.json commands, with colon if appropriate.
11
11
  - Use newlines and trailing commas where appropriate to minimise future diffs, e.g. in function args.
12
12
  - If you make a new .env or .creds.yml variable, update the correlating .sample file.
13
- - In Shopify, don't normalise and take gids as inputs if you can just take the id - the non-gid number - instead.
13
+ - In Shopify, don't normalise and take gids as inputs if you can just take the id - the non-gid number - instead.
14
+ - Use trailing commas wherever possible, for future git diff readability.
15
+
16
+ ## API clients
17
+ - Base URLs for platform clients should live in `{platform}.constants.js`, not creds, if they are static for all users of the API.
18
+ - Don't explicitly set `Content-Type: application/json` on the client — `customFetch` already adds it when there is a request body.
package/README.md CHANGED
@@ -56,4 +56,4 @@ For cloud deploy, workspaces use `hosting/.hosting.yml` and `npm run host` (same
56
56
  ## What the thang do
57
57
  - Server makes functions available from the api/ route, where an export matches the filename. Run `npm run serve`, and they're all curlable.
58
58
  - .creds.yml is copied into .env when deploying, so creds can be accessed while hosted. Locally, it reads from the file directly.
59
- - Cloud deploy reads `hosting/.hosting.yml` for per-function config — `before_wrappers` / `after_wrappers` like `requireHostedApiKey`, `max_instances`, schedules — and deploys each function to Google Cloud.
59
+ - Cloud deploy reads `hosting/.hosting.yml` for per-function config — `before_wrappers` / `after_wrappers` like `requireHostedApiKey`, `max_instances`, schedules — and deploys each function to Google Cloud.
File without changes
@@ -0,0 +1,8 @@
1
+ // TODO: Split out API version
2
+ const BASE_URL = 'https://apis.bleckmann.com';
3
+ const MAX_PER_PAGE = 1000; // The 'limit' query parameter must be an integer from 1 to 1000
4
+
5
+ module.exports = {
6
+ BASE_URL,
7
+ MAX_PER_PAGE,
8
+ };
@@ -0,0 +1,32 @@
1
+ const { BASE_URL } = require('../bleckmann/bleckmann.constants');
2
+ const { resolveCreds, useBaseUrl } = require('../pipelineSteps');
3
+ const { FetchClient } = require('../utils');
4
+
5
+ const useAuthHeaders = async (state) => {
6
+ const { requestPayload, context } = state;
7
+ const { creds } = context;
8
+ const { PRIMARY_KEY } = creds;
9
+
10
+ return {
11
+ requestPayload: {
12
+ ...requestPayload,
13
+ headers: {
14
+ 'x-api-key': PRIMARY_KEY,
15
+ ...requestPayload.headers,
16
+ },
17
+ },
18
+ };
19
+ };
20
+
21
+ const bleckmannClient = new FetchClient({
22
+ pipeline: [
23
+ resolveCreds,
24
+ useAuthHeaders,
25
+ useBaseUrl(BASE_URL),
26
+ 'fetch',
27
+ ],
28
+ });
29
+
30
+ module.exports = {
31
+ bleckmannClient,
32
+ };
@@ -0,0 +1,52 @@
1
+ const { credsValidator } = require('../validators');
2
+ const { ArgsWarden } = require('../utils');
3
+ const { bleckmannClient } = require('../bleckmann/bleckmann.utils');
4
+
5
+ const argsWarden = new ArgsWarden([
6
+ ['credsPayload', credsValidator],
7
+ ['asnId'],
8
+ ]);
9
+
10
+ const bleckmannAsnGet = async (
11
+ credsPayload,
12
+ asnId,
13
+ options = {},
14
+ ) => {
15
+
16
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
17
+ credsPayload,
18
+ asnId,
19
+ });
20
+ if (rejectResponse) {
21
+ return rejectResponse;
22
+ }
23
+
24
+ const response = await bleckmannClient.fetch({
25
+ requestPayload: {
26
+ url: `/warehousing/asns/${ asnId }`,
27
+ },
28
+ context: {
29
+ credsPayload,
30
+ },
31
+ });
32
+
33
+ return response;
34
+ };
35
+
36
+ const funcApiConfig = {
37
+ argsWarden,
38
+ };
39
+
40
+ module.exports = {
41
+ bleckmannAsnGet,
42
+ funcApiConfig,
43
+ };
44
+
45
+ /*
46
+ curl -X POST "http://localhost:8000/bleckmannAsnGet" \
47
+ -H "Content-Type: application/json" \
48
+ -d '{
49
+ "credsPayload": { "credsPath": "bleckmann" },
50
+ "asnId": "UK-AG002594"
51
+ }'
52
+ */
@@ -0,0 +1,65 @@
1
+ // https://app.swaggerhub.com/apis-docs/Bleckmann/warehousing/1.5.2#/ASN/getAsns
2
+
3
+ const { credsValidator } = require('../validators');
4
+ const { ArgsWarden } = require('../utils');
5
+ const { MAX_PER_PAGE } = require('../bleckmann/bleckmann.constants');
6
+ const { bleckmannClient } = require('../bleckmann/bleckmann.utils');
7
+
8
+ const argsWarden = new ArgsWarden([
9
+ ['credsPayload', credsValidator],
10
+ ]);
11
+
12
+ const bleckmannAsnsGet = async (
13
+ credsPayload,
14
+ {
15
+ createdFrom,
16
+ createdTo,
17
+ receivedFrom,
18
+ receivedTo,
19
+ status,
20
+ perPage = MAX_PER_PAGE,
21
+ } = {},
22
+ ) => {
23
+
24
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({ credsPayload });
25
+ if (rejectResponse) {
26
+ return rejectResponse;
27
+ }
28
+
29
+ const response = await bleckmannClient.fetch({
30
+ requestPayload: {
31
+ url: '/warehousing/asns',
32
+ params: {
33
+ limit: perPage,
34
+ ...(createdFrom && { createdFrom }),
35
+ ...(createdTo && { createdTo }),
36
+ ...(receivedFrom && { receivedFrom }),
37
+ ...(receivedTo && { receivedTo }),
38
+ ...(status && { status }),
39
+ },
40
+ },
41
+ context: {
42
+ credsPayload,
43
+ },
44
+ });
45
+
46
+ return response;
47
+ };
48
+
49
+ const funcApiConfig = {
50
+ argsWarden,
51
+ };
52
+
53
+ module.exports = {
54
+ bleckmannAsnsGet,
55
+ funcApiConfig,
56
+ };
57
+
58
+ /*
59
+ curl -X POST "http://localhost:8000/bleckmannAsnsGet" \
60
+ -H "Content-Type: application/json" \
61
+ -d '{
62
+ "credsPayload": { "credsPath": "bleckmann" },
63
+ "options": { "perPage": 20 }
64
+ }'
65
+ */
package/api/constants.js CHANGED
@@ -1,3 +1,4 @@
1
1
  module.exports = {
2
2
  HOSTED: !!process.env.HOSTED,
3
- };
3
+ TEMP_DIR: `${ __dirname }/../_temp`,
4
+ };
@@ -0,0 +1,11 @@
1
+ const BASE_URL = 'https://api.github.com';
2
+ const DEFAULT_API_VERSION = '2022-11-28';
3
+ const DEFAULT_USER_AGENT = 'mineral';
4
+ const MAX_PER_PAGE = 100;
5
+
6
+ module.exports = {
7
+ BASE_URL,
8
+ DEFAULT_API_VERSION,
9
+ DEFAULT_USER_AGENT,
10
+ MAX_PER_PAGE,
11
+ };
@@ -0,0 +1,65 @@
1
+ const {
2
+ BASE_URL,
3
+ DEFAULT_API_VERSION,
4
+ DEFAULT_USER_AGENT,
5
+ } = require('../github/github.constants');
6
+ const { resolveCreds } = require('../pipelineSteps');
7
+ const {
8
+ FetchClient,
9
+ appendUrlToBase,
10
+ fetchClientCommonSteps,
11
+ } = require('../utils');
12
+
13
+ const useGithubUrl = async (state) => {
14
+ const { requestPayload, context } = state;
15
+ const { creds } = context;
16
+ const baseUrl = creds?.BASE_URL ?? BASE_URL;
17
+
18
+ return {
19
+ requestPayload: {
20
+ ...requestPayload,
21
+ url: appendUrlToBase(baseUrl, requestPayload.url),
22
+ },
23
+ };
24
+ };
25
+
26
+ const useAuthHeaders = async (state) => {
27
+ const { requestPayload, context } = state;
28
+ const { creds } = context;
29
+ const {
30
+ ACCESS_TOKEN,
31
+ GITHUB_TOKEN,
32
+ API_VERSION,
33
+ USER_AGENT,
34
+ } = creds ?? {};
35
+ const token = ACCESS_TOKEN ?? GITHUB_TOKEN;
36
+ const apiVersion = API_VERSION ?? context.apiVersion ?? DEFAULT_API_VERSION;
37
+ const userAgent = USER_AGENT ?? DEFAULT_USER_AGENT;
38
+
39
+ return {
40
+ requestPayload: {
41
+ ...requestPayload,
42
+ headers: {
43
+ Accept: 'application/vnd.github+json',
44
+ 'X-GitHub-Api-Version': apiVersion,
45
+ Authorization: `Bearer ${ token }`,
46
+ 'User-Agent': userAgent,
47
+ ...requestPayload.headers,
48
+ },
49
+ },
50
+ };
51
+ };
52
+
53
+ const githubClient = new FetchClient({
54
+ pipeline: [
55
+ resolveCreds,
56
+ useGithubUrl,
57
+ useAuthHeaders,
58
+ 'fetch',
59
+ fetchClientCommonSteps.exitEarlyOnNotOk,
60
+ ],
61
+ });
62
+
63
+ module.exports = {
64
+ githubClient,
65
+ };
@@ -0,0 +1,144 @@
1
+ // https://docs.github.com/en/rest/using-the-rest-api/getting-started-with-the-rest-api
2
+
3
+ const { ArgsWarden, Getter } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { githubClient } = require('../github/github.utils');
6
+ const { MAX_PER_PAGE } = require('../github/github.constants');
7
+
8
+ const argsWarden = new ArgsWarden([
9
+ ['credsPayload', credsValidator],
10
+ ['url'],
11
+ ]);
12
+
13
+ const githubGetPacket = async (
14
+ credsPayload,
15
+ url,
16
+ {
17
+ params,
18
+ perPage = MAX_PER_PAGE,
19
+ } = {},
20
+ ) => {
21
+ const {
22
+ page = 1,
23
+ ...restParams
24
+ } = params ?? {};
25
+
26
+ return githubClient.fetch({
27
+ requestPayload: {
28
+ url,
29
+ params: {
30
+ per_page: Math.min(perPage, MAX_PER_PAGE),
31
+ page,
32
+ ...restParams,
33
+ },
34
+ },
35
+ context: {
36
+ credsPayload,
37
+ },
38
+ });
39
+ };
40
+
41
+ const githubGetPaginator = async (currentParams, response) => {
42
+ const { args, options } = currentParams;
43
+
44
+ if (!response?.ok) {
45
+ return [true];
46
+ }
47
+
48
+ const items = Array.isArray(response.data) ? response.data : [];
49
+ const { perPage = MAX_PER_PAGE, params = {} } = options;
50
+
51
+ if (items.length < Math.min(perPage, MAX_PER_PAGE)) {
52
+ return [true];
53
+ }
54
+
55
+ const { page = 1, ...restParams } = params;
56
+
57
+ return [false, {
58
+ args,
59
+ options: {
60
+ ...options,
61
+ params: {
62
+ ...restParams,
63
+ page: page + 1,
64
+ },
65
+ },
66
+ }];
67
+ };
68
+
69
+ const githubGet = async (
70
+ returnGetter,
71
+
72
+ credsPayload,
73
+ url,
74
+ {
75
+ params,
76
+ perPage = MAX_PER_PAGE,
77
+ ...getterOptions
78
+ } = {},
79
+ ) => {
80
+
81
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
82
+ credsPayload,
83
+ url,
84
+ });
85
+ if (rejectResponse) {
86
+ return rejectResponse;
87
+ }
88
+
89
+ const getter = new Getter(
90
+ {
91
+ args: [credsPayload, url],
92
+ options: {
93
+ params,
94
+ perPage,
95
+ },
96
+ },
97
+ {
98
+ func: githubGetPacket,
99
+ digester: (response) => {
100
+ if (!response?.ok) {
101
+ return [];
102
+ }
103
+
104
+ return Array.isArray(response.data) ? response.data : [];
105
+ },
106
+ paginator: githubGetPaginator,
107
+ ...getterOptions,
108
+ },
109
+ );
110
+
111
+ if (returnGetter) {
112
+ return getter;
113
+ }
114
+
115
+ const data = await getter.run({ returnAll: true });
116
+
117
+ return {
118
+ ok: true,
119
+ data,
120
+ };
121
+ };
122
+
123
+ const funcApiConfig = {
124
+ argsWarden,
125
+ };
126
+
127
+ module.exports = {
128
+ githubGet: (...args) => githubGet(false, ...args),
129
+ githubGetter: (...args) => githubGet(true, ...args),
130
+ funcApiConfig,
131
+ };
132
+
133
+ /*
134
+ curl -X POST "http://localhost:8000/githubGet" \
135
+ -H "Content-Type: application/json" \
136
+ -d '{
137
+ "credsPayload": { "credsPath": "github" },
138
+ "url": "/user/repos",
139
+ "options": {
140
+ "params": { "sort": "updated" },
141
+ "limit": 10
142
+ }
143
+ }'
144
+ */
@@ -0,0 +1,71 @@
1
+ // https://docs.github.com/en/rest/issues/issues#create-an-issue
2
+
3
+ const { ArgsWarden } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { githubClient } = require('../github/github.utils');
6
+
7
+ const issuePayloadValidator = (issuePayload) => Boolean(issuePayload?.title);
8
+
9
+ const argsWarden = new ArgsWarden([
10
+ ['credsPayload', credsValidator],
11
+ ['owner'],
12
+ ['repo'],
13
+ ['issuePayload', issuePayloadValidator],
14
+ ]);
15
+
16
+ const githubIssueCreate = async (
17
+ credsPayload,
18
+ owner,
19
+ repo,
20
+ issuePayload,
21
+ {
22
+ apiVersion,
23
+ } = {},
24
+ ) => {
25
+
26
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
27
+ credsPayload,
28
+ owner,
29
+ repo,
30
+ issuePayload,
31
+ });
32
+ if (rejectResponse) {
33
+ return rejectResponse;
34
+ }
35
+
36
+ return githubClient.fetch({
37
+ requestPayload: {
38
+ method: 'post',
39
+ url: `/repos/${ owner }/${ repo }/issues`,
40
+ body: issuePayload,
41
+ },
42
+ context: {
43
+ credsPayload,
44
+ apiVersion,
45
+ },
46
+ });
47
+ };
48
+
49
+ const funcApiConfig = {
50
+ argsWarden,
51
+ };
52
+
53
+ module.exports = {
54
+ githubIssueCreate,
55
+ funcApiConfig,
56
+ };
57
+
58
+ /*
59
+ curl -X POST "http://localhost:8000/githubIssueCreate" \
60
+ -H "Content-Type: application/json" \
61
+ -d '{
62
+ "credsPayload": { "credsPath": "github" },
63
+ "owner": "GorgonFreeman",
64
+ "repo": "mineral",
65
+ "issuePayload": {
66
+ "title": "Found a bug",
67
+ "body": "Details here",
68
+ "labels": ["bug"]
69
+ }
70
+ }'
71
+ */
@@ -0,0 +1,65 @@
1
+ // https://docs.github.com/en/rest/issues/issues#get-an-issue
2
+
3
+ const { ArgsWarden } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { githubClient } = require('../github/github.utils');
6
+
7
+ const argsWarden = new ArgsWarden([
8
+ ['credsPayload', credsValidator],
9
+ ['owner'],
10
+ ['repo'],
11
+ ['issueNumber'],
12
+ ]);
13
+
14
+ const githubIssueGet = async (
15
+ credsPayload,
16
+ owner,
17
+ repo,
18
+ issueNumber,
19
+ {
20
+ params,
21
+ apiVersion,
22
+ } = {},
23
+ ) => {
24
+
25
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
26
+ credsPayload,
27
+ owner,
28
+ repo,
29
+ issueNumber,
30
+ });
31
+ if (rejectResponse) {
32
+ return rejectResponse;
33
+ }
34
+
35
+ return githubClient.fetch({
36
+ requestPayload: {
37
+ url: `/repos/${ owner }/${ repo }/issues/${ issueNumber }`,
38
+ params,
39
+ },
40
+ context: {
41
+ credsPayload,
42
+ apiVersion,
43
+ },
44
+ });
45
+ };
46
+
47
+ const funcApiConfig = {
48
+ argsWarden,
49
+ };
50
+
51
+ module.exports = {
52
+ githubIssueGet,
53
+ funcApiConfig,
54
+ };
55
+
56
+ /*
57
+ curl -X POST "http://localhost:8000/githubIssueGet" \
58
+ -H "Content-Type: application/json" \
59
+ -d '{
60
+ "credsPayload": { "credsPath": "github" },
61
+ "owner": "GorgonFreeman",
62
+ "repo": "mineral",
63
+ "issueNumber": 1
64
+ }'
65
+ */
@@ -0,0 +1,71 @@
1
+ // https://docs.github.com/en/rest/issues/issues#update-an-issue
2
+
3
+ const { ArgsWarden } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { githubClient } = require('../github/github.utils');
6
+
7
+ const argsWarden = new ArgsWarden([
8
+ ['credsPayload', credsValidator],
9
+ ['owner'],
10
+ ['repo'],
11
+ ['issueNumber'],
12
+ ['updatePayload', Boolean],
13
+ ]);
14
+
15
+ const githubIssueUpdate = async (
16
+ credsPayload,
17
+ owner,
18
+ repo,
19
+ issueNumber,
20
+ updatePayload,
21
+ {
22
+ apiVersion,
23
+ } = {},
24
+ ) => {
25
+
26
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
27
+ credsPayload,
28
+ owner,
29
+ repo,
30
+ issueNumber,
31
+ updatePayload,
32
+ });
33
+ if (rejectResponse) {
34
+ return rejectResponse;
35
+ }
36
+
37
+ return githubClient.fetch({
38
+ requestPayload: {
39
+ method: 'patch',
40
+ url: `/repos/${ owner }/${ repo }/issues/${ issueNumber }`,
41
+ body: updatePayload,
42
+ },
43
+ context: {
44
+ credsPayload,
45
+ apiVersion,
46
+ },
47
+ });
48
+ };
49
+
50
+ const funcApiConfig = {
51
+ argsWarden,
52
+ };
53
+
54
+ module.exports = {
55
+ githubIssueUpdate,
56
+ funcApiConfig,
57
+ };
58
+
59
+ /*
60
+ curl -X POST "http://localhost:8000/githubIssueUpdate" \
61
+ -H "Content-Type: application/json" \
62
+ -d '{
63
+ "credsPayload": { "credsPath": "github" },
64
+ "owner": "GorgonFreeman",
65
+ "repo": "mineral",
66
+ "issueNumber": 1,
67
+ "updatePayload": {
68
+ "state": "closed"
69
+ }
70
+ }'
71
+ */