Skip to content

Commit a9c9e81

Browse files
authored
feat(javascript): provide algoliasearch package (#158)
1 parent 5d85d24 commit a9c9e81

File tree

14 files changed

+357
-10
lines changed

14 files changed

+357
-10
lines changed

.github/actions/cache/action.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ runs:
3636
path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/packages/requester-browser-xhr/dist
3737
key: ${{ runner.os }}-${{ env.CACHE_VERSION }}-js-requester-browser-xhr-${{ hashFiles('clients/algoliasearch-client-javascript/packages/requester-browser-xhr/**') }}
3838

39+
- name: Restore built JavaScript algoliasearch client
40+
if: ${{ inputs.job == 'cts' }}
41+
uses: actions/cache@v2
42+
with:
43+
path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/packages/algoliasearch/dist
44+
key: ${{ runner.os }}-${{ env.CACHE_VERSION }}-js-algoliasearch-${{ hashFiles('clients/algoliasearch-client-javascript/packages/algoliasearch/**') }}
45+
3946
- name: Restore built JavaScript search client
4047
if: ${{ inputs.job == 'cts' }}
4148
uses: actions/cache@v2

.github/workflows/check.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ jobs:
7676
- client-common
7777
- requester-browser-xhr
7878
- requester-node-http
79+
- algoliasearch
7980
steps:
8081
- uses: actions/checkout@v2
8182

clients/algoliasearch-client-javascript/bundlesize.config.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
22
"files": [
3+
{
4+
"path": "packages/algoliasearch/dist/algoliasearch.umd.browser.js",
5+
"maxSize": "6.25KB"
6+
},
37
{
48
"path": "packages/client-abtesting/dist/client-abtesting.umd.browser.js",
59
"maxSize": "3.25KB"
@@ -14,7 +18,7 @@
1418
},
1519
{
1620
"path": "packages/client-personalization/dist/client-personalization.umd.browser.js",
17-
"maxSize": "3.00KB"
21+
"maxSize": "3.25KB"
1822
},
1923
{
2024
"path": "packages/client-query-suggestions/dist/client-query-suggestions.umd.browser.js",
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import type {
2+
AnalyticsApi,
3+
Region as AnalyticsRegion,
4+
} from '@algolia/client-analytics/src/analyticsApi';
5+
import { createAnalyticsApi } from '@algolia/client-analytics/src/analyticsApi';
6+
import type {
7+
CreateClientOptions,
8+
Host,
9+
Requester,
10+
} from '@algolia/client-common';
11+
import type {
12+
PersonalizationApi,
13+
Region as PersonalizationRegion,
14+
} from '@algolia/client-personalization/src/personalizationApi';
15+
import { createPersonalizationApi } from '@algolia/client-personalization/src/personalizationApi';
16+
import { createSearchApi } from '@algolia/client-search/src/searchApi';
17+
import { createXhrRequester } from '@algolia/requester-browser-xhr';
18+
19+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
20+
export function algoliasearch(
21+
appId: string,
22+
apiKey: string,
23+
options?: { requester?: Requester; hosts?: Host[] }
24+
) {
25+
if (!appId) {
26+
throw new Error('`appId` is missing.');
27+
}
28+
29+
if (!apiKey) {
30+
throw new Error('`apiKey` is missing.');
31+
}
32+
33+
const commonOptions: Omit<CreateClientOptions, 'apiKey' | 'appId'> = {
34+
timeouts: {
35+
connect: 1,
36+
read: 2,
37+
write: 30,
38+
},
39+
requester: options?.requester ?? createXhrRequester(),
40+
userAgents: [{ segment: 'Browser' }],
41+
authMode: 'WithinQueryParameters',
42+
...options,
43+
};
44+
45+
function initAnalytics(
46+
analyticsAppId: string,
47+
analyticsApiKey: string,
48+
region?: AnalyticsRegion,
49+
analyticsOptions?: { requester?: Requester; hosts?: Host[] }
50+
): AnalyticsApi {
51+
return createAnalyticsApi({
52+
appId: analyticsAppId,
53+
apiKey: analyticsApiKey,
54+
region,
55+
...analyticsOptions,
56+
...commonOptions,
57+
});
58+
}
59+
60+
function initPersonalization(
61+
personalizationAppId: string,
62+
personalizationApiKey: string,
63+
region: PersonalizationRegion,
64+
personalizationOptions?: { requester?: Requester; hosts?: Host[] }
65+
): PersonalizationApi {
66+
if (!region) {
67+
throw new Error('`region` is missing.');
68+
}
69+
70+
return createPersonalizationApi({
71+
appId: personalizationAppId,
72+
apiKey: personalizationApiKey,
73+
region,
74+
...personalizationOptions,
75+
...commonOptions,
76+
});
77+
}
78+
79+
return {
80+
...createSearchApi({ appId, apiKey, ...commonOptions }),
81+
initAnalytics,
82+
initPersonalization,
83+
};
84+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import type {
2+
AnalyticsApi,
3+
Region as AnalyticsRegion,
4+
} from '@algolia/client-analytics/src/analyticsApi';
5+
import { createAnalyticsApi } from '@algolia/client-analytics/src/analyticsApi';
6+
import type {
7+
CreateClientOptions,
8+
Host,
9+
Requester,
10+
} from '@algolia/client-common';
11+
import type {
12+
PersonalizationApi,
13+
Region as PersonalizationRegion,
14+
} from '@algolia/client-personalization/src/personalizationApi';
15+
import { createPersonalizationApi } from '@algolia/client-personalization/src/personalizationApi';
16+
import { createSearchApi } from '@algolia/client-search/src/searchApi';
17+
import { createHttpRequester } from '@algolia/requester-node-http';
18+
19+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
20+
export function algoliasearch(
21+
appId: string,
22+
apiKey: string,
23+
options?: { requester?: Requester; hosts?: Host[] }
24+
) {
25+
if (!appId) {
26+
throw new Error('`appId` is missing.');
27+
}
28+
29+
if (!apiKey) {
30+
throw new Error('`apiKey` is missing.');
31+
}
32+
33+
const commonOptions: Omit<CreateClientOptions, 'apiKey' | 'appId'> = {
34+
timeouts: {
35+
connect: 2,
36+
read: 5,
37+
write: 30,
38+
},
39+
requester: options?.requester ?? createHttpRequester(),
40+
userAgents: [{ segment: 'Node.js', version: process.versions.node }],
41+
...options,
42+
};
43+
44+
function initAnalytics(
45+
analyticsAppId: string,
46+
analyticsApiKey: string,
47+
region?: AnalyticsRegion,
48+
analyticsOptions?: { requester?: Requester; hosts?: Host[] }
49+
): AnalyticsApi {
50+
return createAnalyticsApi({
51+
appId: analyticsAppId,
52+
apiKey: analyticsApiKey,
53+
region,
54+
...analyticsOptions,
55+
...commonOptions,
56+
});
57+
}
58+
59+
function initPersonalization(
60+
personalizationAppId: string,
61+
personalizationApiKey: string,
62+
region: PersonalizationRegion,
63+
personalizationOptions?: { requester?: Requester; hosts?: Host[] }
64+
): PersonalizationApi {
65+
if (!region) {
66+
throw new Error('`region` is missing.');
67+
}
68+
69+
return createPersonalizationApi({
70+
appId: personalizationAppId,
71+
apiKey: personalizationApiKey,
72+
region,
73+
...personalizationOptions,
74+
...commonOptions,
75+
});
76+
}
77+
78+
return {
79+
...createSearchApi({ appId, apiKey, ...commonOptions }),
80+
initAnalytics,
81+
initPersonalization,
82+
};
83+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// eslint-disable-next-line import/no-unresolved
2+
export * from './dist/algoliasearch/builds/node';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// eslint-disable-next-line import/no-commonjs,import/extensions
2+
module.exports = require('./dist/algoliasearch.cjs.node.js');
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"name": "algoliasearch",
3+
"version": "5.0.0",
4+
"description": "A fully-featured and blazing-fast JavaScript API client to interact with Algolia API.",
5+
"repository": "algolia/algoliasearch-client-javascript",
6+
"author": "Algolia",
7+
"license": "MIT",
8+
"main": "index.js",
9+
"module": "dist/algoliasearch.esm.node.js",
10+
"types": "index.d.ts",
11+
"jsdelivr": "dist/algoliasearch.umd.browser.js",
12+
"unpkg": "dist/algoliasearch.umd.browser.js",
13+
"browser": {
14+
"./index.js": "./dist/algoliasearch.cjs.browser.js",
15+
"./lite.js": "./dist/algoliasearch-lite.cjs.browser.js"
16+
},
17+
"scripts": {
18+
"clean": "rm -rf ./dist"
19+
},
20+
"engines": {
21+
"node": "^14.0.0"
22+
},
23+
"dependencies": {
24+
"@algolia/client-analytics": "5.0.0",
25+
"@algolia/client-common": "5.0.0",
26+
"@algolia/client-personalization": "5.0.0",
27+
"@algolia/client-search": "5.0.0",
28+
"@algolia/requester-browser-xhr": "5.0.0",
29+
"@algolia/requester-node-http": "5.0.0"
30+
},
31+
"devDependencies": {
32+
"@types/node": "16.11.11",
33+
"typescript": "4.5.4"
34+
}
35+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extends": "../../tsconfig.json",
3+
"compilerOptions": {
4+
"outDir": "dist"
5+
},
6+
"include": ["builds/node.ts", "builds/browser.ts"],
7+
"exclude": ["dist", "node_modules"]
8+
}

clients/algoliasearch-client-javascript/packages/client-common/src/types/CreateClient.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import type { Host } from './Host';
2+
import type { Requester } from './Requester';
23
import type { Timeouts, UserAgentOptions } from './Transporter';
34

45
export type AuthMode = 'WithinHeaders' | 'WithinQueryParameters';
56

67
export type CreateClientOptions = {
78
appId: string;
89
apiKey: string;
9-
requester: any;
10+
requester: Requester;
1011
timeouts: Timeouts;
1112
userAgents: UserAgentOptions[];
1213
hosts?: Host[];

clients/algoliasearch-client-javascript/rollup.config.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ function createBundlers({ output, clientPath }) {
4545
}
4646

4747
function getAvailableClients() {
48-
const availableClients = [];
48+
// We default `algoliasearch` as it's not a generated client, but an aggregation of
49+
// multiple clients.
50+
const availableClients = ['algoliasearch'];
4951
const generators = Object.entries(
5052
generatorConfig['generator-cli'].generators
5153
);
@@ -112,15 +114,19 @@ function initPackagesConfig() {
112114
}
113115

114116
return availableClients.flatMap((packageName) => {
117+
const isAlgoliasearchClient = packageName.startsWith('algoliasearch');
115118
const commonConfig = {
116119
package: packageName,
117-
name: `@algolia/${packageName}`,
120+
name: isAlgoliasearchClient ? packageName : `@algolia/${packageName}`,
118121
output: packageName,
119-
dependencies: [
120-
'@algolia/client-common',
121-
'@algolia/requester-browser-xhr',
122-
'@algolia/requester-node-http',
123-
],
122+
dependencies: isAlgoliasearchClient
123+
? [
124+
'@algolia/client-analytics',
125+
'@algolia/client-common',
126+
'@algolia/client-personalization',
127+
'@algolia/client-search',
128+
]
129+
: ['@algolia/client-common'],
124130
external: [],
125131
};
126132
const browserFormats = ['umd-browser', 'esm-browser', 'cjs-browser'];
@@ -132,13 +138,21 @@ function initPackagesConfig() {
132138
input: 'builds/browser.ts',
133139
formats: browserFormats,
134140
external: ['dom'],
141+
dependencies: [
142+
...commonConfig.dependencies,
143+
'@algolia/requester-browser-xhr',
144+
],
135145
globals: {
136146
[packageName]: packageName,
137147
},
138148
},
139149
{
140150
...commonConfig,
141151
input: 'builds/node.ts',
152+
dependencies: [
153+
...commonConfig.dependencies,
154+
'@algolia/requester-node-http',
155+
],
142156
formats: nodeFormats,
143157
},
144158
];

0 commit comments

Comments
 (0)