Browse Source

PackageTransport now used. Package >> amdNamespace removed

Nicolas Petton 10 năm trước cách đây
mục cha
commit
77ec5dcc79
2 tập tin đã thay đổi với 387 bổ sung327 xóa
  1. 296 247
      js/Importer-Exporter.js
  2. 91 80
      st/Importer-Exporter.st

+ 296 - 247
js/Importer-Exporter.js

@@ -126,31 +126,6 @@ referencedClasses: ["OrderedCollection", "ExportMethodProtocol", "Smalltalk"]
 smalltalk.AbstractExporter);
 
 
-smalltalk.AbstractExporter.klass.iVarNames = ['default'];
-smalltalk.addMethod(
-smalltalk.method({
-selector: "default",
-category: 'instance creation',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@default"];
-if(($receiver = $2) == nil || $receiver == undefined){
-self["@default"]=self._new();
-$1=self["@default"];
-} else {
-$1=$2;
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"default",{},smalltalk.AbstractExporter.klass)})},
-args: [],
-source: "default\x0a\x09^ default ifNil: [ default := self new ]",
-messageSends: ["ifNil:", "new"],
-referencedClasses: []
-}),
-smalltalk.AbstractExporter.klass);
-
 
 smalltalk.addClass('ChunkExporter', smalltalk.AbstractExporter, [], 'Importer-Exporter');
 smalltalk.ChunkExporter.comment="I am an exporter dedicated to outputting Amber source code in the classic Smalltalk chunk format.\x0a\x0aI do not output any compiled code.";
@@ -945,7 +920,7 @@ smalltalk.Exporter);
 
 
 
-smalltalk.addClass('AmdExporter', smalltalk.Exporter, [], 'Importer-Exporter');
+smalltalk.addClass('AmdExporter', smalltalk.Exporter, ['namespace'], 'Importer-Exporter');
 smalltalk.AmdExporter.comment="I am used to export Packages in an AMD (Asynchronous Module Definition) JavaScript format.";
 smalltalk.addMethod(
 smalltalk.method({
@@ -957,101 +932,47 @@ return smalltalk.withContext(function($ctx1) {
 var $1;
 $1=_st(_st(anArray)._select_((function(each){
 return smalltalk.withContext(function($ctx2) {
-return _st(_st(each)._amdNamespace())._notNil();
+return _st(self._amdNamespaceOfPackage_(each))._notNil();
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})))._collect_((function(each){
 return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(each)._amdNamespace()).__comma("/")).__comma(_st(each)._name());
+return _st(_st(self._amdNamespaceOfPackage_(each)).__comma("/")).__comma(_st(each)._name());
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"amdNamesOfPackages:",{anArray:anArray},smalltalk.AmdExporter)})},
 args: ["anArray"],
-source: "amdNamesOfPackages: anArray\x0a\x09^ (anArray\x0a\x09\x09select: [ :each | each amdNamespace notNil ])\x0a\x09\x09collect: [ :each | each amdNamespace, '/', each name ]",
-messageSends: ["collect:", ",", "name", "amdNamespace", "select:", "notNil"],
-referencedClasses: []
-}),
-smalltalk.AmdExporter);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "exportPackageEpilogueOf:on:",
-category: 'output',
-fn: function (aPackage,aStream){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-$1=aStream;
-_st($1)._nextPutAll_("});");
-$2=_st($1)._lf();
-return self}, function($ctx1) {$ctx1.fill(self,"exportPackageEpilogueOf:on:",{aPackage:aPackage,aStream:aStream},smalltalk.AmdExporter)})},
-args: ["aPackage", "aStream"],
-source: "exportPackageEpilogueOf: aPackage on: aStream\x0a\x09aStream\x0a\x09\x09nextPutAll: '});';\x0a\x09\x09lf",
-messageSends: ["nextPutAll:", "lf"],
+source: "amdNamesOfPackages: anArray\x0a\x09^ (anArray\x0a\x09\x09select: [ :each | (self amdNamespaceOfPackage: each) notNil ])\x0a\x09\x09collect: [ :each | (self amdNamespaceOfPackage: each), '/', each name ]",
+messageSends: ["collect:", ",", "name", "amdNamespaceOfPackage:", "select:", "notNil"],
 referencedClasses: []
 }),
 smalltalk.AmdExporter);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "exportPackagePrologueOf:on:",
-category: 'output',
-fn: function (aPackage,aStream){
+selector: "amdNamespaceOfPackage:",
+category: 'private',
+fn: function (aPackage){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$4,$3,$5;
-$1=aStream;
-_st($1)._nextPutAll_("define(\x22");
-$2=$1;
-$4=_st(aPackage)._amdNamespace();
-if(($receiver = $4) == nil || $receiver == undefined){
-$3="amber";
+var $2,$1;
+$2=_st(_st(_st(aPackage)._transport())._type()).__eq("amd");
+if(smalltalk.assert($2)){
+$1=_st(_st(aPackage)._transport())._namespace();
 } else {
-$3=$4;
+$1=nil;
 };
-_st($2)._nextPutAll_($3);
-_st($1)._nextPutAll_("/");
-_st($1)._nextPutAll_(_st(aPackage)._name());
-_st($1)._nextPutAll_("\x22, ");
-_st($1)._nextPutAll_(_st(["amber_vm/smalltalk", "amber_vm/nil", "amber_vm/_st"].__comma(self._amdNamesOfPackages_(_st(aPackage)._loadDependencies())))._asJavascript());
-_st($1)._nextPutAll_(", function(smalltalk,nil,_st){");
-$5=_st($1)._lf();
-return self}, function($ctx1) {$ctx1.fill(self,"exportPackagePrologueOf:on:",{aPackage:aPackage,aStream:aStream},smalltalk.AmdExporter)})},
-args: ["aPackage", "aStream"],
-source: "exportPackagePrologueOf: aPackage on: aStream\x0a\x09aStream\x0a\x09\x09nextPutAll: 'define(\x22';\x0a\x09\x09nextPutAll: (aPackage amdNamespace ifNil: [ 'amber' ]); \x22ifNil: only for LegacyPH, it should not happen with AmdPH\x22\x0a\x09\x09nextPutAll: '/';\x0a\x09\x09nextPutAll: aPackage name;\x0a\x09\x09nextPutAll: '\x22, ';\x0a\x09\x09nextPutAll: (#('amber_vm/smalltalk' 'amber_vm/nil' 'amber_vm/_st'), (self amdNamesOfPackages: aPackage loadDependencies)) asJavascript;\x0a\x09\x09nextPutAll: ', function(smalltalk,nil,_st){';\x0a\x09\x09lf",
-messageSends: ["nextPutAll:", "ifNil:", "amdNamespace", "name", "asJavascript", ",", "amdNamesOfPackages:", "loadDependencies", "lf"],
-referencedClasses: []
-}),
-smalltalk.AmdExporter);
-
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "amdNamesOfPackages:",
-category: 'private',
-fn: function (anArray){
-var self=this;
-var deps,depNames;
-return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(_st(anArray)._select_((function(each){
-return smalltalk.withContext(function($ctx2) {
-return _st(_st(each)._amdNamespace())._notNil();
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})))._collect_((function(each){
-return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(each)._amdNamespace()).__comma("/")).__comma(_st(each)._name());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"amdNamesOfPackages:",{anArray:anArray,deps:deps,depNames:depNames},smalltalk.AmdExporter.klass)})},
-args: ["anArray"],
-source: "amdNamesOfPackages: anArray\x0a\x09| deps depNames |\x0a\x09^(anArray\x0a\x09\x09select: [ :each | each amdNamespace notNil ])\x0a\x09\x09collect: [ :each | each amdNamespace, '/', each name ]",
-messageSends: ["collect:", ",", "name", "amdNamespace", "select:", "notNil"],
+}, function($ctx1) {$ctx1.fill(self,"amdNamespaceOfPackage:",{aPackage:aPackage},smalltalk.AmdExporter)})},
+args: ["aPackage"],
+source: "amdNamespaceOfPackage: aPackage\x0a\x09^ (aPackage transport type = 'amd')\x0a\x09\x09ifTrue: [ aPackage transport namespace ]\x0a\x09\x09ifFalse: [ nil ]",
+messageSends: ["ifTrue:ifFalse:", "namespace", "transport", "=", "type"],
 referencedClasses: []
 }),
-smalltalk.AmdExporter.klass);
+smalltalk.AmdExporter);
 
 smalltalk.addMethod(
 smalltalk.method({
 selector: "exportPackageEpilogueOf:on:",
-category: 'exporting-output',
+category: 'output',
 fn: function (aPackage,aStream){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
@@ -1059,45 +980,39 @@ var $1,$2;
 $1=aStream;
 _st($1)._nextPutAll_("});");
 $2=_st($1)._lf();
-return self}, function($ctx1) {$ctx1.fill(self,"exportPackageEpilogueOf:on:",{aPackage:aPackage,aStream:aStream},smalltalk.AmdExporter.klass)})},
+return self}, function($ctx1) {$ctx1.fill(self,"exportPackageEpilogueOf:on:",{aPackage:aPackage,aStream:aStream},smalltalk.AmdExporter)})},
 args: ["aPackage", "aStream"],
 source: "exportPackageEpilogueOf: aPackage on: aStream\x0a\x09aStream\x0a\x09\x09nextPutAll: '});';\x0a\x09\x09lf",
 messageSends: ["nextPutAll:", "lf"],
 referencedClasses: []
 }),
-smalltalk.AmdExporter.klass);
+smalltalk.AmdExporter);
 
 smalltalk.addMethod(
 smalltalk.method({
 selector: "exportPackagePrologueOf:on:",
-category: 'exporting-output',
+category: 'output',
 fn: function (aPackage,aStream){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$4,$3,$5;
+var $1,$2;
 $1=aStream;
 _st($1)._nextPutAll_("define(\x22");
-$2=$1;
-$4=_st(aPackage)._amdNamespace();
-if(($receiver = $4) == nil || $receiver == undefined){
-$3="amber";
-} else {
-$3=$4;
-};
-_st($2)._nextPutAll_($3);
+_st($1)._nextPutAll_(self._amdNamespaceOfPackage_(aPackage));
 _st($1)._nextPutAll_("/");
 _st($1)._nextPutAll_(_st(aPackage)._name());
 _st($1)._nextPutAll_("\x22, ");
 _st($1)._nextPutAll_(_st(["amber_vm/smalltalk", "amber_vm/nil", "amber_vm/_st"].__comma(self._amdNamesOfPackages_(_st(aPackage)._loadDependencies())))._asJavascript());
 _st($1)._nextPutAll_(", function(smalltalk,nil,_st){");
-$5=_st($1)._lf();
-return self}, function($ctx1) {$ctx1.fill(self,"exportPackagePrologueOf:on:",{aPackage:aPackage,aStream:aStream},smalltalk.AmdExporter.klass)})},
+$2=_st($1)._lf();
+return self}, function($ctx1) {$ctx1.fill(self,"exportPackagePrologueOf:on:",{aPackage:aPackage,aStream:aStream},smalltalk.AmdExporter)})},
 args: ["aPackage", "aStream"],
-source: "exportPackagePrologueOf: aPackage on: aStream\x0a\x09aStream\x0a\x09\x09nextPutAll: 'define(\x22';\x0a\x09\x09nextPutAll: (aPackage amdNamespace ifNil: [ 'amber' ]); \x22ifNil: only for LegacyPH, it should not happen with AmdPH\x22\x0a\x09\x09nextPutAll: '/';\x0a\x09\x09nextPutAll: aPackage name;\x0a\x09\x09nextPutAll: '\x22, ';\x0a\x09\x09nextPutAll: (#('amber_vm/smalltalk' 'amber_vm/nil' 'amber_vm/_st'), (self amdNamesOfPackages: aPackage loadDependencies)) asJavascript;\x0a\x09\x09nextPutAll: ', function(smalltalk,nil,_st){';\x0a\x09\x09lf",
-messageSends: ["nextPutAll:", "ifNil:", "amdNamespace", "name", "asJavascript", ",", "amdNamesOfPackages:", "loadDependencies", "lf"],
+source: "exportPackagePrologueOf: aPackage on: aStream\x0a\x09aStream\x0a\x09\x09nextPutAll: 'define(\x22';\x0a\x09\x09nextPutAll: (self amdNamespaceOfPackage: aPackage);\x0a\x09\x09nextPutAll: '/';\x0a\x09\x09nextPutAll: aPackage name;\x0a\x09\x09nextPutAll: '\x22, ';\x0a\x09\x09nextPutAll: (#('amber_vm/smalltalk' 'amber_vm/nil' 'amber_vm/_st'), (self amdNamesOfPackages: aPackage loadDependencies)) asJavascript;\x0a\x09\x09nextPutAll: ', function(smalltalk,nil,_st){';\x0a\x09\x09lf",
+messageSends: ["nextPutAll:", "amdNamespaceOfPackage:", "name", "asJavascript", ",", "amdNamesOfPackages:", "loadDependencies", "lf"],
 referencedClasses: []
 }),
-smalltalk.AmdExporter.klass);
+smalltalk.AmdExporter);
+
 
 
 smalltalk.addClass('ChunkParser', smalltalk.Object, ['stream'], 'Importer-Exporter');
@@ -1540,12 +1455,12 @@ fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=_st(self._chunkExporterClass())._default();
+$1=_st(self._chunkExporterClass())._new();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"chunkExporter",{},smalltalk.PackageHandler)})},
 args: [],
-source: "chunkExporter\x0a\x09^ self chunkExporterClass default",
-messageSends: ["default", "chunkExporterClass"],
+source: "chunkExporter\x0a\x09^ self chunkExporterClass new",
+messageSends: ["new", "chunkExporterClass"],
 referencedClasses: []
 }),
 smalltalk.PackageHandler);
@@ -1688,12 +1603,12 @@ fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=_st(self._exporterClass())._default();
+$1=_st(self._exporterClass())._new();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"exporter",{},smalltalk.PackageHandler)})},
 args: [],
-source: "exporter\x0a\x09^ self exporterClass default",
-messageSends: ["default", "exporterClass"],
+source: "exporter\x0a\x09^ self exporterClass new",
+messageSends: ["new", "exporterClass"],
 referencedClasses: []
 }),
 smalltalk.PackageHandler);
@@ -1747,93 +1662,6 @@ referencedClasses: ["PluggableExporter", "String"]
 smalltalk.PackageHandler);
 
 
-smalltalk.PackageHandler.klass.iVarNames = ['registry'];
-smalltalk.addMethod(
-smalltalk.method({
-selector: "classRegisteredFor:",
-category: 'accessing',
-fn: function (aString){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(self["@registry"])._at_(aString);
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"classRegisteredFor:",{aString:aString},smalltalk.PackageHandler.klass)})},
-args: ["aString"],
-source: "classRegisteredFor: aString\x0a\x09^ registry at: aString",
-messageSends: ["at:"],
-referencedClasses: []
-}),
-smalltalk.PackageHandler.klass);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "for:",
-category: 'accessing',
-fn: function (aString){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(self._classRegisteredFor_(aString))._new();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"for:",{aString:aString},smalltalk.PackageHandler.klass)})},
-args: ["aString"],
-source: "for: aString\x0a\x09^ (self classRegisteredFor: aString) new",
-messageSends: ["new", "classRegisteredFor:"],
-referencedClasses: []
-}),
-smalltalk.PackageHandler.klass);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "initialize",
-category: 'initialization',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-smalltalk.PackageHandler.klass.superclass.fn.prototype._initialize.apply(_st(self), []);
-self["@registry"]=smalltalk.HashedCollection._from_([]);
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.PackageHandler.klass)})},
-args: [],
-source: "initialize\x0a\x09super initialize.\x0a\x09registry := #{}",
-messageSends: ["initialize"],
-referencedClasses: []
-}),
-smalltalk.PackageHandler.klass);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "register:for:",
-category: 'registry',
-fn: function (aClass,aString){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-_st(self["@registry"])._at_put_(aString,aClass);
-return self}, function($ctx1) {$ctx1.fill(self,"register:for:",{aClass:aClass,aString:aString},smalltalk.PackageHandler.klass)})},
-args: ["aClass", "aString"],
-source: "register: aClass for: aString\x0a\x09registry at: aString put: aClass",
-messageSends: ["at:put:"],
-referencedClasses: []
-}),
-smalltalk.PackageHandler.klass);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "registerFor:",
-category: 'registry',
-fn: function (aString){
-var self=this;
-function $PackageHandler(){return smalltalk.PackageHandler||(typeof PackageHandler=="undefined"?nil:PackageHandler)}
-return smalltalk.withContext(function($ctx1) { 
-_st($PackageHandler())._register_for_(self,aString);
-return self}, function($ctx1) {$ctx1.fill(self,"registerFor:",{aString:aString},smalltalk.PackageHandler.klass)})},
-args: ["aString"],
-source: "registerFor: aString\x0a\x09PackageHandler register: self for: aString",
-messageSends: ["register:for:"],
-referencedClasses: ["PackageHandler"]
-}),
-smalltalk.PackageHandler.klass);
-
 
 smalltalk.addClass('AmdPackageHandler', smalltalk.PackageHandler, [], 'Importer-Exporter');
 smalltalk.AmdPackageHandler.comment="I am responsible for handling package loading and committing.\x0a\x0aI should not be used directly. Instead, use the corresponding `Package` methods.";
@@ -1899,21 +1727,13 @@ category: 'committing',
 fn: function (aPackage){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$3,$4,$1;
-$2=_st(aPackage)._amdNamespace();
-if(($receiver = $2) == nil || $receiver == undefined){
-$3=aPackage;
-_st($3)._amdNamespace_(_st(self._class())._defaultNamespace());
-$4=_st($3)._amdNamespace();
-$1=$4;
-} else {
-$1=$2;
-};
+var $1;
+$1=_st(_st(aPackage)._transport())._namespace();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"namespaceFor:",{aPackage:aPackage},smalltalk.AmdPackageHandler)})},
 args: ["aPackage"],
-source: "namespaceFor: aPackage\x0a\x09^ aPackage amdNamespace\x0a\x09\x09ifNil: [ aPackage amdNamespace: self class defaultNamespace; amdNamespace ]",
-messageSends: ["ifNil:", "amdNamespace:", "defaultNamespace", "class", "amdNamespace"],
+source: "namespaceFor: aPackage\x0a\x09^ aPackage transport namespace",
+messageSends: ["namespace", "transport"],
 referencedClasses: []
 }),
 smalltalk.AmdPackageHandler);
@@ -2309,23 +2129,103 @@ referencedClasses: []
 smalltalk.LegacyPackageHandler.klass);
 
 
-smalltalk.addClass('PackageTransport', smalltalk.Object, [], 'Importer-Exporter');
+smalltalk.addClass('PackageTransport', smalltalk.Object, ['package'], 'Importer-Exporter');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "commit",
+category: 'committing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self._commitHandler())._commit_(self._package());
+return self}, function($ctx1) {$ctx1.fill(self,"commit",{},smalltalk.PackageTransport)})},
+args: [],
+source: "commit\x0a\x09self commitHandler commit: self package",
+messageSends: ["commit:", "package", "commitHandler"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "commitHandler",
-category: 'accessing',
+category: 'factory',
 fn: function (){
 var self=this;
-function $PackageHandler(){return smalltalk.PackageHandler||(typeof PackageHandler=="undefined"?nil:PackageHandler)}
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=_st($PackageHandler())._for_(self._type());
+$1=_st(self._commitHandlerClass())._new();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"commitHandler",{},smalltalk.PackageTransport)})},
 args: [],
-source: "commitHandler\x0a\x09^ PackageHandler for: self type",
-messageSends: ["for:", "type"],
-referencedClasses: ["PackageHandler"]
+source: "commitHandler\x0a\x09^ self commitHandlerClass new",
+messageSends: ["new", "commitHandlerClass"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "commitHandlerClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self._subclassResponsibility();
+return self}, function($ctx1) {$ctx1.fill(self,"commitHandlerClass",{},smalltalk.PackageTransport)})},
+args: [],
+source: "commitHandlerClass\x0a\x09self subclassResponsibility",
+messageSends: ["subclassResponsibility"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "package",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@package"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"package",{},smalltalk.PackageTransport)})},
+args: [],
+source: "package\x0a\x09^ package",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.PackageTransport);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "package:",
+category: 'accessing',
+fn: function (aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self["@package"]=aPackage;
+return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage},smalltalk.PackageTransport)})},
+args: ["aPackage"],
+source: "package: aPackage\x0a\x09package := aPackage",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.PackageTransport);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "setupFromJson:",
+category: 'initialization',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return self}, function($ctx1) {$ctx1.fill(self,"setupFromJson:",{anObject:anObject},smalltalk.PackageTransport)})},
+args: ["anObject"],
+source: "setupFromJson: anObject\x0a\x09\x22no op. override if needed in subclasses\x22",
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.PackageTransport);
 
@@ -2348,6 +2248,100 @@ referencedClasses: []
 smalltalk.PackageTransport);
 
 
+smalltalk.PackageTransport.klass.iVarNames = ['registry'];
+smalltalk.addMethod(
+smalltalk.method({
+selector: "classRegisteredFor:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(self["@registry"])._at_(aString);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"classRegisteredFor:",{aString:aString},smalltalk.PackageTransport.klass)})},
+args: ["aString"],
+source: "classRegisteredFor: aString\x0a\x09^ registry at: aString",
+messageSends: ["at:"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport.klass);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "for:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(self._classRegisteredFor_(aString))._new();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"for:",{aString:aString},smalltalk.PackageTransport.klass)})},
+args: ["aString"],
+source: "for: aString\x0a\x09^ (self classRegisteredFor: aString) new",
+messageSends: ["new", "classRegisteredFor:"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport.klass);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "initialize",
+category: 'initialization',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.PackageTransport.klass.superclass.fn.prototype._initialize.apply(_st(self), []);
+self["@registry"]=smalltalk.HashedCollection._from_([]);
+self._register();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.PackageTransport.klass)})},
+args: [],
+source: "initialize\x0a\x09super initialize.\x0a\x09registry := #{}.\x0a\x09self register",
+messageSends: ["initialize", "register"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport.klass);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "register",
+category: 'registration',
+fn: function (){
+var self=this;
+function $PackageTransport(){return smalltalk.PackageTransport||(typeof PackageTransport=="undefined"?nil:PackageTransport)}
+return smalltalk.withContext(function($ctx1) { 
+_st($PackageTransport())._register_(self);
+return self}, function($ctx1) {$ctx1.fill(self,"register",{},smalltalk.PackageTransport.klass)})},
+args: [],
+source: "register\x0a\x09PackageTransport register: self",
+messageSends: ["register:"],
+referencedClasses: ["PackageTransport"]
+}),
+smalltalk.PackageTransport.klass);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "register:",
+category: 'registration',
+fn: function (aClass){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(aClass)._type();
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
+} else {
+_st(self["@registry"])._at_put_(_st(aClass)._type(),aClass);
+};
+return self}, function($ctx1) {$ctx1.fill(self,"register:",{aClass:aClass},smalltalk.PackageTransport.klass)})},
+args: ["aClass"],
+source: "register: aClass\x0a\x09aClass type ifNotNil: [\x0a\x09\x09registry at: aClass type put: aClass ]",
+messageSends: ["ifNotNil:", "at:put:", "type"],
+referencedClasses: []
+}),
+smalltalk.PackageTransport.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "type",
@@ -2366,6 +2360,25 @@ smalltalk.PackageTransport.klass);
 
 
 smalltalk.addClass('AmdPackageTransport', smalltalk.PackageTransport, ['namespace'], 'Importer-Exporter');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "commitHandlerClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+function $AmdPackageHandler(){return smalltalk.AmdPackageHandler||(typeof AmdPackageHandler=="undefined"?nil:AmdPackageHandler)}
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=$AmdPackageHandler();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"commitHandlerClass",{},smalltalk.AmdPackageTransport)})},
+args: [],
+source: "commitHandlerClass\x0a\x09^ AmdPackageHandler",
+messageSends: [],
+referencedClasses: ["AmdPackageHandler"]
+}),
+smalltalk.AmdPackageTransport);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "defaultNamespace",
@@ -2424,6 +2437,22 @@ referencedClasses: []
 }),
 smalltalk.AmdPackageTransport);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "setupFromJson:",
+category: 'initialization',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self._namespace_(_st(anObject)._at_("amdNamespace"));
+return self}, function($ctx1) {$ctx1.fill(self,"setupFromJson:",{anObject:anObject},smalltalk.AmdPackageTransport)})},
+args: ["anObject"],
+source: "setupFromJson: anObject\x0a\x09self namespace: (anObject at: 'amdNamespace')",
+messageSends: ["namespace:", "at:"],
+referencedClasses: []
+}),
+smalltalk.AmdPackageTransport);
+
 
 smalltalk.addMethod(
 smalltalk.method({
@@ -2644,12 +2673,12 @@ fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=_st(self._handler())._commit_(self);
+$1=_st(self._transport())._commit();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"commit",{},smalltalk.Package)})},
 args: [],
-source: "commit\x0a\x09^ self handler commit: self",
-messageSends: ["commit:", "handler"],
+source: "commit\x0a\x09^ self transport commit",
+messageSends: ["commit", "transport"],
 referencedClasses: []
 }),
 smalltalk.Package);
@@ -2762,34 +2791,31 @@ smalltalk.Package);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "handler",
+selector: "transportJson",
 category: '*Importer-Exporter',
 fn: function (){
 var self=this;
-function $PackageHandler(){return smalltalk.PackageHandler||(typeof PackageHandler=="undefined"?nil:PackageHandler)}
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st($PackageHandler())._for_(self._transportType());
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"handler",{},smalltalk.Package)})},
+return JSON.stringify(self.transport || null);;
+return self}, function($ctx1) {$ctx1.fill(self,"transportJson",{},smalltalk.Package)})},
 args: [],
-source: "handler\x0a\x09^ PackageHandler for: self transportType",
-messageSends: ["for:", "transportType"],
-referencedClasses: ["PackageHandler"]
+source: "transportJson\x0a\x09<return JSON.stringify(self.transport || null);>",
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.Package);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "transportJson",
+selector: "transportType",
 category: '*Importer-Exporter',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return JSON.stringify(self.transport || null);;
-return self}, function($ctx1) {$ctx1.fill(self,"transportJson",{},smalltalk.Package)})},
+return (self.transport && self.transport.type) || 'unknown';;
+return self}, function($ctx1) {$ctx1.fill(self,"transportType",{},smalltalk.Package)})},
 args: [],
-source: "transportJson\x0a\x09<return JSON.stringify(self.transport || null);>",
+source: "transportType\x0a\x09<return (self.transport && self.transport.type) || 'unknown';>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -2797,15 +2823,38 @@ smalltalk.Package);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "transportType",
+selector: "transport",
 category: '*Importer-Exporter',
 fn: function (){
 var self=this;
+function $PackageTransport(){return smalltalk.PackageTransport||(typeof PackageTransport=="undefined"?nil:PackageTransport)}
 return smalltalk.withContext(function($ctx1) { 
-return (self.transport && self.transport.type) || 'unknown';;
-return self}, function($ctx1) {$ctx1.fill(self,"transportType",{},smalltalk.Package)})},
+var $2,$3,$1;
+$2=_st($PackageTransport())._for_(self._transportType());
+_st($2)._setupFromJson_(self._basicTransport());
+_st($2)._package_(self);
+$3=_st($2)._yourself();
+$1=$3;
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"transport",{},smalltalk.Package)})},
 args: [],
-source: "transportType\x0a\x09<return (self.transport && self.transport.type) || 'unknown';>",
+source: "transport\x0a\x09^ (PackageTransport for: self transportType)\x0a\x09\x09setupFromJson: self basicTransport;\x0a\x09\x09package: self;\x0a\x09\x09yourself",
+messageSends: ["setupFromJson:", "basicTransport", "for:", "transportType", "package:", "yourself"],
+referencedClasses: ["PackageTransport"]
+}),
+smalltalk.Package);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "basicTransport",
+category: '*Importer-Exporter',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return self.transport;
+return self}, function($ctx1) {$ctx1.fill(self,"basicTransport",{},smalltalk.Package)})},
+args: [],
+source: "basicTransport\x0a\x09<return self.transport>",
 messageSends: [],
 referencedClasses: []
 }),

+ 91 - 80
st/Importer-Exporter.st

@@ -63,14 +63,6 @@ exportPackage: aPackage on: aStream
 	self subclassResponsibility
 ! !
 
-AbstractExporter class instanceVariableNames: 'default'!
-
-!AbstractExporter class methodsFor: 'instance creation'!
-
-default
-	^ default ifNil: [ default := self new ]
-! !
-
 AbstractExporter subclass: #ChunkExporter
 	instanceVariableNames: ''
 	package: 'Importer-Exporter'!
@@ -442,7 +434,7 @@ exportPackageTransportOf: aPackage on: aStream
 ! !
 
 Exporter subclass: #AmdExporter
-	instanceVariableNames: ''
+	instanceVariableNames: 'namespace'
 	package: 'Importer-Exporter'!
 !AmdExporter commentStamp!
 I am used to export Packages in an AMD (Asynchronous Module Definition) JavaScript format.!
@@ -458,7 +450,7 @@ exportPackageEpilogueOf: aPackage on: aStream
 exportPackagePrologueOf: aPackage on: aStream
 	aStream
 		nextPutAll: 'define("';
-		nextPutAll: (aPackage amdNamespace ifNil: [ 'amber' ]); "ifNil: only for LegacyPH, it should not happen with AmdPH"
+		nextPutAll: (self amdNamespaceOfPackage: aPackage);
 		nextPutAll: '/';
 		nextPutAll: aPackage name;
 		nextPutAll: '", ';
@@ -471,37 +463,14 @@ exportPackagePrologueOf: aPackage on: aStream
 
 amdNamesOfPackages: anArray
 	^ (anArray
-		select: [ :each | each amdNamespace notNil ])
-		collect: [ :each | each amdNamespace, '/', each name ]
-! !
-
-!AmdExporter class methodsFor: 'exporting-output'!
-
-exportPackageEpilogueOf: aPackage on: aStream
-	aStream
-		nextPutAll: '});';
-		lf
+		select: [ :each | (self amdNamespaceOfPackage: each) notNil ])
+		collect: [ :each | (self amdNamespaceOfPackage: each), '/', each name ]
 !
 
-exportPackagePrologueOf: aPackage on: aStream
-	aStream
-		nextPutAll: 'define("';
-		nextPutAll: (aPackage amdNamespace ifNil: [ 'amber' ]); "ifNil: only for LegacyPH, it should not happen with AmdPH"
-		nextPutAll: '/';
-		nextPutAll: aPackage name;
-		nextPutAll: '", ';
-		nextPutAll: (#('amber_vm/smalltalk' 'amber_vm/nil' 'amber_vm/_st'), (self amdNamesOfPackages: aPackage loadDependencies)) asJavascript;
-		nextPutAll: ', function(smalltalk,nil,_st){';
-		lf
-! !
-
-!AmdExporter class methodsFor: 'private'!
-
-amdNamesOfPackages: anArray
-	| deps depNames |
-	^(anArray
-		select: [ :each | each amdNamespace notNil ])
-		collect: [ :each | each amdNamespace, '/', each name ]
+amdNamespaceOfPackage: aPackage
+	^ (aPackage transport type = 'amd')
+		ifTrue: [ aPackage transport namespace ]
+		ifFalse: [ nil ]
 ! !
 
 Object subclass: #ChunkParser
@@ -743,11 +712,11 @@ oldCommit: aPackage
 !PackageHandler methodsFor: 'factory'!
 
 chunkExporter
-	^ self chunkExporterClass default
+	^ self chunkExporterClass new
 !
 
 exporter
-	^ self exporterClass default
+	^ self exporterClass new
 ! !
 
 !PackageHandler methodsFor: 'private'!
@@ -762,35 +731,6 @@ ajaxPutAt: aURL data: aString
 			'error' -> [ :xhr | self error: 'Commiting ' , aURL , ' failed with reason: "' , (xhr responseText) , '"'] }
 ! !
 
-PackageHandler class instanceVariableNames: 'registry'!
-
-!PackageHandler class methodsFor: 'accessing'!
-
-classRegisteredFor: aString
-	^ registry at: aString
-!
-
-for: aString
-	^ (self classRegisteredFor: aString) new
-! !
-
-!PackageHandler class methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	registry := #{}
-! !
-
-!PackageHandler class methodsFor: 'registry'!
-
-register: aClass for: aString
-	registry at: aString put: aClass
-!
-
-registerFor: aString
-	PackageHandler register: self for: aString
-! !
-
 PackageHandler subclass: #AmdPackageHandler
 	instanceVariableNames: ''
 	package: 'Importer-Exporter'!
@@ -817,8 +757,7 @@ exporterClass
 !AmdPackageHandler methodsFor: 'committing'!
 
 namespaceFor: aPackage
-	^ aPackage amdNamespace
-		ifNil: [ aPackage amdNamespace: self class defaultNamespace; amdNamespace ]
+	^ aPackage transport namespace
 ! !
 
 !AmdPackageHandler methodsFor: 'private'!
@@ -957,32 +896,91 @@ loadPackages: aCollection prefix: aString
 ! !
 
 Object subclass: #PackageTransport
-	instanceVariableNames: ''
+	instanceVariableNames: 'package'
 	package: 'Importer-Exporter'!
 
 !PackageTransport methodsFor: 'accessing'!
 
+commitHandlerClass
+	self subclassResponsibility
+!
+
+package
+	^ package
+!
+
+package: aPackage
+	package := aPackage
+!
+
 type
 	^ self class type
-!
+! !
+
+!PackageTransport methodsFor: 'committing'!
+
+commit
+	self commitHandler commit: self package
+! !
+
+!PackageTransport methodsFor: 'factory'!
 
 commitHandler
-	^ PackageHandler for: self type
+	^ self commitHandlerClass new
+! !
+
+!PackageTransport methodsFor: 'initialization'!
+
+setupFromJson: anObject
+	"no op. override if needed in subclasses"
 ! !
 
+PackageTransport class instanceVariableNames: 'registry'!
+
 !PackageTransport class methodsFor: 'accessing'!
 
+classRegisteredFor: aString
+	^ registry at: aString
+!
+
+for: aString
+	^ (self classRegisteredFor: aString) new
+!
+
 type
 	"Override in subclasses"
 	^ nil
 ! !
 
+!PackageTransport class methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	registry := #{}.
+	self register
+! !
+
+!PackageTransport class methodsFor: 'registration'!
+
+register
+	PackageTransport register: self
+!
+
+register: aClass
+	aClass type ifNotNil: [
+		registry at: aClass type put: aClass ]
+! !
+
 PackageTransport subclass: #AmdPackageTransport
 	instanceVariableNames: 'namespace'
 	package: 'Importer-Exporter'!
 
 !AmdPackageTransport methodsFor: 'accessing'!
 
+commitHandlerClass
+	^ AmdPackageHandler
+!
+
 namespace
 	^ namespace ifNil: [ self defaultNamespace ]
 !
@@ -997,6 +995,12 @@ defaultNamespace
 	^ Smalltalk current defaultAmdNamespace
 ! !
 
+!AmdPackageTransport methodsFor: 'initialization'!
+
+setupFromJson: anObject
+	self namespace: (anObject at: 'amdNamespace')
+! !
+
 !AmdPackageTransport class methodsFor: 'accessing'!
 
 type
@@ -1086,7 +1090,7 @@ amdNamespace: aString
 !
 
 commit
-	^ self handler commit: self
+	^ self transport commit
 !
 
 commitPathJs
@@ -1105,15 +1109,22 @@ commitPathSt: aString
 	^ (extension ifNil: [ extension := #{} ]) at: #commitPathSt put: aString
 !
 
-handler
-	^ PackageHandler for: self transportType
-!
-
 transportJson
 	<return JSON.stringify(self.transport || null);>
 !
 
 transportType
 	<return (self.transport && self.transport.type) || 'unknown';>
+!
+
+transport
+	^ (PackageTransport for: self transportType)
+		setupFromJson: self basicTransport;
+		package: self;
+		yourself
+!
+
+basicTransport
+	<return self.transport>
 ! !