Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions sdk-output/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SailPoint, Configuration, Paginator, UsersNERMApi, DelegationsNERMV2025Api } from "./index"
import type { SearchV1 } from "./search/api"
import type { Search } from "./search/api"

describe('accounts', () => {
it('list accounts', async () => {
Expand Down Expand Up @@ -89,7 +89,7 @@ describe('search', () => {
let apiConfig = new Configuration()
let api = new SailPoint.SearchApi(apiConfig)

let search: SearchV1 = {
let search: Search = {
indices: [
"identities"
],
Expand Down
26 changes: 13 additions & 13 deletions sdk-output/paginator.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { AxiosResponse, RawAxiosRequestConfig } from "axios";
import {
SearchV1,
SearchV1Api,
SearchV1ApiSearchPostV1Request,
Search,
SearchApi,
SearchApiSearchPostV1Request,
} from "./search/api";

export interface PaginationParams {
Expand Down Expand Up @@ -38,17 +38,17 @@ export interface ExtraParams {
}

interface SearchApiTypeMap {
SearchV1Api: {
search: SearchV1;
searchParams: SearchV1ApiSearchPostV1Request;
SearchApi: {
search: Search;
searchParams: SearchApiSearchPostV1Request;
document: object;
};
}

type ApiType = keyof SearchApiTypeMap;

type ApiInstanceMap = {
SearchV1Api: SearchV1Api;
SearchApi: SearchApi;
};

export class Paginator {
Expand Down Expand Up @@ -174,11 +174,11 @@ export class Paginator {
let results: AxiosResponse<SearchApiTypeMap[T]["document"][], any>;

try {
const searchParams: SearchV1ApiSearchPostV1Request = {
searchV1: search as SearchV1,
const searchParams: SearchApiSearchPostV1Request = {
search: search as Search,
limit: increment,
};
results = (await (searchAPI as SearchV1Api).searchPostV1(
results = (await (searchAPI as SearchApi).searchPostV1(
searchParams
)) as AxiosResponse<SearchApiTypeMap[T]["document"][], any>;
} catch (e: any) {
Expand Down Expand Up @@ -235,11 +235,11 @@ export class Paginator {
let results: AxiosResponse<SearchApiTypeMap[T]["document"][], any>;

try {
const searchParams: SearchV1ApiSearchPostV1Request = {
searchV1: search as SearchV1,
const searchParams: SearchApiSearchPostV1Request = {
search: search as Search,
limit: increment,
};
results = (await (searchAPI as SearchV1Api).searchPostV1(
results = (await (searchAPI as SearchApi).searchPostV1(
searchParams
)) as AxiosResponse<SearchApiTypeMap[T]["document"][], any>;
} catch (e: any) {
Expand Down
41 changes: 21 additions & 20 deletions sdk-resources/build-versioned-sdk.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,6 @@ function writePartitionConfig(partitionName) {
`npmVersion: ${NPM_VERSION}`,
`useSingleRequestParameter: true`,
`apiVersion: ${API_VERSION}`,
`enumNameSuffix: V1`,
`packageName: ${packageDir}`,
].join("\n");

Expand Down Expand Up @@ -263,8 +262,7 @@ function generatePartition(partitionName, bundledSpec, configPath) {
"-o", outputDir,
"--global-property", "skipFormModel=false,apiDocs=true,modelDocs=true",
"--config", configPath,
"--api-name-suffix", "V1Api",
"--model-name-suffix", "V1",
"--api-name-suffix", "Api",
],
{ encoding: "utf8" }
);
Expand Down Expand Up @@ -425,15 +423,15 @@ node sdk-resources/build-versioned-sdk.js <path-to-apis>
// Regenerate sdk-output/index.ts from discovered partition packages
//
// Naming convention in the SailPoint namespace:
// Generated class AccountsV1Api → SailPoint.AccountsApi
// Generated class AccountsV2Api still SailPoint.AccountsApi (combined)
// Generated class AccountsApi → SailPoint.AccountsApi
// Two partitions for same resource combined class (extends latest, copies older methods)
//
// The version suffix is stripped from the namespace name so the import never
// changes as new versions land. Method names carry the version suffix
// (listAccountsV1, listAccountsV2) so you always know which version you're
// calling.
// API class names carry no version suffix — versions live only in method names
// (listAccountsV1, listAccountsV2) so callers always know which version they call.
// Model names also carry no generated suffix; any version in a model name comes
// from the spec itself (e.g. accessrequestconfigv2 → AccessrequestconfigV2).
//
// Single-version resource → const AccountsApi = _AccountsV1Api
// Single-version resource → const AccountsApi = _AccountsApi
// Multi-version resource → generated combined class that extends the
// latest version and copies older-version prototype methods, with
// TypeScript interface merging for full type safety on all methods.
Expand All @@ -444,12 +442,18 @@ node sdk-resources/build-versioned-sdk.js <path-to-apis>
// import type { AccountV1 } from "sailpoint-api-client/accounts_v1/api"
// ---------------------------------------------------------------------------

/** AccountsV1Api → AccountsApi */
/**
* AccountsApi → AccountsApi (no-op for single-version; strips Vn for hypothetical
* future multi-version partitions whose class names include a version, e.g. AccountsV2Api).
*/
function toResourceApiName(className) {
return className.replace(/V\d+Api$/, "Api");
}

/** Extract the numeric version from a class name: AccountsV1Api → 1 */
/**
* Extract the numeric version from a class name if present (e.g. AccountsV2Api → 2).
* Defaults to 1 so single-version classes (e.g. AccountsApi) sort correctly.
*/
function classVersion(className) {
return parseInt(className.match(/V(\d+)Api$/)?.[1] ?? "1", 10);
}
Expand Down Expand Up @@ -542,12 +546,12 @@ function generateIndexTs() {
/* eslint-disable */
// Code generated by build-versioned-sdk.js; DO NOT EDIT.
//
// Named imports — backward-compatible, version-explicit:
// import { AccountsV1Api, Configuration } from "sailpoint-api-client"
// Named imports — version-explicit class names:
// import { AccountsApi, Configuration } from "sailpoint-api-client"
//
// Namespace — resource-named, version-agnostic (preferred):
// import { SailPoint, Configuration } from "sailpoint-api-client"
// const api = new SailPoint.AccountsApi(config) // works for v1, v2, v3 …
// const api = new SailPoint.AccountsApi(config)
// api.listAccountsV1(...) // method name shows version
// api.listAccountsV2(...) // when v2 partition lands
//
Expand Down Expand Up @@ -591,7 +595,7 @@ ${nsLines.join("\n")}
// Main
// ---------------------------------------------------------------------------

async function main() {
function main() {
if (!fs.existsSync(apisDir)) {
console.error(`Error: apis directory not found: ${apisDir}`);
process.exit(1);
Expand Down Expand Up @@ -741,7 +745,4 @@ async function main() {
}
}

main().catch(err => {
console.error(`Unexpected error: ${err.message}`);
process.exit(1);
});
main();
Loading