@particle-academy/google-slides-ui 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +27 -0
- package/dist/index.cjs +160 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -1
- package/dist/index.d.ts +29 -1
- package/dist/index.js +151 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,34 @@ The four packages share one version, because they are generated from one
|
|
|
8
8
|
`provider/` definition and a version that meant something different in each
|
|
9
9
|
would be a version nobody could reason about.
|
|
10
10
|
|
|
11
|
+
## [0.7.1] — 2026-11-08
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **The Laravel config's environment variable names now split camelCase**,
|
|
16
|
+
as documented. **Consumer action: none.** The old unsplit names are still
|
|
17
|
+
read as a fallback, so an app that set them keeps working; the new names
|
|
18
|
+
are preferred.
|
|
19
|
+
|
|
20
|
+
| Preferred | Still read |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `GOOGLE_SLIDES_CLIENT_ID` | `GOOGLE_SLIDES_CLIENTID` |
|
|
23
|
+
| `GOOGLE_SLIDES_CLIENT_SECRET` | `GOOGLE_SLIDES_CLIENTSECRET` |
|
|
24
|
+
| `GOOGLE_SLIDES_ACCESS_TOKEN` | `GOOGLE_SLIDES_ACCESSTOKEN` |
|
|
25
|
+
| `GOOGLE_SLIDES_REFRESH_TOKEN` | `GOOGLE_SLIDES_REFRESHTOKEN` |
|
|
26
|
+
|
|
27
|
+
## [0.7.0] — 2026-11-08
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **`text_replace`**: replace every occurrence of a string in a presentation
|
|
32
|
+
(Google's `replaceAllText`), optionally only on the slides named in
|
|
33
|
+
`pageObjectIds`. Publishes `occurrencesChanged`; 0 means not found.
|
|
34
|
+
- **`batch_update`**: any list of Google Slides API requests, as JSON, applied
|
|
35
|
+
all or none.
|
|
36
|
+
- Both take an optional **`requiredRevisionId`**: if the presentation has
|
|
37
|
+
changed since you read it, Google refuses the whole batch.
|
|
38
|
+
|
|
11
39
|
## [0.6.0] — 2026-11-08
|
|
12
40
|
|
|
13
41
|
### Added
|
package/README.md
CHANGED
|
@@ -74,6 +74,18 @@ The refresh tokens do **not** rotate: the same one is reusable, so a refresh may
|
|
|
74
74
|
|
|
75
75
|
### Actions
|
|
76
76
|
|
|
77
|
+
#### `batch_update` — Batch update a Google Slides presentation
|
|
78
|
+
|
|
79
|
+
Apply a list of Google Slides presentation API requests to a presentation, all or none.
|
|
80
|
+
|
|
81
|
+
`POST /v1/presentations/{presentationId}:batchUpdate` · **unsafe to replay** — a retried durable run does it TWICE
|
|
82
|
+
|
|
83
|
+
| Input | Required | What it is |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `presentationId` | yes | From presentation_create's data.presentationId, or the id in the presentation's own URL. |
|
|
86
|
+
| `requests` | yes | Google's Request objects, in order. Example: [{"replaceAllText":{"containsText":{"text":"{{name}}","matchCase":true},"replaceText":"Ada"}}]. |
|
|
87
|
+
| `requiredRevisionId` | no | Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen. |
|
|
88
|
+
|
|
77
89
|
#### `presentation_create` — Google Slides presentation
|
|
78
90
|
|
|
79
91
|
Create a blank Google Slides presentation.
|
|
@@ -94,6 +106,21 @@ Read a presentation's slides and the objectId of every element on them -- the pr
|
|
|
94
106
|
|---|---|---|
|
|
95
107
|
| `presentationId` | yes | From presentation_create's data.presentationId, or the id in the presentation's own URL. |
|
|
96
108
|
|
|
109
|
+
#### `text_replace` — Replace text in a Google Slides presentation
|
|
110
|
+
|
|
111
|
+
Replace every occurrence of a string in a presentation.
|
|
112
|
+
|
|
113
|
+
`POST /v1/presentations/{presentationId}:batchUpdate` · **unsafe to replay** — a retried durable run does it TWICE
|
|
114
|
+
|
|
115
|
+
| Input | Required | What it is |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `presentationId` | yes | From presentation_create's data.presentationId, or the id in the presentation's own URL. |
|
|
118
|
+
| `find` | yes | The exact text to find, e.g. {{name}}. Not a regular expression. |
|
|
119
|
+
| `replaceWith` | yes | Inserted in place of every match. Empty is refused: to delete text, use batch_update. |
|
|
120
|
+
| `matchCase` | no | Off matches case-insensitively, which is also what Google does when it is not sent. |
|
|
121
|
+
| `pageObjectIds` | no | Optional. Slide objectIds, comma separated (from presentation_get). Empty means every slide. |
|
|
122
|
+
| `requiredRevisionId` | no | Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen. |
|
|
123
|
+
|
|
97
124
|
## Run it before you have credentials
|
|
98
125
|
|
|
99
126
|
Every operation ships a **faker**, whether or not Google Slides has a sandbox. Set a
|
package/dist/index.cjs
CHANGED
|
@@ -76,6 +76,67 @@ var GOOGLE_SLIDES_OAUTH = {
|
|
|
76
76
|
function googleSlidesMeta(role, operation, docs) {
|
|
77
77
|
return { ...GOOGLE_SLIDES_SERVICE, role, operation, docs };
|
|
78
78
|
}
|
|
79
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_KIND = "@particle-academy/google_slides_batch_update";
|
|
80
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = "batch_update";
|
|
81
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_META = googleSlidesMeta("action", "batch update a presentation", "https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate");
|
|
82
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT = [
|
|
83
|
+
{
|
|
84
|
+
"path": "data.presentationId",
|
|
85
|
+
"type": "string",
|
|
86
|
+
"description": "The presentation updated."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"path": "data.replies",
|
|
90
|
+
"type": "array",
|
|
91
|
+
"description": "One reply per request, in order. Many kinds reply with an empty object."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"path": "data.writeControl.requiredRevisionId",
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "The presentation's revision after the update; pass it to the next batch to guard it."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"path": "mode",
|
|
100
|
+
"type": "string",
|
|
101
|
+
"description": "Which estate this ran against. Google has no sandbox, so: fake or live."
|
|
102
|
+
}
|
|
103
|
+
];
|
|
104
|
+
var googleSlidesBatchUpdateKind = connectors.defineConnectorKind(GOOGLE_SLIDES_BATCH_UPDATE_META, {
|
|
105
|
+
name: GOOGLE_SLIDES_BATCH_UPDATE_KIND,
|
|
106
|
+
aliases: ["google_slides_batch_update"],
|
|
107
|
+
label: "Batch update a Google Slides presentation",
|
|
108
|
+
description: "Apply a list of Google Slides presentation API requests to a presentation, all or none.",
|
|
109
|
+
inputs: [{ id: "in" }],
|
|
110
|
+
outputs: [{ id: "out" }],
|
|
111
|
+
sideEffects: "unsafe-to-replay",
|
|
112
|
+
outputShape: GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT,
|
|
113
|
+
configSchema: [
|
|
114
|
+
{
|
|
115
|
+
"type": "text",
|
|
116
|
+
"key": "presentationId",
|
|
117
|
+
"label": "Presentation ID",
|
|
118
|
+
"required": true,
|
|
119
|
+
"description": "From presentation_create's data.presentationId, or the id in the presentation's own URL."
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"type": "json",
|
|
123
|
+
"key": "requests",
|
|
124
|
+
"label": "Requests",
|
|
125
|
+
"required": true,
|
|
126
|
+
"description": `Google's Request objects, in order. Example: [{"replaceAllText":{"containsText":{"text":"{{name}}","matchCase":true},"replaceText":"Ada"}}].`
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"type": "text",
|
|
130
|
+
"key": "requiredRevisionId",
|
|
131
|
+
"label": "Required revision ID",
|
|
132
|
+
"description": "Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen."
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
defaultConfig: {
|
|
136
|
+
"mode": "auto"
|
|
137
|
+
},
|
|
138
|
+
renderBody: ({ config }) => connectors.summarize(GOOGLE_SLIDES_BATCH_UPDATE_META, config, "batch update a presentation")
|
|
139
|
+
});
|
|
79
140
|
var GOOGLE_SLIDES_PRESENTATION_KIND = "@particle-academy/google_slides_presentation";
|
|
80
141
|
var GOOGLE_SLIDES_PRESENTATION_OPERATION = "presentation_create";
|
|
81
142
|
var GOOGLE_SLIDES_PRESENTATION_META = googleSlidesMeta("action", "create a blank presentation", "https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create");
|
|
@@ -167,14 +228,106 @@ var googleSlidesPresentationGetKind = connectors.defineConnectorKind(GOOGLE_SLID
|
|
|
167
228
|
},
|
|
168
229
|
renderBody: ({ config }) => connectors.summarize(GOOGLE_SLIDES_PRESENTATION_GET_META, config, "read a presentation")
|
|
169
230
|
});
|
|
231
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_KIND = "@particle-academy/google_slides_text_replace";
|
|
232
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = "text_replace";
|
|
233
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_META = googleSlidesMeta("action", "replace text", "https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate");
|
|
234
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT = [
|
|
235
|
+
{
|
|
236
|
+
"path": "data.presentationId",
|
|
237
|
+
"type": "string",
|
|
238
|
+
"description": "The presentation updated."
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"path": "data.replies",
|
|
242
|
+
"type": "array",
|
|
243
|
+
"description": "One reply."
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"path": "data.replies.0.replaceAllText.occurrencesChanged",
|
|
247
|
+
"type": "number",
|
|
248
|
+
"description": "How many occurrences were replaced. 0 means the text was not found, which is not an error."
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"path": "data.writeControl.requiredRevisionId",
|
|
252
|
+
"type": "string",
|
|
253
|
+
"description": "The presentation's revision after the update."
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"path": "mode",
|
|
257
|
+
"type": "string",
|
|
258
|
+
"description": "Which estate this ran against. Google has no sandbox, so: fake or live."
|
|
259
|
+
}
|
|
260
|
+
];
|
|
261
|
+
var googleSlidesTextReplaceKind = connectors.defineConnectorKind(GOOGLE_SLIDES_TEXT_REPLACE_META, {
|
|
262
|
+
name: GOOGLE_SLIDES_TEXT_REPLACE_KIND,
|
|
263
|
+
aliases: ["google_slides_text_replace"],
|
|
264
|
+
label: "Replace text in a Google Slides presentation",
|
|
265
|
+
description: "Replace every occurrence of a string in a presentation.",
|
|
266
|
+
inputs: [{ id: "in" }],
|
|
267
|
+
outputs: [{ id: "out" }],
|
|
268
|
+
sideEffects: "unsafe-to-replay",
|
|
269
|
+
outputShape: GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT,
|
|
270
|
+
configSchema: [
|
|
271
|
+
{
|
|
272
|
+
"type": "text",
|
|
273
|
+
"key": "presentationId",
|
|
274
|
+
"label": "Presentation ID",
|
|
275
|
+
"required": true,
|
|
276
|
+
"description": "From presentation_create's data.presentationId, or the id in the presentation's own URL."
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"type": "text",
|
|
280
|
+
"key": "find",
|
|
281
|
+
"label": "Find",
|
|
282
|
+
"required": true,
|
|
283
|
+
"description": "The exact text to find, e.g. {{name}}. Not a regular expression."
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"type": "textarea",
|
|
287
|
+
"key": "replaceWith",
|
|
288
|
+
"label": "Replace with",
|
|
289
|
+
"required": true,
|
|
290
|
+
"description": "Inserted in place of every match. Empty is refused: to delete text, use batch_update."
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"type": "switch",
|
|
294
|
+
"key": "matchCase",
|
|
295
|
+
"label": "Match case",
|
|
296
|
+
"default": false,
|
|
297
|
+
"description": "Off matches case-insensitively, which is also what Google does when it is not sent."
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"type": "text",
|
|
301
|
+
"key": "pageObjectIds",
|
|
302
|
+
"label": "Only on slides",
|
|
303
|
+
"description": "Optional. Slide objectIds, comma separated (from presentation_get). Empty means every slide."
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
"type": "text",
|
|
307
|
+
"key": "requiredRevisionId",
|
|
308
|
+
"label": "Required revision ID",
|
|
309
|
+
"description": "Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen."
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
defaultConfig: {
|
|
313
|
+
"mode": "auto"
|
|
314
|
+
},
|
|
315
|
+
renderBody: ({ config }) => connectors.summarize(GOOGLE_SLIDES_TEXT_REPLACE_META, config, "replace text")
|
|
316
|
+
});
|
|
170
317
|
|
|
171
318
|
// src/index.ts
|
|
172
319
|
var GOOGLE_SLIDES_KINDS = [
|
|
320
|
+
googleSlidesBatchUpdateKind,
|
|
173
321
|
googleSlidesPresentationKind,
|
|
174
|
-
googleSlidesPresentationGetKind
|
|
322
|
+
googleSlidesPresentationGetKind,
|
|
323
|
+
googleSlidesTextReplaceKind
|
|
175
324
|
];
|
|
176
325
|
|
|
177
326
|
exports.CONNECTOR_API_VERSION = CONNECTOR_API_VERSION;
|
|
327
|
+
exports.GOOGLE_SLIDES_BATCH_UPDATE_KIND = GOOGLE_SLIDES_BATCH_UPDATE_KIND;
|
|
328
|
+
exports.GOOGLE_SLIDES_BATCH_UPDATE_META = GOOGLE_SLIDES_BATCH_UPDATE_META;
|
|
329
|
+
exports.GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = GOOGLE_SLIDES_BATCH_UPDATE_OPERATION;
|
|
330
|
+
exports.GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT = GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT;
|
|
178
331
|
exports.GOOGLE_SLIDES_CREDENTIALS = GOOGLE_SLIDES_CREDENTIALS;
|
|
179
332
|
exports.GOOGLE_SLIDES_KINDS = GOOGLE_SLIDES_KINDS;
|
|
180
333
|
exports.GOOGLE_SLIDES_OAUTH = GOOGLE_SLIDES_OAUTH;
|
|
@@ -187,8 +340,14 @@ exports.GOOGLE_SLIDES_PRESENTATION_META = GOOGLE_SLIDES_PRESENTATION_META;
|
|
|
187
340
|
exports.GOOGLE_SLIDES_PRESENTATION_OPERATION = GOOGLE_SLIDES_PRESENTATION_OPERATION;
|
|
188
341
|
exports.GOOGLE_SLIDES_PRESENTATION_OUTPUT = GOOGLE_SLIDES_PRESENTATION_OUTPUT;
|
|
189
342
|
exports.GOOGLE_SLIDES_SERVICE = GOOGLE_SLIDES_SERVICE;
|
|
343
|
+
exports.GOOGLE_SLIDES_TEXT_REPLACE_KIND = GOOGLE_SLIDES_TEXT_REPLACE_KIND;
|
|
344
|
+
exports.GOOGLE_SLIDES_TEXT_REPLACE_META = GOOGLE_SLIDES_TEXT_REPLACE_META;
|
|
345
|
+
exports.GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = GOOGLE_SLIDES_TEXT_REPLACE_OPERATION;
|
|
346
|
+
exports.GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT = GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT;
|
|
347
|
+
exports.googleSlidesBatchUpdateKind = googleSlidesBatchUpdateKind;
|
|
190
348
|
exports.googleSlidesMeta = googleSlidesMeta;
|
|
191
349
|
exports.googleSlidesPresentationGetKind = googleSlidesPresentationGetKind;
|
|
192
350
|
exports.googleSlidesPresentationKind = googleSlidesPresentationKind;
|
|
351
|
+
exports.googleSlidesTextReplaceKind = googleSlidesTextReplaceKind;
|
|
193
352
|
//# sourceMappingURL=index.cjs.map
|
|
194
353
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/service.ts","../src/kinds/presentation-create.ts","../src/kinds/presentation-get.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's identity on the authoring surface, shared by every Google\n * Slides node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Slides. A test presentation is a real one in a\n * real Drive, so every create is real -- use the faker while developing and\n * clean up any live test presentations.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_SLIDES_SERVICE = {\n service: \"google_slides\",\n serviceTitle: \"Google Slides\",\n domain: \"productivity\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Slides connection holds. */\nexport const GOOGLE_SLIDES_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Slides requires — DECLARED here, performed by the\n * host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n *\n * Its consent grant is SHARED with every connector declaring grant \"google\":\n * one OAuth client, one consent and one refresh token per person, scopes added\n * as features are first used (authorizeParams). Revoking removes the WHOLE\n * grant, so only a full disconnect revokes; a per-feature disconnect stops\n * using the scope locally. Identify the account by the id_token's sub, never\n * by email.\n */\nexport const GOOGLE_SLIDES_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/presentations\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600,\n \"grant\": \"google\",\n \"authorizeParams\": {\n \"access_type\": \"offline\",\n \"include_granted_scopes\": \"true\"\n },\n \"revoke\": {\n \"url\": \"https://oauth2.googleapis.com/revoke\",\n \"param\": \"token\",\n \"scope\": \"grant\"\n },\n \"identity\": {\n \"scope\": \"openid\",\n \"claim\": \"sub\",\n \"issuers\": [\n \"https://accounts.google.com\",\n \"accounts.google.com\"\n ],\n \"jwksUrl\": \"https://www.googleapis.com/oauth2/v3/certs\",\n \"audienceCredential\": \"clientId\"\n },\n \"restrictedScopes\": []\n} as const;\n\n/** Build a Google Slides node's connector metadata from the operation it performs. */\nexport function googleSlidesMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_SLIDES_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Create a blank Google Slides presentation.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_KIND = \"@particle-academy/google_slides_presentation\";\nexport const GOOGLE_SLIDES_PRESENTATION_OPERATION = \"presentation_create\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_META = googleSlidesMeta(\"action\", \"create a blank presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The id of the created presentation.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The title Google stored.\"\n }\n];\n\nexport const googleSlidesPresentationKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_META, {\n name: GOOGLE_SLIDES_PRESENTATION_KIND,\n aliases: [\"google_slides_presentation\"],\n label: \"Google Slides presentation\",\n description: \"Create a blank Google Slides presentation.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"title\",\n \"label\": \"Title\",\n \"required\": true,\n \"description\": \"The title of the new blank presentation.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_META, config as Record<string, unknown>, \"create a blank presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Read a presentation's slides and the objectId\n * of every element on them -- the prerequisite for targeting a specific shape\n * or placeholder with a future edit.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_KIND = \"@particle-academy/google_slides_presentation_get\";\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OPERATION = \"presentation_get\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_META = googleSlidesMeta(\"action\", \"read a presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"Echoes what was asked.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The presentation's title.\"\n },\n {\n \"path\": \"data.locale\",\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag.\"\n },\n {\n \"path\": \"data.slides\",\n \"type\": \"array\",\n \"description\": \"One entry per slide, in order: objectId, and pageElements -- each with its own objectId and exactly one of shape/image/table/line/video/wordArt/sheetsChart/elementGroup/speakerSpotlight set, naming what kind of element it is. A placeholder shape's text (when it has one) lives at pageElements[].shape.text, published raw -- this connector does not flatten Slides' own rich-text run structure.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesPresentationGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_GET_META, {\n name: GOOGLE_SLIDES_PRESENTATION_GET_KIND,\n aliases: [\"google_slides_presentation_get\"],\n label: \"Google Slides presentation\",\n description: \"Read a presentation's slides and the objectId of every element on them -- the prerequisite for targeting a specific shape or placeholder with a future edit.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_GET_META, config as Record<string, unknown>, \"read a presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/presentation-create.js\";\nexport * from \"./kinds/presentation-get.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleSlidesPresentationKind } from \"./kinds/presentation-create.js\";\nimport { googleSlidesPresentationGetKind } from \"./kinds/presentation-get.js\";\n\n/** Every Google Slides kind, for a host that registers the lot. */\nexport const GOOGLE_SLIDES_KINDS: NodeKindDefinition[] = [\n googleSlidesPresentationKind,\n googleSlidesPresentationGetKind,\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/service.ts","../src/kinds/batch-update.ts","../src/kinds/presentation-create.ts","../src/kinds/presentation-get.ts","../src/kinds/text-replace.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's identity on the authoring surface, shared by every Google\n * Slides node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Slides. A test presentation is a real one in a\n * real Drive, so every create is real -- use the faker while developing and\n * clean up any live test presentations.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_SLIDES_SERVICE = {\n service: \"google_slides\",\n serviceTitle: \"Google Slides\",\n domain: \"productivity\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Slides connection holds. */\nexport const GOOGLE_SLIDES_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Slides requires — DECLARED here, performed by the\n * host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n *\n * Its consent grant is SHARED with every connector declaring grant \"google\":\n * one OAuth client, one consent and one refresh token per person, scopes added\n * as features are first used (authorizeParams). Revoking removes the WHOLE\n * grant, so only a full disconnect revokes; a per-feature disconnect stops\n * using the scope locally. Identify the account by the id_token's sub, never\n * by email.\n */\nexport const GOOGLE_SLIDES_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/presentations\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600,\n \"grant\": \"google\",\n \"authorizeParams\": {\n \"access_type\": \"offline\",\n \"include_granted_scopes\": \"true\"\n },\n \"revoke\": {\n \"url\": \"https://oauth2.googleapis.com/revoke\",\n \"param\": \"token\",\n \"scope\": \"grant\"\n },\n \"identity\": {\n \"scope\": \"openid\",\n \"claim\": \"sub\",\n \"issuers\": [\n \"https://accounts.google.com\",\n \"accounts.google.com\"\n ],\n \"jwksUrl\": \"https://www.googleapis.com/oauth2/v3/certs\",\n \"audienceCredential\": \"clientId\"\n },\n \"restrictedScopes\": []\n} as const;\n\n/** Build a Google Slides node's connector metadata from the operation it performs. */\nexport function googleSlidesMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_SLIDES_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/batch-update.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/batch-update.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Batch update a Google Slides presentation — Apply a list of Google Slides\n * presentation API requests to a presentation, all or none.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_BATCH_UPDATE_KIND = \"@particle-academy/google_slides_batch_update\";\nexport const GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = \"batch_update\";\n\nexport const GOOGLE_SLIDES_BATCH_UPDATE_META = googleSlidesMeta(\"action\", \"batch update a presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The presentation updated.\"\n },\n {\n \"path\": \"data.replies\",\n \"type\": \"array\",\n \"description\": \"One reply per request, in order. Many kinds reply with an empty object.\"\n },\n {\n \"path\": \"data.writeControl.requiredRevisionId\",\n \"type\": \"string\",\n \"description\": \"The presentation's revision after the update; pass it to the next batch to guard it.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesBatchUpdateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_BATCH_UPDATE_META, {\n name: GOOGLE_SLIDES_BATCH_UPDATE_KIND,\n aliases: [\"google_slides_batch_update\"],\n label: \"Batch update a Google Slides presentation\",\n description: \"Apply a list of Google Slides presentation API requests to a presentation, all or none.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n },\n {\n \"type\": \"json\",\n \"key\": \"requests\",\n \"label\": \"Requests\",\n \"required\": true,\n \"description\": \"Google's Request objects, in order. Example: [{\\\"replaceAllText\\\":{\\\"containsText\\\":{\\\"text\\\":\\\"{{name}}\\\",\\\"matchCase\\\":true},\\\"replaceText\\\":\\\"Ada\\\"}}].\"\n },\n {\n \"type\": \"text\",\n \"key\": \"requiredRevisionId\",\n \"label\": \"Required revision ID\",\n \"description\": \"Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_BATCH_UPDATE_META, config as Record<string, unknown>, \"batch update a presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Create a blank Google Slides presentation.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_KIND = \"@particle-academy/google_slides_presentation\";\nexport const GOOGLE_SLIDES_PRESENTATION_OPERATION = \"presentation_create\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_META = googleSlidesMeta(\"action\", \"create a blank presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The id of the created presentation.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The title Google stored.\"\n }\n];\n\nexport const googleSlidesPresentationKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_META, {\n name: GOOGLE_SLIDES_PRESENTATION_KIND,\n aliases: [\"google_slides_presentation\"],\n label: \"Google Slides presentation\",\n description: \"Create a blank Google Slides presentation.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"title\",\n \"label\": \"Title\",\n \"required\": true,\n \"description\": \"The title of the new blank presentation.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_META, config as Record<string, unknown>, \"create a blank presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Read a presentation's slides and the objectId\n * of every element on them -- the prerequisite for targeting a specific shape\n * or placeholder with a future edit.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_KIND = \"@particle-academy/google_slides_presentation_get\";\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OPERATION = \"presentation_get\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_META = googleSlidesMeta(\"action\", \"read a presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"Echoes what was asked.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The presentation's title.\"\n },\n {\n \"path\": \"data.locale\",\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag.\"\n },\n {\n \"path\": \"data.slides\",\n \"type\": \"array\",\n \"description\": \"One entry per slide, in order: objectId, and pageElements -- each with its own objectId and exactly one of shape/image/table/line/video/wordArt/sheetsChart/elementGroup/speakerSpotlight set, naming what kind of element it is. A placeholder shape's text (when it has one) lives at pageElements[].shape.text, published raw -- this connector does not flatten Slides' own rich-text run structure.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesPresentationGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_GET_META, {\n name: GOOGLE_SLIDES_PRESENTATION_GET_KIND,\n aliases: [\"google_slides_presentation_get\"],\n label: \"Google Slides presentation\",\n description: \"Read a presentation's slides and the objectId of every element on them -- the prerequisite for targeting a specific shape or placeholder with a future edit.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_GET_META, config as Record<string, unknown>, \"read a presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/text-replace.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/text-replace.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Replace text in a Google Slides presentation — Replace every occurrence of a\n * string in a presentation.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_TEXT_REPLACE_KIND = \"@particle-academy/google_slides_text_replace\";\nexport const GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = \"text_replace\";\n\nexport const GOOGLE_SLIDES_TEXT_REPLACE_META = googleSlidesMeta(\"action\", \"replace text\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The presentation updated.\"\n },\n {\n \"path\": \"data.replies\",\n \"type\": \"array\",\n \"description\": \"One reply.\"\n },\n {\n \"path\": \"data.replies.0.replaceAllText.occurrencesChanged\",\n \"type\": \"number\",\n \"description\": \"How many occurrences were replaced. 0 means the text was not found, which is not an error.\"\n },\n {\n \"path\": \"data.writeControl.requiredRevisionId\",\n \"type\": \"string\",\n \"description\": \"The presentation's revision after the update.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesTextReplaceKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_TEXT_REPLACE_META, {\n name: GOOGLE_SLIDES_TEXT_REPLACE_KIND,\n aliases: [\"google_slides_text_replace\"],\n label: \"Replace text in a Google Slides presentation\",\n description: \"Replace every occurrence of a string in a presentation.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"find\",\n \"label\": \"Find\",\n \"required\": true,\n \"description\": \"The exact text to find, e.g. {{name}}. Not a regular expression.\"\n },\n {\n \"type\": \"textarea\",\n \"key\": \"replaceWith\",\n \"label\": \"Replace with\",\n \"required\": true,\n \"description\": \"Inserted in place of every match. Empty is refused: to delete text, use batch_update.\"\n },\n {\n \"type\": \"switch\",\n \"key\": \"matchCase\",\n \"label\": \"Match case\",\n \"default\": false,\n \"description\": \"Off matches case-insensitively, which is also what Google does when it is not sent.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageObjectIds\",\n \"label\": \"Only on slides\",\n \"description\": \"Optional. Slide objectIds, comma separated (from presentation_get). Empty means every slide.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"requiredRevisionId\",\n \"label\": \"Required revision ID\",\n \"description\": \"Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_TEXT_REPLACE_META, config as Record<string, unknown>, \"replace text\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/batch-update.js\";\nexport * from \"./kinds/presentation-create.js\";\nexport * from \"./kinds/presentation-get.js\";\nexport * from \"./kinds/text-replace.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleSlidesBatchUpdateKind } from \"./kinds/batch-update.js\";\nimport { googleSlidesPresentationKind } from \"./kinds/presentation-create.js\";\nimport { googleSlidesPresentationGetKind } from \"./kinds/presentation-get.js\";\nimport { googleSlidesTextReplaceKind } from \"./kinds/text-replace.js\";\n\n/** Every Google Slides kind, for a host that registers the lot. */\nexport const GOOGLE_SLIDES_KINDS: NodeKindDefinition[] = [\n googleSlidesBatchUpdateKind,\n googleSlidesPresentationKind,\n googleSlidesPresentationGetKind,\n googleSlidesTextReplaceKind,\n];\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -123,6 +123,20 @@ declare const GOOGLE_SLIDES_OAUTH: {
|
|
|
123
123
|
/** Build a Google Slides node's connector metadata from the operation it performs. */
|
|
124
124
|
declare function googleSlidesMeta(role: ConnectorMeta["role"], operation: string, docs: string): ConnectorMeta;
|
|
125
125
|
|
|
126
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_KIND = "@particle-academy/google_slides_batch_update";
|
|
127
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = "batch_update";
|
|
128
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_META: _particle_academy_fancy_flow_connectors.ConnectorMeta;
|
|
129
|
+
/**
|
|
130
|
+
* What this node emits — the "ingredients" a downstream node can reference.
|
|
131
|
+
*
|
|
132
|
+
* fancy-flow reads `outputShape` off the kind and offers it in the variable
|
|
133
|
+
* picker, so declaring it is the whole of the work: an author configuring the
|
|
134
|
+
* next node picks `{{ $json.data.id }}` off a list instead of typing a path
|
|
135
|
+
* and hoping.
|
|
136
|
+
*/
|
|
137
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT: OutputField[];
|
|
138
|
+
declare const googleSlidesBatchUpdateKind: NodeKindDefinition;
|
|
139
|
+
|
|
126
140
|
declare const GOOGLE_SLIDES_PRESENTATION_KIND = "@particle-academy/google_slides_presentation";
|
|
127
141
|
declare const GOOGLE_SLIDES_PRESENTATION_OPERATION = "presentation_create";
|
|
128
142
|
declare const GOOGLE_SLIDES_PRESENTATION_META: _particle_academy_fancy_flow_connectors.ConnectorMeta;
|
|
@@ -151,6 +165,20 @@ declare const GOOGLE_SLIDES_PRESENTATION_GET_META: _particle_academy_fancy_flow_
|
|
|
151
165
|
declare const GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT: OutputField[];
|
|
152
166
|
declare const googleSlidesPresentationGetKind: NodeKindDefinition;
|
|
153
167
|
|
|
168
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_KIND = "@particle-academy/google_slides_text_replace";
|
|
169
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = "text_replace";
|
|
170
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_META: _particle_academy_fancy_flow_connectors.ConnectorMeta;
|
|
171
|
+
/**
|
|
172
|
+
* What this node emits — the "ingredients" a downstream node can reference.
|
|
173
|
+
*
|
|
174
|
+
* fancy-flow reads `outputShape` off the kind and offers it in the variable
|
|
175
|
+
* picker, so declaring it is the whole of the work: an author configuring the
|
|
176
|
+
* next node picks `{{ $json.data.id }}` off a list instead of typing a path
|
|
177
|
+
* and hoping.
|
|
178
|
+
*/
|
|
179
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT: OutputField[];
|
|
180
|
+
declare const googleSlidesTextReplaceKind: NodeKindDefinition;
|
|
181
|
+
|
|
154
182
|
/**
|
|
155
183
|
* GENERATED FILE — do not edit.
|
|
156
184
|
*
|
|
@@ -172,4 +200,4 @@ declare const googleSlidesPresentationGetKind: NodeKindDefinition;
|
|
|
172
200
|
/** Every Google Slides kind, for a host that registers the lot. */
|
|
173
201
|
declare const GOOGLE_SLIDES_KINDS: NodeKindDefinition[];
|
|
174
202
|
|
|
175
|
-
export { CONNECTOR_API_VERSION, GOOGLE_SLIDES_CREDENTIALS, GOOGLE_SLIDES_KINDS, GOOGLE_SLIDES_OAUTH, GOOGLE_SLIDES_PRESENTATION_GET_KIND, GOOGLE_SLIDES_PRESENTATION_GET_META, GOOGLE_SLIDES_PRESENTATION_GET_OPERATION, GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT, GOOGLE_SLIDES_PRESENTATION_KIND, GOOGLE_SLIDES_PRESENTATION_META, GOOGLE_SLIDES_PRESENTATION_OPERATION, GOOGLE_SLIDES_PRESENTATION_OUTPUT, GOOGLE_SLIDES_SERVICE, googleSlidesMeta, googleSlidesPresentationGetKind, googleSlidesPresentationKind };
|
|
203
|
+
export { CONNECTOR_API_VERSION, GOOGLE_SLIDES_BATCH_UPDATE_KIND, GOOGLE_SLIDES_BATCH_UPDATE_META, GOOGLE_SLIDES_BATCH_UPDATE_OPERATION, GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT, GOOGLE_SLIDES_CREDENTIALS, GOOGLE_SLIDES_KINDS, GOOGLE_SLIDES_OAUTH, GOOGLE_SLIDES_PRESENTATION_GET_KIND, GOOGLE_SLIDES_PRESENTATION_GET_META, GOOGLE_SLIDES_PRESENTATION_GET_OPERATION, GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT, GOOGLE_SLIDES_PRESENTATION_KIND, GOOGLE_SLIDES_PRESENTATION_META, GOOGLE_SLIDES_PRESENTATION_OPERATION, GOOGLE_SLIDES_PRESENTATION_OUTPUT, GOOGLE_SLIDES_SERVICE, GOOGLE_SLIDES_TEXT_REPLACE_KIND, GOOGLE_SLIDES_TEXT_REPLACE_META, GOOGLE_SLIDES_TEXT_REPLACE_OPERATION, GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT, googleSlidesBatchUpdateKind, googleSlidesMeta, googleSlidesPresentationGetKind, googleSlidesPresentationKind, googleSlidesTextReplaceKind };
|
package/dist/index.d.ts
CHANGED
|
@@ -123,6 +123,20 @@ declare const GOOGLE_SLIDES_OAUTH: {
|
|
|
123
123
|
/** Build a Google Slides node's connector metadata from the operation it performs. */
|
|
124
124
|
declare function googleSlidesMeta(role: ConnectorMeta["role"], operation: string, docs: string): ConnectorMeta;
|
|
125
125
|
|
|
126
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_KIND = "@particle-academy/google_slides_batch_update";
|
|
127
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = "batch_update";
|
|
128
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_META: _particle_academy_fancy_flow_connectors.ConnectorMeta;
|
|
129
|
+
/**
|
|
130
|
+
* What this node emits — the "ingredients" a downstream node can reference.
|
|
131
|
+
*
|
|
132
|
+
* fancy-flow reads `outputShape` off the kind and offers it in the variable
|
|
133
|
+
* picker, so declaring it is the whole of the work: an author configuring the
|
|
134
|
+
* next node picks `{{ $json.data.id }}` off a list instead of typing a path
|
|
135
|
+
* and hoping.
|
|
136
|
+
*/
|
|
137
|
+
declare const GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT: OutputField[];
|
|
138
|
+
declare const googleSlidesBatchUpdateKind: NodeKindDefinition;
|
|
139
|
+
|
|
126
140
|
declare const GOOGLE_SLIDES_PRESENTATION_KIND = "@particle-academy/google_slides_presentation";
|
|
127
141
|
declare const GOOGLE_SLIDES_PRESENTATION_OPERATION = "presentation_create";
|
|
128
142
|
declare const GOOGLE_SLIDES_PRESENTATION_META: _particle_academy_fancy_flow_connectors.ConnectorMeta;
|
|
@@ -151,6 +165,20 @@ declare const GOOGLE_SLIDES_PRESENTATION_GET_META: _particle_academy_fancy_flow_
|
|
|
151
165
|
declare const GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT: OutputField[];
|
|
152
166
|
declare const googleSlidesPresentationGetKind: NodeKindDefinition;
|
|
153
167
|
|
|
168
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_KIND = "@particle-academy/google_slides_text_replace";
|
|
169
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = "text_replace";
|
|
170
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_META: _particle_academy_fancy_flow_connectors.ConnectorMeta;
|
|
171
|
+
/**
|
|
172
|
+
* What this node emits — the "ingredients" a downstream node can reference.
|
|
173
|
+
*
|
|
174
|
+
* fancy-flow reads `outputShape` off the kind and offers it in the variable
|
|
175
|
+
* picker, so declaring it is the whole of the work: an author configuring the
|
|
176
|
+
* next node picks `{{ $json.data.id }}` off a list instead of typing a path
|
|
177
|
+
* and hoping.
|
|
178
|
+
*/
|
|
179
|
+
declare const GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT: OutputField[];
|
|
180
|
+
declare const googleSlidesTextReplaceKind: NodeKindDefinition;
|
|
181
|
+
|
|
154
182
|
/**
|
|
155
183
|
* GENERATED FILE — do not edit.
|
|
156
184
|
*
|
|
@@ -172,4 +200,4 @@ declare const googleSlidesPresentationGetKind: NodeKindDefinition;
|
|
|
172
200
|
/** Every Google Slides kind, for a host that registers the lot. */
|
|
173
201
|
declare const GOOGLE_SLIDES_KINDS: NodeKindDefinition[];
|
|
174
202
|
|
|
175
|
-
export { CONNECTOR_API_VERSION, GOOGLE_SLIDES_CREDENTIALS, GOOGLE_SLIDES_KINDS, GOOGLE_SLIDES_OAUTH, GOOGLE_SLIDES_PRESENTATION_GET_KIND, GOOGLE_SLIDES_PRESENTATION_GET_META, GOOGLE_SLIDES_PRESENTATION_GET_OPERATION, GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT, GOOGLE_SLIDES_PRESENTATION_KIND, GOOGLE_SLIDES_PRESENTATION_META, GOOGLE_SLIDES_PRESENTATION_OPERATION, GOOGLE_SLIDES_PRESENTATION_OUTPUT, GOOGLE_SLIDES_SERVICE, googleSlidesMeta, googleSlidesPresentationGetKind, googleSlidesPresentationKind };
|
|
203
|
+
export { CONNECTOR_API_VERSION, GOOGLE_SLIDES_BATCH_UPDATE_KIND, GOOGLE_SLIDES_BATCH_UPDATE_META, GOOGLE_SLIDES_BATCH_UPDATE_OPERATION, GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT, GOOGLE_SLIDES_CREDENTIALS, GOOGLE_SLIDES_KINDS, GOOGLE_SLIDES_OAUTH, GOOGLE_SLIDES_PRESENTATION_GET_KIND, GOOGLE_SLIDES_PRESENTATION_GET_META, GOOGLE_SLIDES_PRESENTATION_GET_OPERATION, GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT, GOOGLE_SLIDES_PRESENTATION_KIND, GOOGLE_SLIDES_PRESENTATION_META, GOOGLE_SLIDES_PRESENTATION_OPERATION, GOOGLE_SLIDES_PRESENTATION_OUTPUT, GOOGLE_SLIDES_SERVICE, GOOGLE_SLIDES_TEXT_REPLACE_KIND, GOOGLE_SLIDES_TEXT_REPLACE_META, GOOGLE_SLIDES_TEXT_REPLACE_OPERATION, GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT, googleSlidesBatchUpdateKind, googleSlidesMeta, googleSlidesPresentationGetKind, googleSlidesPresentationKind, googleSlidesTextReplaceKind };
|
package/dist/index.js
CHANGED
|
@@ -74,6 +74,67 @@ var GOOGLE_SLIDES_OAUTH = {
|
|
|
74
74
|
function googleSlidesMeta(role, operation, docs) {
|
|
75
75
|
return { ...GOOGLE_SLIDES_SERVICE, role, operation, docs };
|
|
76
76
|
}
|
|
77
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_KIND = "@particle-academy/google_slides_batch_update";
|
|
78
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = "batch_update";
|
|
79
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_META = googleSlidesMeta("action", "batch update a presentation", "https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate");
|
|
80
|
+
var GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT = [
|
|
81
|
+
{
|
|
82
|
+
"path": "data.presentationId",
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "The presentation updated."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"path": "data.replies",
|
|
88
|
+
"type": "array",
|
|
89
|
+
"description": "One reply per request, in order. Many kinds reply with an empty object."
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"path": "data.writeControl.requiredRevisionId",
|
|
93
|
+
"type": "string",
|
|
94
|
+
"description": "The presentation's revision after the update; pass it to the next batch to guard it."
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"path": "mode",
|
|
98
|
+
"type": "string",
|
|
99
|
+
"description": "Which estate this ran against. Google has no sandbox, so: fake or live."
|
|
100
|
+
}
|
|
101
|
+
];
|
|
102
|
+
var googleSlidesBatchUpdateKind = defineConnectorKind(GOOGLE_SLIDES_BATCH_UPDATE_META, {
|
|
103
|
+
name: GOOGLE_SLIDES_BATCH_UPDATE_KIND,
|
|
104
|
+
aliases: ["google_slides_batch_update"],
|
|
105
|
+
label: "Batch update a Google Slides presentation",
|
|
106
|
+
description: "Apply a list of Google Slides presentation API requests to a presentation, all or none.",
|
|
107
|
+
inputs: [{ id: "in" }],
|
|
108
|
+
outputs: [{ id: "out" }],
|
|
109
|
+
sideEffects: "unsafe-to-replay",
|
|
110
|
+
outputShape: GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT,
|
|
111
|
+
configSchema: [
|
|
112
|
+
{
|
|
113
|
+
"type": "text",
|
|
114
|
+
"key": "presentationId",
|
|
115
|
+
"label": "Presentation ID",
|
|
116
|
+
"required": true,
|
|
117
|
+
"description": "From presentation_create's data.presentationId, or the id in the presentation's own URL."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"type": "json",
|
|
121
|
+
"key": "requests",
|
|
122
|
+
"label": "Requests",
|
|
123
|
+
"required": true,
|
|
124
|
+
"description": `Google's Request objects, in order. Example: [{"replaceAllText":{"containsText":{"text":"{{name}}","matchCase":true},"replaceText":"Ada"}}].`
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"type": "text",
|
|
128
|
+
"key": "requiredRevisionId",
|
|
129
|
+
"label": "Required revision ID",
|
|
130
|
+
"description": "Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen."
|
|
131
|
+
}
|
|
132
|
+
],
|
|
133
|
+
defaultConfig: {
|
|
134
|
+
"mode": "auto"
|
|
135
|
+
},
|
|
136
|
+
renderBody: ({ config }) => summarize(GOOGLE_SLIDES_BATCH_UPDATE_META, config, "batch update a presentation")
|
|
137
|
+
});
|
|
77
138
|
var GOOGLE_SLIDES_PRESENTATION_KIND = "@particle-academy/google_slides_presentation";
|
|
78
139
|
var GOOGLE_SLIDES_PRESENTATION_OPERATION = "presentation_create";
|
|
79
140
|
var GOOGLE_SLIDES_PRESENTATION_META = googleSlidesMeta("action", "create a blank presentation", "https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create");
|
|
@@ -165,13 +226,101 @@ var googleSlidesPresentationGetKind = defineConnectorKind(GOOGLE_SLIDES_PRESENTA
|
|
|
165
226
|
},
|
|
166
227
|
renderBody: ({ config }) => summarize(GOOGLE_SLIDES_PRESENTATION_GET_META, config, "read a presentation")
|
|
167
228
|
});
|
|
229
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_KIND = "@particle-academy/google_slides_text_replace";
|
|
230
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = "text_replace";
|
|
231
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_META = googleSlidesMeta("action", "replace text", "https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate");
|
|
232
|
+
var GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT = [
|
|
233
|
+
{
|
|
234
|
+
"path": "data.presentationId",
|
|
235
|
+
"type": "string",
|
|
236
|
+
"description": "The presentation updated."
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"path": "data.replies",
|
|
240
|
+
"type": "array",
|
|
241
|
+
"description": "One reply."
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"path": "data.replies.0.replaceAllText.occurrencesChanged",
|
|
245
|
+
"type": "number",
|
|
246
|
+
"description": "How many occurrences were replaced. 0 means the text was not found, which is not an error."
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"path": "data.writeControl.requiredRevisionId",
|
|
250
|
+
"type": "string",
|
|
251
|
+
"description": "The presentation's revision after the update."
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"path": "mode",
|
|
255
|
+
"type": "string",
|
|
256
|
+
"description": "Which estate this ran against. Google has no sandbox, so: fake or live."
|
|
257
|
+
}
|
|
258
|
+
];
|
|
259
|
+
var googleSlidesTextReplaceKind = defineConnectorKind(GOOGLE_SLIDES_TEXT_REPLACE_META, {
|
|
260
|
+
name: GOOGLE_SLIDES_TEXT_REPLACE_KIND,
|
|
261
|
+
aliases: ["google_slides_text_replace"],
|
|
262
|
+
label: "Replace text in a Google Slides presentation",
|
|
263
|
+
description: "Replace every occurrence of a string in a presentation.",
|
|
264
|
+
inputs: [{ id: "in" }],
|
|
265
|
+
outputs: [{ id: "out" }],
|
|
266
|
+
sideEffects: "unsafe-to-replay",
|
|
267
|
+
outputShape: GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT,
|
|
268
|
+
configSchema: [
|
|
269
|
+
{
|
|
270
|
+
"type": "text",
|
|
271
|
+
"key": "presentationId",
|
|
272
|
+
"label": "Presentation ID",
|
|
273
|
+
"required": true,
|
|
274
|
+
"description": "From presentation_create's data.presentationId, or the id in the presentation's own URL."
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"type": "text",
|
|
278
|
+
"key": "find",
|
|
279
|
+
"label": "Find",
|
|
280
|
+
"required": true,
|
|
281
|
+
"description": "The exact text to find, e.g. {{name}}. Not a regular expression."
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"type": "textarea",
|
|
285
|
+
"key": "replaceWith",
|
|
286
|
+
"label": "Replace with",
|
|
287
|
+
"required": true,
|
|
288
|
+
"description": "Inserted in place of every match. Empty is refused: to delete text, use batch_update."
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"type": "switch",
|
|
292
|
+
"key": "matchCase",
|
|
293
|
+
"label": "Match case",
|
|
294
|
+
"default": false,
|
|
295
|
+
"description": "Off matches case-insensitively, which is also what Google does when it is not sent."
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"type": "text",
|
|
299
|
+
"key": "pageObjectIds",
|
|
300
|
+
"label": "Only on slides",
|
|
301
|
+
"description": "Optional. Slide objectIds, comma separated (from presentation_get). Empty means every slide."
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"type": "text",
|
|
305
|
+
"key": "requiredRevisionId",
|
|
306
|
+
"label": "Required revision ID",
|
|
307
|
+
"description": "Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen."
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
defaultConfig: {
|
|
311
|
+
"mode": "auto"
|
|
312
|
+
},
|
|
313
|
+
renderBody: ({ config }) => summarize(GOOGLE_SLIDES_TEXT_REPLACE_META, config, "replace text")
|
|
314
|
+
});
|
|
168
315
|
|
|
169
316
|
// src/index.ts
|
|
170
317
|
var GOOGLE_SLIDES_KINDS = [
|
|
318
|
+
googleSlidesBatchUpdateKind,
|
|
171
319
|
googleSlidesPresentationKind,
|
|
172
|
-
googleSlidesPresentationGetKind
|
|
320
|
+
googleSlidesPresentationGetKind,
|
|
321
|
+
googleSlidesTextReplaceKind
|
|
173
322
|
];
|
|
174
323
|
|
|
175
|
-
export { CONNECTOR_API_VERSION, GOOGLE_SLIDES_CREDENTIALS, GOOGLE_SLIDES_KINDS, GOOGLE_SLIDES_OAUTH, GOOGLE_SLIDES_PRESENTATION_GET_KIND, GOOGLE_SLIDES_PRESENTATION_GET_META, GOOGLE_SLIDES_PRESENTATION_GET_OPERATION, GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT, GOOGLE_SLIDES_PRESENTATION_KIND, GOOGLE_SLIDES_PRESENTATION_META, GOOGLE_SLIDES_PRESENTATION_OPERATION, GOOGLE_SLIDES_PRESENTATION_OUTPUT, GOOGLE_SLIDES_SERVICE, googleSlidesMeta, googleSlidesPresentationGetKind, googleSlidesPresentationKind };
|
|
324
|
+
export { CONNECTOR_API_VERSION, GOOGLE_SLIDES_BATCH_UPDATE_KIND, GOOGLE_SLIDES_BATCH_UPDATE_META, GOOGLE_SLIDES_BATCH_UPDATE_OPERATION, GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT, GOOGLE_SLIDES_CREDENTIALS, GOOGLE_SLIDES_KINDS, GOOGLE_SLIDES_OAUTH, GOOGLE_SLIDES_PRESENTATION_GET_KIND, GOOGLE_SLIDES_PRESENTATION_GET_META, GOOGLE_SLIDES_PRESENTATION_GET_OPERATION, GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT, GOOGLE_SLIDES_PRESENTATION_KIND, GOOGLE_SLIDES_PRESENTATION_META, GOOGLE_SLIDES_PRESENTATION_OPERATION, GOOGLE_SLIDES_PRESENTATION_OUTPUT, GOOGLE_SLIDES_SERVICE, GOOGLE_SLIDES_TEXT_REPLACE_KIND, GOOGLE_SLIDES_TEXT_REPLACE_META, GOOGLE_SLIDES_TEXT_REPLACE_OPERATION, GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT, googleSlidesBatchUpdateKind, googleSlidesMeta, googleSlidesPresentationGetKind, googleSlidesPresentationKind, googleSlidesTextReplaceKind };
|
|
176
325
|
//# sourceMappingURL=index.js.map
|
|
177
326
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/service.ts","../src/kinds/presentation-create.ts","../src/kinds/presentation-get.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's identity on the authoring surface, shared by every Google\n * Slides node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Slides. A test presentation is a real one in a\n * real Drive, so every create is real -- use the faker while developing and\n * clean up any live test presentations.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_SLIDES_SERVICE = {\n service: \"google_slides\",\n serviceTitle: \"Google Slides\",\n domain: \"productivity\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Slides connection holds. */\nexport const GOOGLE_SLIDES_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Slides requires — DECLARED here, performed by the\n * host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n *\n * Its consent grant is SHARED with every connector declaring grant \"google\":\n * one OAuth client, one consent and one refresh token per person, scopes added\n * as features are first used (authorizeParams). Revoking removes the WHOLE\n * grant, so only a full disconnect revokes; a per-feature disconnect stops\n * using the scope locally. Identify the account by the id_token's sub, never\n * by email.\n */\nexport const GOOGLE_SLIDES_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/presentations\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600,\n \"grant\": \"google\",\n \"authorizeParams\": {\n \"access_type\": \"offline\",\n \"include_granted_scopes\": \"true\"\n },\n \"revoke\": {\n \"url\": \"https://oauth2.googleapis.com/revoke\",\n \"param\": \"token\",\n \"scope\": \"grant\"\n },\n \"identity\": {\n \"scope\": \"openid\",\n \"claim\": \"sub\",\n \"issuers\": [\n \"https://accounts.google.com\",\n \"accounts.google.com\"\n ],\n \"jwksUrl\": \"https://www.googleapis.com/oauth2/v3/certs\",\n \"audienceCredential\": \"clientId\"\n },\n \"restrictedScopes\": []\n} as const;\n\n/** Build a Google Slides node's connector metadata from the operation it performs. */\nexport function googleSlidesMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_SLIDES_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Create a blank Google Slides presentation.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_KIND = \"@particle-academy/google_slides_presentation\";\nexport const GOOGLE_SLIDES_PRESENTATION_OPERATION = \"presentation_create\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_META = googleSlidesMeta(\"action\", \"create a blank presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The id of the created presentation.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The title Google stored.\"\n }\n];\n\nexport const googleSlidesPresentationKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_META, {\n name: GOOGLE_SLIDES_PRESENTATION_KIND,\n aliases: [\"google_slides_presentation\"],\n label: \"Google Slides presentation\",\n description: \"Create a blank Google Slides presentation.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"title\",\n \"label\": \"Title\",\n \"required\": true,\n \"description\": \"The title of the new blank presentation.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_META, config as Record<string, unknown>, \"create a blank presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Read a presentation's slides and the objectId\n * of every element on them -- the prerequisite for targeting a specific shape\n * or placeholder with a future edit.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_KIND = \"@particle-academy/google_slides_presentation_get\";\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OPERATION = \"presentation_get\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_META = googleSlidesMeta(\"action\", \"read a presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"Echoes what was asked.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The presentation's title.\"\n },\n {\n \"path\": \"data.locale\",\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag.\"\n },\n {\n \"path\": \"data.slides\",\n \"type\": \"array\",\n \"description\": \"One entry per slide, in order: objectId, and pageElements -- each with its own objectId and exactly one of shape/image/table/line/video/wordArt/sheetsChart/elementGroup/speakerSpotlight set, naming what kind of element it is. A placeholder shape's text (when it has one) lives at pageElements[].shape.text, published raw -- this connector does not flatten Slides' own rich-text run structure.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesPresentationGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_GET_META, {\n name: GOOGLE_SLIDES_PRESENTATION_GET_KIND,\n aliases: [\"google_slides_presentation_get\"],\n label: \"Google Slides presentation\",\n description: \"Read a presentation's slides and the objectId of every element on them -- the prerequisite for targeting a specific shape or placeholder with a future edit.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_GET_META, config as Record<string, unknown>, \"read a presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/presentation-create.js\";\nexport * from \"./kinds/presentation-get.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleSlidesPresentationKind } from \"./kinds/presentation-create.js\";\nimport { googleSlidesPresentationGetKind } from \"./kinds/presentation-get.js\";\n\n/** Every Google Slides kind, for a host that registers the lot. */\nexport const GOOGLE_SLIDES_KINDS: NodeKindDefinition[] = [\n googleSlidesPresentationKind,\n googleSlidesPresentationGetKind,\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/service.ts","../src/kinds/batch-update.ts","../src/kinds/presentation-create.ts","../src/kinds/presentation-get.ts","../src/kinds/text-replace.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's identity on the authoring surface, shared by every Google\n * Slides node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Slides. A test presentation is a real one in a\n * real Drive, so every create is real -- use the faker while developing and\n * clean up any live test presentations.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_SLIDES_SERVICE = {\n service: \"google_slides\",\n serviceTitle: \"Google Slides\",\n domain: \"productivity\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Slides connection holds. */\nexport const GOOGLE_SLIDES_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Slides requires — DECLARED here, performed by the\n * host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n *\n * Its consent grant is SHARED with every connector declaring grant \"google\":\n * one OAuth client, one consent and one refresh token per person, scopes added\n * as features are first used (authorizeParams). Revoking removes the WHOLE\n * grant, so only a full disconnect revokes; a per-feature disconnect stops\n * using the scope locally. Identify the account by the id_token's sub, never\n * by email.\n */\nexport const GOOGLE_SLIDES_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/presentations\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600,\n \"grant\": \"google\",\n \"authorizeParams\": {\n \"access_type\": \"offline\",\n \"include_granted_scopes\": \"true\"\n },\n \"revoke\": {\n \"url\": \"https://oauth2.googleapis.com/revoke\",\n \"param\": \"token\",\n \"scope\": \"grant\"\n },\n \"identity\": {\n \"scope\": \"openid\",\n \"claim\": \"sub\",\n \"issuers\": [\n \"https://accounts.google.com\",\n \"accounts.google.com\"\n ],\n \"jwksUrl\": \"https://www.googleapis.com/oauth2/v3/certs\",\n \"audienceCredential\": \"clientId\"\n },\n \"restrictedScopes\": []\n} as const;\n\n/** Build a Google Slides node's connector metadata from the operation it performs. */\nexport function googleSlidesMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_SLIDES_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/batch-update.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/batch-update.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Batch update a Google Slides presentation — Apply a list of Google Slides\n * presentation API requests to a presentation, all or none.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_BATCH_UPDATE_KIND = \"@particle-academy/google_slides_batch_update\";\nexport const GOOGLE_SLIDES_BATCH_UPDATE_OPERATION = \"batch_update\";\n\nexport const GOOGLE_SLIDES_BATCH_UPDATE_META = googleSlidesMeta(\"action\", \"batch update a presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The presentation updated.\"\n },\n {\n \"path\": \"data.replies\",\n \"type\": \"array\",\n \"description\": \"One reply per request, in order. Many kinds reply with an empty object.\"\n },\n {\n \"path\": \"data.writeControl.requiredRevisionId\",\n \"type\": \"string\",\n \"description\": \"The presentation's revision after the update; pass it to the next batch to guard it.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesBatchUpdateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_BATCH_UPDATE_META, {\n name: GOOGLE_SLIDES_BATCH_UPDATE_KIND,\n aliases: [\"google_slides_batch_update\"],\n label: \"Batch update a Google Slides presentation\",\n description: \"Apply a list of Google Slides presentation API requests to a presentation, all or none.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_BATCH_UPDATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n },\n {\n \"type\": \"json\",\n \"key\": \"requests\",\n \"label\": \"Requests\",\n \"required\": true,\n \"description\": \"Google's Request objects, in order. Example: [{\\\"replaceAllText\\\":{\\\"containsText\\\":{\\\"text\\\":\\\"{{name}}\\\",\\\"matchCase\\\":true},\\\"replaceText\\\":\\\"Ada\\\"}}].\"\n },\n {\n \"type\": \"text\",\n \"key\": \"requiredRevisionId\",\n \"label\": \"Required revision ID\",\n \"description\": \"Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_BATCH_UPDATE_META, config as Record<string, unknown>, \"batch update a presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Create a blank Google Slides presentation.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_KIND = \"@particle-academy/google_slides_presentation\";\nexport const GOOGLE_SLIDES_PRESENTATION_OPERATION = \"presentation_create\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_META = googleSlidesMeta(\"action\", \"create a blank presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/create\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The id of the created presentation.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The title Google stored.\"\n }\n];\n\nexport const googleSlidesPresentationKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_META, {\n name: GOOGLE_SLIDES_PRESENTATION_KIND,\n aliases: [\"google_slides_presentation\"],\n label: \"Google Slides presentation\",\n description: \"Create a blank Google Slides presentation.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"title\",\n \"label\": \"Title\",\n \"required\": true,\n \"description\": \"The title of the new blank presentation.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_META, config as Record<string, unknown>, \"create a blank presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/presentation-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/presentation-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides presentation — Read a presentation's slides and the objectId\n * of every element on them -- the prerequisite for targeting a specific shape\n * or placeholder with a future edit.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_KIND = \"@particle-academy/google_slides_presentation_get\";\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OPERATION = \"presentation_get\";\n\nexport const GOOGLE_SLIDES_PRESENTATION_GET_META = googleSlidesMeta(\"action\", \"read a presentation\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"Echoes what was asked.\"\n },\n {\n \"path\": \"data.title\",\n \"type\": \"string\",\n \"description\": \"The presentation's title.\"\n },\n {\n \"path\": \"data.locale\",\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag.\"\n },\n {\n \"path\": \"data.slides\",\n \"type\": \"array\",\n \"description\": \"One entry per slide, in order: objectId, and pageElements -- each with its own objectId and exactly one of shape/image/table/line/video/wordArt/sheetsChart/elementGroup/speakerSpotlight set, naming what kind of element it is. A placeholder shape's text (when it has one) lives at pageElements[].shape.text, published raw -- this connector does not flatten Slides' own rich-text run structure.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesPresentationGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_PRESENTATION_GET_META, {\n name: GOOGLE_SLIDES_PRESENTATION_GET_KIND,\n aliases: [\"google_slides_presentation_get\"],\n label: \"Google Slides presentation\",\n description: \"Read a presentation's slides and the objectId of every element on them -- the prerequisite for targeting a specific shape or placeholder with a future edit.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_SLIDES_PRESENTATION_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_PRESENTATION_GET_META, config as Record<string, unknown>, \"read a presentation\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/text-replace.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/text-replace.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Replace text in a Google Slides presentation — Replace every occurrence of a\n * string in a presentation.\n *\n * https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleSlidesMeta } from \"../service.js\";\n\nexport const GOOGLE_SLIDES_TEXT_REPLACE_KIND = \"@particle-academy/google_slides_text_replace\";\nexport const GOOGLE_SLIDES_TEXT_REPLACE_OPERATION = \"text_replace\";\n\nexport const GOOGLE_SLIDES_TEXT_REPLACE_META = googleSlidesMeta(\"action\", \"replace text\", \"https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/batchUpdate\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.presentationId\",\n \"type\": \"string\",\n \"description\": \"The presentation updated.\"\n },\n {\n \"path\": \"data.replies\",\n \"type\": \"array\",\n \"description\": \"One reply.\"\n },\n {\n \"path\": \"data.replies.0.replaceAllText.occurrencesChanged\",\n \"type\": \"number\",\n \"description\": \"How many occurrences were replaced. 0 means the text was not found, which is not an error.\"\n },\n {\n \"path\": \"data.writeControl.requiredRevisionId\",\n \"type\": \"string\",\n \"description\": \"The presentation's revision after the update.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleSlidesTextReplaceKind: NodeKindDefinition = defineConnectorKind(GOOGLE_SLIDES_TEXT_REPLACE_META, {\n name: GOOGLE_SLIDES_TEXT_REPLACE_KIND,\n aliases: [\"google_slides_text_replace\"],\n label: \"Replace text in a Google Slides presentation\",\n description: \"Replace every occurrence of a string in a presentation.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_SLIDES_TEXT_REPLACE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"presentationId\",\n \"label\": \"Presentation ID\",\n \"required\": true,\n \"description\": \"From presentation_create's data.presentationId, or the id in the presentation's own URL.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"find\",\n \"label\": \"Find\",\n \"required\": true,\n \"description\": \"The exact text to find, e.g. {{name}}. Not a regular expression.\"\n },\n {\n \"type\": \"textarea\",\n \"key\": \"replaceWith\",\n \"label\": \"Replace with\",\n \"required\": true,\n \"description\": \"Inserted in place of every match. Empty is refused: to delete text, use batch_update.\"\n },\n {\n \"type\": \"switch\",\n \"key\": \"matchCase\",\n \"label\": \"Match case\",\n \"default\": false,\n \"description\": \"Off matches case-insensitively, which is also what Google does when it is not sent.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageObjectIds\",\n \"label\": \"Only on slides\",\n \"description\": \"Optional. Slide objectIds, comma separated (from presentation_get). Empty means every slide.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"requiredRevisionId\",\n \"label\": \"Required revision ID\",\n \"description\": \"Optional. The presentation's revisionId as you last read it. If the presentation has changed since, Google refuses the whole batch with a 400 instead of applying it to content you have not seen.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_SLIDES_TEXT_REPLACE_META, config as Record<string, unknown>, \"replace text\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_slides\n */\n\n/**\n * Google Slides's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/batch-update.js\";\nexport * from \"./kinds/presentation-create.js\";\nexport * from \"./kinds/presentation-get.js\";\nexport * from \"./kinds/text-replace.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleSlidesBatchUpdateKind } from \"./kinds/batch-update.js\";\nimport { googleSlidesPresentationKind } from \"./kinds/presentation-create.js\";\nimport { googleSlidesPresentationGetKind } from \"./kinds/presentation-get.js\";\nimport { googleSlidesTextReplaceKind } from \"./kinds/text-replace.js\";\n\n/** Every Google Slides kind, for a host that registers the lot. */\nexport const GOOGLE_SLIDES_KINDS: NodeKindDefinition[] = [\n googleSlidesBatchUpdateKind,\n googleSlidesPresentationKind,\n googleSlidesPresentationGetKind,\n googleSlidesTextReplaceKind,\n];\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@particle-academy/google-slides-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Google Slides's authoring surface for fancy-flow — the node kinds, their config schemas and their declared output shapes. React on every host; carries no executor.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|