Skip to content

Commit 9b69c9f

Browse files
Merge pull request #17 from stevendborrelli/v0.5.0
v0.5.0 release prep
2 parents e5816ba + 1de6cb9 commit 9b69c9f

3 files changed

Lines changed: 105 additions & 11 deletions

File tree

README.md

Lines changed: 102 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,14 @@ import {
224224
getObservedComposedResources,
225225
getInput,
226226
getContextKey,
227+
getRequiredResource,
227228
getRequiredResources,
229+
getRequiredSchema,
230+
getRequiredSchemas,
228231
getCredentials,
232+
advertiseCapabilities,
233+
hasCapability,
234+
Capability,
229235
} from "@crossplane-org/function-sdk-typescript";
230236

231237
// Get the observed composite resource (XR)
@@ -246,11 +252,28 @@ const input = getInput(req);
246252
// Get context value from previous function
247253
const [value, exists] = getContextKey(req, "my-key");
248254

249-
// Get required resources
255+
// Get a specific required resource by name
256+
const [resources, resolved] = getRequiredResource(req, "app-config");
257+
258+
// Get all required resources
250259
const required = getRequiredResources(req);
251260

261+
// Get a specific required schema by name
262+
const [schema, resolved] = getRequiredSchema(req, "xr-schema");
263+
264+
// Get all required schemas
265+
const schemas = getRequiredSchemas(req);
266+
252267
// Get credentials
253268
const creds = getCredentials(req, "aws-creds");
269+
270+
// Check if Crossplane advertises capabilities (v2.2+)
271+
if (advertiseCapabilities(req)) {
272+
// Check for specific capability support
273+
if (hasCapability(req, Capability.CAPABILITY_REQUIRED_RESOURCES)) {
274+
// Use required resources feature
275+
}
276+
}
254277
```
255278

256279
#### Response Helpers
@@ -268,7 +291,8 @@ import {
268291
normal,
269292
fatal,
270293
warning,
271-
update,
294+
requireResource,
295+
requireSchema,
272296
DEFAULT_TTL,
273297
} from "@crossplane-org/function-sdk-typescript";
274298

@@ -295,8 +319,16 @@ normal(rsp, "Success message");
295319
warning(rsp, "Warning message");
296320
fatal(rsp, "Fatal error message");
297321

298-
// Update a resource by merging
299-
const updated = update(sourceResource, targetResource);
322+
// Request Crossplane fetch a resource (available in next invocation)
323+
rsp = requireResource(rsp, "app-config", {
324+
apiVersion: "v1",
325+
kind: "ConfigMap",
326+
matchName: "my-config",
327+
namespace: "default"
328+
});
329+
330+
// Request Crossplane fetch a schema (available in next invocation)
331+
rsp = requireSchema(rsp, "xr-schema", "example.org/v1", "MyResource");
300332
```
301333

302334
#### Resource Helpers
@@ -311,6 +343,8 @@ import {
311343
fromObject,
312344
toObject,
313345
newDesiredComposed,
346+
update,
347+
getCondition,
314348
} from "@crossplane-org/function-sdk-typescript";
315349

316350
// Create a Resource from a plain object
@@ -329,6 +363,35 @@ const plainObj = asObject(struct);
329363

330364
// Create a new empty DesiredComposed resource
331365
const desired = newDesiredComposed();
366+
367+
// Deep merge updates into a resource (arrays replaced by default)
368+
update(resource, {
369+
resource: {
370+
spec: {
371+
forProvider: {
372+
region: "us-west-2",
373+
tags: ["env:prod"] // Replaces existing tags
374+
}
375+
}
376+
}
377+
});
378+
379+
// Or merge with array concatenation
380+
update(resource, {
381+
resource: {
382+
spec: {
383+
forProvider: {
384+
tags: ["new-tag"] // Appended to existing tags
385+
}
386+
}
387+
}
388+
}, { mergeArrays: true });
389+
390+
// Get a status condition from a resource
391+
const readyCondition = getCondition(resource.resource, "Ready");
392+
if (readyCondition.status === "True") {
393+
console.log("Resource is ready");
394+
}
332395
```
333396

334397
### Error Handling
@@ -519,6 +582,10 @@ import {
519582
ObservedComposed,
520583
DesiredComposed,
521584
ConnectionDetails,
585+
MergeOptions,
586+
587+
// Status condition types
588+
Condition as ResourceCondition,
522589
523590
// Protocol buffer types
524591
Severity,
@@ -531,6 +598,11 @@ import {
531598
Resources,
532599
Credentials,
533600
CredentialData,
601+
Requirements,
602+
ResourceSelector,
603+
SchemaSelector,
604+
Schema,
605+
Capability,
534606
535607
// Runtime types
536608
ServerOptions,
@@ -539,21 +611,43 @@ import {
539611

540612
### Core Functions
541613

614+
#### Response Functions
615+
542616
- **`to(req, ttl?)`** - Initialize a response from a request
543617
- **`normal(rsp, message)`** - Add a normal (info) result
544618
- **`warning(rsp, message)`** - Add a warning result
545619
- **`fatal(rsp, message)`** - Add a fatal error result
620+
- **`setDesiredComposedResources(rsp, resources)`** - Set desired composed resources
621+
- **`setDesiredCompositeStatus({rsp, status})`** - Update XR status
622+
- **`setContextKey(rsp, key, value)`** - Set context for next function
623+
- **`setOutput(rsp, output)`** - Set function output
624+
- **`requireResource(rsp, name, selector)`** - Request Crossplane fetch resources
625+
- **`requireSchema(rsp, name, apiVersion, kind)`** - Request Crossplane fetch schemas
626+
627+
#### Request Functions
628+
546629
- **`getObservedCompositeResource(req)`** - Get the observed XR
547630
- **`getDesiredCompositeResource(req)`** - Get the desired XR
548631
- **`getDesiredComposedResources(req)`** - Get desired composed resources
549632
- **`getObservedComposedResources(req)`** - Get observed composed resources
550-
- **`setDesiredComposedResources(rsp, resources)`** - Set desired composed resources
551-
- **`setDesiredCompositeStatus({rsp, status})`** - Update XR status
552-
- **`setContextKey(rsp, key, value)`** - Set context for next function
553633
- **`getContextKey(req, key)`** - Get context from previous function
554634
- **`getInput(req)`** - Get function input configuration
555-
- **`getRequiredResources(req)`** - Get required resources
635+
- **`getRequiredResource(req, name)`** - Get a required resource by name
636+
- **`getRequiredResources(req)`** - Get all required resources
637+
- **`getRequiredSchema(req, name)`** - Get a required schema by name
638+
- **`getRequiredSchemas(req)`** - Get all required schemas
556639
- **`getCredentials(req, name)`** - Get credentials by name (throws error if not found)
640+
- **`advertiseCapabilities(req)`** - Check if Crossplane advertises capabilities
641+
- **`hasCapability(req, capability)`** - Check for a specific capability
642+
643+
#### Resource Functions
644+
645+
- **`fromObject(obj, connectionDetails?, ready?)`** - Create Resource from plain object
646+
- **`fromModel(model, connectionDetails?, ready?)`** - Create Resource from kubernetes-models
647+
- **`toObject(resource)`** - Extract plain object from Resource
648+
- **`update(resource, source, options?)`** - Deep merge data into a Resource
649+
- **`getCondition(resource, type)`** - Extract a status condition by type
650+
- **`newDesiredComposed()`** - Create an empty DesiredComposed resource
557651

558652
See [USAGE.md](USAGE.md) for detailed API documentation and examples.
559653

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@crossplane-org/function-sdk-typescript",
3-
"version": "0.4.0",
3+
"version": "0.5.0",
44
"description": "A Crossplane Function SDK for Typescript",
55
"keywords": [
66
"crossplane",

0 commit comments

Comments
 (0)