@aaronsb/google-workspace-mcp 2.7.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -21
- package/LICENSE-MIT +21 -0
- package/NOTICE +24 -0
- package/README.md +87 -57
- package/build/accounts/auth.d.ts +1 -1
- package/build/accounts/auth.js +1 -1
- package/build/accounts/oauth.js +3 -3
- package/build/accounts/oauth.js.map +1 -1
- package/build/accounts/token-service.js +1 -1
- package/build/accounts/token-service.js.map +1 -1
- package/build/coverage/analyze.d.ts +1 -1
- package/build/coverage/analyze.js +6 -4
- package/build/coverage/analyze.js.map +1 -1
- package/build/coverage/baseline.js +37 -20
- package/build/coverage/baseline.js.map +1 -1
- package/build/coverage/compare.d.ts +1 -1
- package/build/coverage/compare.js +19 -10
- package/build/coverage/compare.js.map +1 -1
- package/build/coverage/discover.d.ts +5 -5
- package/build/coverage/discover.js +71 -155
- package/build/coverage/discover.js.map +1 -1
- package/build/coverage/report.js +3 -3
- package/build/coverage/report.js.map +1 -1
- package/build/coverage/types.d.ts +19 -4
- package/build/executor/index.d.ts +0 -3
- package/build/executor/index.js +1 -2
- package/build/executor/index.js.map +1 -1
- package/build/factory/defaults.js +30 -4
- package/build/factory/defaults.js.map +1 -1
- package/build/factory/generator.d.ts +10 -4
- package/build/factory/generator.js +86 -96
- package/build/factory/generator.js.map +1 -1
- package/build/factory/manifest/README.md +4 -3
- package/build/factory/manifest/calendar.yaml +1 -11
- package/build/factory/manifest/docs.yaml +15 -6
- package/build/factory/manifest/drive.yaml +1 -5
- package/build/factory/manifest/gmail.yaml +32 -25
- package/build/factory/manifest/meet.yaml +1 -1
- package/build/factory/manifest/sheets.yaml +2 -5
- package/build/factory/manifest/tasks.yaml +40 -2
- package/build/factory/patches.js +2 -0
- package/build/factory/patches.js.map +1 -1
- package/build/factory/registry.d.ts +2 -3
- package/build/factory/registry.js +3 -9
- package/build/factory/registry.js.map +1 -1
- package/build/factory/safety.js +4 -4
- package/build/factory/safety.js.map +1 -1
- package/build/factory/types.d.ts +16 -15
- package/build/google/client.d.ts +45 -0
- package/build/google/client.js +232 -0
- package/build/google/client.js.map +1 -0
- package/build/google/descriptor.d.ts +40 -0
- package/build/google/descriptor.js +37 -0
- package/build/google/descriptor.js.map +1 -0
- package/build/google/descriptor.json +5271 -0
- package/build/google/errors.d.ts +45 -0
- package/build/google/errors.js +44 -0
- package/build/google/errors.js.map +1 -0
- package/build/google/methods.d.ts +37 -0
- package/build/google/methods.js +13 -0
- package/build/google/methods.js.map +1 -0
- package/build/index.js +30 -4
- package/build/index.js.map +1 -1
- package/build/node-floor.d.ts +16 -0
- package/build/node-floor.js +73 -0
- package/build/node-floor.js.map +1 -0
- package/build/server/formatting/markdown.d.ts +1 -1
- package/build/server/formatting/markdown.js +1 -1
- package/build/server/formatting/next-steps.js +1 -1
- package/build/server/formatting/next-steps.js.map +1 -1
- package/build/server/handlers/accounts.js +2 -2
- package/build/server/handlers/accounts.js.map +1 -1
- package/build/server/scratchpad/adapters/import-doc.js +15 -13
- package/build/server/scratchpad/adapters/import-doc.js.map +1 -1
- package/build/server/scratchpad/adapters/import-drive.js +16 -11
- package/build/server/scratchpad/adapters/import-drive.js.map +1 -1
- package/build/server/scratchpad/adapters/import-email.js +3 -15
- package/build/server/scratchpad/adapters/import-email.js.map +1 -1
- package/build/server/scratchpad/adapters/import-meet.js +5 -17
- package/build/server/scratchpad/adapters/import-meet.js.map +1 -1
- package/build/server/scratchpad/adapters/import-sheet.js +5 -6
- package/build/server/scratchpad/adapters/import-sheet.js.map +1 -1
- package/build/server/scratchpad/adapters/send-calendar.js +18 -13
- package/build/server/scratchpad/adapters/send-calendar.js.map +1 -1
- package/build/server/scratchpad/adapters/send-doc.js +22 -17
- package/build/server/scratchpad/adapters/send-doc.js.map +1 -1
- package/build/server/scratchpad/adapters/send-email-draft.d.ts +1 -1
- package/build/server/scratchpad/adapters/send-email-draft.js +17 -25
- package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -1
- package/build/server/scratchpad/adapters/send-email.d.ts +2 -2
- package/build/server/scratchpad/adapters/send-email.js +21 -25
- package/build/server/scratchpad/adapters/send-email.js.map +1 -1
- package/build/server/scratchpad/adapters/send-sheet.js +10 -10
- package/build/server/scratchpad/adapters/send-sheet.js.map +1 -1
- package/build/server/scratchpad/adapters/send-task.js +9 -8
- package/build/server/scratchpad/adapters/send-task.js.map +1 -1
- package/build/server/scratchpad/handler.js +22 -28
- package/build/server/scratchpad/handler.js.map +1 -1
- package/build/server/scratchpad/manager.d.ts +1 -1
- package/build/server/server.js +13 -10
- package/build/server/server.js.map +1 -1
- package/build/server/session/tracker.js +21 -25
- package/build/server/session/tracker.js.map +1 -1
- package/build/server/tools.d.ts +1 -1
- package/build/server/tools.js +3 -3
- package/build/server/tools.js.map +1 -1
- package/build/services/calendar/patch.js +178 -68
- package/build/services/calendar/patch.js.map +1 -1
- package/build/services/docs/patch.d.ts +5 -3
- package/build/services/docs/patch.js +89 -19
- package/build/services/docs/patch.js.map +1 -1
- package/build/services/drive/patch.d.ts +1 -1
- package/build/services/drive/patch.js +115 -143
- package/build/services/drive/patch.js.map +1 -1
- package/build/services/gmail/attachments.js +10 -15
- package/build/services/gmail/attachments.js.map +1 -1
- package/build/services/gmail/mail.d.ts +34 -0
- package/build/services/gmail/mail.js +245 -0
- package/build/services/gmail/mail.js.map +1 -0
- package/build/services/gmail/mime.d.ts +45 -4
- package/build/services/gmail/mime.js +138 -4
- package/build/services/gmail/mime.js.map +1 -1
- package/build/services/gmail/patch.js +103 -53
- package/build/services/gmail/patch.js.map +1 -1
- package/build/services/meet/patch.js +24 -31
- package/build/services/meet/patch.js.map +1 -1
- package/build/services/sheets/patch.js +30 -35
- package/build/services/sheets/patch.js.map +1 -1
- package/build/services/tasks/patch.d.ts +18 -0
- package/build/services/tasks/patch.js +37 -0
- package/build/services/tasks/patch.js.map +1 -0
- package/build/version.d.ts +1 -1
- package/build/version.js +2 -2
- package/build/version.js.map +1 -1
- package/package.json +23 -12
- package/build/__helpers__/testSetup.d.ts +0 -1
- package/build/__helpers__/testSetup.js +0 -6
- package/build/__helpers__/testSetup.js.map +0 -1
- package/build/__tests__/accounts/credentials.test.d.ts +0 -1
- package/build/__tests__/accounts/credentials.test.js +0 -127
- package/build/__tests__/accounts/credentials.test.js.map +0 -1
- package/build/__tests__/accounts/oauth.test.d.ts +0 -1
- package/build/__tests__/accounts/oauth.test.js +0 -71
- package/build/__tests__/accounts/oauth.test.js.map +0 -1
- package/build/__tests__/accounts/registry.test.d.ts +0 -1
- package/build/__tests__/accounts/registry.test.js +0 -74
- package/build/__tests__/accounts/registry.test.js.map +0 -1
- package/build/__tests__/accounts/token-service.test.d.ts +0 -1
- package/build/__tests__/accounts/token-service.test.js +0 -126
- package/build/__tests__/accounts/token-service.test.js.map +0 -1
- package/build/__tests__/executor/errors.test.d.ts +0 -1
- package/build/__tests__/executor/errors.test.js +0 -42
- package/build/__tests__/executor/errors.test.js.map +0 -1
- package/build/__tests__/executor/gws.test.d.ts +0 -1
- package/build/__tests__/executor/gws.test.js +0 -187
- package/build/__tests__/executor/gws.test.js.map +0 -1
- package/build/__tests__/executor/paths.test.d.ts +0 -1
- package/build/__tests__/executor/paths.test.js +0 -60
- package/build/__tests__/executor/paths.test.js.map +0 -1
- package/build/__tests__/executor/resolve-binary.test.d.ts +0 -1
- package/build/__tests__/executor/resolve-binary.test.js +0 -58
- package/build/__tests__/executor/resolve-binary.test.js.map +0 -1
- package/build/__tests__/executor/workspace.test.d.ts +0 -1
- package/build/__tests__/executor/workspace.test.js +0 -143
- package/build/__tests__/executor/workspace.test.js.map +0 -1
- package/build/__tests__/factory/calendar-patch.test.d.ts +0 -5
- package/build/__tests__/factory/calendar-patch.test.js +0 -269
- package/build/__tests__/factory/calendar-patch.test.js.map +0 -1
- package/build/__tests__/factory/drive-patch.test.d.ts +0 -5
- package/build/__tests__/factory/drive-patch.test.js +0 -344
- package/build/__tests__/factory/drive-patch.test.js.map +0 -1
- package/build/__tests__/factory/generator.test.d.ts +0 -1
- package/build/__tests__/factory/generator.test.js +0 -240
- package/build/__tests__/factory/generator.test.js.map +0 -1
- package/build/__tests__/factory/patch-coverage.test.d.ts +0 -10
- package/build/__tests__/factory/patch-coverage.test.js +0 -182
- package/build/__tests__/factory/patch-coverage.test.js.map +0 -1
- package/build/__tests__/factory/safety.test.d.ts +0 -1
- package/build/__tests__/factory/safety.test.js +0 -107
- package/build/__tests__/factory/safety.test.js.map +0 -1
- package/build/__tests__/factory/sheets-patch.test.d.ts +0 -6
- package/build/__tests__/factory/sheets-patch.test.js +0 -498
- package/build/__tests__/factory/sheets-patch.test.js.map +0 -1
- package/build/__tests__/integration/executor.test.d.ts +0 -5
- package/build/__tests__/integration/executor.test.js +0 -38
- package/build/__tests__/integration/executor.test.js.map +0 -1
- package/build/__tests__/integration/handlers.test.d.ts +0 -6
- package/build/__tests__/integration/handlers.test.js +0 -95
- package/build/__tests__/integration/handlers.test.js.map +0 -1
- package/build/__tests__/integration/setup.d.ts +0 -19
- package/build/__tests__/integration/setup.js +0 -61
- package/build/__tests__/integration/setup.js.map +0 -1
- package/build/__tests__/server/formatting/html-sanitize.test.d.ts +0 -7
- package/build/__tests__/server/formatting/html-sanitize.test.js +0 -174
- package/build/__tests__/server/formatting/html-sanitize.test.js.map +0 -1
- package/build/__tests__/server/formatting/markdown.test.d.ts +0 -1
- package/build/__tests__/server/formatting/markdown.test.js +0 -259
- package/build/__tests__/server/formatting/markdown.test.js.map +0 -1
- package/build/__tests__/server/formatting/next-steps.test.d.ts +0 -1
- package/build/__tests__/server/formatting/next-steps.test.js +0 -42
- package/build/__tests__/server/formatting/next-steps.test.js.map +0 -1
- package/build/__tests__/server/handler.test.d.ts +0 -1
- package/build/__tests__/server/handler.test.js +0 -97
- package/build/__tests__/server/handler.test.js.map +0 -1
- package/build/__tests__/server/handlers/__mocks__/executor.d.ts +0 -173
- package/build/__tests__/server/handlers/__mocks__/executor.js +0 -135
- package/build/__tests__/server/handlers/__mocks__/executor.js.map +0 -1
- package/build/__tests__/server/handlers/accounts.test.d.ts +0 -1
- package/build/__tests__/server/handlers/accounts.test.js +0 -129
- package/build/__tests__/server/handlers/accounts.test.js.map +0 -1
- package/build/__tests__/server/handlers/calendar.test.d.ts +0 -1
- package/build/__tests__/server/handlers/calendar.test.js +0 -96
- package/build/__tests__/server/handlers/calendar.test.js.map +0 -1
- package/build/__tests__/server/handlers/drive.test.d.ts +0 -1
- package/build/__tests__/server/handlers/drive.test.js +0 -68
- package/build/__tests__/server/handlers/drive.test.js.map +0 -1
- package/build/__tests__/server/handlers/email.test.d.ts +0 -1
- package/build/__tests__/server/handlers/email.test.js +0 -99
- package/build/__tests__/server/handlers/email.test.js.map +0 -1
- package/build/__tests__/server/handlers/validate.test.d.ts +0 -1
- package/build/__tests__/server/handlers/validate.test.js +0 -88
- package/build/__tests__/server/handlers/validate.test.js.map +0 -1
- package/build/__tests__/server/queue.test.d.ts +0 -1
- package/build/__tests__/server/queue.test.js +0 -199
- package/build/__tests__/server/queue.test.js.map +0 -1
- package/build/__tests__/server/server.test.d.ts +0 -7
- package/build/__tests__/server/server.test.js +0 -135
- package/build/__tests__/server/server.test.js.map +0 -1
- package/build/__tests__/server/session/context.test.d.ts +0 -1
- package/build/__tests__/server/session/context.test.js +0 -101
- package/build/__tests__/server/session/context.test.js.map +0 -1
- package/build/__tests__/server/session/tracker.test.d.ts +0 -1
- package/build/__tests__/server/session/tracker.test.js +0 -146
- package/build/__tests__/server/session/tracker.test.js.map +0 -1
- package/build/__tests__/server/tools.test.d.ts +0 -1
- package/build/__tests__/server/tools.test.js +0 -91
- package/build/__tests__/server/tools.test.js.map +0 -1
- package/build/__tests__/services/gmail/mime.test.d.ts +0 -1
- package/build/__tests__/services/gmail/mime.test.js +0 -23
- package/build/__tests__/services/gmail/mime.test.js.map +0 -1
- package/build/__tests__/services/meet/patch.test.d.ts +0 -4
- package/build/__tests__/services/meet/patch.test.js +0 -374
- package/build/__tests__/services/meet/patch.test.js.map +0 -1
- package/build/executor/errors.d.ts +0 -15
- package/build/executor/errors.js +0 -37
- package/build/executor/errors.js.map +0 -1
- package/build/executor/gws.d.ts +0 -26
- package/build/executor/gws.js +0 -197
- package/build/executor/gws.js.map +0 -1
- package/build/server/handlers/calendar.d.ts +0 -2
- package/build/server/handlers/calendar.js +0 -97
- package/build/server/handlers/calendar.js.map +0 -1
- package/build/server/handlers/drive.d.ts +0 -2
- package/build/server/handlers/drive.js +0 -58
- package/build/server/handlers/drive.js.map +0 -1
- package/build/server/handlers/email.d.ts +0 -2
- package/build/server/handlers/email.js +0 -119
- package/build/server/handlers/email.js.map +0 -1
- package/build/server/scratchpad/__tests__/docs-sync-integration.test.d.ts +0 -11
- package/build/server/scratchpad/__tests__/docs-sync-integration.test.js +0 -187
- package/build/server/scratchpad/__tests__/docs-sync-integration.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/docs-sync.test.d.ts +0 -16
- package/build/server/scratchpad/__tests__/docs-sync.test.js +0 -213
- package/build/server/scratchpad/__tests__/docs-sync.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/json-path.test.d.ts +0 -4
- package/build/server/scratchpad/__tests__/json-path.test.js +0 -121
- package/build/server/scratchpad/__tests__/json-path.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/manager.test.d.ts +0 -5
- package/build/server/scratchpad/__tests__/manager.test.js +0 -886
- package/build/server/scratchpad/__tests__/manager.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/validate.test.d.ts +0 -4
- package/build/server/scratchpad/__tests__/validate.test.js +0 -112
- package/build/server/scratchpad/__tests__/validate.test.js.map +0 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Build-time coverage analysis tool (ADR-100).
|
|
4
4
|
*
|
|
5
|
-
* Compares the curated manifest against
|
|
5
|
+
* Compares the curated manifest against Google's actual published API surface
|
|
6
6
|
* to produce a structured coverage report.
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
@@ -23,9 +23,11 @@ async function main() {
|
|
|
23
23
|
const manifest = loadManifest();
|
|
24
24
|
// Load existing baseline (if any)
|
|
25
25
|
const baseline = loadBaseline();
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
// Read Google's real surface from Discovery. Never derive it from help text: a
|
|
27
|
+
// regex over prose once invented the method `calendars.The`, and measured us
|
|
28
|
+
// against the wrong denominator. See ADR-103 item 11.
|
|
29
|
+
process.stderr.write("[coverage] Reading Google's API surface...\n");
|
|
30
|
+
const discovered = await discoverSurface();
|
|
29
31
|
// Compare
|
|
30
32
|
const report = compareSurfaces(manifest, discovered, baseline);
|
|
31
33
|
// Output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/coverage/analyze.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,sDAAsD;IACtD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,kCAAkC;IAClC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,+
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/coverage/analyze.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,sDAAsD;IACtD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,kCAAkC;IAClC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,+EAA+E;IAC/E,6EAA6E;IAC7E,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,eAAe,EAAE,CAAC;IAE3C,UAAU;IACV,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE/D,SAAS;IACT,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,+BAA+B;IAC/B,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,IAAI,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -18,12 +18,24 @@ export function loadBaseline(filePath) {
|
|
|
18
18
|
return null;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Build the set of manifest-covered resource paths.
|
|
23
|
+
*
|
|
24
|
+
* This used to read `svc.paramGaps` — "ops with param gaps are covered" — which is a
|
|
25
|
+
* PROXY for coverage, and a backwards one. An operation with every parameter mapped has
|
|
26
|
+
* no param gaps, so it was absent here, fell through the checks below, and got written
|
|
27
|
+
* as `status: "gap"`. Coverage this good was indistinguishable from no coverage at all.
|
|
28
|
+
* 25 fully-covered operations were committed to coverage-baseline.json as uncovered
|
|
29
|
+
* work, including `docs:documents.create`, which takes no parameters and so could never
|
|
30
|
+
* have had a gap.
|
|
31
|
+
*
|
|
32
|
+
* Now it reads what the report actually measured, from the manifest. Same source the
|
|
33
|
+
* printed count uses — which is why the count was right while the artifact was wrong.
|
|
34
|
+
*/
|
|
22
35
|
function getCoveredPaths(report) {
|
|
23
36
|
const covered = new Set();
|
|
24
37
|
for (const svc of report.services) {
|
|
25
|
-
|
|
26
|
-
for (const opPath of Object.keys(svc.paramGaps)) {
|
|
38
|
+
for (const opPath of svc.coveredPaths) {
|
|
27
39
|
covered.add(`${svc.service}:${opPath}`);
|
|
28
40
|
}
|
|
29
41
|
}
|
|
@@ -32,9 +44,7 @@ function getCoveredPaths(report) {
|
|
|
32
44
|
/** Generate a new baseline from a coverage report + discovered surface. */
|
|
33
45
|
export function generateBaseline(report, discovered, existing) {
|
|
34
46
|
const services = {};
|
|
35
|
-
|
|
36
|
-
// (ops with param gaps are definitely covered)
|
|
37
|
-
const paramGapPaths = getCoveredPaths(report);
|
|
47
|
+
const coveredPaths = getCoveredPaths(report);
|
|
38
48
|
for (const svc of report.services) {
|
|
39
49
|
const disc = discovered.services[svc.service];
|
|
40
50
|
if (!disc)
|
|
@@ -52,9 +62,10 @@ export function generateBaseline(report, discovered, existing) {
|
|
|
52
62
|
operations[opPath] = existingOps[opPath];
|
|
53
63
|
continue;
|
|
54
64
|
}
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
65
|
+
// Covered is covered — asked directly, not inferred from a side effect.
|
|
66
|
+
// A fully-mapped operation has no param gaps, and that is a sign of GOOD coverage,
|
|
67
|
+
// not missing coverage. `params` stays undefined when there is nothing to flag.
|
|
68
|
+
if (coveredPaths.has(`${svc.service}:${opPath}`)) {
|
|
58
69
|
const gaps = svc.paramGaps[opPath] || [];
|
|
59
70
|
operations[opPath] = {
|
|
60
71
|
status: 'covered',
|
|
@@ -64,21 +75,27 @@ export function generateBaseline(report, discovered, existing) {
|
|
|
64
75
|
};
|
|
65
76
|
continue;
|
|
66
77
|
}
|
|
67
|
-
|
|
68
|
-
// We can infer from whether the op was NOT in newOps and NOT excluded
|
|
69
|
-
const isNew = svc.newOps.includes(opPath);
|
|
70
|
-
const wasCovered = existingOps[opPath]?.status === 'covered';
|
|
71
|
-
if (wasCovered && !isNew) {
|
|
72
|
-
operations[opPath] = { status: 'covered' };
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
operations[opPath] = { status: 'gap' };
|
|
76
|
-
}
|
|
78
|
+
operations[opPath] = { status: 'gap' };
|
|
77
79
|
}
|
|
78
80
|
services[svc.service] = { operations };
|
|
79
81
|
}
|
|
82
|
+
// The artifact must agree with the report it came from.
|
|
83
|
+
//
|
|
84
|
+
// This is the check whose absence let the bug live: `make coverage` PRINTED 60/233
|
|
85
|
+
// while the file it wrote recorded 35, and nothing ever compared the two. A baseline
|
|
86
|
+
// that silently contradicts its own report is worse than no baseline — it hands
|
|
87
|
+
// contributors a list of "gaps" that are already implemented.
|
|
88
|
+
const persisted = Object.values(services)
|
|
89
|
+
.flatMap(s => Object.values(s.operations))
|
|
90
|
+
.filter(op => op.status === 'covered').length;
|
|
91
|
+
const reported = report.services.reduce((n, s) => n + s.coveredOps, 0);
|
|
92
|
+
if (persisted !== reported) {
|
|
93
|
+
throw new Error(`coverage baseline disagrees with the report it was generated from: ` +
|
|
94
|
+
`the report counts ${reported} covered operations, the baseline recorded ${persisted}. ` +
|
|
95
|
+
`Refusing to write an artifact that contradicts its own measurement.`);
|
|
96
|
+
}
|
|
80
97
|
return {
|
|
81
|
-
|
|
98
|
+
apiSurface: report.apiSurface,
|
|
82
99
|
generatedAt: report.timestamp,
|
|
83
100
|
services,
|
|
84
101
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/coverage/baseline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C,SAAS,WAAW,CAAC,QAAiB;IACpC,MAAM,CAAC,GAAG,QAAQ,IAAI,YAAY,CAAC;IACnC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAiB;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/coverage/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Compare curated manifest against
|
|
2
|
+
* Compare the curated manifest against the API surface Google publishes.
|
|
3
3
|
*/
|
|
4
4
|
import type { Manifest } from '../factory/types.js';
|
|
5
5
|
import type { DiscoveredSurface, CoverageBaseline, CoverageReport } from './types.js';
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Compare curated manifest against
|
|
2
|
+
* Compare the curated manifest against the API surface Google publishes.
|
|
3
3
|
*/
|
|
4
4
|
import { ELIGIBLE_SERVICES, SKIP_PARAMS } from './types.js';
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Build the set of Google methods the manifest covers.
|
|
7
|
+
*
|
|
8
|
+
* An operation either names a Google method or is a custom handler composed of
|
|
9
|
+
* them. Anything that reshapes a response is built from raw Google in our own
|
|
10
|
+
* layer (ADR-103).
|
|
11
|
+
*/
|
|
6
12
|
function buildCoveredPaths(manifest) {
|
|
7
13
|
const covered = new Map();
|
|
8
14
|
for (const [_serviceName, serviceDef] of Object.entries(manifest.services)) {
|
|
9
15
|
for (const [opName, opDef] of Object.entries(serviceDef.operations)) {
|
|
10
|
-
const path = opDef.resource
|
|
16
|
+
const path = opDef.resource;
|
|
11
17
|
if (!path)
|
|
12
18
|
continue;
|
|
13
19
|
const paramNames = new Set();
|
|
@@ -18,7 +24,7 @@ function buildCoveredPaths(manifest) {
|
|
|
18
24
|
}
|
|
19
25
|
}
|
|
20
26
|
covered.set(path, {
|
|
21
|
-
service: serviceDef.
|
|
27
|
+
service: serviceDef.google_service,
|
|
22
28
|
opName,
|
|
23
29
|
params: paramNames,
|
|
24
30
|
});
|
|
@@ -27,9 +33,9 @@ function buildCoveredPaths(manifest) {
|
|
|
27
33
|
return covered;
|
|
28
34
|
}
|
|
29
35
|
/** Compare params for a covered operation. */
|
|
30
|
-
function compareParams(manifestParams,
|
|
36
|
+
function compareParams(manifestParams, googleParams) {
|
|
31
37
|
const gaps = [];
|
|
32
|
-
for (const [name, param] of Object.entries(
|
|
38
|
+
for (const [name, param] of Object.entries(googleParams)) {
|
|
33
39
|
if (SKIP_PARAMS.has(name))
|
|
34
40
|
continue;
|
|
35
41
|
if (param.deprecated)
|
|
@@ -37,7 +43,7 @@ function compareParams(manifestParams, gwsParams) {
|
|
|
37
43
|
if (!manifestParams.has(name)) {
|
|
38
44
|
gaps.push({
|
|
39
45
|
paramName: name,
|
|
40
|
-
|
|
46
|
+
inGoogle: true,
|
|
41
47
|
inManifest: false,
|
|
42
48
|
details: `${param.type}${param.required ? ', required' : ''} — ${param.description.slice(0, 80)}`,
|
|
43
49
|
});
|
|
@@ -53,7 +59,7 @@ export function compareSurfaces(manifest, discovered, baseline) {
|
|
|
53
59
|
for (const service of ELIGIBLE_SERVICES) {
|
|
54
60
|
const disc = discovered.services[service];
|
|
55
61
|
if (!disc) {
|
|
56
|
-
//
|
|
62
|
+
// Eligible, but Google publishes no Discovery document for it
|
|
57
63
|
continue;
|
|
58
64
|
}
|
|
59
65
|
const baselineOps = baseline?.services[service]?.operations || {};
|
|
@@ -72,12 +78,14 @@ export function compareSurfaces(manifest, discovered, baseline) {
|
|
|
72
78
|
const newOps = [];
|
|
73
79
|
const removedOps = [];
|
|
74
80
|
const paramGaps = {};
|
|
81
|
+
const coveredOpPaths = [];
|
|
75
82
|
for (const opPath of allOps) {
|
|
76
83
|
const isCovered = coveredPaths.has(opPath);
|
|
77
84
|
const baselineEntry = baselineOps[opPath];
|
|
78
85
|
const wasInBaseline = !!baselineEntry;
|
|
79
86
|
if (isCovered) {
|
|
80
87
|
covered++;
|
|
88
|
+
coveredOpPaths.push(opPath);
|
|
81
89
|
// Check param gaps for resource-based operations
|
|
82
90
|
const discOp = disc.operations[opPath];
|
|
83
91
|
const manifestEntry = coveredPaths.get(opPath);
|
|
@@ -98,7 +106,7 @@ export function compareSurfaces(manifest, discovered, baseline) {
|
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
}
|
|
101
|
-
//
|
|
109
|
+
// In the baseline, but Google no longer publishes it
|
|
102
110
|
for (const opPath of Object.keys(baselineOps)) {
|
|
103
111
|
if (!allOps.has(opPath)) {
|
|
104
112
|
removedOps.push(opPath);
|
|
@@ -115,10 +123,11 @@ export function compareSurfaces(manifest, discovered, baseline) {
|
|
|
115
123
|
newOps,
|
|
116
124
|
removedOps,
|
|
117
125
|
paramGaps,
|
|
126
|
+
coveredPaths: coveredOpPaths,
|
|
118
127
|
});
|
|
119
128
|
}
|
|
120
129
|
return {
|
|
121
|
-
|
|
130
|
+
apiSurface: discovered.apiSurface,
|
|
122
131
|
timestamp: new Date().toISOString(),
|
|
123
132
|
totalOps: totalOps,
|
|
124
133
|
coveredOps: totalCovered,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/coverage/compare.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/coverage/compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import type { DiscoveredSurface } from './types.js';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
3
|
+
* Read Google's real surface for every service the descriptor knows about.
|
|
4
|
+
*
|
|
5
|
+
* An operation is a Google method or it does not exist.
|
|
4
6
|
*/
|
|
5
|
-
|
|
6
|
-
/** Discover the full gws CLI surface for all eligible services. */
|
|
7
|
-
export declare function discoverSurface(): DiscoveredSurface;
|
|
7
|
+
export declare function discoverSurface(): Promise<DiscoveredSurface>;
|
|
@@ -1,168 +1,84 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Discover Google's API surface — by asking Google.
|
|
3
|
+
*
|
|
4
|
+
* The descriptor records where each service's Discovery document lives (which
|
|
5
|
+
* cannot be templated — Calendar is served from `calendar-json.googleapis.com`),
|
|
6
|
+
* so we look it up and read it.
|
|
7
|
+
*
|
|
8
|
+
* NEVER DERIVE THE SURFACE FROM HUMAN-READABLE PROSE. A regex over `--help` text
|
|
9
|
+
* once captured `calendars.The` — a word from a wrapped description line — and
|
|
10
|
+
* recorded it in coverage-baseline.json as an uncovered "gap": a method that does
|
|
11
|
+
* not exist, offered to contributors as work they could pick up. Nothing caught
|
|
12
|
+
* it, because the only source of truth was typography.
|
|
13
|
+
*
|
|
14
|
+
* The denominator must be GOOGLE'S surface. Counting invented operations, or
|
|
15
|
+
* services we deliberately do not support, makes the headline percentage fiction.
|
|
16
|
+
*
|
|
17
|
+
* WHY FETCH RATHER THAN READ THE DESCRIPTOR: the committed descriptor is
|
|
18
|
+
* deliberately structure-only — no descriptions — because it ships at RUNTIME and
|
|
19
|
+
* descriptions would add +162 KB to every install for text no server ever reads.
|
|
20
|
+
* Coverage is a DEV command. It can afford the network, and it needs the prose to
|
|
21
|
+
* make "the frontier" actionable.
|
|
22
|
+
*
|
|
23
|
+
* See ADR-103, verification item 11.
|
|
4
24
|
*/
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
function getBinary() {
|
|
11
|
-
if (!cachedBinary)
|
|
12
|
-
cachedBinary = resolveGwsBinary();
|
|
13
|
-
return cachedBinary;
|
|
14
|
-
}
|
|
15
|
-
function gws(args) {
|
|
16
|
-
return execFileSync(getBinary(), args, {
|
|
17
|
-
encoding: 'utf8',
|
|
18
|
-
timeout: TIMEOUT,
|
|
19
|
-
env: { ...process.env },
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
function gwsSafe(args) {
|
|
23
|
-
try {
|
|
24
|
-
return execFileSync(getBinary(), args, {
|
|
25
|
-
encoding: 'utf8',
|
|
26
|
-
timeout: TIMEOUT,
|
|
27
|
-
env: { ...process.env },
|
|
28
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
29
|
-
});
|
|
25
|
+
import { loadDescriptor } from '../google/descriptor.js';
|
|
26
|
+
/** Flatten resources -> methods into dotted keys: `users.messages.attachments.get`. */
|
|
27
|
+
function walkMethods(node, prefix, out) {
|
|
28
|
+
for (const [name, method] of Object.entries(node.methods ?? {})) {
|
|
29
|
+
out[prefix ? `${prefix}.${name}` : name] = method;
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
for (const [name, child] of Object.entries(node.resources ?? {})) {
|
|
32
|
+
walkMethods(child, prefix ? `${prefix}.${name}` : name, out);
|
|
33
33
|
}
|
|
34
|
+
return out;
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
function parseServiceHelp(output) {
|
|
37
|
-
const resources = [];
|
|
38
|
-
const helpers = [];
|
|
39
|
-
for (const line of output.split('\n')) {
|
|
40
|
-
const trimmed = line.trimStart();
|
|
41
|
-
// Helpers: lines starting with +
|
|
42
|
-
const helperMatch = trimmed.match(/^(\+\w+)\s+(?:\[Helper\]\s*)?(.*)$/);
|
|
43
|
-
if (helperMatch) {
|
|
44
|
-
helpers.push({ name: helperMatch[1], description: helperMatch[2].trim() });
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
// Resources: "word Operations on the '...' resource"
|
|
48
|
-
const resourceMatch = trimmed.match(/^(\w+)\s+Operations on the/);
|
|
49
|
-
if (resourceMatch && resourceMatch[1] !== 'help') {
|
|
50
|
-
resources.push(resourceMatch[1]);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return { resources, helpers };
|
|
54
|
-
}
|
|
55
|
-
/** Parse resource --help to find methods and sub-resources. */
|
|
56
|
-
function parseResourceHelp(output) {
|
|
57
|
-
const methods = [];
|
|
58
|
-
const subResources = [];
|
|
59
|
-
for (const line of output.split('\n')) {
|
|
60
|
-
const trimmed = line.trimStart();
|
|
61
|
-
if (!trimmed || trimmed.startsWith('Usage:') || trimmed.startsWith('FLAGS:'))
|
|
62
|
-
continue;
|
|
63
|
-
const resourceMatch = trimmed.match(/^(\w+)\s+Operations on the/);
|
|
64
|
-
if (resourceMatch && resourceMatch[1] !== 'help') {
|
|
65
|
-
subResources.push(resourceMatch[1]);
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
// Methods: "word Description text" (not "help", not "Operations on")
|
|
69
|
-
const methodMatch = trimmed.match(/^(\w+)\s+\S/);
|
|
70
|
-
if (methodMatch && methodMatch[1] !== 'help' && !trimmed.includes('Operations on')) {
|
|
71
|
-
methods.push(methodMatch[1]);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return { methods, subResources };
|
|
75
|
-
}
|
|
76
|
-
/** Parse gws schema JSON output into DiscoveredParam records. */
|
|
77
|
-
function parseSchemaParams(json) {
|
|
36
|
+
function toParams(method) {
|
|
78
37
|
const params = {};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
description: String(p.description || '').replace(/\n/g, ' ').slice(0, 200),
|
|
89
|
-
required: Boolean(p.required),
|
|
90
|
-
...(p.default !== undefined ? { default: p.default } : {}),
|
|
91
|
-
...(p.enum ? { enum: p.enum } : {}),
|
|
92
|
-
...(p.deprecated ? { deprecated: true } : {}),
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// Schema parse failed — return empty params
|
|
38
|
+
for (const [name, p] of Object.entries(method.parameters ?? {})) {
|
|
39
|
+
params[name] = {
|
|
40
|
+
type: p.type ?? 'string',
|
|
41
|
+
description: p.description ?? '',
|
|
42
|
+
required: p.required === true,
|
|
43
|
+
...(p.default !== undefined ? { default: p.default } : {}),
|
|
44
|
+
...(p.enum ? { enum: p.enum } : {}),
|
|
45
|
+
...(p.deprecated ? { deprecated: true } : {}),
|
|
46
|
+
};
|
|
98
47
|
}
|
|
99
48
|
return params;
|
|
100
49
|
}
|
|
101
|
-
/**
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
for (const method of methods) {
|
|
109
|
-
const resourcePath = `${parentPath}.${method}`;
|
|
110
|
-
// gws schema uses flat resource names (e.g. drive.replies.list),
|
|
111
|
-
// not nested CLI paths (e.g. drive.comments.replies.list).
|
|
112
|
-
// Try the full path first, fall back to leaf resource + method.
|
|
113
|
-
const leafResource = parts[parts.length - 1];
|
|
114
|
-
const schemaOutput = gwsSafe(['schema', `${service}.${parentPath}.${method}`])
|
|
115
|
-
|| (parts.length > 1 ? gwsSafe(['schema', `${service}.${leafResource}.${method}`]) : null);
|
|
116
|
-
let params = {};
|
|
117
|
-
let description = '';
|
|
118
|
-
let httpMethod;
|
|
119
|
-
if (schemaOutput) {
|
|
120
|
-
params = parseSchemaParams(schemaOutput);
|
|
121
|
-
try {
|
|
122
|
-
const schema = JSON.parse(schemaOutput);
|
|
123
|
-
description = String(schema.description || '').replace(/\n/g, ' ').slice(0, 200);
|
|
124
|
-
httpMethod = schema.httpMethod;
|
|
125
|
-
}
|
|
126
|
-
catch { /* ignore */ }
|
|
127
|
-
}
|
|
128
|
-
operations[resourcePath] = { resourcePath, description, httpMethod, params };
|
|
129
|
-
}
|
|
130
|
-
for (const sub of subResources) {
|
|
131
|
-
const subOps = discoverResource(service, `${parentPath}.${sub}`, [...parts, sub]);
|
|
132
|
-
Object.assign(operations, subOps);
|
|
133
|
-
}
|
|
134
|
-
return operations;
|
|
135
|
-
}
|
|
136
|
-
/** Discover the full surface of a single gws service. */
|
|
137
|
-
function discoverService(service) {
|
|
138
|
-
const helpOutput = gwsSafe([service, '--help']);
|
|
139
|
-
if (!helpOutput)
|
|
140
|
-
return { operations: {}, helpers: {} };
|
|
141
|
-
const { resources, helpers } = parseServiceHelp(helpOutput);
|
|
142
|
-
const helperMap = {};
|
|
143
|
-
for (const h of helpers) {
|
|
144
|
-
helperMap[h.name] = h;
|
|
145
|
-
}
|
|
146
|
-
let operations = {};
|
|
147
|
-
for (const resource of resources) {
|
|
148
|
-
const resourceOps = discoverResource(service, resource, [resource]);
|
|
149
|
-
operations = { ...operations, ...resourceOps };
|
|
150
|
-
}
|
|
151
|
-
return { operations, helpers: helperMap };
|
|
152
|
-
}
|
|
153
|
-
/** Discover the full gws CLI surface for all eligible services. */
|
|
154
|
-
export function discoverSurface() {
|
|
155
|
-
// Get gws version
|
|
156
|
-
let gwsVersion = 'unknown';
|
|
157
|
-
try {
|
|
158
|
-
gwsVersion = gws(['--version']).trim().split('\n')[0];
|
|
159
|
-
}
|
|
160
|
-
catch { /* ignore */ }
|
|
50
|
+
/**
|
|
51
|
+
* Read Google's real surface for every service the descriptor knows about.
|
|
52
|
+
*
|
|
53
|
+
* An operation is a Google method or it does not exist.
|
|
54
|
+
*/
|
|
55
|
+
export async function discoverSurface() {
|
|
56
|
+
const descriptor = await loadDescriptor();
|
|
161
57
|
const services = {};
|
|
162
|
-
for (const service of
|
|
163
|
-
process.stderr.write(`[coverage]
|
|
164
|
-
|
|
58
|
+
for (const [serviceName, service] of Object.entries(descriptor.services)) {
|
|
59
|
+
process.stderr.write(`[coverage] reading ${serviceName} from Google...\n`);
|
|
60
|
+
const response = await fetch(service.discoveryUrl);
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`[coverage] could not read Discovery for ${serviceName} at ${service.discoveryUrl}: ${response.status}`);
|
|
63
|
+
}
|
|
64
|
+
const doc = await response.json();
|
|
65
|
+
const operations = {};
|
|
66
|
+
for (const [resourcePath, method] of Object.entries(walkMethods(doc, '', {}))) {
|
|
67
|
+
operations[resourcePath] = {
|
|
68
|
+
resourcePath,
|
|
69
|
+
description: method.description ?? '',
|
|
70
|
+
httpMethod: method.httpMethod,
|
|
71
|
+
params: toParams(method),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
services[serviceName] = { operations, helpers: {} };
|
|
165
75
|
}
|
|
166
|
-
return {
|
|
76
|
+
return {
|
|
77
|
+
// The surface is Google's now, so the version that matters is Google's, not a
|
|
78
|
+
// CLI's. Recorded per service in the descriptor.
|
|
79
|
+
apiSurface: `google-discovery (${Object.entries(descriptor.services)
|
|
80
|
+
.map(([n, s]) => `${n}/${s.version}`).join(', ')})`,
|
|
81
|
+
services,
|
|
82
|
+
};
|
|
167
83
|
}
|
|
168
84
|
//# sourceMappingURL=discover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/coverage/discover.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/coverage/discover.ts"],"names":[],"mappings":"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"}
|
package/build/coverage/report.js
CHANGED
|
@@ -23,8 +23,8 @@ function pct(n, total) {
|
|
|
23
23
|
export function formatTerminalReport(report) {
|
|
24
24
|
const lines = [];
|
|
25
25
|
lines.push('');
|
|
26
|
-
lines.push(`${BOLD}
|
|
27
|
-
lines.push(`${DIM}
|
|
26
|
+
lines.push(`${BOLD}Google API Coverage${RESET}`);
|
|
27
|
+
lines.push(`${DIM}surface: ${report.apiSurface}${RESET}`);
|
|
28
28
|
lines.push(`${DIM}timestamp: ${report.timestamp}${RESET}`);
|
|
29
29
|
lines.push('');
|
|
30
30
|
// Summary
|
|
@@ -67,7 +67,7 @@ export function formatTerminalReport(report) {
|
|
|
67
67
|
const removedOps = report.services.flatMap(s => s.removedOps.map(op => ({ service: s.service, op })));
|
|
68
68
|
if (removedOps.length > 0) {
|
|
69
69
|
lines.push('');
|
|
70
|
-
lines.push(`${BOLD}Removed from
|
|
70
|
+
lines.push(`${BOLD}Removed from Google's surface:${RESET}`);
|
|
71
71
|
for (const { service, op } of removedOps) {
|
|
72
72
|
lines.push(` ${RED}-${RESET} ${CYAN}${service}${RESET} ${op}`);
|
|
73
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/coverage/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,SAAS,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;IACrD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1F,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;AACvF,CAAC;AAED,SAAS,GAAG,CAAC,CAAS,EAAE,KAAa;IACnC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/coverage/report.ts"],"names":[],"mappings":"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"}
|