npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@uidev1116/acms-js-sdk

v0.3.1

Published

a-blog cms JavaScript SDK

Readme

acms-js-sdk

JavaScript SDK for a-blog cms. Works in Node.js and modern browsers.

Installation

npm install @uidev1116/acms-js-sdk

# or

yarn add @uidev1116/acms-js-sdk

Usage

First, you need to create a client instance.

ES Modules:

import { createClient } from '@uidev1116/acms-js-sdk';

const acmsClient = createClient({
  baseUrl: 'YOUR_BASE_URL',
  apiKey: 'YOUR_API_KEY',
});

CommonJS:

const { createClient } = require('@uidev1116/acms-js-sdk');

const acmsClient = createClient({
  baseUrl: 'YOUR_BASE_URL',
  apiKey: 'YOUR_API_KEY',
});

CDN:

<script type="module">
  const { createClient } = 'https://unpkg.com/@uidev1116/acms-js-sdk@latest/dist/es/acms-js-sdk.js';

  const acmsClient = createClient({
    baseUrl: 'YOUR_BASE_URL',
    apiKey: 'YOUR_API_KEY',
  });
</script>

Then, you can use get method.

Specify the module ID to be used in the module's GET API function in the api, and information on the specified module ID can be fetched.

acmsClient
  .get({
    api: 'MODULE_ID',
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error);
  });

Relative paths from baseUrl can also be specified.

acmsClient
  .get('api/MODULE_ID')
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error);
  });

Url Context

You can specify the URL context.

acmsClient
  .get({
    blog: 'BLOG_CODE',
    category: 'CATEGORY_CODE',
    entry: 'ENTRY_CODE',
    api: 'MODULE_ID',
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error);
  });

You can see the acmsPath section for more details.

Error Handling

You can handle errors.

Youb can check if the error is AcmsFetchError by using isAcmsFetchError.

acmsClient
  .get({
    api: 'MODULE_ID',
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    if (acmsClient.isAcmsFetchError(error)) {
      console.error(error.response.data);
      return;
    }
    console.error(error);
  });

Options

The second argument can be an option.

Below is a list of all options.

| name | description | type | default | | --------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | --------- | | requestInit | An object containing any custom settings that you want to apply to the request. | RequestInit | undefined | | responseType | indication the type of data that the server will respond with | 'arrayBuffer' | 'blob' | 'formData' | 'json' | 'text'; | 'json' | | acmsPathOptions | Configuration for acmsPath behavior (API version, custom segments, etc.) | AcmsPathOptions | {} |

Options can also be set in the arguments of the createClient function.

In this case, all requests will reflect the set options.

const acmsClient = createClient({
  baseUrl: 'YOUR_BASE_URL',
  apiKey: 'Your_API_KEY',
  requestInit: {
    headers: {
      'Content-Type': 'application/json',
    },
  },
  responseType: 'json',
});

API Version Configuration

You can configure the default API version for all requests using acmsPathOptions:

const acmsClient = createClient({
  baseUrl: 'YOUR_BASE_URL',
  apiKey: 'YOUR_API_KEY',
  acmsPathOptions: {
    apiVersion: 'v2', // 'v1' or 'v2' (default: 'v2')
  },
});

// All API requests will use the specified version
acmsClient.get({
  api: 'summary_index',
});
// => Requests to: YOUR_BASE_URL/api/v2/summary_index/

You can also customize the path segments:

const acmsClient = createClient({
  baseUrl: 'YOUR_BASE_URL',
  apiKey: 'YOUR_API_KEY',
  acmsPathOptions: {
    apiVersion: 'v1',
    segments: {
      bid: 'custom-bid',
      cid: 'custom-cid',
      // ... other custom segments
    },
  },
});

Next.js App Router

For Next.js App Router, you can specify the revalidate option.

Functions: fetch | Next.js

const response = await acmsClient.get(
  { api: 'MODULE_ID' },
  {
    requestInit: {
      next: {
        revalidate: 60,
      },
    }
  },
);

AbortController: abort() method

You can use AbortController.

const controller = new AbortController();
const response = await acmsClient.get(
  { api: 'MODULE_ID' },
  {
    requestInit: {
      signal: controller.signal,
    }
  },
);

setTimeout(() => {
  controller.abort();
}, 1000);

TypeScript

You can use TypeScript.

acmsClient
  .get<ResponseType>({
    api: 'MODULE_ID',
  })
  .then((response) => {
    console.log(response.data); // response.data is ResponseType
  })

acmsPath

You can get the path of Url Context by using utility function acmsPath.


import { acmsPath } from '@uidev1116/acms-js-sdk';

const path = acmsPath({
  blog: 'BLOG_CODE',
  category: 'CATEGORY_CODE',
  entry: 'ENTRY_CODE',
  // user: 1,
  // unit: 'UNIT_ID',
  // tag: ['tag1', 'tag2'],
  // field: 'color/eq/red',
  // span: { start: '2021-01-01', end: '2021-12-31' },
  // date: { year: 2021, month: 1, day: 1 },
  // page: 1,
  // order: 'id-asc',
  // limit: 10,
  // keyword: 'KEYWORD',
  // tpl: 'include/sample.json'
  // admin: 'entry_index',
  api: 'MODULE_ID',
});

Params Type

interface AcmsPathParams {
  blog?: string | number;
  admin?: string;
  category?: string | string[] | number;
  entry?: string | number;
  user?: number;
  unit?: string;
  tag?: string[];
  field?: string | AcmsFieldList;
  span?: { start?: string | Date; end?: string | Date };
  date?: { year?: number; month?: number; day?: number };
  page?: number;
  order?: string;
  limit?: number;
  keyword?: string;
  tpl?: string;
  api?: string;
  searchParams?: ConstructorParameters<typeof URLSearchParams>[0];
}

Options

You can configure options for acmsPath.

interface AcmsPathOptions {
  apiVersion?: 'v1' | 'v2'; // Default: 'v2'
  segments?: Partial<AcmsPathSegments>; // Custom segment names
}

apiVersion: Specifies the API version for the path.

  • 'v2' (default): Generates paths like api/v2/MODULE_ID/
  • 'v1': Generates paths like api/MODULE_ID/
// v2 API (default)
acmsPath({ api: 'summary_index' });
// => 'api/v2/summary_index/'

// v1 API
acmsPath({ api: 'summary_index' }, { apiVersion: 'v1' });
// => 'api/summary_index/'

isAcmsFetchError

You can check if the error is AcmsFetchError by using utility function isAcmsFetchError.

import { isAcmsFetchError } from '@uidev1116/acms-js-sdk';

acmsClient
  .get({
    api: 'MODULE_ID',
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    if (isAcmsFetchError(error)) {
      console.error(error.response.data);
      return;
    }
    console.error(error);
  });

parseAcmsPath

The parseAcmsPath function is a utility designed to parse acms path into a structured context object. This function is particularly useful for extracting various segments from a URL path and organizing them into a meaningful context that can be used for further processing in applications.

import { parseAcmsPath } from '@uidev1116/acms-js-sdk';

// For example, if the current URL path is '/bid/1/cid/2/eid/3/page/2/field/color/eq/red'
const context = parseAcmsPath(window.location.pathname);
// Output:
// {
//   bid: 1,
//   cid: 2,
//   eid: 3,
//   page: 2,
//   field: AcmsFieldList { ... } // field is an AcmsFieldList instance
// }

Return Type

interface AcmsContext {
  bid?: number;
  cid?: number;
  eid?: number;
  uid?: number;
  utid?: string;
  tag?: string[];
  field?: AcmsFieldList; // Returns AcmsFieldList instance
  span?: { start: string | Date; end: string | Date };
  date?: { year: number; month?: number; day?: number };
  page?: number;
  order?: string;
  limit?: number;
  keyword?: string;
  admin?: string;
  tpl?: string;
  api?: string;
  apiVersion?: 'v1' | 'v2'; // Detected API version
  unresolvedPath?: string; // Any unresolved path segments
}

Note: The field property is returned as an AcmsFieldList instance, which provides methods to manipulate field data. The apiVersion is automatically detected from the path (defaults to 'v1' for legacy paths without version).

API Version Detection

The parseAcmsPath function automatically detects the API version from the path:

// v1 API (legacy format)
parseAcmsPath('/api/summary_index');
// { api: 'summary_index', apiVersion: 'v1', ... }

// v2 API
parseAcmsPath('/api/v2/summary_index');
// { api: 'summary_index', apiVersion: 'v2', ... }

AcmsFieldList

The AcmsFieldList class is a utility for working with field contexts in a-blog cms. It allows you to build complex field queries programmatically and convert between string and object representations.

Basic Usage

You can use AcmsFieldList in two ways with acmsPath:

1. Using string notation (simple)

import { acmsPath } from '@uidev1116/acms-js-sdk';

const path = acmsPath({
  blog: 'news',
  field: 'color/eq/red',
});
// => 'news/field/color/eq/red/'

2. Using AcmsFieldList (programmatic)

import { acmsPath, AcmsFieldList } from '@uidev1116/acms-js-sdk';

const fieldList = new AcmsFieldList([
  {
    key: 'color',
    filters: [
      { operator: 'eq', value: 'red', connector: 'or' }
    ],
    separator: '_and_'
  }
]);

const path = acmsPath({
  blog: 'news',
  field: fieldList,
});
// => 'news/field/color/eq/red/'

AcmsFieldList Methods

Constructor

const fieldList = new AcmsFieldList(fields?: AcmsField[]);

Instance Methods

  • push(field: AcmsField): Add a field to the end
  • pop(): Remove and return the last field
  • shift(): Remove and return the first field
  • unshift(field: AcmsField): Add a field to the beginning
  • getFields(): Get all fields as an array
  • toString(): Convert to a-blog cms field path string

Static Methods

  • AcmsFieldList.fromString(input: string): Parse a field string into an AcmsFieldList
  • AcmsFieldList.fromFormData(formData: FormData): Create from FormData

Working with Field Types

interface AcmsField {
  key: string;
  filters: AcmsFilter[];
  separator?: '_and_' | '_or_';
}

interface AcmsFilter {
  operator: 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'lk' | 'nlk' | 're' | 'nre' | 'em' | 'nem';
  value: string;
  connector: 'and' | 'or';
}

Example: Building Complex Field Queries

import { AcmsFieldList } from '@uidev1116/acms-js-sdk';

// Create a field list with multiple conditions
const fieldList = new AcmsFieldList([
  {
    key: 'color',
    filters: [
      { operator: 'eq', value: 'red', connector: 'or' },
      { operator: 'eq', value: 'blue', connector: 'or' }
    ],
    separator: '_and_'
  },
  {
    key: 'size',
    filters: [
      { operator: 'gte', value: '10', connector: 'and' }
    ],
    separator: '_and_'
  }
]);

// Convert to string
console.log(fieldList.toString());
// => 'color/eq/red/blue/_and_/size/gte/10'

Example: Parsing Field Strings

import { AcmsFieldList } from '@uidev1116/acms-js-sdk';

// Parse from string
const fieldList = AcmsFieldList.fromString('color/eq/red/blue/_and_/size/gte/10');

// Get structured data
const fields = fieldList.getFields();
console.log(fields);
// => [
//   { key: 'color', filters: [...], separator: '_and_' },
//   { key: 'size', filters: [...], separator: '_and_' }
// ]

Using with parseAcmsPath

When you parse a path containing field segments, the result will include an AcmsFieldList instance:

import { parseAcmsPath } from '@uidev1116/acms-js-sdk';

const context = parseAcmsPath('/field/color/eq/red');

// context.field is an AcmsFieldList instance
console.log(context.field.toString());
// => 'color/eq/red'

console.log(context.field.getFields());
// => [{ key: 'color', filters: [...], separator: '_and_' }]