Skip to content

Commit

Permalink
Merge pull request #241 from webarkit/dev
Browse files Browse the repository at this point in the history
0.12.1 version
kalwalt authored Oct 25, 2021

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents e9183a6 + 2a61d8a commit e713d79
Showing 18 changed files with 396 additions and 260 deletions.
4 changes: 2 additions & 2 deletions dist/ARnft.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions dist/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@webarkit/ar-nft",
"version": "0.12.0",
"version": "0.12.1",
"main": "dist/ARnft.js",
"types": "types/src/index.d.ts",
"description": "WebAR Javscript library for markerless AR",
@@ -63,7 +63,7 @@
"ecstatic": "^4.1.4"
},
"dependencies": {
"@kalwalt/jsartoolkit-nft": "^0.9.3",
"@webarkit/jsartoolkit-nft": "^0.9.7",
"terser-webpack-plugin": "^5.1.1",
"uuid": "^8.3.2"
}
96 changes: 59 additions & 37 deletions dist/src/ARnft.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/src/ARnft.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 10 additions & 13 deletions dist/src/NFTWorker.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/src/NFTWorker.js.map
88 changes: 38 additions & 50 deletions dist/src/renderers/CameraViewRenderer.js
2 changes: 1 addition & 1 deletion dist/src/renderers/CameraViewRenderer.js.map
87 changes: 87 additions & 0 deletions examples/arNFT_autoupdate_example.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>ARnft example showing a simple red cube</title>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=0.5, maximum-scale=1" />
<link rel="stylesheet" href="css/nft-style.css" />
</head>

<body>
<a href="https://raw.githubusercontent.com/artoolkitx/artoolkit5/master/doc/Marker%20images/pinball.jpg" class="ui marker" target="_blank">
🖼 Marker Image
</a>

<script src="js/third_party/three.js/three.min.js"></script>
<script src="js/ARnftThreejs.js"></script>
<script src="../dist/ARnft.js"></script>

<script>
ARnft.ARnft.initWithConfig({
width: 640,
height: 480,
markerUrls: ["examples/DataNFT/pinball"],
names: ["pinball"],
configUrl: "config.json",
stats: true,
autoUpdate: false,
})
.then((nft) => {
let mat = new THREE.MeshLambertMaterial({
color: 0xff0000,
});
let boxGeom = new THREE.BoxGeometry(1, 1, 1);
let cube = new THREE.Mesh(boxGeom, mat);
cube.position.z = 90;
cube.scale.set(180, 180, 180);

document.addEventListener("containerEvent", function (ev) {
let canvas = document.getElementById("canvas");
let fov = (0.8 * 180) / Math.PI;
let ratio = window.clientWidth / window.clientHeight;
let config = {
renderer: {
alpha: true,
antialias: true,
context: null,
precision: "mediump",
premultipliedAlpha: true,
stencil: true,
depth: true,
logarithmicDepthBuffer: true,
},
camera: {
fov: fov,
ratio: ratio,
near: 0.01,
far: 1000,
},
};

let sceneThreejs = new ARnftThreejs.SceneRendererTJS(config, canvas, nft.uuid, true);
sceneThreejs.initRenderer();

let nftAddTJS = new ARnftThreejs.NFTaddTJS(nft.uuid);
nftAddTJS.add(cube, "pinball", false);

const fpsInterval = 1000 / 30;
let now = Date.now(), elapsed = 0, then = now;
const tick = () => {
now = Date.now();
elapsed = now - then;
window.requestAnimationFrame(tick);
sceneThreejs.draw();
if (elapsed > fpsInterval) {
then = now - (elapsed % fpsInterval);
nft.update();
}
};
tick();
});
})
.catch((error) => {
console.log(error);
});
</script>
</body>
</html>
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@webarkit/ar-nft",
"version": "0.12.0",
"version": "0.12.1",
"main": "dist/ARnft.js",
"types": "types/src/index.d.ts",
"description": "WebAR Javscript library for markerless AR",
@@ -63,7 +63,7 @@
"ecstatic": "^4.1.4"
},
"dependencies": {
"@kalwalt/jsartoolkit-nft": "^0.9.3",
"@webarkit/jsartoolkit-nft": "^0.9.7",
"terser-webpack-plugin": "^5.1.1",
"uuid": "^8.3.2"
}
139 changes: 88 additions & 51 deletions src/ARnft.ts
Original file line number Diff line number Diff line change
@@ -43,11 +43,36 @@ import { v4 as uuidv4 } from "uuid";
import packageJson from "../package.json";
const { version } = packageJson;

interface Entity {
interface IEntity {
name: string;
markerUrl: string;
}

interface IInitConfig {
/** the width in pixels of the video camera. */
width: number;
/** the height in pixels of the video camera. */
height: number;
/** the url of the config.json file. */
configUrl: string;
/** true if you want the stats. */
stats?: boolean;
/** false if you want to maintain it yourself */
autoUpdate?: boolean;
}

interface INameInitConfig extends IInitConfig {
/** the Array of url of the markers (without the extension) */
markerUrls: Array<string>;
/** the names of the markers */
names: Array<string>;
}

interface IEntityInitConfig extends IInitConfig {
/** the Array of Entity. */
entities: IEntity[];
}

export default class ARnft {
public cameraView: CameraViewRenderer;
public appData: ConfigData;
@@ -56,11 +81,13 @@ export default class ARnft {
public configUrl: string;
public markerUrl: string;
public camData: string;
public autoUpdate: boolean = true;
private controllers: NFTWorker[];
private static entities: Entity[];
private static entities: IEntity[];
private target: EventTarget;
private uuid: string;
private version: string;
private initialized: boolean;

/**
* The **ARnft** constructor to create a new instance of the ARnft class.
@@ -102,11 +129,7 @@ export default class ARnft {
configUrl: string,
stats: boolean
): Promise<object> {
const _arnft = new ARnft(width, height, configUrl);
return await _arnft._initialize(markerUrls, names, stats).catch((error: any) => {
console.error(error);
return Promise.reject(false);
});
return ARnft.initWithConfig({ width, height, markerUrls, names, configUrl, stats });
}

/**
@@ -125,22 +148,38 @@ export default class ARnft {
static async initWithEntities(
width: number,
height: number,
entities: Entity[],
entities: IEntity[],
configUrl: string,
stats: boolean
): Promise<object> {
const _arnft = new ARnft(width, height, configUrl);
this.entities = entities;
let markerUrls = this.entities.map((entity) => {
return entity.markerUrl;
});
let names = this.entities.map((entity) => {
return entity.name;
});
return await _arnft._initialize(markerUrls, names, stats).catch((error: any) => {
return ARnft.initWithConfig({ width, height, entities, configUrl, stats });
}

static async initWithConfig(params: INameInitConfig | IEntityInitConfig) {
const _arnft = new ARnft(params.width, params.height, params.configUrl);
if (params.autoUpdate != null) {
_arnft.autoUpdate = params.autoUpdate;
}
try {
let markerUrls;
let names;
const nameParams = params as INameInitConfig;
const entityParams = params as IEntityInitConfig;
if (nameParams.markerUrls != null && nameParams.names != null) {
markerUrls = nameParams.markerUrls;
names = nameParams.names;
} else if (entityParams.entities != null) {
this.entities = entityParams.entities;
markerUrls = this.entities.map((x) => x.markerUrl);
names = this.entities.map((x) => x.name);
} else {
throw "markerUrls or entities can't be undefined";
}
return await _arnft._initialize(markerUrls, names, params.stats);
} catch (error: any) {
console.error(error);
return Promise.reject(false);
});
return Promise.reject(error);
}
}

/**
@@ -152,7 +191,7 @@ export default class ARnft {
* @returns the ARnft object.
*/

private async _initialize(markerUrls: Array<string>, names: Array<string>, stats: boolean): Promise<object> {
private async _initialize(markerUrls: Array<string>, names: Array<string>, stats: boolean): Promise<this> {
const initEvent = new Event("initARnft");
this.target.dispatchEvent(initEvent);
console.log(
@@ -180,38 +219,21 @@ export default class ARnft {

this.controllers = [];
this.cameraView = new CameraViewRenderer(document.getElementById("video") as HTMLVideoElement);
await this.cameraView.initialize(this.appData.videoSettings).catch((error: any) => {
console.error(error);
return Promise.reject(false);
});
try {
await this.cameraView.initialize(this.appData.videoSettings);
} catch (error: any) {
return Promise.reject(error);
}
const renderUpdate = () => stats ? statsMain.update() : null;
const trackUpdate = () => stats ? statsWorker.update() : null;
markerUrls.forEach((markerUrl: string, index: number) => {
this.controllers.push(new NFTWorker(markerUrl, this.width, this.height, this.uuid, names[index]));
this.controllers[index].initialize(
this.appData.cameraPara,
this.cameraView.getImage(),
() => {
if (stats) {
statsMain.update();
}
},
() => {
if (stats) {
statsWorker.update();
}
}
);

this.controllers[index].process(this.cameraView.getImage());
let update = () => {
this.controllers[index].process(this.cameraView.getImage());
requestAnimationFrame(update);
};
update();
this.controllers[index].initialize(this.appData.cameraPara, this.cameraView.getImage(), renderUpdate, trackUpdate);
});
this.initialized = true;
});

this.target.addEventListener('nftLoaded-'+this.uuid, async (ev: any) => {

this.target.addEventListener("nftLoaded-" + this.uuid, () => {
const nftWorkersNotReady = this.controllers.filter((nftWorker) => {
return nftWorker.isReady() === false;
});
@@ -220,14 +242,29 @@ export default class ARnft {
this.target.dispatchEvent(new CustomEvent<object>("ARnftIsReady"));
}
});
return Promise.resolve(this);

let _update = () => {
if (!this.initialized || !this.autoUpdate) return requestAnimationFrame(_update);
const image = this.cameraView.getImage();
this.controllers.forEach((controller) => controller.process(image));
requestAnimationFrame(_update);
};
requestAnimationFrame(_update);
return this;
}

/**
*
* @returns all the entities
* Default autoUpdate true. If set, don't call this function. When it isn't, then you have to maintain it yourself.
*/
public static getEntities() {
public update(): void {
if (!this.initialized || this.autoUpdate) return;
if (this.cameraView != null) {
const image = this.cameraView.getImage();
this.controllers.forEach((controller) => controller.process(image));
}
}

public static getEntities(): IEntity[] {
return this.entities;
}

25 changes: 12 additions & 13 deletions src/NFTWorker.ts
Original file line number Diff line number Diff line change
@@ -79,23 +79,20 @@ export default class NFTWorker {
* @param trackUpdate
* @returns true if succesfull.
*/
public initialize(
public async initialize(
cameraURL: string,
imageData: ImageData,
renderUpdate: () => void,
trackUpdate: () => void
): Promise<boolean> {
return new Promise<boolean>((resolve, reject) => {
this.worker = new Worker();
this.load(cameraURL, imageData, renderUpdate, trackUpdate).then(() => {
resolve(true);
});
const worker = this.worker;
this.target.addEventListener("terminateWorker", function () {
worker.postMessage({ type: "stop" });
worker.terminate();
});
this.worker = new Worker();
const worker = this.worker;
this.target.addEventListener("terminateWorker", function () {
worker.postMessage({ type: "stop" });
worker.terminate();
});
return await this.load(cameraURL, imageData, renderUpdate, trackUpdate);

}

/**
@@ -238,7 +235,9 @@ export default class NFTWorker {
}
}

public isReady() {return this.ready};
public isReady() {
return this.ready;
}
public getUuid(): string {
return this.uuid;
}
@@ -255,7 +254,7 @@ export default class NFTWorker {
return this.target;
}

public destroy(): void {}
public destroy(): void { }

/**
* Stop the NFT tracking and the video streaming.
97 changes: 42 additions & 55 deletions src/renderers/CameraViewRenderer.ts
Original file line number Diff line number Diff line change
@@ -45,8 +45,9 @@ export interface ScreenData {
}

export interface ICameraViewRenderer {
getHeight(): number;
getWidth(): number;
facing: string;
height: number;
width: number;
getImage(): ImageData;
}

@@ -55,7 +56,7 @@ export class CameraViewRenderer implements ICameraViewRenderer {

private context_process: CanvasRenderingContext2D;

public video: HTMLVideoElement;
public _video: HTMLVideoElement;

private _facing: string;

@@ -76,46 +77,45 @@ export class CameraViewRenderer implements ICameraViewRenderer {
constructor(video: HTMLVideoElement) {
this.canvas_process = document.createElement("canvas");
this.context_process = this.canvas_process.getContext("2d");
this.video = video;
this._video = video;
this.target = window || global;
}

// Getters

public getFacing(): string {
public get facing(): string {
return this._facing;
}

public getHeight(): number {
public get height(): number {
return this.vh;
}

public getWidth(): number {
public get width(): number {
return this.vw;
}

public getVideo(): HTMLVideoElement {
return this.video;
public get video(): HTMLVideoElement {
return this._video;
}

public getCanvasProcess(): HTMLCanvasElement {
public get canvasProcess(): HTMLCanvasElement {
return this.canvas_process;
}

public getContexProcess(): CanvasRenderingContext2D {
public get contextProcess(): CanvasRenderingContext2D {
return this.context_process;
}

public getImage(): ImageData {
this.context_process.drawImage(this.video, 0, 0, this.vw, this.vh, this.ox, this.oy, this.w, this.h);
this.context_process.drawImage(this._video, 0, 0, this.vw, this.vh, this.ox, this.oy, this.w, this.h);
return this.context_process.getImageData(0, 0, this.pw, this.ph);
}

public prepareImage(): void {
this.vw = this.video.videoWidth;
this.vh = this.video.videoHeight;
this.vw = this._video.videoWidth;
this.vh = this._video.videoHeight;

var pscale = 320 / Math.max(this.vw, this.vh / 3 * 4);
var pscale = 320 / Math.max(this.vw, (this.vh / 3) * 4);

this.w = this.vw * pscale;
this.h = this.vh * pscale;
@@ -127,18 +127,18 @@ export class CameraViewRenderer implements ICameraViewRenderer {
this.canvas_process.width = this.pw;
this.canvas_process.height = this.ph;

this.context_process.fillStyle = 'black';
this.context_process.fillStyle = "black";
this.context_process.fillRect(0, 0, this.pw, this.ph);
}

public initialize(videoSettings: VideoSettingData): Promise<boolean> {
public async initialize(videoSettings: VideoSettingData): Promise<boolean> {
this._facing = videoSettings.facingMode || "environment";

const constraints = {};
const mediaDevicesConstraints = {};

return new Promise<boolean>(async (resolve, reject) => {
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
try {
var hint: any = {
audio: false,
video: {
@@ -147,50 +147,37 @@ export class CameraViewRenderer implements ICameraViewRenderer {
},
};
if (navigator.mediaDevices.enumerateDevices) {
try {
const devices = await navigator.mediaDevices.enumerateDevices();
var videoDevices = [] as Array<string>;
var videoDeviceIndex = 0;
devices.forEach(function (device) {
if (device.kind == "videoinput") {
videoDevices[videoDeviceIndex++] = device.deviceId;
}
});
if (videoDevices.length > 1) {
hint.video.deviceId = { exact: videoDevices[videoDevices.length - 1] };
const devices = await navigator.mediaDevices.enumerateDevices();
var videoDevices = [] as Array<string>;
var videoDeviceIndex = 0;
devices.forEach(function (device) {
if (device.kind == "videoinput") {
videoDevices[videoDeviceIndex++] = device.deviceId;
}
} catch (err: any) {
console.log(err.name + ": " + err.message);
});
if (videoDevices.length > 1) {
hint.video.deviceId = { exact: videoDevices[videoDevices.length - 1] };
}
}
const stream = await navigator.mediaDevices.getUserMedia(hint);

navigator.mediaDevices.getUserMedia(hint).then(async (stream) => {
this.video.srcObject = stream;
this.video = await new Promise<HTMLVideoElement>((resolve, reject) => {
this.video.onloadedmetadata = () => resolve(this.video);
}).then((value) => {
this.prepareImage()
resolve(true);
return value;
}).catch((msg) => {
console.log(msg);
reject(msg);
return null;
});
}).catch((error) => {
console.error(error);
reject(error);
this._video.srcObject = stream;
this._video = await new Promise<HTMLVideoElement>((resolve) => {
this._video.onloadedmetadata = () => resolve(this._video);
});
this.prepareImage();
return true;
} catch (error) {
return Promise.reject(error);
}
else {
// reject("No navigator.mediaDevices && navigator.mediaDevices.getUserMedia");
reject("Sorry, Your device does not support this experince.");
}
});
} else {
// reject("No navigator.mediaDevices && navigator.mediaDevices.getUserMedia");
return Promise.reject("Sorry, Your device does not support this experince.");
}
}

public destroy(): void {
const video = this.video;
const video = this._video;
this.target.addEventListener("stopStreaming", function () {
const stream = <MediaStream>video.srcObject;
console.log("stop streaming");
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@
"../node_modules/*",
],
"jsartoolkitnft": [
"./node_modules/@kalwalt/jsartoolkit-nft"
"./node_modules/@webarkit/jsartoolkit-nft"
]
}
},
24 changes: 21 additions & 3 deletions types/src/ARnft.d.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
import { ConfigData } from "./config/ConfigData";
import { CameraViewRenderer } from "./renderers/CameraViewRenderer";
interface Entity {
interface IEntity {
name: string;
markerUrl: string;
}
interface IInitConfig {
width: number;
height: number;
configUrl: string;
stats?: boolean;
autoUpdate?: boolean;
}
interface INameInitConfig extends IInitConfig {
markerUrls: Array<string>;
names: Array<string>;
}
interface IEntityInitConfig extends IInitConfig {
entities: IEntity[];
}
export default class ARnft {
cameraView: CameraViewRenderer;
appData: ConfigData;
@@ -12,16 +26,20 @@ export default class ARnft {
configUrl: string;
markerUrl: string;
camData: string;
autoUpdate: boolean;
private controllers;
private static entities;
private target;
private uuid;
private version;
private initialized;
constructor(width: number, height: number, configUrl: string);
static init(width: number, height: number, markerUrls: Array<string>, names: Array<string>, configUrl: string, stats: boolean): Promise<object>;
static initWithEntities(width: number, height: number, entities: Entity[], configUrl: string, stats: boolean): Promise<object>;
static initWithEntities(width: number, height: number, entities: IEntity[], configUrl: string, stats: boolean): Promise<object>;
static initWithConfig(params: INameInitConfig | IEntityInitConfig): Promise<ARnft>;
private _initialize;
static getEntities(): Entity[];
update(): void;
static getEntities(): IEntity[];
getEventTarget(): EventTarget;
dispose(): void;
disposeNFT(): void;
19 changes: 10 additions & 9 deletions types/src/renderers/CameraViewRenderer.d.ts
Original file line number Diff line number Diff line change
@@ -8,14 +8,15 @@ export interface ScreenData {
max: number;
}
export interface ICameraViewRenderer {
getHeight(): number;
getWidth(): number;
facing: string;
height: number;
width: number;
getImage(): ImageData;
}
export declare class CameraViewRenderer implements ICameraViewRenderer {
private canvas_process;
private context_process;
video: HTMLVideoElement;
_video: HTMLVideoElement;
private _facing;
private vw;
private vh;
@@ -27,12 +28,12 @@ export declare class CameraViewRenderer implements ICameraViewRenderer {
private oy;
private target;
constructor(video: HTMLVideoElement);
getFacing(): string;
getHeight(): number;
getWidth(): number;
getVideo(): HTMLVideoElement;
getCanvasProcess(): HTMLCanvasElement;
getContexProcess(): CanvasRenderingContext2D;
get facing(): string;
get height(): number;
get width(): number;
get video(): HTMLVideoElement;
get canvasProcess(): HTMLCanvasElement;
get contextProcess(): CanvasRenderingContext2D;
getImage(): ImageData;
prepareImage(): void;
initialize(videoSettings: VideoSettingData): Promise<boolean>;
2 changes: 1 addition & 1 deletion webpack.config.js
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ module.exports = {
},
resolve: {
alias: {
jsartoolkitnft: '@kalwalt/jsartoolkit-nft'
jsartoolkitnft: '@webarkit/jsartoolkit-nft'
},
extensions: ['.tsx', '.ts', '.js'],
},
36 changes: 18 additions & 18 deletions yarn.lock
Original file line number Diff line number Diff line change
@@ -842,10 +842,10 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"

"@babel/runtime@^7.13.10":
version "7.13.10"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz"
integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
"@babel/runtime@^7.15.4":
version "7.15.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
dependencies:
regenerator-runtime "^0.13.4"

@@ -892,14 +892,6 @@
resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz"
integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==

"@kalwalt/jsartoolkit-nft@^0.9.3":
version "0.9.3"
resolved "https://registry.yarnpkg.com/@kalwalt/jsartoolkit-nft/-/jsartoolkit-nft-0.9.3.tgz#9a26886381d24c93113a7e77f1c4dfe1c575b769"
integrity sha512-eganlVVDgZUJhSuf4g3AX6l0H2Sb4hJVdiCLvmsGRqd73E9/TQXgvoOBQ03bPt3zpv3zRsuxZ00Y08ojnxVy7w==
dependencies:
"@babel/runtime" "^7.13.10"
axios "^0.21.2"

"@types/eslint-scope@^3.7.0":
version "3.7.0"
resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz"
@@ -951,6 +943,14 @@
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f"
integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==

"@webarkit/jsartoolkit-nft@^0.9.7":
version "0.9.7"
resolved "https://registry.yarnpkg.com/@webarkit/jsartoolkit-nft/-/jsartoolkit-nft-0.9.7.tgz#65023219d221e785a353c85a83e12ccdc93f8921"
integrity sha512-Qm6lfiLt7c3tDn2c36id94z35AiI+BpcoGc+SrXqIWNZaWJt5Rurl1dsGU9+HknHHtUcKGv7sKTHAXWevmAMDA==
dependencies:
"@babel/runtime" "^7.15.4"
axios "^0.23.0"

"@webassemblyjs/ast@1.9.1":
version "1.9.1"
resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz"
@@ -1157,12 +1157,12 @@ ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"

axios@^0.21.2:
version "0.21.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
axios@^0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149"
integrity sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg==
dependencies:
follow-redirects "^1.14.0"
follow-redirects "^1.14.4"

babel-loader@^8.2.2:
version "8.2.2"
@@ -1552,7 +1552,7 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"

follow-redirects@^1.14.0:
follow-redirects@^1.14.4:
version "1.14.4"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379"
integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==

0 comments on commit e713d79

Please sign in to comment.