Skip to content

Commit 6f6562e

Browse files
committed
Implement define tests, start test buildchain creation and fix issue in define function
1 parent e97228e commit 6f6562e

19 files changed

+277
-37
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules
2-
dist
2+
dist
3+
test/dist

.npmignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ src
22
esquirejs.ts
33
index.ts
44
tsconfig.json
5+
test/dist

package.json

+6-2
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@
2525
"url": "https://github.com/aapoalas/esquirejs.git"
2626
},
2727
"scripts": {
28-
"build-test": "echo TODO",
29-
"test": "echo TODO"
28+
"build": "tsc",
29+
"build-test": "tsc --project tsconfig.test.json",
30+
"test": "tape test/**/*.test.js",
31+
"watch": "tsc --watch",
32+
"watch-test": "tsc --watch --project tsconfig.test.json"
3033
},
3134
"prepublish": "tsc",
3235
"sideEffects": false,
3336
"devDependencies": {
3437
"@types/tape": "4.2.33",
38+
"browserify": "16.5.0",
3539
"tape": "4.11.0",
3640
"typescript": "3.7.2"
3741
}

src/define.ts

+10-9
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ const resolveDependencies = (depNames: string[], exports?: {}) =>
107107
return moduleRequireFunction;
108108
} else if (dep === MODULE_DEPENDENCY) {
109109
return {
110-
id: name,
111-
uri: name,
110+
id: "",
111+
uri: "",
112112
config: {},
113113
exports,
114114
};
@@ -210,7 +210,6 @@ export function define(...params: any[]) {
210210
// not overwrite a module that hasn't been unreferenced.
211211
const isNamed = typeof name === "string";
212212
const isNamedNewAMDModule = isNamed && !hasModule(name!);
213-
const isRedefinedAMDModule = isNamed && hasModule(name!);
214213

215214
let defineAsync: boolean = importJSOptions.deferDefineLoads;
216215
if (depNames !== undefined && moduleFactory !== undefined) {
@@ -240,18 +239,20 @@ export function define(...params: any[]) {
240239
// will be set to be invoked on the next tick and the result saved
241240
// as an asynchronous module definition.
242241

243-
moduleData = () =>
244-
Promise.all(resolveDependencies(depNames!, moduleData)).then(
242+
const boundModuleData = moduleData;
243+
const moduleBuilderFunction = () =>
244+
Promise.all(resolveDependencies(depNames!, boundModuleData)).then(
245245
deps => {
246246
const returnValue = moduleFactory!(...deps);
247-
return usesExports ? moduleData : returnValue;
247+
return usesExports ? boundModuleData : returnValue;
248248
}
249249
);
250250
if (shouldBuildDelayed) {
251-
const moduleDataPromise = Promise.resolve().then(() =>
252-
moduleData()
251+
moduleData = () => Promise.resolve().then(() =>
252+
moduleBuilderFunction()
253253
);
254-
moduleData = () => moduleDataPromise;
254+
} else {
255+
moduleData = moduleBuilderFunction;
255256
}
256257
// The 'moduleData' is here by necessity a function and such a function
257258
// that it will never leak out of this library. As such, it is safe for us

test/define/parameters.test.ts

+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
/**
2+
* Original Work Copyright 2019 Valmet Automation Inc.
3+
*/
4+
5+
import * as tape from "tape";
6+
import { define, load, setOptions } from "../../index";
7+
8+
tape("Define function", ({ test }) => {
9+
test("Anonymous define with no parameters", t => {
10+
setOptions({
11+
deferDefineLoads: false,
12+
});
13+
t.plan(1);
14+
const moduleFactory = function () {
15+
t.deepEqual(Array.from(arguments), []);
16+
return "key-anonymous-define-no-parameters"
17+
};
18+
define(moduleFactory);
19+
});
20+
21+
test("Named define with no parameters, deferred", async t => {
22+
setOptions({
23+
deferDefineLoads: true,
24+
});
25+
t.plan(2);
26+
const moduleFactory = function () {
27+
t.deepEqual(Array.from(arguments), []);
28+
return "key-named-define-no-parameters-deferred"
29+
};
30+
define("named-define-no-parameters-deferred", moduleFactory);
31+
const value = await load("named-define-no-parameters-deferred");
32+
t.equal(value, "key-named-define-no-parameters-deferred");
33+
});
34+
35+
test("Named define with no parameters, undeferred", async t => {
36+
setOptions({
37+
deferDefineLoads: true,
38+
});
39+
t.plan(2);
40+
const moduleFactory = function () {
41+
t.deepEqual(Array.from(arguments), []);
42+
return "key-named-define-no-parameters-undeferred"
43+
};
44+
define("named-define-no-parameters-undeferred", moduleFactory);
45+
const value = await load("named-define-no-parameters-undeferred");
46+
t.equal(value, "key-named-define-no-parameters-undeferred");
47+
});
48+
49+
test("Anonymous define with parameters", t => {
50+
setOptions({
51+
deferDefineLoads: false,
52+
});
53+
t.plan(1);
54+
const moduleFactory = function () {
55+
t.deepEqual(Array.from(arguments), ["key-named-define-no-parameters-undeferred"]);
56+
return "key-anonymous-define-with-parameters"
57+
};
58+
define(["named-define-no-parameters-undeferred"], moduleFactory);
59+
});
60+
61+
test("Named define with parameters, deferred", async t => {
62+
setOptions({
63+
deferDefineLoads: true,
64+
});
65+
t.plan(2);
66+
const moduleFactory = function () {
67+
t.deepEqual(Array.from(arguments), [
68+
"key-named-define-no-parameters-deferred",
69+
"key-named-define-no-parameters-undeferred"
70+
]);
71+
return "key-named-define-with-parameters-deferred"
72+
};
73+
define("named-define-with-parameters-deferred", ["named-define-no-parameters-deferred", "named-define-no-parameters-undeferred"], moduleFactory);
74+
const value = await load("named-define-with-parameters-deferred");
75+
t.equal(value, "key-named-define-with-parameters-deferred");
76+
})
77+
78+
test("Named define with parameters, undeferred", async t => {
79+
setOptions({
80+
deferDefineLoads: true,
81+
});
82+
t.plan(2);
83+
const moduleFactory = function () {
84+
t.deepEqual(Array.from(arguments), [
85+
"key-named-define-no-parameters-deferred",
86+
"key-named-define-no-parameters-undeferred"
87+
]);
88+
return "key-named-define-with-parameters-undeferred"
89+
};
90+
define("named-define-with-parameters-undeferred", ["named-define-no-parameters-deferred", "named-define-no-parameters-undeferred"], moduleFactory);
91+
const value = await load("named-define-with-parameters-undeferred");
92+
t.equal(value, "key-named-define-with-parameters-undeferred");
93+
});
94+
95+
test("'require' parameter without explicit parameter name", t => {
96+
t.plan(3);
97+
const moduleFactory = function (require) {
98+
t.equal(typeof require, "function");
99+
const requireFunction = require;
100+
const value = requireFunction("named-define-with-parameters-undeferred");
101+
t.equal(value, "key-named-define-with-parameters-undeferred");
102+
t.throws(() => requireFunction("not-loaded-module"));
103+
};
104+
define("require-test", moduleFactory);
105+
load("require-test");
106+
});
107+
108+
test("'require' parameter with explicit parameter name", t => {
109+
t.plan(3);
110+
const moduleFactory = function (requireFunction) {
111+
t.equal(typeof requireFunction, "function");
112+
const value = requireFunction("named-define-with-parameters-undeferred");
113+
t.equal(value, "key-named-define-with-parameters-undeferred");
114+
t.throws(() => requireFunction("not-loaded-module"));
115+
};
116+
define("require-test-explicit", ["require"], moduleFactory);
117+
load("require-test-explicit");
118+
});
119+
120+
test("'exports' parameter without explicit parameter name", async t => {
121+
t.plan(2);
122+
let exportsValue;
123+
const moduleFactory = function (exports) {
124+
t.deepEqual(exports, {});
125+
exportsValue = exports;
126+
};
127+
define("exports-test", moduleFactory);
128+
const value = await load("exports-test");
129+
t.equal(value, exportsValue);
130+
});
131+
132+
test("'exports' parameter with explicit parameter name", async t => {
133+
t.plan(2);
134+
let exportsValue;
135+
const moduleFactory = function (exports) {
136+
t.deepEqual(exports, {});
137+
exportsValue = exports;
138+
};
139+
define("exports-test-explicit", ["exports"], moduleFactory);
140+
const value = await load("exports-test-explicit");
141+
t.equal(value, exportsValue);
142+
});
143+
144+
test("'module' parameter without explicit parameter name", async t => {
145+
t.plan(2);
146+
let moduleValue;
147+
const moduleFactory = function (module) {
148+
t.deepEqual(module, {
149+
id: "",
150+
uri: "",
151+
config: {},
152+
exports: {},
153+
});
154+
moduleValue = module;
155+
};
156+
define("module-test", moduleFactory);
157+
const value = await load("module-test");
158+
t.equal(value, moduleValue.exports);
159+
});
160+
161+
test("'module' parameter with explicit parameter name", async t => {
162+
t.plan(2);
163+
let moduleValue;
164+
const moduleFactory = function (module) {
165+
t.deepEqual(module, {
166+
id: "",
167+
uri: "",
168+
config: {},
169+
exports: {},
170+
});
171+
moduleValue = module;
172+
};
173+
define("module-test-explicit", ["module"], moduleFactory);
174+
const value = await load("module-test-explicit");
175+
t.equal(value, moduleValue.exports);
176+
});
177+
});

test/define/parameters.ts

-24
This file was deleted.

test/globals.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { define } from "../src/define";
2+
3+
declare global {
4+
interface Window {
5+
define: typeof define;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define([], (...parameters: []) => ({
2+
name: "amd-anonymous-empty-parameters",
3+
type: "module",
4+
parameters,
5+
}));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define("amd-anonymous-module-parameter", ["amd-anonymous-empty-parameters"], (...parameters: [any]) => ({
2+
name: "amd-anonymous-module-parameter",
3+
type: "module",
4+
parameters,
5+
}));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define((...parameters: []) => ({
2+
name: "amd-anonymous-no-parameters",
3+
type: "module",
4+
parameters,
5+
}));

test/scripts/amd-data-parameter.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define("amd-data-parameters", ["amd-data"], (...parameters: [any]) => ({
2+
name: "amd-data-parameters",
3+
type: "module",
4+
parameters,
5+
}));

test/scripts/amd-data.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
define("amd-data", {
2+
name: "amd-data",
3+
type: "data",
4+
});

test/scripts/amd-empty-parameters.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define("amd-empty-parameters", [], (...parameters: []) => ({
2+
name: "amd-empty-parameters",
3+
type: "module",
4+
parameters,
5+
}));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define("amd-module-multiple-parameters", ["amd-no-parameters", "amd-data", "amd-anonymous-empty-parameters"], (...parameters: [any]) => ({
2+
name: "amd-module-multiple-parameters",
3+
type: "module",
4+
parameters,
5+
}));

test/scripts/amd-module-parameter.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define("amd-module-parameter", ["amd-no-parameters"], (...parameters: [any]) => ({
2+
name: "amd-module-parameters",
3+
type: "module",
4+
parameters,
5+
}));

test/scripts/amd-no-parameters.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define("amd-no-parameters", (...parameters: []) => ({
2+
name: "amd-no-parameters",
3+
type: "module",
4+
parameters,
5+
}));

test/test.html

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script type="importmap">
2+
{
3+
"imports": {
4+
"tape": "../node_modules/tape/index.js"
5+
}
6+
}
7+
</script>
8+
<script type="module" src="./dist/test/define/parameters.test.js"></script>

tsconfig.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"exclude": [
1111
"node_modules",
1212
"dist",
13-
"test"
13+
"test",
14+
"test-dist",
1415
]
1516
}

tsconfig.test.json

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"compilerOptions": {
3+
"allowSyntheticDefaultImports": true,
4+
"target": "esnext",
5+
"module": "commonjs",
6+
"declaration": true,
7+
"outDir": "test/dist",
8+
"strict": true,
9+
"forceConsistentCasingInFileNames": true
10+
},
11+
"exclude": [
12+
"node_modules",
13+
"dist",
14+
"test/dist"
15+
],
16+
"include": [
17+
"test/globals.d.ts",
18+
"test/**/*.ts"
19+
]
20+
}

0 commit comments

Comments
 (0)