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
5 changes: 4 additions & 1 deletion plugins/nextjs-plugin/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export const withJuno = async (params?: {
try {
const args: ConfigArgs = {params: junoParams, mode};

const {satelliteId, orbiterId, icpIds, container} = await initConfig(args);
const {satelliteId, orbiterId, icpIds, container, authClientIds} = await initConfig(args);

const prefix = prefixParam ?? 'NEXT_PUBLIC_';

Expand Down Expand Up @@ -87,6 +87,9 @@ export const withJuno = async (params?: {
}),
...(container !== undefined && {
[`${prefix}CONTAINER`]: container
}),
...(authClientIds?.google !== undefined && {
[`${prefix}GOOGLE_CLIENT_ID`]: authClientIds.google
})
},
...REQUIRED_NEXT_CONFIG
Expand Down
9 changes: 7 additions & 2 deletions plugins/nextjs-plugin/src/tests/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ describe('withJuno', () => {
const spy = vi.spyOn(pluginTools, 'initConfig').mockResolvedValue({
satelliteId: 'sat-id',
orbiterId: 'orb-id',
authClientIds: {
google: 'google-client-id-123'
},
icpIds: {
internetIdentityId: 'ii-id',
icpLedgerId: 'ledger-id',
Expand Down Expand Up @@ -51,7 +54,8 @@ describe('withJuno', () => {
NEXT_PUBLIC_CYCLES_LEDGER_ID: 'cycles-ledger-id',
NEXT_PUBLIC_SNS_WASM_ID: 'sns-wasm-id',
NEXT_PUBLIC_NNS_DAPP_ID: 'nns-dapp-id',
NEXT_PUBLIC_CONTAINER: 'http://localhost:1234'
NEXT_PUBLIC_CONTAINER: 'http://localhost:1234',
NEXT_PUBLIC_GOOGLE_CLIENT_ID: 'google-client-id-123'
}
});
});
Expand All @@ -60,6 +64,7 @@ describe('withJuno', () => {
vi.spyOn(pluginTools, 'initConfig').mockResolvedValue({
satelliteId: 'sat-id',
orbiterId: undefined,
authClientIds: undefined,
icpIds: undefined,
container: undefined
});
Expand All @@ -74,13 +79,13 @@ describe('withJuno', () => {
vi.spyOn(pluginTools, 'initConfig').mockResolvedValue({
satelliteId: 'sat-id',
orbiterId: undefined,
authClientIds: undefined,
icpIds: undefined,
container: undefined
});

const result = await withJuno({
nextConfig: {
output: 'standalone',
env: {
FOO: 'bar'
}
Expand Down
37 changes: 36 additions & 1 deletion plugins/plugin-tools/src/config.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type {JunoConfig} from '@junobuild/config';
import {
CMC_ID,
CYCLES_INDEX_ID,
Expand All @@ -15,7 +16,7 @@ import {
} from './constants';
import {JunoPluginError} from './error';
import {assertJunoConfig, junoConfigExist, readJunoConfig} from './fs';
import type {ConfigArgs, IcpIds, JunoParams} from './types';
import type {AuthClientIds, ConfigArgs, IcpIds, JunoParams} from './types';

export const useDockerContainer = ({params, mode}: ConfigArgs): boolean =>
params?.container !== false &&
Expand Down Expand Up @@ -153,3 +154,37 @@ export const container = ({

return undefined;
};

export const authClientIds = async ({mode}: ConfigArgs): Promise<AuthClientIds | undefined> => {
const exist = await junoConfigExist();

if (!exist) {
return undefined;
}

const config: JunoConfig = await readJunoConfig({mode});

if (config === undefined || !('satellite' in config)) {
return undefined;
}

const {
satellite: {authentication}
} = config;

if (authentication === undefined) {
return undefined;
}

const {google} = authentication;

if (google === undefined) {
return undefined;
}

const {clientId} = google;

return {
google: clientId
};
};
8 changes: 6 additions & 2 deletions plugins/plugin-tools/src/init.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
import {
authClientIds as authClientIdsConfig,
container as containerConfig,
icpIds as icpIdsConfig,
orbiterId as orbiterIdConfig,
satelliteId as satelliteIdConfig,
useDockerContainer
} from './config';
import {assertJunoConfig} from './fs';
import type {ConfigArgs, IcpIds} from './types';
import type {AuthClientIds, ConfigArgs, IcpIds} from './types';

export const initConfig = async (
args: ConfigArgs
): Promise<{
satelliteId: string;
orbiterId: string | undefined;
authClientIds: AuthClientIds | undefined;
icpIds: IcpIds | undefined;
container: string | undefined;
}> => {
Expand All @@ -22,16 +24,18 @@ export const initConfig = async (
await assertJunoConfig();
}

const [satelliteId, orbiterId, icpIds, container] = await Promise.all([
const [satelliteId, orbiterId, authClientIds, icpIds, container] = await Promise.all([
satelliteIdConfig(args),
orbiterIdConfig(args),
authClientIdsConfig(args),
Promise.resolve(icpIdsConfig()),
Promise.resolve(containerConfig(args))
]);

return {
satelliteId,
orbiterId,
authClientIds,
icpIds,
container
};
Expand Down
80 changes: 79 additions & 1 deletion plugins/plugin-tools/src/tests/config.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import type {JunoConfig} from '@junobuild/config';
import * as configLoader from '@junobuild/config-loader';

import {container, icpIds, orbiterId, satelliteId, useDockerContainer} from '../config';
import {
authClientIds,
container,
icpIds,
orbiterId,
satelliteId,
useDockerContainer
} from '../config';
import {
CMC_ID,
CYCLES_INDEX_ID,
Expand Down Expand Up @@ -406,4 +413,75 @@ describe('config', () => {
expect(url).toBeUndefined();
});
});

describe('authClientIds', () => {
beforeEach(() => {
vi.clearAllMocks();
});

it('returns undefined if no config file exists', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(false);

const ids = await authClientIds({params: {}, mode: MODE_DEVELOPMENT});

expect(ids).toBeUndefined();
});

it('returns undefined if config is undefined', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue(
undefined as unknown as JunoConfig
);

const ids = await authClientIds({params: {}, mode: MODE_DEVELOPMENT});

expect(ids).toBeUndefined();
});

it('returns undefined if config has no satellite key', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({} as unknown as JunoConfig);

const ids = await authClientIds({params: {}, mode: MODE_DEVELOPMENT});

expect(ids).toBeUndefined();
});

it('returns undefined if satellite.authentication is undefined', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
satellite: {}
} as unknown as JunoConfig);

const ids = await authClientIds({params: {}, mode: MODE_DEVELOPMENT});

expect(ids).toBeUndefined();
});

it('returns undefined if authentication.google is undefined', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
satellite: {authentication: {}}
} as unknown as JunoConfig);

const ids = await authClientIds({params: {}, mode: MODE_DEVELOPMENT});

expect(ids).toBeUndefined();
});

it('returns google clientId when set', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
satellite: {
authentication: {
google: {clientId: 'google-client-id-123'}
}
}
} as unknown as JunoConfig);

const ids = await authClientIds({params: {}, mode: 'production'});

expect(ids).toEqual({google: 'google-client-id-123'});
});
});
});
16 changes: 12 additions & 4 deletions plugins/plugin-tools/src/tests/init.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ describe('init', () => {
nnsDappId: NNS_DAPP_ID
};

const mockGoogleClientId = '1234567890-abcdef.apps.googleusercontent.com';

let spyJunoConfigExist: MockInstance;
let spyReadJunoConfig: MockInstance;

Expand All @@ -59,13 +61,16 @@ describe('init', () => {

spyJunoConfigExist = vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
spyReadJunoConfig = vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
satellite: {ids: {production: 'mock-satellite-id'}},
satellite: {
ids: {production: 'mock-satellite-id'},
authentication: {google: {clientId: mockGoogleClientId}}
},
orbiter: {id: 'mock-orbiter-id'}
});
});

it('returns config for development', async () => {
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(false);
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);

const result = await initConfig({
params: {},
Expand All @@ -75,12 +80,13 @@ describe('init', () => {
expect(result).toEqual({
orbiterId: undefined,
satelliteId: DOCKER_SATELLITE_ID,
authClientIds: {google: mockGoogleClientId},
icpIds: expectedIcpIds,
container: DOCKER_CONTAINER_URL
});

expect(configLoader.junoConfigExist).toHaveBeenCalled();
expect(spyReadJunoConfig).not.toHaveBeenCalled();
expect(configLoader.junoConfigExist).toHaveResolvedTimes(3);
expect(spyReadJunoConfig).toHaveBeenCalledTimes(3);
});

it('returns config without container for production', async () => {
Expand All @@ -89,6 +95,7 @@ describe('init', () => {
expect(result).toEqual({
satelliteId: 'mock-satellite-id',
orbiterId: 'mock-orbiter-id',
authClientIds: {google: mockGoogleClientId},
icpIds: expectedIcpIds,
container: undefined
});
Expand Down Expand Up @@ -145,6 +152,7 @@ describe('init', () => {
expect(result).toEqual({
satelliteId: 'mock-satellite-id',
orbiterId: 'mock-orbiter-id',
authClientIds: {google: mockGoogleClientId},
icpIds: expectedIcpIds,
container: undefined
});
Expand Down
12 changes: 12 additions & 0 deletions plugins/plugin-tools/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,15 @@ export interface IcpIds {
*/
nnsDappId: string;
}

/**
* Represent the provider client IDs for the OpenID authentication resolved
* from the juno.config file for the corresponding mode.
*/
export interface AuthClientIds {
/**
* Google client ID.
* @type {string}
*/
google: string;
}
5 changes: 4 additions & 1 deletion plugins/vite-plugin/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export default function Juno(params?: JunoParams): Plugin {
try {
const args: ConfigArgs = {params, mode};

const {satelliteId, orbiterId, icpIds, container} = await initConfig(args);
const {satelliteId, orbiterId, icpIds, container, authClientIds} = await initConfig(args);

const prefix = `import.meta.env.${envPrefix ?? 'VITE_'}`;

Expand Down Expand Up @@ -62,6 +62,9 @@ export default function Juno(params?: JunoParams): Plugin {
}),
...(container !== undefined && {
[`${prefix}CONTAINER`]: JSON.stringify(container)
}),
...(authClientIds?.google !== undefined && {
[`${prefix}GOOGLE_CLIENT_ID`]: JSON.stringify(authClientIds.google)
})
}
};
Expand Down
6 changes: 5 additions & 1 deletion plugins/vite-plugin/src/tests/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ describe('vite-plugin-juno', () => {
const spyInitConfig = vi.spyOn(pluginTools, 'initConfig').mockResolvedValue({
satelliteId: 'sat-id',
orbiterId: 'orb-id',
authClientIds: {
google: 'google-client-id-123'
},
icpIds: {
internetIdentityId: 'ii-id',
icpLedgerId: 'ledger-id',
Expand Down Expand Up @@ -54,7 +57,8 @@ describe('vite-plugin-juno', () => {
'import.meta.env.VITE_CYCLES_LEDGER_ID': JSON.stringify('cycles-ledger-id'),
'import.meta.env.VITE_SNS_WASM_ID': JSON.stringify('sns-wasm-id'),
'import.meta.env.VITE_NNS_DAPP_ID': JSON.stringify('nns-dapp-id'),
'import.meta.env.VITE_CONTAINER': JSON.stringify('http://localhost:1234')
'import.meta.env.VITE_CONTAINER': JSON.stringify('http://localhost:1234'),
'import.meta.env.VITE_GOOGLE_CLIENT_ID': JSON.stringify('google-client-id-123')
}
});
});
Expand Down